diff -Nrcpad gcc-14-20250502/LAST_UPDATED gcc-14-20250509/LAST_UPDATED
*** gcc-14-20250502/LAST_UPDATED	Fri May  2 22:33:46 2025
--- gcc-14-20250509/LAST_UPDATED	Fri May  9 22:33:23 2025
***************
*** 1 ****
! Obtained from git: releases/gcc-14 revision 088f3168a98d96ade7566dff37e3c2c305a4b2ef
--- 1 ----
! Obtained from git: releases/gcc-14 revision 81da797328c91ef6b3bed6666f6d047f8e003efe
diff -Nrcpad gcc-14-20250502/MD5SUMS gcc-14-20250509/MD5SUMS
*** gcc-14-20250502/MD5SUMS	Fri May  2 22:33:50 2025
--- gcc-14-20250509/MD5SUMS	Fri May  9 22:33:29 2025
***************
*** 1,5 ****
  # This file contains the MD5 checksums of the files in the
! # gcc-14-20250502.tar.xz tarball.
  #
  # Besides verifying that all files in the tarball were correctly expanded,
  # it also can be used to determine if any files have changed since the
--- 1,5 ----
  # This file contains the MD5 checksums of the files in the
! # gcc-14-20250509.tar.xz tarball.
  #
  # Besides verifying that all files in the tarball were correctly expanded,
  # it also can be used to determine if any files have changed since the
*************** ddba67a2d70633fea1f055f0cddbd350  Change
*** 23,29 ****
  fd4ecdf5d672efe2b0e409aca9cf9446  ChangeLog.jit
  09538b708302f1735f6fa05b622ecf5e  ChangeLog.tree-ssa
  24ab760126489e69436a43185dc3d202  INSTALL/README
! d1541431cfdc4454cb52d8ef84521b30  LAST_UPDATED
  1671040823f8eb8436a06fdd18065e02  MAINTAINERS
  304c3887135aefa27c21292ec585b0a3  Makefile.def
  8dd93fbf2e32bcbd2faba10e3b8ba2b0  Makefile.in
--- 23,29 ----
  fd4ecdf5d672efe2b0e409aca9cf9446  ChangeLog.jit
  09538b708302f1735f6fa05b622ecf5e  ChangeLog.tree-ssa
  24ab760126489e69436a43185dc3d202  INSTALL/README
! 9154fb1441a72d2af7ecbfc1d5560392  LAST_UPDATED
  1671040823f8eb8436a06fdd18065e02  MAINTAINERS
  304c3887135aefa27c21292ec585b0a3  Makefile.def
  8dd93fbf2e32bcbd2faba10e3b8ba2b0  Makefile.in
*************** baf9b6e2583cff7f3b9de94370dd739e  gcc/AB
*** 505,511 ****
  a916467b91076e631dd8edb7424769c7  gcc/COPYING.LIB
  d32239bcb673463ab874e80d47fae504  gcc/COPYING3
  6a6a8e020838b23406c81b19c1d46df6  gcc/COPYING3.LIB
! 6e7af0a71096436718a4a126007c79d1  gcc/ChangeLog
  a3b63c675afa7a655cc2bfa8a907af79  gcc/ChangeLog-1997
  d9a88529352a010253c2e8fb1ed6023b  gcc/ChangeLog-1998
  240f08f81cb4699e8b49347db38233db  gcc/ChangeLog-1999
--- 505,511 ----
  a916467b91076e631dd8edb7424769c7  gcc/COPYING.LIB
  d32239bcb673463ab874e80d47fae504  gcc/COPYING3
  6a6a8e020838b23406c81b19c1d46df6  gcc/COPYING3.LIB
! e2f565f35ab9fdf2babe64f50db0b762  gcc/ChangeLog
  a3b63c675afa7a655cc2bfa8a907af79  gcc/ChangeLog-1997
  d9a88529352a010253c2e8fb1ed6023b  gcc/ChangeLog-1998
  240f08f81cb4699e8b49347db38233db  gcc/ChangeLog-1999
*************** fb3fadb88e1d2b3b640cfaaa5ff11780  gcc/Ch
*** 541,547 ****
  3eb07e0b2e542409bf73d359f7f65609  gcc/ChangeLog.ptr
  e13638e26743ba41e6011b76cc00d9a9  gcc/ChangeLog.tree-ssa
  739ab47f6425bcea1d05e4fc0542de54  gcc/ChangeLog.tuples
! cd8714535e4a1e3c303ecd336ee62f58  gcc/DATESTAMP
  d41d8cd98f00b204e9800998ecf8427e  gcc/DEV-PHASE
  eb92e1ff5e982ca07e173e0eb286d243  gcc/FSFChangeLog
  30e1e33411566388b3164558482dc5e6  gcc/FSFChangeLog.10
--- 541,547 ----
  3eb07e0b2e542409bf73d359f7f65609  gcc/ChangeLog.ptr
  e13638e26743ba41e6011b76cc00d9a9  gcc/ChangeLog.tree-ssa
  739ab47f6425bcea1d05e4fc0542de54  gcc/ChangeLog.tuples
! fc53fc667f46aada2b3b592d081dcd72  gcc/DATESTAMP
  d41d8cd98f00b204e9800998ecf8427e  gcc/DEV-PHASE
  eb92e1ff5e982ca07e173e0eb286d243  gcc/FSFChangeLog
  30e1e33411566388b3164558482dc5e6  gcc/FSFChangeLog.10
*************** b8ea4d0fbacd00d61908ce1633d440fb  gcc/co
*** 3370,3376 ****
  e74b8aa51ed0a0fd74ec97bb4009c55f  gcc/config/aarch64/aarch64-tune.md
  6ede31fb52cae2cf590b667c55706637  gcc/config/aarch64/aarch64-tuning-flags.def
  93d2ce2396c397f594f146a9d7d80c52  gcc/config/aarch64/aarch64-vxworks.h
! 70a57e9bbace36d6892e9aaa13ca3fdf  gcc/config/aarch64/aarch64.cc
  be8a897650902ba46d1df7cb3a50ca2c  gcc/config/aarch64/aarch64.h
  356f40f57c28daebc2895871909cc2f6  gcc/config/aarch64/aarch64.md
  3948f2f1b7b27ca528cac06ae5fe36ff  gcc/config/aarch64/aarch64.opt
--- 3370,3376 ----
  e74b8aa51ed0a0fd74ec97bb4009c55f  gcc/config/aarch64/aarch64-tune.md
  6ede31fb52cae2cf590b667c55706637  gcc/config/aarch64/aarch64-tuning-flags.def
  93d2ce2396c397f594f146a9d7d80c52  gcc/config/aarch64/aarch64-vxworks.h
! 880e7b0625115361a29305a84304ccdf  gcc/config/aarch64/aarch64.cc
  be8a897650902ba46d1df7cb3a50ca2c  gcc/config/aarch64/aarch64.h
  356f40f57c28daebc2895871909cc2f6  gcc/config/aarch64/aarch64.md
  3948f2f1b7b27ca528cac06ae5fe36ff  gcc/config/aarch64/aarch64.opt
*************** e99d78e4dd33a6aa584724df90e53b4e  gcc/co
*** 4983,4989 ****
  f170b7baa9932b4ba3beb73d7abced9a  gcc/config/rs6000/rs6000-string.cc
  ed1a47904e657788396f5063d85c91dd  gcc/config/rs6000/rs6000-tables.opt
  ce8de9a27f36b759a69194616c02eb38  gcc/config/rs6000/rs6000-tables.opt.urls
! 0167f6663f300700834c3364ee0c4eda  gcc/config/rs6000/rs6000.cc
  a01586ff71e4e5e6d8cecf0f75ba68ff  gcc/config/rs6000/rs6000.h
  9bb3221c240ad646eef47bf57e389d92  gcc/config/rs6000/rs6000.md
  3a2092e316055a319aafca915be949d0  gcc/config/rs6000/rs6000.opt
--- 4983,4989 ----
  f170b7baa9932b4ba3beb73d7abced9a  gcc/config/rs6000/rs6000-string.cc
  ed1a47904e657788396f5063d85c91dd  gcc/config/rs6000/rs6000-tables.opt
  ce8de9a27f36b759a69194616c02eb38  gcc/config/rs6000/rs6000-tables.opt.urls
! 2bd3d18abb554a6b4b893d27c32b96d2  gcc/config/rs6000/rs6000.cc
  a01586ff71e4e5e6d8cecf0f75ba68ff  gcc/config/rs6000/rs6000.h
  9bb3221c240ad646eef47bf57e389d92  gcc/config/rs6000/rs6000.md
  3a2092e316055a319aafca915be949d0  gcc/config/rs6000/rs6000.opt
*************** ef6eb019220dc23fd0adccd9bdd5c35e  gcc/co
*** 5358,5367 ****
  b2245059a9571ee7345914f533817909  gcc/convert.h
  3ec3393ac38dfddb60842d39351b0cd1  gcc/coretypes.h
  d36a2aabdf8da39363d9be0efef739b0  gcc/coroutine-builtins.def
! c59586748f2760da4b4b93526be5cc64  gcc/coroutine-passes.cc
  f1ae4baa11bd5b6dd111907d100e7c0c  gcc/coverage.cc
  bf1a3b3570d1b69e07f60f5150f38a93  gcc/coverage.h
! ca6ea4b9857f4e9034b4ddda46a064a4  gcc/cp/ChangeLog
  d271e3663538ba1f3281cab3838e92cd  gcc/cp/ChangeLog-1993
  f5a44adbc05521162350ca409d1d95ce  gcc/cp/ChangeLog-1994
  ac55db48d964cb5469ff03c1cd3ee04d  gcc/cp/ChangeLog-1995
--- 5358,5367 ----
  b2245059a9571ee7345914f533817909  gcc/convert.h
  3ec3393ac38dfddb60842d39351b0cd1  gcc/coretypes.h
  d36a2aabdf8da39363d9be0efef739b0  gcc/coroutine-builtins.def
! 11daa3f7f65177eb32e2dad6fd437637  gcc/coroutine-passes.cc
  f1ae4baa11bd5b6dd111907d100e7c0c  gcc/coverage.cc
  bf1a3b3570d1b69e07f60f5150f38a93  gcc/coverage.h
! 0b77f840aa8aee2b1b513f42c47f6fb9  gcc/cp/ChangeLog
  d271e3663538ba1f3281cab3838e92cd  gcc/cp/ChangeLog-1993
  f5a44adbc05521162350ca409d1d95ce  gcc/cp/ChangeLog-1994
  ac55db48d964cb5469ff03c1cd3ee04d  gcc/cp/ChangeLog-1995
*************** fdbccaa087b035a5aecd3be41b27dfc6  gcc/cp
*** 5405,5411 ****
  e2342416928d82aea826d50f04c9f56c  gcc/cp/constraint.cc
  7f4cf1f0f93d7aa0443c94e023845d1c  gcc/cp/contracts.cc
  5b547c5fd539f8a214ed271c5a475a85  gcc/cp/contracts.h
! 6967b0103077418c2e5ab5ead691d772  gcc/cp/coroutines.cc
  c00c917a34a1da5c9fc0740ca6cf66ae  gcc/cp/cp-gimplify.cc
  d3243151c2dc95476f1ffe37daeac128  gcc/cp/cp-lang.cc
  7c2a3efea776c90aa874253dbc0d63d5  gcc/cp/cp-name-hint.h
--- 5405,5411 ----
  e2342416928d82aea826d50f04c9f56c  gcc/cp/constraint.cc
  7f4cf1f0f93d7aa0443c94e023845d1c  gcc/cp/contracts.cc
  5b547c5fd539f8a214ed271c5a475a85  gcc/cp/contracts.h
! 3484b55b3ed387dc1e3533752de97075  gcc/cp/coroutines.cc
  c00c917a34a1da5c9fc0740ca6cf66ae  gcc/cp/cp-gimplify.cc
  d3243151c2dc95476f1ffe37daeac128  gcc/cp/cp-lang.cc
  7c2a3efea776c90aa874253dbc0d63d5  gcc/cp/cp-name-hint.h
*************** d3243151c2dc95476f1ffe37daeac128  gcc/cp
*** 5413,5427 ****
  435279c2effa4bff943c983b01d2b6a5  gcc/cp/cp-objcp-common.h
  821d270a560d4fc013061cdea0f0a956  gcc/cp/cp-trait.def
  a5599d1cd180d05b45d78f09c98ceb60  gcc/cp/cp-tree.def
! 800e2196786f6f509e098d6ccf2cc750  gcc/cp/cp-tree.h
  e1f1e00efaa3ab325dcde6256bd453ea  gcc/cp/cp-ubsan.cc
! 9c03298cd40d3b947e019ec428058338  gcc/cp/cvt.cc
  56f39bfaef18eed52575804302d7f065  gcc/cp/cxx-pretty-print.cc
  08e116dfeec3d3e6814661d5e4274639  gcc/cp/cxx-pretty-print.h
  8947390d58d06707b7fc5112da286233  gcc/cp/cxxapi-data.csv
! a46cb7202bcedbfcb63c97baa7799138  gcc/cp/decl.cc
  1abb8e5bf838320c47bbb41c28ac53c8  gcc/cp/decl.h
! f98406f804a08b649a403ec03c6dda4b  gcc/cp/decl2.cc
  db1260dd767707d8dcbdbdcd7982bfad  gcc/cp/dump.cc
  59bf1da855227c5935dc3e19aae2d725  gcc/cp/error.cc
  2bd7d5984b70c2c7549c4af9201f8d2d  gcc/cp/except.cc
--- 5413,5427 ----
  435279c2effa4bff943c983b01d2b6a5  gcc/cp/cp-objcp-common.h
  821d270a560d4fc013061cdea0f0a956  gcc/cp/cp-trait.def
  a5599d1cd180d05b45d78f09c98ceb60  gcc/cp/cp-tree.def
! c05f8f3fcb885f5560bd64aae4ec8649  gcc/cp/cp-tree.h
  e1f1e00efaa3ab325dcde6256bd453ea  gcc/cp/cp-ubsan.cc
! 727cb3d1869a6d04892b13922b9a7d46  gcc/cp/cvt.cc
  56f39bfaef18eed52575804302d7f065  gcc/cp/cxx-pretty-print.cc
  08e116dfeec3d3e6814661d5e4274639  gcc/cp/cxx-pretty-print.h
  8947390d58d06707b7fc5112da286233  gcc/cp/cxxapi-data.csv
! c6f67dc5986c092e1ada72c268f60ce5  gcc/cp/decl.cc
  1abb8e5bf838320c47bbb41c28ac53c8  gcc/cp/decl.h
! 1cb099a7980289f4fcdda85452c6a3e4  gcc/cp/decl2.cc
  db1260dd767707d8dcbdbdcd7982bfad  gcc/cp/dump.cc
  59bf1da855227c5935dc3e19aae2d725  gcc/cp/error.cc
  2bd7d5984b70c2c7549c4af9201f8d2d  gcc/cp/except.cc
*************** e5de0a6c0e25db99122b38cfbd158f92  gcc/cp
*** 5443,5449 ****
  11d4b2dad811e7167eda68313cf80ac5  gcc/cp/name-lookup.cc
  4c2302075ee88f154fe1d9d5bc880b38  gcc/cp/name-lookup.h
  9071e61b746a07f7ae419836317ea8d4  gcc/cp/operators.def
! 1a28eaf049388507440c077078b27e23  gcc/cp/optimize.cc
  858714f2d555e4551794ae01f5e0a5da  gcc/cp/parser.cc
  64953966b085a9e770be93c5d1bdca4e  gcc/cp/parser.h
  c5cecb5a2b5692e0e5862de7ec5c1c79  gcc/cp/pt.cc
--- 5443,5449 ----
  11d4b2dad811e7167eda68313cf80ac5  gcc/cp/name-lookup.cc
  4c2302075ee88f154fe1d9d5bc880b38  gcc/cp/name-lookup.h
  9071e61b746a07f7ae419836317ea8d4  gcc/cp/operators.def
! 60c299af3fd419f7a4f41273c6f5363e  gcc/cp/optimize.cc
  858714f2d555e4551794ae01f5e0a5da  gcc/cp/parser.cc
  64953966b085a9e770be93c5d1bdca4e  gcc/cp/parser.h
  c5cecb5a2b5692e0e5862de7ec5c1c79  gcc/cp/pt.cc
*************** f796fb99601d560c4a882b6ecfb1409c  gcc/in
*** 6262,6273 ****
  fcd61155f90da565ae9b576ee28ece0d  gcc/insn-notes.def
  73d4978deb1a86ccb6b004d076a2fc87  gcc/int-vector-builder.h
  6cc45ccaf1a55265f34493f54bd36beb  gcc/internal-fn.cc
! 12b95e305549993d38ac59f46ff13cf7  gcc/internal-fn.def
  6f5650312adfade2d0fbb8ea6d4334d8  gcc/internal-fn.h
  5e2086cfd6bea225be01b38fb20580c1  gcc/intl.cc
  228428e1fe66a4b0575040e005f4176b  gcc/intl.h
  6fd24145bd08ca12fe502d97a9f5a8e9  gcc/ipa-comdats.cc
! 521d20e691c360c2ae7cdec41c4ddebf  gcc/ipa-cp.cc
  4dcb4dc14308e9d673b88c990eda3bd6  gcc/ipa-cp.h
  ddaf3689bf5ee9cd7a26ab4ad95f31f4  gcc/ipa-devirt.cc
  8210f1d996629cd5789d47de6f419385  gcc/ipa-fnsummary.cc
--- 6262,6273 ----
  fcd61155f90da565ae9b576ee28ece0d  gcc/insn-notes.def
  73d4978deb1a86ccb6b004d076a2fc87  gcc/int-vector-builder.h
  6cc45ccaf1a55265f34493f54bd36beb  gcc/internal-fn.cc
! 8d0a43bcb40870e59de413ae4d164b1f  gcc/internal-fn.def
  6f5650312adfade2d0fbb8ea6d4334d8  gcc/internal-fn.h
  5e2086cfd6bea225be01b38fb20580c1  gcc/intl.cc
  228428e1fe66a4b0575040e005f4176b  gcc/intl.h
  6fd24145bd08ca12fe502d97a9f5a8e9  gcc/ipa-comdats.cc
! f479085872ad2e2e6091ac7376784cc9  gcc/ipa-cp.cc
  4dcb4dc14308e9d673b88c990eda3bd6  gcc/ipa-cp.h
  ddaf3689bf5ee9cd7a26ab4ad95f31f4  gcc/ipa-devirt.cc
  8210f1d996629cd5789d47de6f419385  gcc/ipa-fnsummary.cc
*************** e8a9eb01b9451a357155e7152df1c669  gcc/ta
*** 8060,8066 ****
  a05663c52c607143c607d3ecf1391979  gcc/targhooks.cc
  51d240e574a3f9ecec346d64a04ac634  gcc/targhooks.h
  f39fcaa8197187283ccfed40107b426d  gcc/testsuite/.gitattributes
! 9eb513d36a10c4e1a18ca89d5c3a5684  gcc/testsuite/ChangeLog
  862f04afbd87da2cc6bc432c3f28430f  gcc/testsuite/ChangeLog-1993-2007
  029a5d8dacd25eb5d4711452ac448e5b  gcc/testsuite/ChangeLog-2008
  13ac28c41d51b66b4ec40dba6bd50f39  gcc/testsuite/ChangeLog-2009
--- 8060,8066 ----
  a05663c52c607143c607d3ecf1391979  gcc/targhooks.cc
  51d240e574a3f9ecec346d64a04ac634  gcc/targhooks.h
  f39fcaa8197187283ccfed40107b426d  gcc/testsuite/.gitattributes
! 1b433ad3f3d1a244c2ec88157fdfa89c  gcc/testsuite/ChangeLog
  862f04afbd87da2cc6bc432c3f28430f  gcc/testsuite/ChangeLog-1993-2007
  029a5d8dacd25eb5d4711452ac448e5b  gcc/testsuite/ChangeLog-2008
  13ac28c41d51b66b4ec40dba6bd50f39  gcc/testsuite/ChangeLog-2009
*************** b8aaec32a77e9927231c6c5f3237432f  gcc/te
*** 13815,13820 ****
--- 13815,13822 ----
  14697006c1045d90c0f505dbfc8c5072  gcc/testsuite/g++.dg/abi/bitfield9.C
  104feb47499ce7e6125b3ef0a9ee49f3  gcc/testsuite/g++.dg/abi/comdat1.C
  bc52f8836c83bf95f70976078f1c9616  gcc/testsuite/g++.dg/abi/comdat2.C
+ d4efdf5c223cead8e9524dc4c698fb41  gcc/testsuite/g++.dg/abi/comdat3.C
+ 535dc9a1ae61607620c0607cc9a7072a  gcc/testsuite/g++.dg/abi/comdat4.C
  bb696554d34c85c7a4f3ecf5c800d48e  gcc/testsuite/g++.dg/abi/comdat5.C
  b587f170bbc6f95ef287e408bcafe1e3  gcc/testsuite/g++.dg/abi/cookie1.C
  06ad90a0554de61d87d60dab2a30bf3e  gcc/testsuite/g++.dg/abi/covariant1.C
*************** ddfd6a90cf32e5a6f5b08574c034f7eb  gcc/te
*** 14777,14783 ****
  ffc351894b467f0868dd9e3ff56e8b09  gcc/testsuite/g++.dg/coroutines/coro-bad-alloc-01-bad-op-del.C
  bcba22803ed3d0f8efcb00d0980effed  gcc/testsuite/g++.dg/coroutines/coro-bad-alloc-02-no-op-new-nt.C
  5905d0bff2fe1daec08474d17a24aec6  gcc/testsuite/g++.dg/coroutines/coro-bad-gro-00-class-gro-scalar-return.C
! d0ec9373b7671fe70b47e96812daa568  gcc/testsuite/g++.dg/coroutines/coro-bad-gro-01-void-gro-non-class-coro.C
  a50880b566fed6d07b909ccdaa5107a7  gcc/testsuite/g++.dg/coroutines/coro-bad-grooaf-00-static.C
  bf25ae08316051d9833582ee358711b2  gcc/testsuite/g++.dg/coroutines/coro-bad-grooaf-01-grooaf-expected.C
  8e2244c730152e6c96e90cb463a33d11  gcc/testsuite/g++.dg/coroutines/coro-builtins.C
--- 14779,14785 ----
  ffc351894b467f0868dd9e3ff56e8b09  gcc/testsuite/g++.dg/coroutines/coro-bad-alloc-01-bad-op-del.C
  bcba22803ed3d0f8efcb00d0980effed  gcc/testsuite/g++.dg/coroutines/coro-bad-alloc-02-no-op-new-nt.C
  5905d0bff2fe1daec08474d17a24aec6  gcc/testsuite/g++.dg/coroutines/coro-bad-gro-00-class-gro-scalar-return.C
! 3beaced477f50a047439eb1e530556f9  gcc/testsuite/g++.dg/coroutines/coro-bad-gro-01-void-gro-non-class-coro.C
  a50880b566fed6d07b909ccdaa5107a7  gcc/testsuite/g++.dg/coroutines/coro-bad-grooaf-00-static.C
  bf25ae08316051d9833582ee358711b2  gcc/testsuite/g++.dg/coroutines/coro-bad-grooaf-01-grooaf-expected.C
  8e2244c730152e6c96e90cb463a33d11  gcc/testsuite/g++.dg/coroutines/coro-builtins.C
*************** cb41fef7448625fa4e0c8fd96e24fc4d  gcc/te
*** 14800,14805 ****
--- 14802,14809 ----
  6f5627b19b794cfdd383607165c8ad4e  gcc/testsuite/g++.dg/coroutines/coro1-refs-and-ctors.h
  6487c0454968e62ff493f215450a35cc  gcc/testsuite/g++.dg/coroutines/coro1-ret-int-yield-int.h
  101a458de5b12d6ed22922527d4908a3  gcc/testsuite/g++.dg/coroutines/coroutines.exp
+ 6ece11b45159f25b68242745f908d279  gcc/testsuite/g++.dg/coroutines/maybe-unused-1.C
+ de5003b6efc45fbdb82fb3c9a14023b0  gcc/testsuite/g++.dg/coroutines/nodiscard-1.C
  38480902b130e861149d8b8b006e7e6b  gcc/testsuite/g++.dg/coroutines/pr100127.C
  98a063ad16e26b41bc64224b581301b8  gcc/testsuite/g++.dg/coroutines/pr100611.C
  46087ea7fe5f7e548d1db1fe2bd1cdf7  gcc/testsuite/g++.dg/coroutines/pr100673.C
*************** cb41fef7448625fa4e0c8fd96e24fc4d  gcc/te
*** 14809,14818 ****
  41e3768a7e4c86bb1f5702ed69afe25d  gcc/testsuite/g++.dg/coroutines/pr101367.C
  3b7900c34ea0474d337aa825a01675c2  gcc/testsuite/g++.dg/coroutines/pr101765.C
  907876b899af7e13b2655a2ff373099e  gcc/testsuite/g++.dg/coroutines/pr101976.C
  5a6ab803d16d71889bbcfbe081300785  gcc/testsuite/g++.dg/coroutines/pr102454.C
! fcf423593c66a6801268d44dcd7b6ae1  gcc/testsuite/g++.dg/coroutines/pr102489.C
  85cc1b4c4f0e73f17a81693bed3275fa  gcc/testsuite/g++.dg/coroutines/pr103328.C
! 72ed4197105a0e5b283253be79a963fa  gcc/testsuite/g++.dg/coroutines/pr103868.C
  4be4670ffeb4857d864cfa5cfa5dc16f  gcc/testsuite/g++.dg/coroutines/pr104051.C
  b134bf48c5d1c37a3f48e0c7f25bd714  gcc/testsuite/g++.dg/coroutines/pr104981-preview-this.C
  9bcaec9fc97ae958d52ca93f20348767  gcc/testsuite/g++.dg/coroutines/pr105287.C
--- 14813,14823 ----
  41e3768a7e4c86bb1f5702ed69afe25d  gcc/testsuite/g++.dg/coroutines/pr101367.C
  3b7900c34ea0474d337aa825a01675c2  gcc/testsuite/g++.dg/coroutines/pr101765.C
  907876b899af7e13b2655a2ff373099e  gcc/testsuite/g++.dg/coroutines/pr101976.C
+ 9c42a83dd6fc49392780ffaa29c32b59  gcc/testsuite/g++.dg/coroutines/pr102051.C
  5a6ab803d16d71889bbcfbe081300785  gcc/testsuite/g++.dg/coroutines/pr102454.C
! ef7a17d165b83f4a1f6f2146ca741d68  gcc/testsuite/g++.dg/coroutines/pr102489.C
  85cc1b4c4f0e73f17a81693bed3275fa  gcc/testsuite/g++.dg/coroutines/pr103328.C
! 858276614776f5f89fec709b05c75e87  gcc/testsuite/g++.dg/coroutines/pr103868.C
  4be4670ffeb4857d864cfa5cfa5dc16f  gcc/testsuite/g++.dg/coroutines/pr104051.C
  b134bf48c5d1c37a3f48e0c7f25bd714  gcc/testsuite/g++.dg/coroutines/pr104981-preview-this.C
  9bcaec9fc97ae958d52ca93f20348767  gcc/testsuite/g++.dg/coroutines/pr105287.C
*************** dc116348933b70af69665c9477f14450  gcc/te
*** 14827,14843 ****
--- 14832,14858 ----
  bfb4d4da5fe86af369bbdec84872cc96  gcc/testsuite/g++.dg/coroutines/pr105475-broken-spec.C
  2d3e12d9f28b3d12f5381192430ca293  gcc/testsuite/g++.dg/coroutines/pr105475.C
  c5029b3ababd909d21fec108130560c2  gcc/testsuite/g++.dg/coroutines/pr106188.C
+ 95d1fc3ce20e1869ccfe0388d864bb6f  gcc/testsuite/g++.dg/coroutines/pr106973.C
  7801d6d5799eadc6c00398b3003e9a6d  gcc/testsuite/g++.dg/coroutines/pr107768.C
+ 3d4d02626804c550ebe1e4cd3be90908  gcc/testsuite/g++.dg/coroutines/pr109682.C
+ 20936a8fefd894aeb3daa85e46ea1b0b  gcc/testsuite/g++.dg/coroutines/pr110635.C
  fcfad9d83adada266f7987b8339f2669  gcc/testsuite/g++.dg/coroutines/pr110871.C
  9ea2b6247ebc58dcea5e8b7eddd7adca  gcc/testsuite/g++.dg/coroutines/pr110872.C
  dd1706e477862bd429aba56e40a12665  gcc/testsuite/g++.dg/coroutines/pr111728.C
  bc13f9bef9dfbb9f378794dc144f6b7f  gcc/testsuite/g++.dg/coroutines/pr112341-2.C
  c30585d33347e6eb25da9da916e1da25  gcc/testsuite/g++.dg/coroutines/pr112341-3.C
  d94eaf98fb64f996342be49a4c220def  gcc/testsuite/g++.dg/coroutines/pr112341.C
+ 50b0f2e4de017887ae63e20c43f93400  gcc/testsuite/g++.dg/coroutines/pr113457-1.C
+ 9d5fe657327f09951f2ae2d6f6ec210a  gcc/testsuite/g++.dg/coroutines/pr113457.C
  2dcf11bf73d45c90e6be4a5ed46555a5  gcc/testsuite/g++.dg/coroutines/pr115550-preview-this.C
  8496292f23f33e07ff0fe7b9e8f1eb91  gcc/testsuite/g++.dg/coroutines/pr115906-yield.C
  9514f224b21eb90bcef5ab37ae609a92  gcc/testsuite/g++.dg/coroutines/pr115906.C
  b75b654187426934820f1e2a8a63aaad  gcc/testsuite/g++.dg/coroutines/pr116327-preview-this.C
+ 36259c7c65f78b7358d2efa4fb0a9e54  gcc/testsuite/g++.dg/coroutines/pr116482.C
+ 808c70848e15a3d82e09b131dabb149b  gcc/testsuite/g++.dg/coroutines/pr116502.C
+ 99fb6f2e5c0e7bc8a3c78cbf8090a91f  gcc/testsuite/g++.dg/coroutines/pr116506.C
+ 59d8e6cfa9a450642b4a378751f44e8a  gcc/testsuite/g++.dg/coroutines/pr116793-1.C
+ 16df01e113e50e8969f23cb32c1ab8fd  gcc/testsuite/g++.dg/coroutines/pr116880.C
  cbb42d13b1660a8eb1d40a3d88308140  gcc/testsuite/g++.dg/coroutines/pr93458-1-missing-traits.C
  d9151fc224e4913ed7ffacd748769917  gcc/testsuite/g++.dg/coroutines/pr93458-2-bad-traits.C
  e9b715cb41c54f5b179b4725b788e338  gcc/testsuite/g++.dg/coroutines/pr93458-3-missing-handle.C
*************** f94b132c0aae8eaa2355126af9e65707  gcc/te
*** 14850,14857 ****
  c41c0f3460d21e0c4db49f70ce077c29  gcc/testsuite/g++.dg/coroutines/pr94760-mismatched-traits-and-promise-prev.C
  bd516c5865d9e7ccb7376cdd2e004d0f  gcc/testsuite/g++.dg/coroutines/pr94817.C
  80f2ddf6e7fa3b7d98d16dcb37394788  gcc/testsuite/g++.dg/coroutines/pr94829.C
! c5ae54387794567cbde9f25938e1f958  gcc/testsuite/g++.dg/coroutines/pr94879-folly-1.C
! 692b01e05c2f7e4502c21442ec225059  gcc/testsuite/g++.dg/coroutines/pr94883-folly-2.C
  fa1dba5da47078603d79923b5b343d43  gcc/testsuite/g++.dg/coroutines/pr94886-folly-3.C
  f41f630eebfc858cbd9471df42c4a56a  gcc/testsuite/g++.dg/coroutines/pr95050.C
  9d01ddcc0b1513ede783b802cb9b0351  gcc/testsuite/g++.dg/coroutines/pr95345.C
--- 14865,14872 ----
  c41c0f3460d21e0c4db49f70ce077c29  gcc/testsuite/g++.dg/coroutines/pr94760-mismatched-traits-and-promise-prev.C
  bd516c5865d9e7ccb7376cdd2e004d0f  gcc/testsuite/g++.dg/coroutines/pr94817.C
  80f2ddf6e7fa3b7d98d16dcb37394788  gcc/testsuite/g++.dg/coroutines/pr94829.C
! ef62b6c91b84ae78415b2ba2e4047e03  gcc/testsuite/g++.dg/coroutines/pr94879-folly-1.C
! 0e8610ea1b9412eeabe69a53328bbbca  gcc/testsuite/g++.dg/coroutines/pr94883-folly-2.C
  fa1dba5da47078603d79923b5b343d43  gcc/testsuite/g++.dg/coroutines/pr94886-folly-3.C
  f41f630eebfc858cbd9471df42c4a56a  gcc/testsuite/g++.dg/coroutines/pr95050.C
  9d01ddcc0b1513ede783b802cb9b0351  gcc/testsuite/g++.dg/coroutines/pr95345.C
*************** f3711dab25fac8bb7802f39735ea954d  gcc/te
*** 14883,14893 ****
  03aa07b826568c4887ee864d32462f71  gcc/testsuite/g++.dg/coroutines/pr96251.C
  893c1e476cefb7fe09e215a6c634bb61  gcc/testsuite/g++.dg/coroutines/pr96517.C
  09ad0ccdf1203d227f2f6da85d74297c  gcc/testsuite/g++.dg/coroutines/pr96749-1.C
! c9053b02ff32311dfd9d7b646bb29551  gcc/testsuite/g++.dg/coroutines/pr96749-2.C
  0dd229753914401c8af3e84d3934dbfc  gcc/testsuite/g++.dg/coroutines/pr97438.C
  7f93d96e5cf64c45c34eb259e9bb9c11  gcc/testsuite/g++.dg/coroutines/pr97587.C
  b1fb25f5e346d416ca26445cdb59a356  gcc/testsuite/g++.dg/coroutines/pr98118.C
  13e8e708074a4e784b2756a16cffac95  gcc/testsuite/g++.dg/coroutines/pr98480.C
  e7ca2ef0f0db55f629fcfb4d4227cd60  gcc/testsuite/g++.dg/coroutines/pr99047.C
  609255984b51c63eb216d8341218b2c3  gcc/testsuite/g++.dg/coroutines/pr99575.C
  28c303ff08aa9b17dc678501b118bb0d  gcc/testsuite/g++.dg/coroutines/pr99576_1.C
--- 14898,14909 ----
  03aa07b826568c4887ee864d32462f71  gcc/testsuite/g++.dg/coroutines/pr96251.C
  893c1e476cefb7fe09e215a6c634bb61  gcc/testsuite/g++.dg/coroutines/pr96517.C
  09ad0ccdf1203d227f2f6da85d74297c  gcc/testsuite/g++.dg/coroutines/pr96749-1.C
! 5cf51403a7824807d1418e74f843f287  gcc/testsuite/g++.dg/coroutines/pr96749-2.C
  0dd229753914401c8af3e84d3934dbfc  gcc/testsuite/g++.dg/coroutines/pr97438.C
  7f93d96e5cf64c45c34eb259e9bb9c11  gcc/testsuite/g++.dg/coroutines/pr97587.C
  b1fb25f5e346d416ca26445cdb59a356  gcc/testsuite/g++.dg/coroutines/pr98118.C
  13e8e708074a4e784b2756a16cffac95  gcc/testsuite/g++.dg/coroutines/pr98480.C
+ 130388811ec68458ac2cf04b5e1843cb  gcc/testsuite/g++.dg/coroutines/pr98935.C
  e7ca2ef0f0db55f629fcfb4d4227cd60  gcc/testsuite/g++.dg/coroutines/pr99047.C
  609255984b51c63eb216d8341218b2c3  gcc/testsuite/g++.dg/coroutines/pr99575.C
  28c303ff08aa9b17dc678501b118bb0d  gcc/testsuite/g++.dg/coroutines/pr99576_1.C
*************** b980842cc9bcb2b9e860aa2e3af5dc8c  gcc/te
*** 15002,15007 ****
--- 15018,15025 ----
  880e7bddb449e36639d0b28849901bd7  gcc/testsuite/g++.dg/coroutines/torture/local-var-05-awaitable.C
  eda65f9adf2b3b0f2d16abf6d3a3472a  gcc/testsuite/g++.dg/coroutines/torture/local-var-06-structured-binding.C
  3a086507b4173f7496d1581ef7af0f41  gcc/testsuite/g++.dg/coroutines/torture/mid-suspend-destruction-0.C
+ d70e1067c46528fe83662185c66bef45  gcc/testsuite/g++.dg/coroutines/torture/pr105104.C
+ 90760c8a1f8f820b4edb0f623596ca78  gcc/testsuite/g++.dg/coroutines/torture/pr115905.C
  33c54ba08ef1e709e2fb67d90cc048b4  gcc/testsuite/g++.dg/coroutines/torture/pr92933.C
  308d14f00ca84e328c3f1e144675b59b  gcc/testsuite/g++.dg/coroutines/torture/pr95003.C
  f15d0868b7388079e03b56a95cf11a64  gcc/testsuite/g++.dg/coroutines/torture/pr95519-00-return_void.C
*************** ee83980c52efcd311fdf334e2fd23f42  gcc/te
*** 25908,25913 ****
--- 25926,25932 ----
  6b9ff4b9b47e58f0f5a801795c933b05  gcc/testsuite/g++.dg/opt/pr112374.C
  825c715cc564416b76db4cdff16d60ca  gcc/testsuite/g++.dg/opt/pr113705.C
  0324d31ab64ecdfb74347e2e96dd74d2  gcc/testsuite/g++.dg/opt/pr117439.C
+ 149c3b47d16cfa08669bf79341552440  gcc/testsuite/g++.dg/opt/pr119327.C
  2896f5b1a96dd9fabb1dbb65cb4c5921  gcc/testsuite/g++.dg/opt/pr13066-1.C
  4f87f86b9f018cae74888e97468b2fe0  gcc/testsuite/g++.dg/opt/pr14029.C
  8fb7e68e9e9b5eb02628e03f5333e645  gcc/testsuite/g++.dg/opt/pr14888.C
*************** c516af6d3dbacce330102f6926ee7107  gcc/te
*** 28289,28294 ****
--- 28308,28314 ----
  2272cd92b5c114b457626eb6e3f44b3c  gcc/testsuite/g++.dg/template/explicit-instantiation5.C
  c6a14388529e88398ceff5e475585175  gcc/testsuite/g++.dg/template/explicit-instantiation6.C
  edbb068b5e160bf72ca66e43d8adde70  gcc/testsuite/g++.dg/template/explicit-instantiation7.C
+ cd59b83738231d65f6e81bfdcafe5ed8  gcc/testsuite/g++.dg/template/explicit-instantiation8.C
  610a5ce174887479710ddef7e050b0e9  gcc/testsuite/g++.dg/template/explicit1.C
  44f3a8f925589bae9dc773b19a3fd2de  gcc/testsuite/g++.dg/template/explicit2.C
  3b0207ca15de6320946949f657d95b9a  gcc/testsuite/g++.dg/template/explicit3.C
*************** ea93675f26568f57c77e075dbc9a1f3b  gcc/te
*** 29536,29541 ****
--- 29556,29562 ----
  f052d3af1586cf42bf5ec8d92e1621ac  gcc/testsuite/g++.dg/torture/pr116927-1.C
  372a5372bc2611240b35fde2512f27e9  gcc/testsuite/g++.dg/torture/pr118320.C
  f298eddbaaad3dfdc15f6cf9683ff08a  gcc/testsuite/g++.dg/torture/pr11911.C
+ 9df51f0b5a7e716286f2e97dfd28d477  gcc/testsuite/g++.dg/torture/pr119610.C
  9cede7e8b587157ccdf0f9f6667d6cc8  gcc/testsuite/g++.dg/torture/pr119778.C
  161154ed9f6193a2a7da119e068c3f3f  gcc/testsuite/g++.dg/torture/pr27218.C
  a84e9fff95df4801f8e582fbc33303b8  gcc/testsuite/g++.dg/torture/pr30252.C
*************** f3ce91773bd0b4a3127c481ccd50f20e  gcc/te
*** 34942,34947 ****
--- 34963,34969 ----
  ab6c5e333d0a740ae5ecff69966813a2  gcc/testsuite/g++.target/aarch64/sve/min_1.C
  6bb662ee32d75fad86cbbcc07aab9998  gcc/testsuite/g++.target/aarch64/sve/pr102252.C
  0dc60096927b240a4fb696311ad6b402  gcc/testsuite/g++.target/aarch64/sve/pr107920.C
+ a36c6629cdaa92f5a41aa0c862cf5a54  gcc/testsuite/g++.target/aarch64/sve/pr119610-sve.C
  a99137b765de9aa71ce57dc37592e682  gcc/testsuite/g++.target/aarch64/sve/pr119706.C
  29fcc7f7695fcab2e4779698100f3053  gcc/testsuite/g++.target/aarch64/sve/pr96974.C
  6c0e94c363caf9e62df35ea98b4918ed  gcc/testsuite/g++.target/aarch64/sve/pr98177-1.C
*************** f22c386d32e16704e73e0ad284bf1ad1  gcc/te
*** 46304,46320 ****
  4644aff4e3d9b41ef0b44eb441b3e574  gcc/testsuite/gcc.dg/plugin/known-fns-1.c
  d3e84ae842f69911a3ac0ceb96542627  gcc/testsuite/gcc.dg/plugin/location-overflow-test-1.c
  b584a46252319e63ce8a18cd3d89f07c  gcc/testsuite/gcc.dg/plugin/location-overflow-test-2.c
  502e1f072faf23c44132129d5a080fdb  gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr83173-1.h
  8bc743f30102ffbfb1bc6a409fc63a2e  gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr83173-2.h
  6d6028de00b79eb5be6f42b7a4332c90  gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr83173.c
  96ff609825b6520f9e9cc6f866930933  gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr83173.h
! 7ed2331e1a7f3114d7589d237e39abde  gcc/testsuite/gcc.dg/plugin/location_overflow_plugin.c
  c323b7b4ac0cf2caa641c6bb31350375  gcc/testsuite/gcc.dg/plugin/must-tail-call-1.c
  de7a6b85ff1667e6ef4b89117e774f2d  gcc/testsuite/gcc.dg/plugin/must-tail-call-2.c
  4905199fc259967af414db22821f7f74  gcc/testsuite/gcc.dg/plugin/must_tail_call_plugin.c
  adbc6d60d6e1474ca93af3b50208e741  gcc/testsuite/gcc.dg/plugin/one_time-test-1.c
  91500c30c78de7048ecb72b86a431e80  gcc/testsuite/gcc.dg/plugin/one_time_plugin.c
! 77079e24bd64da7841a69b1545b100bc  gcc/testsuite/gcc.dg/plugin/plugin.exp
  10b87cc378ff8b6e30ae77af8c669e4b  gcc/testsuite/gcc.dg/plugin/plugindir1.c
  770fbe5bf2a65884c6120dab4b13a1d4  gcc/testsuite/gcc.dg/plugin/plugindir2.c
  5be673fb13573d3689c3cc3dff9f5a2e  gcc/testsuite/gcc.dg/plugin/plugindir3.c
--- 46326,46348 ----
  4644aff4e3d9b41ef0b44eb441b3e574  gcc/testsuite/gcc.dg/plugin/known-fns-1.c
  d3e84ae842f69911a3ac0ceb96542627  gcc/testsuite/gcc.dg/plugin/location-overflow-test-1.c
  b584a46252319e63ce8a18cd3d89f07c  gcc/testsuite/gcc.dg/plugin/location-overflow-test-2.c
+ 9e170fe1467d0a1b2ec0d3baf50cff4b  gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr116047-1.h
+ 668a3b5ad920346b135fa852ca249d17  gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr116047-2.h
+ cdda437331cf2936d974619d7e527746  gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr116047.c
+ 6a52c4783a498c1b2c1277c4196e9800  gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr120061-1.h
+ 668a3b5ad920346b135fa852ca249d17  gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr120061-2.h
+ d599542d2bc9679a29260101b5c82178  gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr120061.c
  502e1f072faf23c44132129d5a080fdb  gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr83173-1.h
  8bc743f30102ffbfb1bc6a409fc63a2e  gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr83173-2.h
  6d6028de00b79eb5be6f42b7a4332c90  gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr83173.c
  96ff609825b6520f9e9cc6f866930933  gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr83173.h
! f5b8daff012339a15462d549e5dbbb70  gcc/testsuite/gcc.dg/plugin/location_overflow_plugin.c
  c323b7b4ac0cf2caa641c6bb31350375  gcc/testsuite/gcc.dg/plugin/must-tail-call-1.c
  de7a6b85ff1667e6ef4b89117e774f2d  gcc/testsuite/gcc.dg/plugin/must-tail-call-2.c
  4905199fc259967af414db22821f7f74  gcc/testsuite/gcc.dg/plugin/must_tail_call_plugin.c
  adbc6d60d6e1474ca93af3b50208e741  gcc/testsuite/gcc.dg/plugin/one_time-test-1.c
  91500c30c78de7048ecb72b86a431e80  gcc/testsuite/gcc.dg/plugin/one_time_plugin.c
! d2674a48a3d9741ec78583398a05bc4c  gcc/testsuite/gcc.dg/plugin/plugin.exp
  10b87cc378ff8b6e30ae77af8c669e4b  gcc/testsuite/gcc.dg/plugin/plugindir1.c
  770fbe5bf2a65884c6120dab4b13a1d4  gcc/testsuite/gcc.dg/plugin/plugindir2.c
  5be673fb13573d3689c3cc3dff9f5a2e  gcc/testsuite/gcc.dg/plugin/plugindir3.c
*************** fd22cdc8f5c1d5a0506c32e0942e724b  gcc/te
*** 46862,46867 ****
--- 46890,46896 ----
  a3d075dd1b96232581aa40c9e02294e1  gcc/testsuite/gcc.dg/pr119151.c
  23b8c99f9e2dfda91a95f1195ab38bfd  gcc/testsuite/gcc.dg/pr119183.c
  5b4015cb994569a43c505c35b96cda44  gcc/testsuite/gcc.dg/pr119204.c
+ 212cef6b05e312dbd1f377cf4e35ab99  gcc/testsuite/gcc.dg/pr120048.c
  bc5ddfbbc46f4e0cce1629d1b58d3090  gcc/testsuite/gcc.dg/pr12603.c
  72a2fca76cb69617ae36bab93c7ec0d7  gcc/testsuite/gcc.dg/pr12625-1.c
  6f0ef61e5a12db5f11da839b2988c5e1  gcc/testsuite/gcc.dg/pr13519-1.c
*************** f3f24420449914a2a57bd3e42094bc9b  gcc/te
*** 84171,84176 ****
--- 84200,84206 ----
  ba1541c5643b49009111f281b45d0132  gcc/testsuite/gcc.target/riscv/rvv/autovec/pr118154-2.c
  b383a140231f763cc0d532c0ed651bc9  gcc/testsuite/gcc.target/riscv/rvv/autovec/pr118182-1.c
  f390f96b1df1b9e69ecc684e7ac631c6  gcc/testsuite/gcc.target/riscv/rvv/autovec/pr118182-2.c
+ 1064dbbae3b2f7e04909839e8152b061  gcc/testsuite/gcc.target/riscv/rvv/autovec/pr118950.c
  ee8bcba5f6876f2027f0f263f81465aa  gcc/testsuite/gcc.target/riscv/rvv/autovec/reduc/extract_last-1.c
  7ff884bfa2e6cf9bc4c6172466538515  gcc/testsuite/gcc.target/riscv/rvv/autovec/reduc/extract_last-10.c
  b2792e9264dcd6fa2e88f495d51677e6  gcc/testsuite/gcc.target/riscv/rvv/autovec/reduc/extract_last-11.c
*************** f01f6a92460103019cb9d3f27c479ef9  gcc/te
*** 104564,104569 ****
--- 104594,104604 ----
  b143f8a11acbf26720d0836e04874836  gcc/testsuite/gnat.dg/opt105.adb
  43266125cef592b6eaa7a9074c70ea58  gcc/testsuite/gnat.dg/opt105_pkg.adb
  ef6aab3ddf23751e6c8af372ba52012c  gcc/testsuite/gnat.dg/opt105_pkg.ads
+ 1962ea0f694c7aaf1ff3137c189868f8  gcc/testsuite/gnat.dg/opt106.adb
+ f8a43d7dd54caabde100374f7144dfc3  gcc/testsuite/gnat.dg/opt106_pkg1.adb
+ ab899fc6f72925f8084209d5187582d5  gcc/testsuite/gnat.dg/opt106_pkg1.ads
+ acc696967fd0d2302cfab5304ee3a970  gcc/testsuite/gnat.dg/opt106_pkg2.adb
+ e4a127b46129811de1774562e29fb8fc  gcc/testsuite/gnat.dg/opt106_pkg2.ads
  5d50fb38b1ab84c39760906cb103c522  gcc/testsuite/gnat.dg/opt10_pkg.ads
  603264d4afdd2fd2174ea9c4cf4653ed  gcc/testsuite/gnat.dg/opt11.adb
  53160585b3a5d820b653e1e0d5f14c75  gcc/testsuite/gnat.dg/opt11.ads
*************** f0c469a9020851b9e5f01ec926b1d640  gcc/tr
*** 110201,110207 ****
  76ef7a403eba76cb39fe06d695ab266a  gcc/tree-ssa-address.cc
  a35227be3c2b85c69d7e31275f1f7092  gcc/tree-ssa-address.h
  6de3a86e4726e592336120d653bc7a9a  gcc/tree-ssa-alias-compare.h
! cdc64e9194ff51863611e8090fbb5846  gcc/tree-ssa-alias.cc
  f77037d285f3ce285e41e6d91e5e482f  gcc/tree-ssa-alias.h
  069fe336c8cbda10fd3dbda8899deb7a  gcc/tree-ssa-ccp.cc
  be2ddd67b1fc2c7baf9c618d285adce3  gcc/tree-ssa-ccp.h
--- 110236,110242 ----
  76ef7a403eba76cb39fe06d695ab266a  gcc/tree-ssa-address.cc
  a35227be3c2b85c69d7e31275f1f7092  gcc/tree-ssa-address.h
  6de3a86e4726e592336120d653bc7a9a  gcc/tree-ssa-alias-compare.h
! cd0d0f6287362974306f9d433bb2401f  gcc/tree-ssa-alias.cc
  f77037d285f3ce285e41e6d91e5e482f  gcc/tree-ssa-alias.h
  069fe336c8cbda10fd3dbda8899deb7a  gcc/tree-ssa-ccp.cc
  be2ddd67b1fc2c7baf9c618d285adce3  gcc/tree-ssa-ccp.h
*************** ff0ac55bde82f5e21ae65ccdbf2e13f2  gcc/tr
*** 110278,110284 ****
  baa0d7c2a79888b8d490ef9ea9bf876b  gcc/tree-vect-generic.cc
  a5c65c0281a1b6faf6652682936ae74e  gcc/tree-vect-loop-manip.cc
  b007b2d97ecc0ea9c1d6d6f84e9ebbeb  gcc/tree-vect-loop.cc
! 7ab93074a98aa287ba55a5656cd28374  gcc/tree-vect-patterns.cc
  7d8505e37be0d60874402ed24f0b78ff  gcc/tree-vect-slp-patterns.cc
  62afed2a3920f38b0d29565df04b36c8  gcc/tree-vect-slp.cc
  fdda4ebc0219dbf056f89bcd39de70d3  gcc/tree-vect-stmts.cc
--- 110313,110319 ----
  baa0d7c2a79888b8d490ef9ea9bf876b  gcc/tree-vect-generic.cc
  a5c65c0281a1b6faf6652682936ae74e  gcc/tree-vect-loop-manip.cc
  b007b2d97ecc0ea9c1d6d6f84e9ebbeb  gcc/tree-vect-loop.cc
! 43f6f3fee20eb715fd451bf19e9bfd4c  gcc/tree-vect-patterns.cc
  7d8505e37be0d60874402ed24f0b78ff  gcc/tree-vect-slp-patterns.cc
  62afed2a3920f38b0d29565df04b36c8  gcc/tree-vect-slp.cc
  fdda4ebc0219dbf056f89bcd39de70d3  gcc/tree-vect-stmts.cc
*************** bb8d04c4e68c6b4518199de46e56faeb  gcc/ve
*** 110329,110335 ****
  ad835c61b5aa28c3f501e0b335cfd8b7  gcc/vector-builder.h
  e9e81f6468a4d8def6380d5c73383508  gcc/vmsdbg.h
  46441fdd05b5cf12c9c2b11ce1a04f46  gcc/vmsdbgout.cc
! 499cbc0538e5c2d65f5c143c86b59213  gcc/vr-values.cc
  e460830a86e9a9a754fcdc3352b86ed6  gcc/vr-values.h
  ff26c41ea07360558ce5b1efed5c5d8a  gcc/vtable-verify.cc
  531ee320a86188a0112184274dc1b80b  gcc/vtable-verify.h
--- 110364,110370 ----
  ad835c61b5aa28c3f501e0b335cfd8b7  gcc/vector-builder.h
  e9e81f6468a4d8def6380d5c73383508  gcc/vmsdbg.h
  46441fdd05b5cf12c9c2b11ce1a04f46  gcc/vmsdbgout.cc
! db1117500a0d39905f6f00accd6e0282  gcc/vr-values.cc
  e460830a86e9a9a754fcdc3352b86ed6  gcc/vr-values.h
  ff26c41ea07360558ce5b1efed5c5d8a  gcc/vtable-verify.cc
  531ee320a86188a0112184274dc1b80b  gcc/vtable-verify.h
*************** cffdeae41b78da05839b193e90188f55  libcod
*** 110617,110623 ****
  6419dfc879387358e95288142e569914  libcody/packet.cc
  688ece05c8b9d378b3df186808162e76  libcody/resolver.cc
  b1f3850fc5ac62999d1e124aa6f76531  libcody/server.cc
! f07b9ca908418449940ef6144f72cda3  libcpp/ChangeLog
  2bd831b17997584e38305782cebe6948  libcpp/ChangeLog.jit
  1acbb917a57e9be62e9a35a2b8843ec3  libcpp/Makefile.in
  b07c7863f0e7ad4e6a0915d66fc9e582  libcpp/aclocal.m4
--- 110652,110658 ----
  6419dfc879387358e95288142e569914  libcody/packet.cc
  688ece05c8b9d378b3df186808162e76  libcody/resolver.cc
  b1f3850fc5ac62999d1e124aa6f76531  libcody/server.cc
! 993c513edb738594f87023bf9b636902  libcpp/ChangeLog
  2bd831b17997584e38305782cebe6948  libcpp/ChangeLog.jit
  1acbb917a57e9be62e9a35a2b8843ec3  libcpp/Makefile.in
  b07c7863f0e7ad4e6a0915d66fc9e582  libcpp/aclocal.m4
*************** b07c7863f0e7ad4e6a0915d66fc9e582  libcpp
*** 110629,110635 ****
  ff89722b7f828d03d9b7e6604b48f705  libcpp/directives.cc
  4a17617515d4961fd96609af51d900fe  libcpp/errors.cc
  d7920f5045b616b678bf06a6b0ca888e  libcpp/expr.cc
! 33f2a754d8fd0e4257ce830260886014  libcpp/files.cc
  4c23b9e82ca01448b18f7ac4c9e8058c  libcpp/generated_cpp_wcwidth.h
  7fc584598464f2c3aa397e7fec90dccf  libcpp/identifiers.cc
  288c3178bd1e0b81deb8cc4c93fbf099  libcpp/include/cpplib.h
--- 110664,110670 ----
  ff89722b7f828d03d9b7e6604b48f705  libcpp/directives.cc
  4a17617515d4961fd96609af51d900fe  libcpp/errors.cc
  d7920f5045b616b678bf06a6b0ca888e  libcpp/expr.cc
! 3c84272668a840aca2af8488e3667a5a  libcpp/files.cc
  4c23b9e82ca01448b18f7ac4c9e8058c  libcpp/generated_cpp_wcwidth.h
  7fc584598464f2c3aa397e7fec90dccf  libcpp/identifiers.cc
  288c3178bd1e0b81deb8cc4c93fbf099  libcpp/include/cpplib.h
*************** f6265ed339cae65c8b044bbb21d283b4  libcpp
*** 110640,110646 ****
  1fd31f0e6458a730ee43a6f6c7f06571  libcpp/init.cc
  cc012cd95bd1c909ce999456a16ab01c  libcpp/internal.h
  24606cb643c2f881e28b32f45c3d07d1  libcpp/lex.cc
! 7901306f3f55e17c3cb29685e44e2dd6  libcpp/line-map.cc
  46a07100f95f5e354c7e25cd19d26884  libcpp/location-example.txt
  01c3a45d6e866221d817655f5a80e227  libcpp/macro.cc
  3edc80e88fde4a216d7436d2ecb158af  libcpp/makeucnid.cc
--- 110675,110681 ----
  1fd31f0e6458a730ee43a6f6c7f06571  libcpp/init.cc
  cc012cd95bd1c909ce999456a16ab01c  libcpp/internal.h
  24606cb643c2f881e28b32f45c3d07d1  libcpp/lex.cc
! 32d9ae16ae2d390a3a20be3480f9cdbc  libcpp/line-map.cc
  46a07100f95f5e354c7e25cd19d26884  libcpp/location-example.txt
  01c3a45d6e866221d817655f5a80e227  libcpp/macro.cc
  3edc80e88fde4a216d7436d2ecb158af  libcpp/makeucnid.cc
*************** d828e38384c506bf5e7d5a3c02725a37  libssp
*** 123527,123533 ****
  7bb3c32ba0a48d1cf785305e1b783eb6  libssp/strncpy-chk.c
  a19c79c1d86436e86b0fee41e6cf6b15  libssp/vsnprintf-chk.c
  145156e880b03115b393070d0ed37be3  libssp/vsprintf-chk.c
! 663f0da2438793a8bb38e68ff50dcd98  libstdc++-v3/ChangeLog
  7aa6c40440a44fcf5ec94c066160c2f8  libstdc++-v3/ChangeLog-1998
  7aff86600b6a1ed3fa87305075a92db0  libstdc++-v3/ChangeLog-1999
  a6f28e8fc9bb07696a9e068b439a3a87  libstdc++-v3/ChangeLog-2000
--- 123562,123568 ----
  7bb3c32ba0a48d1cf785305e1b783eb6  libssp/strncpy-chk.c
  a19c79c1d86436e86b0fee41e6cf6b15  libssp/vsnprintf-chk.c
  145156e880b03115b393070d0ed37be3  libssp/vsprintf-chk.c
! f10c9a63cdc70f56f6f16a0c40804d1d  libstdc++-v3/ChangeLog
  7aa6c40440a44fcf5ec94c066160c2f8  libstdc++-v3/ChangeLog-1998
  7aff86600b6a1ed3fa87305075a92db0  libstdc++-v3/ChangeLog-1999
  a6f28e8fc9bb07696a9e068b439a3a87  libstdc++-v3/ChangeLog-2000
*************** de9d16c58c0525a3af601dd8a558357a  libstd
*** 124935,124941 ****
  d2516f1592a95141d667a726c219a5b8  libstdc++-v3/include/std/list
  49f6e0e6000077ee2b3f2633f47e4925  libstdc++-v3/include/std/locale
  2d8375c801ecdd87116fe153d972e927  libstdc++-v3/include/std/map
! b1f89a49d34ca9aa81fe4ddc52e67b5a  libstdc++-v3/include/std/memory
  b95756c8b75f0ba0696fe0d53e25c2c8  libstdc++-v3/include/std/memory_resource
  41cd6b791822b87ce3f2e3e2bc0d425d  libstdc++-v3/include/std/mutex
  b162db38fed9250df89cd38bf8a9f2a9  libstdc++-v3/include/std/numbers
--- 124970,124976 ----
  d2516f1592a95141d667a726c219a5b8  libstdc++-v3/include/std/list
  49f6e0e6000077ee2b3f2633f47e4925  libstdc++-v3/include/std/locale
  2d8375c801ecdd87116fe153d972e927  libstdc++-v3/include/std/map
! 7d840f2456c0d2a16866065760922b47  libstdc++-v3/include/std/memory
  b95756c8b75f0ba0696fe0d53e25c2c8  libstdc++-v3/include/std/memory_resource
  41cd6b791822b87ce3f2e3e2bc0d425d  libstdc++-v3/include/std/mutex
  b162db38fed9250df89cd38bf8a9f2a9  libstdc++-v3/include/std/numbers
*************** dd5a0f9343939d245f3aaedf9400dfeb  libstd
*** 126063,126069 ****
  8b53fa85edafd52c50395631802734a2  libstdc++-v3/testsuite/20_util/headers/memory/114866.cc
  39f3dfbffe021c3d53b6d1f4ae51f8c5  libstdc++-v3/testsuite/20_util/headers/memory/synopsis.cc
  78e045976302605b440747c3bc55acc1  libstdc++-v3/testsuite/20_util/headers/memory/types_std_c++0x.cc
! ab228be36ab386f60d442030820f1348  libstdc++-v3/testsuite/20_util/headers/memory/version.cc
  0f1c7bc346a9c0c3cd16287166acf9da  libstdc++-v3/testsuite/20_util/headers/type_traits/std_c++0x_neg.cc
  5ec07052daaaf3291a88f0c4a2c8ab25  libstdc++-v3/testsuite/20_util/headers/type_traits/types_std_c++0x.cc
  288193ad5fa101b699095fa309756d94  libstdc++-v3/testsuite/20_util/headers/type_traits/types_std_c++0x_neg.cc
--- 126098,126104 ----
  8b53fa85edafd52c50395631802734a2  libstdc++-v3/testsuite/20_util/headers/memory/114866.cc
  39f3dfbffe021c3d53b6d1f4ae51f8c5  libstdc++-v3/testsuite/20_util/headers/memory/synopsis.cc
  78e045976302605b440747c3bc55acc1  libstdc++-v3/testsuite/20_util/headers/memory/types_std_c++0x.cc
! 8492f2875030a6b25ae26cf2bfe312d2  libstdc++-v3/testsuite/20_util/headers/memory/version.cc
  0f1c7bc346a9c0c3cd16287166acf9da  libstdc++-v3/testsuite/20_util/headers/type_traits/std_c++0x_neg.cc
  5ec07052daaaf3291a88f0c4a2c8ab25  libstdc++-v3/testsuite/20_util/headers/type_traits/types_std_c++0x.cc
  288193ad5fa101b699095fa309756d94  libstdc++-v3/testsuite/20_util/headers/type_traits/types_std_c++0x_neg.cc
diff -Nrcpad gcc-14-20250502/gcc/ChangeLog gcc-14-20250509/gcc/ChangeLog
*** gcc-14-20250502/gcc/ChangeLog	Fri May  2 22:32:15 2025
--- gcc-14-20250509/gcc/ChangeLog	Fri May  9 22:32:10 2025
***************
*** 1,3 ****
--- 1,57 ----
+ 2025-05-08  Richard Sandiford  <richard.sandiford@arm.com>
+ 
+ 	Backported from master:
+ 	2025-04-24  Richard Sandiford  <richard.sandiford@arm.com>
+ 
+ 	PR target/119610
+ 	* config/aarch64/aarch64.cc (aarch64_allocate_and_probe_stack_space):
+ 	Add a bytes_below_sp parameter and use it to calculate the CFA
+ 	offsets.  Attach the first SVE CFA note to the move into the
+ 	associated temporary register.
+ 	(aarch64_allocate_and_probe_stack_space): Update calls accordingly.
+ 	Start out with bytes_per_sp set to the frame size and decrement
+ 	it after each allocation.
+ 
+ 2025-05-08  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	Backported from master:
+ 	2025-04-22  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR target/119327
+ 	* config/rs6000/rs6000.cc (rs6000_can_inline_p): Ignore also
+ 	OPTION_MASK_SAVE_TOC_INDIRECT differences.
+ 
+ 2025-05-07  Robin Dapp  <rdapp@ventanamicro.com>
+ 
+ 	Backported from master:
+ 	2025-02-24  Robin Dapp  <rdapp@ventanamicro.com>
+ 
+ 	PR middle-end/118950
+ 	* tree-vect-patterns.cc (vect_recog_gather_scatter_pattern): Use
+ 	original LHS's type.
+ 
+ 2025-05-06  Andrew MacLeod  <amacleod@redhat.com>
+ 
+ 	PR tree-optimization/120048
+ 	* ipa-cp.cc (ipcp_store_vr_results): Check for UNDEFINED.
+ 
+ 2025-05-05  Arsen Arsenović  <arsen@aarsen.me>
+ 
+ 	Backported from master:
+ 	2024-09-04  Arsen Arsenović  <arsen@aarsen.me>
+ 
+ 	PR c++/106973
+ 	* internal-fn.def (CO_YIELD): Mark as ECF_LEAF.
+ 
+ 2025-05-05  Arsen Arsenović  <arsen@aarsen.me>
+ 
+ 	Backported from master:
+ 	2024-08-29  Arsen Arsenović  <arsen@aarsen.me>
+ 
+ 	PR c++/105104
+ 	* coroutine-passes.cc (execute_early_expand_coro_ifns): Don't
+ 	remove any labels.
+ 
  2025-05-01  Iain Sandoe  <iain@sandoe.co.uk>
  
  	Backported from master:
diff -Nrcpad gcc-14-20250502/gcc/DATESTAMP gcc-14-20250509/gcc/DATESTAMP
*** gcc-14-20250502/gcc/DATESTAMP	Fri May  2 22:32:15 2025
--- gcc-14-20250509/gcc/DATESTAMP	Fri May  9 22:32:11 2025
***************
*** 1 ****
! 20250502
--- 1 ----
! 20250509
diff -Nrcpad gcc-14-20250502/gcc/config/aarch64/aarch64.cc gcc-14-20250509/gcc/config/aarch64/aarch64.cc
*** gcc-14-20250502/gcc/config/aarch64/aarch64.cc	Fri May  2 22:32:16 2025
--- gcc-14-20250509/gcc/config/aarch64/aarch64.cc	Fri May  9 22:32:11 2025
*************** aarch64_emit_stack_tie (rtx reg)
*** 9126,9138 ****
  }
  
  /* Allocate POLY_SIZE bytes of stack space using TEMP1 and TEMP2 as scratch
!    registers.  If POLY_SIZE is not large enough to require a probe this function
!    will only adjust the stack.  When allocating the stack space
!    FRAME_RELATED_P is then used to indicate if the allocation is frame related.
!    FINAL_ADJUSTMENT_P indicates whether we are allocating the area below
!    the saved registers.  If we are then we ensure that any allocation
!    larger than the ABI defined buffer needs a probe so that the
!    invariant of having a 1KB buffer is maintained.
  
     We emit barriers after each stack adjustment to prevent optimizations from
     breaking the invariant that we never drop the stack more than a page.  This
--- 9126,9141 ----
  }
  
  /* Allocate POLY_SIZE bytes of stack space using TEMP1 and TEMP2 as scratch
!    registers, given that the stack pointer is currently BYTES_BELOW_SP bytes
!    above the bottom of the static frame.
! 
!    If POLY_SIZE is not large enough to require a probe this function will only
!    adjust the stack.  When allocating the stack space FRAME_RELATED_P is then
!    used to indicate if the allocation is frame related.  FINAL_ADJUSTMENT_P
!    indicates whether we are allocating the area below the saved registers.
!    If we are then we ensure that any allocation larger than the ABI defined
!    buffer needs a probe so that the invariant of having a 1KB buffer is
!    maintained.
  
     We emit barriers after each stack adjustment to prevent optimizations from
     breaking the invariant that we never drop the stack more than a page.  This
*************** aarch64_emit_stack_tie (rtx reg)
*** 9149,9154 ****
--- 9152,9158 ----
  static void
  aarch64_allocate_and_probe_stack_space (rtx temp1, rtx temp2,
  					poly_int64 poly_size,
+ 					poly_int64 bytes_below_sp,
  					aarch64_feature_flags force_isa_mode,
  					bool frame_related_p,
  					bool final_adjustment_p)
*************** aarch64_allocate_and_probe_stack_space (
*** 9212,9219 ****
  			  poly_size, temp1, temp2, force_isa_mode,
  			  false, true);
  
!       rtx_insn *insn = get_last_insn ();
! 
        if (frame_related_p)
  	{
  	  /* This is done to provide unwinding information for the stack
--- 9216,9223 ----
  			  poly_size, temp1, temp2, force_isa_mode,
  			  false, true);
  
!       auto initial_cfa_offset = frame.frame_size - bytes_below_sp;
!       auto final_cfa_offset = initial_cfa_offset + poly_size;
        if (frame_related_p)
  	{
  	  /* This is done to provide unwinding information for the stack
*************** aarch64_allocate_and_probe_stack_space (
*** 9223,9250 ****
  	     The tie will expand to nothing but the optimizers will not touch
  	     the instruction.  */
  	  rtx stack_ptr_copy = gen_rtx_REG (Pmode, STACK_CLASH_SVE_CFA_REGNUM);
! 	  emit_move_insn (stack_ptr_copy, stack_pointer_rtx);
  	  aarch64_emit_stack_tie (stack_ptr_copy);
  
  	  /* We want the CFA independent of the stack pointer for the
  	     duration of the loop.  */
! 	  add_reg_note (insn, REG_CFA_DEF_CFA, stack_ptr_copy);
  	  RTX_FRAME_RELATED_P (insn) = 1;
  	}
  
        rtx probe_const = gen_int_mode (min_probe_threshold, Pmode);
        rtx guard_const = gen_int_mode (guard_size, Pmode);
  
!       insn = emit_insn (gen_probe_sve_stack_clash (Pmode, stack_pointer_rtx,
! 						   stack_pointer_rtx, temp1,
! 						   probe_const, guard_const));
  
        /* Now reset the CFA register if needed.  */
        if (frame_related_p)
  	{
  	  add_reg_note (insn, REG_CFA_DEF_CFA,
! 			gen_rtx_PLUS (Pmode, stack_pointer_rtx,
! 				      gen_int_mode (poly_size, Pmode)));
  	  RTX_FRAME_RELATED_P (insn) = 1;
  	}
  
--- 9227,9257 ----
  	     The tie will expand to nothing but the optimizers will not touch
  	     the instruction.  */
  	  rtx stack_ptr_copy = gen_rtx_REG (Pmode, STACK_CLASH_SVE_CFA_REGNUM);
! 	  auto *insn = emit_move_insn (stack_ptr_copy, stack_pointer_rtx);
  	  aarch64_emit_stack_tie (stack_ptr_copy);
  
  	  /* We want the CFA independent of the stack pointer for the
  	     duration of the loop.  */
! 	  add_reg_note (insn, REG_CFA_DEF_CFA,
! 			plus_constant (Pmode, stack_ptr_copy,
! 				       initial_cfa_offset));
  	  RTX_FRAME_RELATED_P (insn) = 1;
  	}
  
        rtx probe_const = gen_int_mode (min_probe_threshold, Pmode);
        rtx guard_const = gen_int_mode (guard_size, Pmode);
  
!       auto *insn
! 	= emit_insn (gen_probe_sve_stack_clash (Pmode, stack_pointer_rtx,
! 						stack_pointer_rtx, temp1,
! 						probe_const, guard_const));
  
        /* Now reset the CFA register if needed.  */
        if (frame_related_p)
  	{
  	  add_reg_note (insn, REG_CFA_DEF_CFA,
! 			plus_constant (Pmode, stack_pointer_rtx,
! 				       final_cfa_offset));
  	  RTX_FRAME_RELATED_P (insn) = 1;
  	}
  
*************** aarch64_allocate_and_probe_stack_space (
*** 9290,9301 ****
  	 We can determine which allocation we are doing by looking at
  	 the value of FRAME_RELATED_P since the final allocations are not
  	 frame related.  */
        if (frame_related_p)
  	{
  	  /* We want the CFA independent of the stack pointer for the
  	     duration of the loop.  */
  	  add_reg_note (insn, REG_CFA_DEF_CFA,
! 			plus_constant (Pmode, temp1, rounded_size));
  	  RTX_FRAME_RELATED_P (insn) = 1;
  	}
  
--- 9297,9309 ----
  	 We can determine which allocation we are doing by looking at
  	 the value of FRAME_RELATED_P since the final allocations are not
  	 frame related.  */
+       auto cfa_offset = frame.frame_size - (bytes_below_sp - rounded_size);
        if (frame_related_p)
  	{
  	  /* We want the CFA independent of the stack pointer for the
  	     duration of the loop.  */
  	  add_reg_note (insn, REG_CFA_DEF_CFA,
! 			plus_constant (Pmode, temp1, cfa_offset));
  	  RTX_FRAME_RELATED_P (insn) = 1;
  	}
  
*************** aarch64_allocate_and_probe_stack_space (
*** 9317,9323 ****
        if (frame_related_p)
  	{
  	  add_reg_note (insn, REG_CFA_DEF_CFA,
! 			plus_constant (Pmode, stack_pointer_rtx, rounded_size));
  	  RTX_FRAME_RELATED_P (insn) = 1;
  	}
  
--- 9325,9331 ----
        if (frame_related_p)
  	{
  	  add_reg_note (insn, REG_CFA_DEF_CFA,
! 			plus_constant (Pmode, stack_pointer_rtx, cfa_offset));
  	  RTX_FRAME_RELATED_P (insn) = 1;
  	}
  
*************** aarch64_expand_prologue (void)
*** 9625,9641 ****
       code below does not handle it for -fstack-clash-protection.  */
    gcc_assert (known_eq (initial_adjust, 0) || callee_adjust == 0);
  
    /* Will only probe if the initial adjustment is larger than the guard
       less the amount of the guard reserved for use by the caller's
       outgoing args.  */
    aarch64_allocate_and_probe_stack_space (tmp0_rtx, tmp1_rtx, initial_adjust,
! 					  force_isa_mode, true, false);
  
    if (callee_adjust != 0)
!     aarch64_push_regs (reg1, reg2, callee_adjust);
! 
!   /* The offset of the current SP from the bottom of the static frame.  */
!   poly_int64 bytes_below_sp = frame_size - initial_adjust - callee_adjust;
  
    if (emit_frame_chain)
      {
--- 9633,9654 ----
       code below does not handle it for -fstack-clash-protection.  */
    gcc_assert (known_eq (initial_adjust, 0) || callee_adjust == 0);
  
+   /* The offset of the current SP from the bottom of the static frame.  */
+   poly_int64 bytes_below_sp = frame_size;
+ 
    /* Will only probe if the initial adjustment is larger than the guard
       less the amount of the guard reserved for use by the caller's
       outgoing args.  */
    aarch64_allocate_and_probe_stack_space (tmp0_rtx, tmp1_rtx, initial_adjust,
! 					  bytes_below_sp, force_isa_mode,
! 					  true, false);
!   bytes_below_sp -= initial_adjust;
  
    if (callee_adjust != 0)
!     {
!       aarch64_push_regs (reg1, reg2, callee_adjust);
!       bytes_below_sp -= callee_adjust;
!     }
  
    if (emit_frame_chain)
      {
*************** aarch64_expand_prologue (void)
*** 9703,9709 ****
  		  || known_eq (frame.reg_offset[VG_REGNUM], bytes_below_sp));
        aarch64_allocate_and_probe_stack_space (tmp1_rtx, tmp0_rtx,
  					      sve_callee_adjust,
! 					      force_isa_mode,
  					      !frame_pointer_needed, false);
        bytes_below_sp -= sve_callee_adjust;
      }
--- 9716,9722 ----
  		  || known_eq (frame.reg_offset[VG_REGNUM], bytes_below_sp));
        aarch64_allocate_and_probe_stack_space (tmp1_rtx, tmp0_rtx,
  					      sve_callee_adjust,
! 					      bytes_below_sp, force_isa_mode,
  					      !frame_pointer_needed, false);
        bytes_below_sp -= sve_callee_adjust;
      }
*************** aarch64_expand_prologue (void)
*** 9714,9723 ****
  
    /* We may need to probe the final adjustment if it is larger than the guard
       that is assumed by the called.  */
-   gcc_assert (known_eq (bytes_below_sp, final_adjust));
    aarch64_allocate_and_probe_stack_space (tmp1_rtx, tmp0_rtx, final_adjust,
! 					  force_isa_mode,
  					  !frame_pointer_needed, true);
    if (emit_frame_chain && maybe_ne (final_adjust, 0))
      aarch64_emit_stack_tie (hard_frame_pointer_rtx);
  
--- 9727,9737 ----
  
    /* We may need to probe the final adjustment if it is larger than the guard
       that is assumed by the called.  */
    aarch64_allocate_and_probe_stack_space (tmp1_rtx, tmp0_rtx, final_adjust,
! 					  bytes_below_sp, force_isa_mode,
  					  !frame_pointer_needed, true);
+   bytes_below_sp -= final_adjust;
+   gcc_assert (known_eq (bytes_below_sp, 0));
    if (emit_frame_chain && maybe_ne (final_adjust, 0))
      aarch64_emit_stack_tie (hard_frame_pointer_rtx);
  
diff -Nrcpad gcc-14-20250502/gcc/config/rs6000/rs6000.cc gcc-14-20250509/gcc/config/rs6000/rs6000.cc
*** gcc-14-20250502/gcc/config/rs6000/rs6000.cc	Fri May  2 22:32:17 2025
--- gcc-14-20250509/gcc/config/rs6000/rs6000.cc	Fri May  9 22:32:12 2025
*************** rs6000_can_inline_p (tree caller, tree c
*** 25762,25771 ****
  	}
      }
  
!   /* Ignore -mpower8-fusion and -mpower10-fusion options for inlining
!      purposes.  */
!   callee_isa &= ~(OPTION_MASK_P8_FUSION | OPTION_MASK_P10_FUSION);
!   explicit_isa &= ~(OPTION_MASK_P8_FUSION | OPTION_MASK_P10_FUSION);
  
    /* The callee's options must be a subset of the caller's options, i.e.
       a vsx function may inline an altivec function, but a no-vsx function
--- 25762,25774 ----
  	}
      }
  
!   /* Ignore -mpower8-fusion, -mpower10-fusion and -msave-toc-indirect options
!      for inlining purposes.  */
!   HOST_WIDE_INT ignored_isas = (OPTION_MASK_P8_FUSION
! 				| OPTION_MASK_P10_FUSION
! 				| OPTION_MASK_SAVE_TOC_INDIRECT);
!   callee_isa &= ~ignored_isas;
!   explicit_isa &= ~ignored_isas;
  
    /* The callee's options must be a subset of the caller's options, i.e.
       a vsx function may inline an altivec function, but a no-vsx function
diff -Nrcpad gcc-14-20250502/gcc/coroutine-passes.cc gcc-14-20250509/gcc/coroutine-passes.cc
*** gcc-14-20250502/gcc/coroutine-passes.cc	Fri May  2 22:32:17 2025
--- gcc-14-20250509/gcc/coroutine-passes.cc	Fri May  9 22:32:12 2025
*************** execute_early_expand_coro_ifns (void)
*** 293,301 ****
    /* Some of the possible YIELD points will hopefully have been removed by
       earlier optimisations; record the ones that are still present.  */
    hash_map<int_hash<HOST_WIDE_INT, -1, -2>, tree> destinations;
-   /* Labels we added to carry the CFG changes, we need to remove these to
-      avoid confusing EH.  */
-   hash_set<tree> to_remove;
    /* List of dispatch points to update.  */
    auto_vec<gimple_stmt_iterator, 16> actor_worklist;
    basic_block bb;
--- 293,298 ----
*************** execute_early_expand_coro_ifns (void)
*** 374,381 ****
  		}
  	      else
  		dst_dest = dst_tgt;
- 	      to_remove.add (res_tgt);
- 	      to_remove.add (dst_tgt);
  	      /* lose the co_yield.  */
  	      gsi_remove (&gsi, true);
  	      stmt = gsi_stmt (gsi); /* next. */
--- 371,376 ----
*************** execute_early_expand_coro_ifns (void)
*** 463,489 ****
  	}
      }
  
-   /* Remove the labels we inserted to map our hidden CFG, this
-      avoids confusing block merges when there are also EH labels.  */
-   FOR_EACH_BB_FN (bb, cfun)
-     for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi);)
-       {
- 	gimple *stmt = gsi_stmt (gsi);
- 	if (glabel *glab = dyn_cast<glabel *> (stmt))
- 	  {
- 	    tree rem = gimple_label_label (glab);
- 	    if (to_remove.contains (rem))
- 	      {
- 		gsi_remove (&gsi, true);
- 		to_remove.remove (rem);
- 		continue; /* We already moved to the next insn.  */
- 	      }
- 	  }
- 	else
- 	  break;
- 	gsi_next (&gsi);
-       }
- 
    /* Changed the CFG.  */
    todoflags |= TODO_cleanup_cfg;
    return todoflags;
--- 458,463 ----
diff -Nrcpad gcc-14-20250502/gcc/cp/ChangeLog gcc-14-20250509/gcc/cp/ChangeLog
*** gcc-14-20250502/gcc/cp/ChangeLog	Fri May  2 22:32:17 2025
--- gcc-14-20250509/gcc/cp/ChangeLog	Fri May  9 22:32:12 2025
***************
*** 1,3 ****
--- 1,179 ----
+ 2025-05-06  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	Backported from master:
+ 	2024-05-15  Jakub Jelinek  <jakub@redhat.com>
+ 		    Jason Merrill  <jason@redhat.com>
+ 
+ 	PR lto/113208
+ 	* cp-tree.h (maybe_optimize_cdtor): Remove.
+ 	* decl2.cc (tentative_decl_linkage): Call maybe_make_one_only
+ 	for implicit instantiations of maybe in charge ctors/dtors
+ 	declared inline.
+ 	(import_export_decl): Don't call maybe_optimize_cdtor.
+ 	(c_parse_final_cleanups): Formatting fixes.
+ 	* optimize.cc (can_alias_cdtor): Adjust condition, for
+ 	HAVE_COMDAT_GROUP && DECL_ONE_ONLY && DECL_WEAK return true even
+ 	if not DECL_INTERFACE_KNOWN.
+ 	(maybe_clone_body): Don't clear DECL_SAVED_TREE, instead set it
+ 	to void_node.
+ 	(maybe_clone_body): Remove.
+ 	* decl.cc (cxx_comdat_group): For DECL_CLONED_FUNCTION_P
+ 	functions if SUPPORTS_ONE_ONLY return DECL_COMDAT_GROUP if already
+ 	set.
+ 
+ 2025-05-05  Iain Sandoe  <iains.gcc@gmail.com>
+ 
+ 	Backported from master:
+ 	2025-02-03  Iain Sandoe  <iains.gcc@gmail.com>
+ 		    Jason Merrill  <jason@redhat.com>
+ 
+ 	PR c++/116506
+ 	PR c++/116880
+ 	* coroutines.cc (build_co_await): Ensure that xvalues are
+ 	materialised.  Handle references/pointer values in awaiter
+ 	access expressions.
+ 	(is_stable_lvalue): New.
+ 	* decl.cc (cxx_maybe_build_cleanup): Handle null arg.
+ 
+ 2025-05-05  Jason Merrill  <jason@redhat.com>
+ 
+ 	Backported from master:
+ 	2025-01-08  Jason Merrill  <jason@redhat.com>
+ 
+ 	* coroutines.cc (cp_coroutine_transform::build_ramp_function): Build
+ 	INIT_EXPR directly.
+ 
+ 2025-05-05  Iain Sandoe  <iain@sandoe.co.uk>
+ 
+ 	Backported from master:
+ 	2024-12-15  Iain Sandoe  <iain@sandoe.co.uk>
+ 
+ 	PR c++/98935
+ 	* coroutines.cc (register_local_var_uses): Add a pset to the
+ 	tree walk to avoid visiting the same BIND_EXPR twice.  Make
+ 	an early exit for cases that the callback does not apply.
+ 	(cp_coroutine_transform::apply_transforms): Add a pset to the
+ 	tree walk for register_local_vars.
+ 
+ 2025-05-05  Arsen Arsenović  <arsen@aarsen.me>
+ 
+ 	Backported from master:
+ 	2024-09-27  Arsen Arsenović  <arsen@aarsen.me>
+ 
+ 	PR c++/116793
+ 	* coroutines.cc (await_statement_expander): Just process
+ 	subtrees if encountering a CLEANUP_POINT_EXPR.
+ 
+ 2025-05-05  Arsen Arsenović  <arsen@aarsen.me>
+ 
+ 	Backported from master:
+ 	2024-09-27  Arsen Arsenović  <arsen@aarsen.me>
+ 
+ 	* coroutines.cc (co_await_get_resume_call): Return a tree
+ 	directly, rather than a tree pointer.
+ 	* cp-tree.h (co_await_get_resume_call): Adjust signature
+ 	accordingly.
+ 	* cvt.cc (convert_to_void): Do not alter CO_AWAIT_EXPRs when
+ 	discarding them.  Simplify handling implicit INDIRECT_REFs.
+ 
+ 2025-05-05  Arsen Arsenović  <arsen@aarsen.me>
+ 
+ 	Backported from master:
+ 	2024-09-27  Arsen Arsenović  <arsen@aarsen.me>
+ 
+ 	PR c++/116502
+ 	* coroutines.cc (maybe_promote_temps): Convert temporary
+ 	initializers to void without complaining.
+ 
+ 2025-05-05  Iain Sandoe  <iain@sandoe.co.uk>
+ 
+ 	Backported from master:
+ 	2024-09-05  Iain Sandoe  <iain@sandoe.co.uk>
+ 
+ 	* coroutines.cc
+ 	(cp_coroutine_transform::build_ramp_function): Separate the
+ 	build of promise constructor and destructor.  When evaluating
+ 	the constructor, check that build_special_member_call returns
+ 	an expression with side effects before adding it.
+ 
+ 2025-05-05  Iain Sandoe  <iain@sandoe.co.uk>
+ 
+ 	Backported from master:
+ 	2024-09-15  Iain Sandoe  <iain@sandoe.co.uk>
+ 
+ 	PR c++/115905
+ 	* coroutines.cc (struct coro_aw_data): Add a member for the
+ 	restart dispatch label.
+ 	(expand_one_await_expression): Rework to modernise and to
+ 	handle the boolean await_suspend() case.
+ 	(build_actor_fn): Rework the dispatcher and allow for a jump
+ 	back to the dispatcher.
+ 
+ 2025-05-05  Iain Sandoe  <iain@sandoe.co.uk>
+ 
+ 	Backported from master:
+ 	2024-08-27  Iain Sandoe  <iain@sandoe.co.uk>
+ 
+ 	PR c++/116482
+ 	* coroutines.cc
+ 	(coro_build_actor_or_destroy_function): Make the parameter
+ 	decls DECL_ARTIFICIAL.
+ 
+ 2025-05-05  Arsen Arsenović  <arsen@aarsen.me>
+ 
+ 	Backported from master:
+ 	2024-08-26  Arsen Arsenović  <arsen@aarsen.me>
+ 
+ 	PR c++/113457
+ 	* coroutines.cc (struct coroutine_info): Add integer field
+ 	awaitable_number.  This is a counter used for assigning unique
+ 	names to awaitable temporaries.
+ 	(get_awaitable_var): Use awaitable_number from coroutine_info
+ 	instead of the static int awn.
+ 
+ 2025-05-05  Iain Sandoe  <iain@sandoe.co.uk>
+ 
+ 	Backported from master:
+ 	2024-08-24  Iain Sandoe  <iain@sandoe.co.uk>
+ 
+ 	PR c++/110635
+ 	* coroutines.cc
+ 	(cp_coroutine_transform::wrap_original_function_body): Look through
+ 	initial await target expressions to find the actual co_await_expr
+ 	that we need to update.
+ 
+ 2025-05-05  Iain Sandoe  <iain@sandoe.co.uk>
+ 
+ 	Backported from master:
+ 	2024-08-24  Iain Sandoe  <iain@sandoe.co.uk>
+ 
+ 	PR c++/102051
+ 	* coroutines.cc
+ 	(cp_coroutine_transform::build_ramp_function): Handle
+ 	"throwing_cleanup" here instead of ...
+ 	(cp_coroutine_transform::apply_transforms): ... here.
+ 
+ 2025-05-05  Iain Sandoe  <iain@sandoe.co.uk>
+ 
+ 	Backported from master:
+ 	2024-08-24  Iain Sandoe  <iain@sandoe.co.uk>
+ 
+ 	PR c++/109682
+ 	* coroutines.cc
+ 	(cp_coroutine_transform::build_ramp_function): Allow for cases where
+ 	get_return_on_allocation_fail has a type convertible to the ramp
+ 	return type.
+ 
+ 2025-05-05  Iain Sandoe  <iain@sandoe.co.uk>
+ 
+ 	Backported from master:
+ 	2024-08-24  Iain Sandoe  <iain@sandoe.co.uk>
+ 
+ 	PR c++/100476
+ 	* coroutines.cc
+ 	(cp_coroutine_transform::build_ramp_function): Remove special
+ 	handling of void get_return_object expressions.
+ 
  2025-05-01  Iain Sandoe  <iain@sandoe.co.uk>
  
  	Backported from master:
diff -Nrcpad gcc-14-20250502/gcc/cp/coroutines.cc gcc-14-20250509/gcc/cp/coroutines.cc
*** gcc-14-20250502/gcc/cp/coroutines.cc	Fri May  2 22:32:17 2025
--- gcc-14-20250509/gcc/cp/coroutines.cc	Fri May  9 22:32:12 2025
*************** struct GTY((for_user)) coroutine_info
*** 95,100 ****
--- 95,104 ----
    tree return_void;   /* The expression for p.return_void() if it exists.  */
    location_t first_coro_keyword; /* The location of the keyword that made this
  				    function into a coroutine.  */
+ 
+   /* Temporary variable number assigned by get_awaitable_var.  */
+   int awaitable_number = 0;
+ 
    /* Flags to avoid repeated errors for per-function issues.  */
    bool coro_ret_type_error_emitted;
    bool coro_promise_error_emitted;
*************** coro_get_destroy_function (tree decl)
*** 721,726 ****
--- 725,742 ----
    return NULL_TREE;
  }
  
+ /* Given a CO_AWAIT_EXPR AWAIT_EXPR, return its resume call.  */
+ 
+ tree
+ co_await_get_resume_call (tree await_expr)
+ {
+   gcc_checking_assert (TREE_CODE (await_expr) == CO_AWAIT_EXPR);
+   tree vec = TREE_OPERAND (await_expr, 3);
+   if (!vec)
+     return nullptr;
+   return TREE_VEC_ELT (vec, 2);
+ }
+ 
  /* These functions assumes that the caller has verified that the state for
     the decl has been initialized, we try to minimize work here.  */
  
*************** enum suspend_point_kind {
*** 981,995 ****
  static tree
  get_awaitable_var (suspend_point_kind suspend_kind, tree v_type)
  {
!   static int awn = 0;
    char *buf;
    switch (suspend_kind)
      {
!       default: buf = xasprintf ("Aw%d", awn++); break;
!       case CO_YIELD_SUSPEND_POINT: buf =  xasprintf ("Yd%d", awn++); break;
!       case INITIAL_SUSPEND_POINT: buf =  xasprintf ("Is"); break;
!       case FINAL_SUSPEND_POINT: buf =  xasprintf ("Fs"); awn = 0; break;
!   }
    tree ret = get_identifier (buf);
    free (buf);
    ret = build_lang_decl (VAR_DECL, ret, v_type);
--- 997,1014 ----
  static tree
  get_awaitable_var (suspend_point_kind suspend_kind, tree v_type)
  {
!   auto cinfo = get_coroutine_info (current_function_decl);
!   gcc_checking_assert (cinfo);
    char *buf;
    switch (suspend_kind)
      {
!     default: buf = xasprintf ("Aw%d", cinfo->awaitable_number++); break;
!     case CO_YIELD_SUSPEND_POINT:
!       buf = xasprintf ("Yd%d", cinfo->awaitable_number++);
!       break;
!     case INITIAL_SUSPEND_POINT: buf = xasprintf ("Is"); break;
!     case FINAL_SUSPEND_POINT: buf = xasprintf ("Fs"); break;
!     }
    tree ret = get_identifier (buf);
    free (buf);
    ret = build_lang_decl (VAR_DECL, ret, v_type);
*************** build_template_co_await_expr (location_t
*** 1047,1052 ****
--- 1066,1093 ----
    return aw_expr;
  }
  
+ /* Is EXPR an lvalue that will refer to the same object after a resume?
+ 
+    This is close to asking tree_invariant_p of its address, but that doesn't
+    distinguish temporaries from other variables.  */
+ 
+ static bool
+ is_stable_lvalue (tree expr)
+ {
+   if (TREE_SIDE_EFFECTS (expr))
+     return false;
+ 
+   for (; handled_component_p (expr);
+        expr = TREE_OPERAND (expr, 0))
+     {
+       if (TREE_CODE (expr) == ARRAY_REF
+ 	  && !TREE_CONSTANT (TREE_OPERAND (expr, 1)))
+ 	return false;
+     }
+ 
+   return (TREE_CODE (expr) == PARM_DECL
+ 	  || (VAR_P (expr) && !is_local_temp (expr)));
+ }
  
  /*  This performs [expr.await] bullet 3.3 and validates the interface obtained.
      It is also used to build the initial and final suspend points.
*************** build_co_await (location_t loc, tree a,
*** 1109,1115 ****
    if (o_type && !VOID_TYPE_P (o_type))
      o_type = complete_type_or_else (o_type, o);
  
!   if (!o_type)
      return error_mark_node;
  
    if (TREE_CODE (o_type) != RECORD_TYPE)
--- 1150,1156 ----
    if (o_type && !VOID_TYPE_P (o_type))
      o_type = complete_type_or_else (o_type, o);
  
!   if (!o_type || o_type == error_mark_node)
      return error_mark_node;
  
    if (TREE_CODE (o_type) != RECORD_TYPE)
*************** build_co_await (location_t loc, tree a,
*** 1136,1191 ****
    if (!awrs_meth || awrs_meth == error_mark_node)
      return error_mark_node;
  
!   /* To complete the lookups, we need an instance of 'e' which is built from
!      'o' according to [expr.await] 3.4.
  
!      If we need to materialize this as a temporary, then that will have to be
!      'promoted' to a coroutine frame var.  However, if the awaitable is a
!      user variable, parameter or comes from a scope outside this function,
!      then we must use it directly - or we will see unnecessary copies.
  
!      If o is a variable, find the underlying var.  */
!   tree e_proxy = STRIP_NOPS (o);
!   if (INDIRECT_REF_P (e_proxy))
!     e_proxy = TREE_OPERAND (e_proxy, 0);
!   while (TREE_CODE (e_proxy) == COMPONENT_REF)
      {
!       e_proxy = TREE_OPERAND (e_proxy, 0);
!       if (INDIRECT_REF_P (e_proxy))
! 	e_proxy = TREE_OPERAND (e_proxy, 0);
!       if (TREE_CODE (e_proxy) == CALL_EXPR)
  	{
! 	  /* We could have operator-> here too.  */
! 	  tree op = TREE_OPERAND (CALL_EXPR_FN (e_proxy), 0);
! 	  if (DECL_OVERLOADED_OPERATOR_P (op)
! 	      && DECL_OVERLOADED_OPERATOR_IS (op, COMPONENT_REF))
! 	    {
! 	      e_proxy = CALL_EXPR_ARG (e_proxy, 0);
! 	      STRIP_NOPS (e_proxy);
! 	      gcc_checking_assert (TREE_CODE (e_proxy) == ADDR_EXPR);
! 	      e_proxy = TREE_OPERAND (e_proxy, 0);
! 	    }
  	}
!       STRIP_NOPS (e_proxy);
!     }
! 
!   /* Only build a temporary if we need it.  */
!   STRIP_NOPS (e_proxy);
!   if (TREE_CODE (e_proxy) == PARM_DECL
!       || (VAR_P (e_proxy) && !is_local_temp (e_proxy)))
!     {
!       e_proxy = o;
!       o = NULL_TREE; /* The var is already present.  */
!     }
!   else
!     {
!       tree p_type = o_type;
!       if (glvalue_p (o))
! 	p_type = cp_build_reference_type (p_type, !lvalue_p (o));
!       e_proxy = get_awaitable_var (suspend_kind, p_type);
!       o = cp_build_modify_expr (loc, e_proxy, INIT_EXPR, o,
! 				tf_warning_or_error);
!       e_proxy = convert_from_reference (e_proxy);
      }
  
    /* I suppose we could check that this is contextually convertible to bool.  */
--- 1177,1211 ----
    if (!awrs_meth || awrs_meth == error_mark_node)
      return error_mark_node;
  
!   /* [expr.await]/3.3 If o would be a prvalue, the temporary
!      materialization conversion ([conv.rval]) is applied.  */
!   if (!glvalue_p (o))
!     o = get_target_expr (o, tf_warning_or_error);
  
!   /* [expr.await]/3.4 e is an lvalue referring to the result of evaluating the
!      (possibly-converted) o.
  
!      So, either reuse an existing stable lvalue such as a variable or
!      COMPONENT_REF thereof, or create a new a coroutine state frame variable
!      for the awaiter, since it must persist across suspension.  */
!   tree e_var = NULL_TREE;
!   tree e_proxy = o;
!   if (is_stable_lvalue (o))
!     o = NULL_TREE; /* Use the existing entity.  */
!   else /* We need a non-temp var.  */
      {
!       tree p_type = TREE_TYPE (o);
!       tree o_a = o;
!       if (glvalue_p (o))
  	{
! 	  /* Build a reference variable for a non-stable lvalue o.  */
! 	  p_type = cp_build_reference_type (p_type, xvalue_p (o));
! 	  o_a = build_address (o);
! 	  o_a = cp_fold_convert (p_type, o_a);
  	}
!       e_var = get_awaitable_var (suspend_kind, p_type);
!       o = cp_build_init_expr (loc, e_var, o_a);
!       e_proxy = convert_from_reference (e_var);
      }
  
    /* I suppose we could check that this is contextually convertible to bool.  */
*************** build_co_await (location_t loc, tree a,
*** 1251,1257 ****
  	return error_mark_node;
        if (coro_diagnose_throwing_fn (awrs_func))
  	return error_mark_node;
!       if (tree dummy = cxx_maybe_build_cleanup (e_proxy, tf_none))
  	{
  	  if (CONVERT_EXPR_P (dummy))
  	    dummy = TREE_OPERAND (dummy, 0);
--- 1271,1277 ----
  	return error_mark_node;
        if (coro_diagnose_throwing_fn (awrs_func))
  	return error_mark_node;
!       if (tree dummy = cxx_maybe_build_cleanup (e_var, tf_none))
  	{
  	  if (CONVERT_EXPR_P (dummy))
  	    dummy = TREE_OPERAND (dummy, 0);
*************** build_co_await (location_t loc, tree a,
*** 1262,1268 ****
      }
  
    /* We now have three call expressions, in terms of the promise, handle and
!      'e' proxies.  Save them in the await expression for later expansion.  */
  
    tree awaiter_calls = make_tree_vec (3);
    TREE_VEC_ELT (awaiter_calls, 0) = awrd_call; /* await_ready().  */
--- 1282,1289 ----
      }
  
    /* We now have three call expressions, in terms of the promise, handle and
!      'e' proxy expression.  Save them in the await expression for later
!      expansion.  */
  
    tree awaiter_calls = make_tree_vec (3);
    TREE_VEC_ELT (awaiter_calls, 0) = awrd_call; /* await_ready().  */
*************** build_co_await (location_t loc, tree a,
*** 1275,1282 ****
      }
    TREE_VEC_ELT (awaiter_calls, 2) = awrs_call; /* await_resume().  */
  
!   if (REFERENCE_REF_P (e_proxy))
!     e_proxy = TREE_OPERAND (e_proxy, 0);
  
    tree awrs_type = TREE_TYPE (TREE_TYPE (awrs_func));
    tree suspend_kind_cst = build_int_cst (integer_type_node,
--- 1296,1303 ----
      }
    TREE_VEC_ELT (awaiter_calls, 2) = awrs_call; /* await_resume().  */
  
!   if (e_var)
!     e_proxy = e_var;
  
    tree awrs_type = TREE_TYPE (TREE_TYPE (awrs_func));
    tree suspend_kind_cst = build_int_cst (integer_type_node,
*************** struct coro_aw_data
*** 1784,1789 ****
--- 1805,1811 ----
    tree cleanup;    /* This is where to go once we complete local destroy.  */
    tree cororet;    /* This is where to go if we suspend.  */
    tree corocont;   /* This is where to go if we continue.  */
+   tree dispatch;   /* This is where we go if we restart the dispatch.  */
    tree conthand;   /* This is the handle for a continuation.  */
    unsigned index;  /* This is our current resume index.  */
  };
*************** co_await_find_in_subtree (tree *stmt, in
*** 1828,1869 ****
     in either.  */
  
  static tree *
! expand_one_await_expression (tree *stmt, tree *await_expr, void *d)
  {
    coro_aw_data *data = (coro_aw_data *) d;
  
!   tree saved_statement = *stmt;
    tree saved_co_await = *await_expr;
  
    tree actor = data->actor_fn;
!   location_t loc = EXPR_LOCATION (*stmt);
    tree var = TREE_OPERAND (saved_co_await, 1);  /* frame slot. */
!   tree expr = TREE_OPERAND (saved_co_await, 2); /* initializer.  */
    tree awaiter_calls = TREE_OPERAND (saved_co_await, 3);
  
    tree source = TREE_OPERAND (saved_co_await, 4);
    bool is_final = (source
  		   && TREE_INT_CST_LOW (source) == (int) FINAL_SUSPEND_POINT);
!   bool needs_dtor = TYPE_HAS_NONTRIVIAL_DESTRUCTOR (TREE_TYPE (var));
    int resume_point = data->index;
!   size_t bufsize = sizeof ("destroy.") + 10;
!   char *buf = (char *) alloca (bufsize);
!   snprintf (buf, bufsize, "destroy.%d", resume_point);
    tree destroy_label = create_named_label_with_ctx (loc, buf, actor);
!   snprintf (buf, bufsize, "resume.%d", resume_point);
    tree resume_label = create_named_label_with_ctx (loc, buf, actor);
!   tree empty_list = build_empty_stmt (loc);
  
!   tree stmt_list = NULL;
!   tree r;
    tree *await_init = NULL;
  
!   if (!expr)
      needs_dtor = false; /* No need, the var's lifetime is managed elsewhere.  */
    else
      {
!       r = coro_build_cvt_void_expr_stmt (expr, loc);
!       append_to_statement_list_force (r, &stmt_list);
        /* We have an initializer, which might itself contain await exprs.  */
        await_init = tsi_stmt_ptr (tsi_last (stmt_list));
      }
--- 1850,1893 ----
     in either.  */
  
  static tree *
! expand_one_await_expression (tree *expr, tree *await_expr, void *d)
  {
    coro_aw_data *data = (coro_aw_data *) d;
  
!   tree saved_statement = *expr;
    tree saved_co_await = *await_expr;
  
    tree actor = data->actor_fn;
!   location_t loc = EXPR_LOCATION (*expr);
    tree var = TREE_OPERAND (saved_co_await, 1);  /* frame slot. */
!   tree init_expr = TREE_OPERAND (saved_co_await, 2); /* initializer.  */
    tree awaiter_calls = TREE_OPERAND (saved_co_await, 3);
  
    tree source = TREE_OPERAND (saved_co_await, 4);
    bool is_final = (source
  		   && TREE_INT_CST_LOW (source) == (int) FINAL_SUSPEND_POINT);
! 
!   /* Build labels for the destinations of the control flow when we are resuming
!      or destroying.  */
    int resume_point = data->index;
!   char *buf = xasprintf ("destroy.%d", resume_point);
    tree destroy_label = create_named_label_with_ctx (loc, buf, actor);
!   free (buf);
!   buf = xasprintf ("resume.%d", resume_point);
    tree resume_label = create_named_label_with_ctx (loc, buf, actor);
!   free (buf);
  
!   /* This will contain our expanded expression and replace the original
!      expression.  */
!   tree stmt_list = push_stmt_list ();
    tree *await_init = NULL;
  
!   bool needs_dtor = TYPE_HAS_NONTRIVIAL_DESTRUCTOR (TREE_TYPE (var));
!   if (!init_expr)
      needs_dtor = false; /* No need, the var's lifetime is managed elsewhere.  */
    else
      {
!       finish_expr_stmt (init_expr);
        /* We have an initializer, which might itself contain await exprs.  */
        await_init = tsi_stmt_ptr (tsi_last (stmt_list));
      }
*************** expand_one_await_expression (tree *stmt,
*** 1874,1891 ****
    if (TREE_CODE (TREE_TYPE (ready_cond)) != BOOLEAN_TYPE)
      ready_cond = cp_convert (boolean_type_node, ready_cond,
  			     tf_warning_or_error);
    /* Be aggressive in folding here, since there are a significant number of
       cases where the ready condition is constant.  */
    ready_cond = invert_truthvalue_loc (loc, ready_cond);
!   ready_cond
!     = build1_loc (loc, CLEANUP_POINT_EXPR, boolean_type_node, ready_cond);
  
-   tree body_list = NULL;
    tree susp_idx = build_int_cst (short_unsigned_type_node, data->index);
!   r = build2_loc (loc, MODIFY_EXPR, short_unsigned_type_node, data->resume_idx,
! 		  susp_idx);
!   r = coro_build_cvt_void_expr_stmt (r, loc);
!   append_to_statement_list (r, &body_list);
  
    /* Find out what we have to do with the awaiter's suspend method.
       [expr.await]
--- 1898,1912 ----
    if (TREE_CODE (TREE_TYPE (ready_cond)) != BOOLEAN_TYPE)
      ready_cond = cp_convert (boolean_type_node, ready_cond,
  			     tf_warning_or_error);
+   tree susp_if = begin_if_stmt ();
    /* Be aggressive in folding here, since there are a significant number of
       cases where the ready condition is constant.  */
    ready_cond = invert_truthvalue_loc (loc, ready_cond);
!   finish_if_stmt_cond (ready_cond, susp_if);
  
    tree susp_idx = build_int_cst (short_unsigned_type_node, data->index);
!   tree r = cp_build_init_expr (data->resume_idx, susp_idx);
!   finish_expr_stmt (r);
  
    /* Find out what we have to do with the awaiter's suspend method.
       [expr.await]
*************** expand_one_await_expression (tree *stmt,
*** 1904,1934 ****
    /* NOTE: final suspend can't resume; the "resume" label in that case
       corresponds to implicit destruction.  */
    if (VOID_TYPE_P (susp_type))
!     {
!       /* We just call await_suspend() and hit the yield.  */
!       suspend = coro_build_cvt_void_expr_stmt (suspend, loc);
!       append_to_statement_list (suspend, &body_list);
!     }
    else if (TREE_CODE (susp_type) == BOOLEAN_TYPE)
      {
!       /* Boolean return, continue if the call returns false.  */
!       suspend = build1_loc (loc, TRUTH_NOT_EXPR, boolean_type_node, suspend);
!       suspend
! 	= build1_loc (loc, CLEANUP_POINT_EXPR, boolean_type_node, suspend);
!       tree go_on = build1_loc (loc, GOTO_EXPR, void_type_node, resume_label);
!       r = build3_loc (loc, COND_EXPR, void_type_node, suspend, go_on,
! 		      empty_list);
!       append_to_statement_list (r, &body_list);
      }
    else
      {
        r = suspend;
        if (!same_type_ignoring_top_level_qualifiers_p (susp_type,
  						      void_coro_handle_type))
  	r = build1_loc (loc, VIEW_CONVERT_EXPR, void_coro_handle_type, r);
        r = cp_build_init_expr (loc, data->conthand, r);
!       r = build1 (CONVERT_EXPR, void_type_node, r);
!       append_to_statement_list (r, &body_list);
        is_cont = true;
      }
  
--- 1925,1957 ----
    /* NOTE: final suspend can't resume; the "resume" label in that case
       corresponds to implicit destruction.  */
    if (VOID_TYPE_P (susp_type))
!     /* Void return - just proceed to suspend.  */
!     finish_expr_stmt (suspend);
    else if (TREE_CODE (susp_type) == BOOLEAN_TYPE)
      {
!       /* Boolean return, "continue" if the call returns false.  */
!       tree restart_if = begin_if_stmt ();
!       suspend = invert_truthvalue_loc (loc, suspend);
!       finish_if_stmt_cond (suspend, restart_if);
!       /* Resume - so restart the dispatcher, since we do not know if this
! 	 coroutine was already resumed from within await_suspend.  We must
! 	 exit this scope without cleanups.  */
!       r = build_call_expr_internal_loc (loc, IFN_CO_SUSPN, void_type_node, 1,
! 					build_address (data->dispatch));
!       /* This will eventually expand to 'goto coro.restart.dispatch'.  */
!       finish_expr_stmt (r);
!       finish_then_clause (restart_if);
!       finish_if_stmt (restart_if);
      }
    else
      {
+       /* Handle return, save it to the continuation.  */
        r = suspend;
        if (!same_type_ignoring_top_level_qualifiers_p (susp_type,
  						      void_coro_handle_type))
  	r = build1_loc (loc, VIEW_CONVERT_EXPR, void_coro_handle_type, r);
        r = cp_build_init_expr (loc, data->conthand, r);
!       finish_expr_stmt (r);
        is_cont = true;
      }
  
*************** expand_one_await_expression (tree *stmt,
*** 1941,1955 ****
    susp_idx = build_int_cst (integer_type_node, data->index);
  
    tree sw = begin_switch_stmt ();
-   tree cond = build_decl (loc, VAR_DECL, NULL_TREE, integer_type_node);
-   DECL_ARTIFICIAL (cond) = 1;
-   DECL_IGNORED_P (cond) = 1;
-   layout_decl (cond, 0);
  
    r = build_call_expr_internal_loc (loc, IFN_CO_YIELD, integer_type_node, 5,
  				    susp_idx, final_susp, r_l, d_l,
  				    data->coro_fp);
-   r = cp_build_init_expr (cond, r);
    finish_switch_cond (r, sw);
    r = build_case_label (integer_zero_node, NULL_TREE,
  			create_anon_label_with_ctx (loc, actor));
--- 1964,1973 ----
*************** expand_one_await_expression (tree *stmt,
*** 1957,2001 ****
    /* Implement the suspend, a scope exit without clean ups.  */
    r = build_call_expr_internal_loc (loc, IFN_CO_SUSPN, void_type_node, 1,
  				    is_cont ? cont : susp);
!   r = coro_build_cvt_void_expr_stmt (r, loc);
!   add_stmt (r); /*   goto ret;  */
    r = build_case_label (integer_one_node, NULL_TREE,
  			create_anon_label_with_ctx (loc, actor));
    add_stmt (r); /* case 1:  */
!   r = build1_loc (loc, GOTO_EXPR, void_type_node, resume_label);
!   add_stmt (r); /*  goto resume;  */
    r = build_case_label (NULL_TREE, NULL_TREE,
  			create_anon_label_with_ctx (loc, actor));
    add_stmt (r); /* default:;  */
!   r = build1_loc (loc, GOTO_EXPR, void_type_node, destroy_label);
!   add_stmt (r); /* goto destroy;  */
! 
!   /* part of finish switch.  */
!   SWITCH_STMT_BODY (sw) = pop_stmt_list (SWITCH_STMT_BODY (sw));
!   pop_switch ();
!   tree scope = SWITCH_STMT_SCOPE (sw);
!   SWITCH_STMT_SCOPE (sw) = NULL;
!   r = do_poplevel (scope);
!   append_to_statement_list (r, &body_list);
  
!   destroy_label = build_stmt (loc, LABEL_EXPR, destroy_label);
!   append_to_statement_list (destroy_label, &body_list);
    if (needs_dtor)
!     {
!       tree dtor = build_cleanup (var);
!       append_to_statement_list (dtor, &body_list);
!     }
!   r = build1_loc (loc, GOTO_EXPR, void_type_node, data->cleanup);
!   append_to_statement_list (r, &body_list);
! 
!   r = build3_loc (loc, COND_EXPR, void_type_node, ready_cond, body_list,
! 		  empty_list);
  
!   append_to_statement_list (r, &stmt_list);
  
    /* Resume point.  */
!   resume_label = build_stmt (loc, LABEL_EXPR, resume_label);
!   append_to_statement_list (resume_label, &stmt_list);
  
    /* This will produce the value (if one is provided) from the co_await
       expression.  */
--- 1975,2001 ----
    /* Implement the suspend, a scope exit without clean ups.  */
    r = build_call_expr_internal_loc (loc, IFN_CO_SUSPN, void_type_node, 1,
  				    is_cont ? cont : susp);
!   finish_expr_stmt (r); /* This will eventually expand to 'goto return'.  */
    r = build_case_label (integer_one_node, NULL_TREE,
  			create_anon_label_with_ctx (loc, actor));
    add_stmt (r); /* case 1:  */
!   add_stmt (build_stmt (loc, GOTO_EXPR, resume_label)); /*  goto resume;  */
    r = build_case_label (NULL_TREE, NULL_TREE,
  			create_anon_label_with_ctx (loc, actor));
    add_stmt (r); /* default:;  */
!   add_stmt (build_stmt (loc, GOTO_EXPR, destroy_label)); /* goto destroy;  */
  
!   finish_switch_stmt (sw);
!   add_stmt (build_stmt (loc, LABEL_EXPR, destroy_label));
    if (needs_dtor)
!     finish_expr_stmt (build_cleanup (var));
!   add_stmt (build_stmt (loc, GOTO_EXPR, data->cleanup));
  
!   finish_then_clause (susp_if);
!   finish_if_stmt (susp_if);
  
    /* Resume point.  */
!   add_stmt (build_stmt (loc, LABEL_EXPR, resume_label));
  
    /* This will produce the value (if one is provided) from the co_await
       expression.  */
*************** expand_one_await_expression (tree *stmt,
*** 2009,2022 ****
    /* Get a pointer to the revised statement.  */
    tree *revised = tsi_stmt_ptr (tsi_last (stmt_list));
    if (needs_dtor)
!     {
!       tree dtor = build_cleanup (var);
!       append_to_statement_list (dtor, &stmt_list);
!     }
    data->index += 2;
  
!   /* Replace the original statement with the expansion.  */
!   *stmt = stmt_list;
  
    /* Now, if the awaitable had an initializer, expand any awaits that might
       be embedded in it.  */
--- 2009,2019 ----
    /* Get a pointer to the revised statement.  */
    tree *revised = tsi_stmt_ptr (tsi_last (stmt_list));
    if (needs_dtor)
!     finish_expr_stmt (build_cleanup (var));
    data->index += 2;
  
!   /* Replace the original expression with the expansion.  */
!   *expr = pop_stmt_list (stmt_list);
  
    /* Now, if the awaitable had an initializer, expand any awaits that might
       be embedded in it.  */
*************** await_statement_expander (tree *stmt, in
*** 2050,2056 ****
    tree res = NULL_TREE;
  
    /* Process a statement at a time.  */
!   if (STATEMENT_CLASS_P (*stmt) || TREE_CODE (*stmt) == BIND_EXPR)
      return NULL_TREE; /* Just process the sub-trees.  */
    else if (TREE_CODE (*stmt) == STATEMENT_LIST)
      {
--- 2047,2055 ----
    tree res = NULL_TREE;
  
    /* Process a statement at a time.  */
!   if (STATEMENT_CLASS_P (*stmt)
!       || TREE_CODE (*stmt) == BIND_EXPR
!       || TREE_CODE (*stmt) == CLEANUP_POINT_EXPR)
      return NULL_TREE; /* Just process the sub-trees.  */
    else if (TREE_CODE (*stmt) == STATEMENT_LIST)
      {
*************** build_actor_fn (location_t loc, tree cor
*** 2388,2393 ****
--- 2387,2420 ----
    tree continue_label
      = create_named_label_with_ctx (loc, "actor.continue.ret", actor);
  
+   /* Build the dispatcher; for each await expression there is an odd entry
+      corresponding to the destruction action and an even entry for the resume
+      one:
+      if (resume index is odd)
+ 	{
+ 	  switch (resume index)
+ 	   case 1:
+ 	     goto cleanup.
+ 	   case ... odd suspension point number
+ 	     .CO_ACTOR (... odd suspension point number)
+ 	     break;
+ 	   default:
+ 	     break;
+ 	}
+       else
+ 	{
+ 	  coro.restart.dispatch:
+ 	   case 0:
+ 	     goto start.
+ 	   case ... even suspension point number
+ 	     .CO_ACTOR (... even suspension point number)
+ 	     break;
+ 	   default:
+ 	     break;
+ 	}
+     we should not get here unless something is broken badly.
+      __builtin_trap ();
+ */
    tree lsb_if = begin_if_stmt ();
    tree chkb0 = build2 (BIT_AND_EXPR, short_unsigned_type_node, rat,
  		       build_int_cst (short_unsigned_type_node, 1));
*************** build_actor_fn (location_t loc, tree cor
*** 2397,2408 ****
  
    tree destroy_dispatcher = begin_switch_stmt ();
    finish_switch_cond (rat, destroy_dispatcher);
-   tree ddeflab = build_case_label (NULL_TREE, NULL_TREE,
- 				   create_anon_label_with_ctx (loc, actor));
-   add_stmt (ddeflab);
-   tree b = build_call_expr_loc (loc, builtin_decl_explicit (BUILT_IN_TRAP), 0);
-   b = coro_build_cvt_void_expr_stmt (b, loc);
-   add_stmt (b);
  
    /* The destroy point numbered #1 is special, in that it is reached from a
       coroutine that is suspended after re-throwing from unhandled_exception().
--- 2424,2429 ----
*************** build_actor_fn (location_t loc, tree cor
*** 2410,2417 ****
       frame itself.  */
    tree del_promise_label
      = create_named_label_with_ctx (loc, "coro.delete.promise", actor);
!   b = build_case_label (build_int_cst (short_unsigned_type_node, 1), NULL_TREE,
! 			create_anon_label_with_ctx (loc, actor));
    add_stmt (b);
    add_stmt (build_stmt (loc, GOTO_EXPR, del_promise_label));
  
--- 2431,2438 ----
       frame itself.  */
    tree del_promise_label
      = create_named_label_with_ctx (loc, "coro.delete.promise", actor);
!   tree b = build_case_label (build_int_cst (short_unsigned_type_node, 1),
! 			     NULL_TREE, create_anon_label_with_ctx (loc, actor));
    add_stmt (b);
    add_stmt (build_stmt (loc, GOTO_EXPR, del_promise_label));
  
*************** build_actor_fn (location_t loc, tree cor
*** 2424,2456 ****
        add_stmt (b);
        b = build_call_expr_internal_loc (loc, IFN_CO_ACTOR, void_type_node, 1,
  					l_num);
!       b = coro_build_cvt_void_expr_stmt (b, loc);
!       add_stmt (b);
!       b = build1 (GOTO_EXPR, void_type_node, CASE_LABEL (ddeflab));
!       add_stmt (b);
        lab_num += 2;
      }
  
!   /* Insert the prototype dispatcher.  */
    finish_switch_stmt (destroy_dispatcher);
  
    finish_then_clause (lsb_if);
    begin_else_clause (lsb_if);
  
    tree dispatcher = begin_switch_stmt ();
    finish_switch_cond (rat, dispatcher);
    b = build_case_label (build_int_cst (short_unsigned_type_node, 0), NULL_TREE,
  			create_anon_label_with_ctx (loc, actor));
    add_stmt (b);
!   b = build1 (GOTO_EXPR, void_type_node, actor_begin_label);
!   add_stmt (b);
! 
!   tree rdeflab = build_case_label (NULL_TREE, NULL_TREE,
! 				   create_anon_label_with_ctx (loc, actor));
!   add_stmt (rdeflab);
!   b = build_call_expr_loc (loc, builtin_decl_explicit (BUILT_IN_TRAP), 0);
!   b = coro_build_cvt_void_expr_stmt (b, loc);
!   add_stmt (b);
  
    lab_num = 2;
    /* The final resume should be made to hit the default (trap, UB) entry
--- 2445,2478 ----
        add_stmt (b);
        b = build_call_expr_internal_loc (loc, IFN_CO_ACTOR, void_type_node, 1,
  					l_num);
!       finish_expr_stmt (b);
!       finish_break_stmt ();
        lab_num += 2;
      }
+   b = build_case_label (NULL_TREE, NULL_TREE,
+ 			create_anon_label_with_ctx (loc, actor));
+   add_stmt (b);
+   finish_break_stmt ();
  
!   /* Finish the destroy dispatcher.  */
    finish_switch_stmt (destroy_dispatcher);
  
    finish_then_clause (lsb_if);
    begin_else_clause (lsb_if);
  
+   /* For the case of a boolean await_resume () that returns 'true' we should
+      restart the dispatch, since we cannot know if additional resumes were
+      executed from within the await_suspend function.  */
+   tree restart_dispatch_label
+     = create_named_label_with_ctx (loc, "coro.restart.dispatch", actor);
+   add_stmt (build_stmt (loc, LABEL_EXPR, restart_dispatch_label));
+ 
    tree dispatcher = begin_switch_stmt ();
    finish_switch_cond (rat, dispatcher);
    b = build_case_label (build_int_cst (short_unsigned_type_node, 0), NULL_TREE,
  			create_anon_label_with_ctx (loc, actor));
    add_stmt (b);
!   add_stmt (build_stmt (loc, GOTO_EXPR, actor_begin_label));
  
    lab_num = 2;
    /* The final resume should be made to hit the default (trap, UB) entry
*************** build_actor_fn (location_t loc, tree cor
*** 2464,2484 ****
        add_stmt (b);
        b = build_call_expr_internal_loc (loc, IFN_CO_ACTOR, void_type_node, 1,
  					l_num);
!       b = coro_build_cvt_void_expr_stmt (b, loc);
!       add_stmt (b);
!       b = build1 (GOTO_EXPR, void_type_node, CASE_LABEL (rdeflab));
!       add_stmt (b);
        lab_num += 2;
      }
  
!   /* Insert the prototype dispatcher.  */
    finish_switch_stmt (dispatcher);
    finish_else_clause (lsb_if);
  
    finish_if_stmt (lsb_if);
  
!   tree r = build_stmt (loc, LABEL_EXPR, actor_begin_label);
!   add_stmt (r);
  
    /* actor's coroutine 'self handle'.  */
    tree ash_m = lookup_member (coro_frame_type, coro_self_handle_id, 1,
--- 2486,2512 ----
        add_stmt (b);
        b = build_call_expr_internal_loc (loc, IFN_CO_ACTOR, void_type_node, 1,
  					l_num);
!       finish_expr_stmt (b);
!       finish_break_stmt ();
        lab_num += 2;
      }
+   b = build_case_label (NULL_TREE, NULL_TREE,
+ 			create_anon_label_with_ctx (loc, actor));
+   add_stmt (b);
+   finish_break_stmt ();
  
!   /* Finish the resume dispatcher.  */
    finish_switch_stmt (dispatcher);
    finish_else_clause (lsb_if);
  
    finish_if_stmt (lsb_if);
  
!   /* If we reach here then we've hit UB.  */
!   tree t = build_call_expr_loc (loc, builtin_decl_explicit (BUILT_IN_TRAP), 0);
!   finish_expr_stmt (t);
! 
!   /* Now we start building the rewritten function body.  */
!   add_stmt (build_stmt (loc, LABEL_EXPR, actor_begin_label));
  
    /* actor's coroutine 'self handle'.  */
    tree ash_m = lookup_member (coro_frame_type, coro_self_handle_id, 1,
*************** build_actor_fn (location_t loc, tree cor
*** 2490,2496 ****
    /* Should have been set earlier by coro_promise_type_found_p.  */
    gcc_assert (hfa_m);
  
!   r = build1 (CONVERT_EXPR, build_pointer_type (void_type_node), actor_fp);
    vec<tree, va_gc> *args = make_tree_vector_single (r);
    tree hfa = build_new_method_call (ash, hfa_m, &args, NULL_TREE, LOOKUP_NORMAL,
  				    NULL, tf_warning_or_error);
--- 2518,2524 ----
    /* Should have been set earlier by coro_promise_type_found_p.  */
    gcc_assert (hfa_m);
  
!   tree r = build1 (CONVERT_EXPR, build_pointer_type (void_type_node), actor_fp);
    vec<tree, va_gc> *args = make_tree_vector_single (r);
    tree hfa = build_new_method_call (ash, hfa_m, &args, NULL_TREE, LOOKUP_NORMAL,
  				    NULL, tf_warning_or_error);
*************** build_actor_fn (location_t loc, tree cor
*** 2610,2616 ****
  
    coro_aw_data data = {actor, actor_fp, resume_idx_var, NULL_TREE,
  		       ash, del_promise_label, ret_label,
! 		       continue_label, continuation, 2};
    cp_walk_tree (&actor_body, await_statement_expander, &data, NULL);
  
    BIND_EXPR_BODY (actor_bind) = pop_stmt_list (actor_body);
--- 2638,2644 ----
  
    coro_aw_data data = {actor, actor_fp, resume_idx_var, NULL_TREE,
  		       ash, del_promise_label, ret_label,
! 		       continue_label, restart_dispatch_label, continuation, 2};
    cp_walk_tree (&actor_body, await_statement_expander, &data, NULL);
  
    BIND_EXPR_BODY (actor_bind) = pop_stmt_list (actor_body);
*************** maybe_promote_temps (tree *stmt, void *d
*** 3311,3317 ****
  	 to run the initializer.
  	 If the initializer is a conditional expression, we need to collect
  	 and declare any promoted variables nested within it.  DTORs for such
! 	 variables must be run conditionally too.  */
        if (t->var)
  	{
  	  tree var = t->var;
--- 3339,3351 ----
  	 to run the initializer.
  	 If the initializer is a conditional expression, we need to collect
  	 and declare any promoted variables nested within it.  DTORs for such
! 	 variables must be run conditionally too.
! 
! 	 Since here we're synthetically processing code here, we've already
! 	 emitted any Wunused-result warnings.  Below, however, we call
! 	 finish_expr_stmt, which will convert its operand to void, and could
! 	 result in such a diagnostic being emitted.  To avoid that, convert to
! 	 void ahead of time.  */
        if (t->var)
  	{
  	  tree var = t->var;
*************** maybe_promote_temps (tree *stmt, void *d
*** 3321,3327 ****
  	  if (TREE_CODE (t->init) == COND_EXPR)
  	    process_conditional (t, vlist);
  	  else
! 	    finish_expr_stmt (t->init);
  	  if (tree cleanup = cxx_maybe_build_cleanup (var, tf_warning_or_error))
  	    {
  	      tree cl = build_stmt (sloc, CLEANUP_STMT, expr_list, cleanup, var);
--- 3355,3361 ----
  	  if (TREE_CODE (t->init) == COND_EXPR)
  	    process_conditional (t, vlist);
  	  else
! 	    finish_expr_stmt (convert_to_void (t->init, ICV_STATEMENT, tf_none));
  	  if (tree cleanup = cxx_maybe_build_cleanup (var, tf_warning_or_error))
  	    {
  	      tree cl = build_stmt (sloc, CLEANUP_STMT, expr_list, cleanup, var);
*************** maybe_promote_temps (tree *stmt, void *d
*** 3340,3346 ****
  	  if (TREE_CODE (t->init) == COND_EXPR)
  	    process_conditional (t, vlist);
  	  else
! 	    finish_expr_stmt (t->init);
  	  if (expr_list)
  	    {
  	      if (TREE_CODE (expr_list) != STATEMENT_LIST)
--- 3374,3380 ----
  	  if (TREE_CODE (t->init) == COND_EXPR)
  	    process_conditional (t, vlist);
  	  else
! 	    finish_expr_stmt (convert_to_void (t->init, ICV_STATEMENT, tf_none));
  	  if (expr_list)
  	    {
  	      if (TREE_CODE (expr_list) != STATEMENT_LIST)
*************** struct local_vars_frame_data
*** 4103,4108 ****
--- 4137,4145 ----
  static tree
  register_local_var_uses (tree *stmt, int *do_subtree, void *d)
  {
+   if (TREE_CODE (*stmt) != BIND_EXPR)
+     return NULL_TREE;
+ 
    local_vars_frame_data *lvd = (local_vars_frame_data *) d;
  
    /* As we enter a bind expression - record the vars there and then recurse.
*************** register_local_var_uses (tree *stmt, int
*** 4110,4197 ****
       The bind index is a growing count of how many bind indices we've seen.
       We build a space in the frame for each local var.  */
  
!   if (TREE_CODE (*stmt) == BIND_EXPR)
      {
!       tree lvar;
!       unsigned serial = 0;
!       for (lvar = BIND_EXPR_VARS (*stmt); lvar != NULL;
! 	   lvar = DECL_CHAIN (lvar))
! 	{
! 	  bool existed;
! 	  local_var_info &local_var
! 	    = lvd->local_var_uses->get_or_insert (lvar, &existed);
! 	  gcc_checking_assert (!existed);
! 	  local_var.def_loc = DECL_SOURCE_LOCATION (lvar);
! 	  tree lvtype = TREE_TYPE (lvar);
! 	  local_var.frame_type = lvtype;
! 	  local_var.field_idx = local_var.field_id = NULL_TREE;
  
! 	  /* Make sure that we only present vars to the tests below.  */
! 	  if (TREE_CODE (lvar) != PARM_DECL
! 	      && TREE_CODE (lvar) != VAR_DECL)
! 	    continue;
  
! 	  /* We don't move static vars into the frame. */
! 	  local_var.is_static = TREE_STATIC (lvar);
! 	  if (local_var.is_static)
! 	    continue;
  
! 	  poly_uint64 size;
! 	  if (TREE_CODE (lvtype) == ARRAY_TYPE
! 	      && !poly_int_tree_p (DECL_SIZE_UNIT (lvar), &size))
! 	    {
! 	      sorry_at (local_var.def_loc, "variable length arrays are not"
! 			" yet supported in coroutines");
! 	      /* Ignore it, this is broken anyway.  */
! 	      continue;
! 	    }
  
! 	  lvd->local_var_seen = true;
! 	  /* If this var is a lambda capture proxy, we want to leave it alone,
! 	     and later rewrite the DECL_VALUE_EXPR to indirect through the
! 	     frame copy of the pointer to the lambda closure object.  */
! 	  local_var.is_lambda_capture = is_capture_proxy (lvar);
! 	  if (local_var.is_lambda_capture)
! 	    continue;
  
! 	  /* If a variable has a value expression, then that's what needs
! 	     to be processed.  */
! 	  local_var.has_value_expr_p = DECL_HAS_VALUE_EXPR_P (lvar);
! 	  if (local_var.has_value_expr_p)
! 	    continue;
  
! 	  /* Make names depth+index unique, so that we can support nested
! 	     scopes with identically named locals and still be able to
! 	     identify them in the coroutine frame.  */
! 	  tree lvname = DECL_NAME (lvar);
! 	  char *buf = NULL;
  
! 	  /* The outermost bind scope contains the artificial variables that
! 	     we inject to implement the coro state machine.  We want to be able
! 	     to inspect these in debugging.  */
! 	  if (lvname != NULL_TREE && lvd->nest_depth == 0)
! 	    buf = xasprintf ("%s", IDENTIFIER_POINTER (lvname));
! 	  else if (lvname != NULL_TREE)
! 	    buf = xasprintf ("%s_%u_%u", IDENTIFIER_POINTER (lvname),
! 			     lvd->nest_depth, lvd->bind_indx);
! 	  else
! 	    buf = xasprintf ("_D%u_%u_%u", lvd->nest_depth, lvd->bind_indx,
! 			     serial++);
  
! 	  /* TODO: Figure out if we should build a local type that has any
! 	     excess alignment or size from the original decl.  */
! 	  local_var.field_id = coro_make_frame_entry (lvd->field_list, buf,
! 						      lvtype, lvd->loc);
! 	  free (buf);
! 	  /* We don't walk any of the local var sub-trees, they won't contain
! 	     any bind exprs.  */
! 	}
!       lvd->bind_indx++;
!       lvd->nest_depth++;
!       cp_walk_tree (&BIND_EXPR_BODY (*stmt), register_local_var_uses, d, NULL);
!       *do_subtree = 0; /* We've done this.  */
!       lvd->nest_depth--;
      }
    return NULL_TREE;
  }
  
--- 4147,4232 ----
       The bind index is a growing count of how many bind indices we've seen.
       We build a space in the frame for each local var.  */
  
!   tree lvar;
!   unsigned serial = 0;
!   for (lvar = BIND_EXPR_VARS (*stmt); lvar != NULL; lvar = DECL_CHAIN (lvar))
      {
!       bool existed;
!       local_var_info &local_var
! 	= lvd->local_var_uses->get_or_insert (lvar, &existed);
!       gcc_checking_assert (!existed);
!       local_var.def_loc = DECL_SOURCE_LOCATION (lvar);
!       tree lvtype = TREE_TYPE (lvar);
!       local_var.frame_type = lvtype;
!       local_var.field_idx = local_var.field_id = NULL_TREE;
  
!       /* Make sure that we only present vars to the tests below.  */
!       if (TREE_CODE (lvar) != PARM_DECL
! 	  && TREE_CODE (lvar) != VAR_DECL)
! 	continue;
  
!       /* We don't move static vars into the frame. */
!       local_var.is_static = TREE_STATIC (lvar);
!       if (local_var.is_static)
! 	continue;
  
!       poly_uint64 size;
!       if (TREE_CODE (lvtype) == ARRAY_TYPE
! 	  && !poly_int_tree_p (DECL_SIZE_UNIT (lvar), &size))
! 	{
! 	  sorry_at (local_var.def_loc, "variable length arrays are not"
! 		    " yet supported in coroutines");
! 	  /* Ignore it, this is broken anyway.  */
! 	  continue;
! 	}
  
!       lvd->local_var_seen = true;
!       /* If this var is a lambda capture proxy, we want to leave it alone,
! 	 and later rewrite the DECL_VALUE_EXPR to indirect through the
! 	 frame copy of the pointer to the lambda closure object.  */
!       local_var.is_lambda_capture = is_capture_proxy (lvar);
!       if (local_var.is_lambda_capture)
! 	continue;
  
!       /* If a variable has a value expression, then that's what needs
! 	 to be processed.  */
!       local_var.has_value_expr_p = DECL_HAS_VALUE_EXPR_P (lvar);
!       if (local_var.has_value_expr_p)
! 	continue;
  
!       /* Make names depth+index unique, so that we can support nested
! 	 scopes with identically named locals and still be able to
! 	 identify them in the coroutine frame.  */
!       tree lvname = DECL_NAME (lvar);
!       char *buf = NULL;
  
!       /* The outermost bind scope contains the artificial variables that
! 	 we inject to implement the coro state machine.  We want to be able
! 	 to inspect these in debugging.  */
!       if (lvname != NULL_TREE && lvd->nest_depth == 0)
! 	buf = xasprintf ("%s", IDENTIFIER_POINTER (lvname));
!       else if (lvname != NULL_TREE)
! 	buf = xasprintf ("%s_%u_%u", IDENTIFIER_POINTER (lvname),
! 			 lvd->nest_depth, lvd->bind_indx);
!       else
! 	buf = xasprintf ("_D%u_%u_%u", lvd->nest_depth, lvd->bind_indx,
! 			 serial++);
  
!       /* TODO: Figure out if we should build a local type that has any
! 	 excess alignment or size from the original decl.  */
!       local_var.field_id = coro_make_frame_entry (lvd->field_list, buf,
! 						  lvtype, lvd->loc);
!       free (buf);
!       /* We don't walk any of the local var sub-trees, they won't contain
! 	 any bind exprs.  */
      }
+   lvd->bind_indx++;
+   lvd->nest_depth++;
+   /* Ensure we only visit each expression once.  */
+   cp_walk_tree_without_duplicates (&BIND_EXPR_BODY (*stmt),
+ 				   register_local_var_uses, d);
+   *do_subtree = 0; /* We've done this.  */
+   lvd->nest_depth--;
    return NULL_TREE;
  }
  
*************** coro_build_actor_or_destroy_function (tr
*** 4219,4224 ****
--- 4254,4260 ----
  
    tree id = get_identifier ("frame_ptr");
    tree fp = build_lang_decl (PARM_DECL, id, coro_frame_ptr);
+   DECL_ARTIFICIAL (fp) = true;
    DECL_CONTEXT (fp) = fn;
    DECL_ARG_TYPE (fp) = type_passed_as (coro_frame_ptr);
    DECL_ARGUMENTS (fn) = fp;
*************** coro_rewrite_function_body (location_t f
*** 4442,4448 ****
  	     a reference type, look past the indirection.  */
  	  if (INDIRECT_REF_P (initial_await))
  	    initial_await = TREE_OPERAND (initial_await, 0);
! 	  tree vec = TREE_OPERAND (initial_await, 3);
  	  tree aw_r = TREE_VEC_ELT (vec, 2);
  	  aw_r = convert_to_void (aw_r, ICV_STATEMENT, tf_warning_or_error);
  	  tree update = build2 (MODIFY_EXPR, boolean_type_node, i_a_r_c,
--- 4478,4490 ----
  	     a reference type, look past the indirection.  */
  	  if (INDIRECT_REF_P (initial_await))
  	    initial_await = TREE_OPERAND (initial_await, 0);
! 	  /* In the case that the initial_await returns a target expression
! 	     we might need to look through that to update the await expr.  */
! 	  tree iaw = initial_await;
! 	  if (TREE_CODE (iaw) == TARGET_EXPR)
! 	    iaw = TARGET_EXPR_INITIAL (iaw);
! 	  gcc_checking_assert (TREE_CODE (iaw) == CO_AWAIT_EXPR);
! 	  tree vec = TREE_OPERAND (iaw, 3);
  	  tree aw_r = TREE_VEC_ELT (vec, 2);
  	  aw_r = convert_to_void (aw_r, ICV_STATEMENT, tf_warning_or_error);
  	  tree update = build2 (MODIFY_EXPR, boolean_type_node, i_a_r_c,
*************** morph_fn_to_coro (tree orig, tree *resum
*** 4632,4653 ****
        TREE_OPERAND (body_start, 0) = push_stmt_list ();
      }
  
-   /* If the original function has a return value with a non-trivial DTOR
-      and the body contains a var with a DTOR that might throw, the decl is
-      marked "throwing_cleanup".
-      We do not [in the ramp, which is synthesised here], use any body var
-      types with DTORs that might throw.
-      The original body is transformed into the actor function which only
-      contains void returns, and is also wrapped in a try-catch block.
-      So (a) the 'throwing_cleanup' is not correct for the ramp and (b) we do
-      not need to transfer it to the actor which only contains void returns.  */
-   cp_function_chain->throwing_cleanup = false;
- 
    /* Create the coro frame type, as far as it can be known at this stage.
       1. Types we already know.  */
  
-   tree fn_return_type = TREE_TYPE (TREE_TYPE (orig));
    tree promise_type = get_coroutine_promise_type (orig);
  
    /* 2. Types we need to define or look up.  */
  
--- 4674,4685 ----
        TREE_OPERAND (body_start, 0) = push_stmt_list ();
      }
  
    /* Create the coro frame type, as far as it can be known at this stage.
       1. Types we already know.  */
  
    tree promise_type = get_coroutine_promise_type (orig);
+   tree fn_return_type = TREE_TYPE (TREE_TYPE (orig));
+   bool void_ramp_p = VOID_TYPE_P (fn_return_type);
  
    /* 2. Types we need to define or look up.  */
  
*************** morph_fn_to_coro (tree orig, tree *resum
*** 4698,4704 ****
    tree field_list = NULL_TREE;
    hash_map<tree, local_var_info> local_var_uses;
    local_vars_frame_data local_vars_data (&field_list, &local_var_uses);
!   cp_walk_tree (&fnbody, register_local_var_uses, &local_vars_data, NULL);
  
    /* Tie off the struct for now, so that we can build offsets to the
       known entries.  */
--- 4730,4737 ----
    tree field_list = NULL_TREE;
    hash_map<tree, local_var_info> local_var_uses;
    local_vars_frame_data local_vars_data (&field_list, &local_var_uses);
!   cp_walk_tree_without_duplicates (&fnbody, register_local_var_uses,
! 				   &local_vars_data);
  
    /* Tie off the struct for now, so that we can build offsets to the
       known entries.  */
*************** morph_fn_to_coro (tree orig, tree *resum
*** 4945,4969 ****
  	 control to the caller of the coroutine and the return value is
  	 obtained by a call to T::get_return_object_on_allocation_failure(),
  	 where T is the promise type.  */
- 
-       gcc_checking_assert (same_type_p (fn_return_type, TREE_TYPE (grooaf)));
        tree if_stmt = begin_if_stmt ();
        tree cond = build1 (CONVERT_EXPR, coro_frame_ptr, nullptr_node);
        cond = build2 (EQ_EXPR, boolean_type_node, coro_fp, cond);
        finish_if_stmt_cond (cond, if_stmt);
!       if (VOID_TYPE_P (fn_return_type))
! 	{
! 	  /* Execute the get-return-object-on-alloc-fail call...  */
! 	  finish_expr_stmt (grooaf);
! 	  /* ... but discard the result, since we return void.  */
! 	  finish_return_stmt (NULL_TREE);
! 	}
        else
! 	{
! 	  /* Get the fallback return object.  */
! 	  r = build_cplus_new (fn_return_type, grooaf, tf_warning_or_error);
! 	  finish_return_stmt (r);
! 	}
        finish_then_clause (if_stmt);
        finish_if_stmt (if_stmt);
      }
--- 4978,4995 ----
  	 control to the caller of the coroutine and the return value is
  	 obtained by a call to T::get_return_object_on_allocation_failure(),
  	 where T is the promise type.  */
        tree if_stmt = begin_if_stmt ();
        tree cond = build1 (CONVERT_EXPR, coro_frame_ptr, nullptr_node);
        cond = build2 (EQ_EXPR, boolean_type_node, coro_fp, cond);
        finish_if_stmt_cond (cond, if_stmt);
!       r = NULL_TREE;
!       if (void_ramp_p)
! 	/* Execute the get-return-object-on-alloc-fail call...  */
! 	finish_expr_stmt (grooaf);
        else
! 	/* Get the fallback return object.  */
! 	r = grooaf;
!       finish_return_stmt (r);
        finish_then_clause (if_stmt);
        finish_if_stmt (if_stmt);
      }
*************** morph_fn_to_coro (tree orig, tree *resum
*** 5069,5076 ****
  
  	  if (parm.rv_ref || parm.pt_ref)
  	    /* Initialise the frame reference field directly.  */
! 	    r = cp_build_modify_expr (fn_start, TREE_OPERAND (fld_idx, 0),
! 				      INIT_EXPR, arg, tf_warning_or_error);
  	  else
  	    {
  	      r = forward_parm (arg);
--- 5095,5102 ----
  
  	  if (parm.rv_ref || parm.pt_ref)
  	    /* Initialise the frame reference field directly.  */
! 	    r = build2 (INIT_EXPR, TREE_TYPE (arg),
! 			TREE_OPERAND (fld_idx, 0), arg);
  	  else
  	    {
  	      r = forward_parm (arg);
*************** morph_fn_to_coro (tree orig, tree *resum
*** 5106,5121 ****
    tree p = build_class_member_access_expr (deref_fp, promise_m, NULL_TREE,
  					   false, tf_warning_or_error);
  
-   tree promise_dtor = NULL_TREE;
    if (type_build_ctor_call (promise_type))
      {
!       /* Do a placement new constructor for the promise type (we never call
! 	 the new operator, just the constructor on the object in place in the
! 	 frame).
  
! 	 First try to find a constructor with the same parameter list as the
! 	 original function (if it has params), failing that find a constructor
! 	 with no parameter list.  */
  
        if (DECL_ARGUMENTS (orig))
  	{
--- 5132,5143 ----
    tree p = build_class_member_access_expr (deref_fp, promise_m, NULL_TREE,
  					   false, tf_warning_or_error);
  
    if (type_build_ctor_call (promise_type))
      {
!       /* Construct the promise object [dcl.fct.def.coroutine] / 5.7.
  
! 	 First try to find a constructor with an argument list comprised of
! 	 the parameter copies.  */
  
        if (DECL_ARGUMENTS (orig))
  	{
*************** morph_fn_to_coro (tree orig, tree *resum
*** 5127,5146 ****
        else
  	r = NULL_TREE;
  
        if (r == NULL_TREE || r == error_mark_node)
  	r = build_special_member_call (p, complete_ctor_identifier, NULL,
  				       promise_type, LOOKUP_NORMAL,
  				       tf_warning_or_error);
  
!       r = coro_build_cvt_void_expr_stmt (r, fn_start);
!       finish_expr_stmt (r);
  
!       r = build_modify_expr (fn_start, coro_promise_live, boolean_type_node,
! 			     INIT_EXPR, fn_start, boolean_true_node,
! 			     boolean_type_node);
        finish_expr_stmt (r);
- 
-       promise_dtor = cxx_maybe_build_cleanup (p, tf_warning_or_error);
      }
  
    /* Set up a new bind context for the GRO.  */
--- 5149,5175 ----
        else
  	r = NULL_TREE;
  
+       /* If that fails then the promise constructor argument list is empty.  */
        if (r == NULL_TREE || r == error_mark_node)
  	r = build_special_member_call (p, complete_ctor_identifier, NULL,
  				       promise_type, LOOKUP_NORMAL,
  				       tf_warning_or_error);
  
!       /* If type_build_ctor_call() encounters deprecated implicit CTORs it will
! 	 return true, and therefore we will execute this code path.  However,
! 	 we might well not actually require a CTOR and under those conditions
! 	 the build call above will not return a call expression, but the
! 	 original instance object.  Do not attempt to add the statement unless
! 	 it has side-effects.  */
!       if (r && r != error_mark_node && TREE_SIDE_EFFECTS (r))
! 	finish_expr_stmt (r);
!     }
  
!   tree promise_dtor = cxx_maybe_build_cleanup (p, tf_warning_or_error);;
!   if (flag_exceptions && promise_dtor)
!     {
!       r = cp_build_init_expr (coro_promise_live, boolean_true_node);
        finish_expr_stmt (r);
      }
  
    /* Set up a new bind context for the GRO.  */
*************** morph_fn_to_coro (tree orig, tree *resum
*** 5157,5163 ****
  				     coro_get_return_object_identifier,
  				     fn_start, NULL, /*musthave=*/true);
    /* Without a return object we haven't got much clue what's going on.  */
!   if (get_ro == error_mark_node)
      {
        BIND_EXPR_BODY (ramp_bind) = pop_stmt_list (ramp_body);
        DECL_SAVED_TREE (orig) = newbody;
--- 5186,5192 ----
  				     coro_get_return_object_identifier,
  				     fn_start, NULL, /*musthave=*/true);
    /* Without a return object we haven't got much clue what's going on.  */
!   if (!get_ro || get_ro == error_mark_node)
      {
        BIND_EXPR_BODY (ramp_bind) = pop_stmt_list (ramp_body);
        DECL_SAVED_TREE (orig) = newbody;
*************** morph_fn_to_coro (tree orig, tree *resum
*** 5165,5174 ****
        suppress_warning (orig, OPT_Wreturn_type);
        return false;
      }
  
    tree gro_context_body = push_stmt_list ();
-   tree gro_type = TREE_TYPE (get_ro);
-   bool gro_is_void_p = VOID_TYPE_P (gro_type);
  
    tree gro = NULL_TREE;
    tree gro_bind_vars = NULL_TREE;
--- 5194,5213 ----
        suppress_warning (orig, OPT_Wreturn_type);
        return false;
      }
+  
+   /* Check for a bad get return object type.
+      [dcl.fct.def.coroutine] / 7 requires:
+      The expression promise.get_return_object() is used to initialize the
+      returned reference or prvalue result object ... */
+   tree gro_type = TREE_TYPE (get_ro);
+   if (VOID_TYPE_P (gro_type) && !void_ramp_p)
+     {
+       error_at (fn_start, "no viable conversion from %<void%> provided by"
+ 		" %<get_return_object%> to return type %qT", fn_return_type);
+       return false;
+     }
  
    tree gro_context_body = push_stmt_list ();
  
    tree gro = NULL_TREE;
    tree gro_bind_vars = NULL_TREE;
*************** morph_fn_to_coro (tree orig, tree *resum
*** 5177,5184 ****
    tree gro_cleanup_stmt = NULL_TREE;
    /* We have to sequence the call to get_return_object before initial
       suspend.  */
!   if (gro_is_void_p)
!     r = get_ro;
    else if (same_type_p (gro_type, fn_return_type))
      {
       /* [dcl.fct.def.coroutine] / 7
--- 5216,5226 ----
    tree gro_cleanup_stmt = NULL_TREE;
    /* We have to sequence the call to get_return_object before initial
       suspend.  */
!   if (void_ramp_p)
!     {
!       gcc_checking_assert (VOID_TYPE_P (gro_type));
!       r = get_ro;
!     }
    else if (same_type_p (gro_type, fn_return_type))
      {
       /* [dcl.fct.def.coroutine] / 7
*************** morph_fn_to_coro (tree orig, tree *resum
*** 5263,5291 ****
       either as the return value (if it's the same type) or to the CTOR
       for an object of the return type.  */
  
    if (same_type_p (gro_type, fn_return_type))
!     r = gro_is_void_p ? NULL_TREE : DECL_RESULT (orig);
!   else if (!gro_is_void_p)
      /* check_return_expr will automatically return gro as an rvalue via
         treat_lvalue_as_rvalue_p.  */
      r = gro;
-   else if (CLASS_TYPE_P (fn_return_type))
-     {
-       /* For class type return objects, we can attempt to construct,
- 	 even if the gro is void. ??? Citation ??? c++/100476  */
-       r = build_special_member_call (NULL_TREE,
- 				     complete_ctor_identifier, NULL,
- 				     fn_return_type, LOOKUP_NORMAL,
- 				     tf_warning_or_error);
-       r = build_cplus_new (fn_return_type, r, tf_warning_or_error);
-     }
-   else
-     {
-       /* We can't initialize a non-class return value from void.  */
-       error_at (input_location, "cannot initialize a return object of type"
- 		" %qT with an rvalue of type %<void%>", fn_return_type);
-       r = error_mark_node;
-     }
  
    finish_return_stmt (r);
  
--- 5305,5320 ----
       either as the return value (if it's the same type) or to the CTOR
       for an object of the return type.  */
  
+   /* We must manage the cleanups ourselves, because the responsibility for
+      them changes after the initial suspend.  However, any use of
+      cxx_maybe_build_cleanup () can set the throwing_cleanup flag.  */
+   cp_function_chain->throwing_cleanup = false;
    if (same_type_p (gro_type, fn_return_type))
!     r = void_ramp_p ? NULL_TREE : DECL_RESULT (orig);
!   else
      /* check_return_expr will automatically return gro as an rvalue via
         treat_lvalue_as_rvalue_p.  */
      r = gro;
  
    finish_return_stmt (r);
  
diff -Nrcpad gcc-14-20250502/gcc/cp/cp-tree.h gcc-14-20250509/gcc/cp/cp-tree.h
*** gcc-14-20250502/gcc/cp/cp-tree.h	Fri May  2 22:32:17 2025
--- gcc-14-20250509/gcc/cp/cp-tree.h	Fri May  9 22:32:12 2025
*************** extern bool handle_module_option (unsign
*** 7454,7460 ****
  /* In optimize.cc */
  extern tree clone_attrs				(tree);
  extern bool maybe_clone_body			(tree);
- extern void maybe_optimize_cdtor		(tree);
  
  /* In parser.cc */
  extern tree cp_convert_range_for (tree, tree, tree, cp_decomp *, bool,
--- 7454,7459 ----
*************** extern tree coro_get_actor_function		(tr
*** 8767,8772 ****
--- 8766,8773 ----
  extern tree coro_get_destroy_function		(tree);
  extern tree coro_get_ramp_function		(tree);
  
+ extern tree co_await_get_resume_call		(tree await_expr);
+ 
  /* contracts.cc */
  extern tree make_postcondition_variable		(cp_expr);
  extern tree make_postcondition_variable		(cp_expr, tree);
diff -Nrcpad gcc-14-20250502/gcc/cp/cvt.cc gcc-14-20250509/gcc/cp/cvt.cc
*** gcc-14-20250502/gcc/cp/cvt.cc	Fri May  2 22:32:17 2025
--- gcc-14-20250509/gcc/cp/cvt.cc	Fri May  9 22:32:12 2025
*************** convert_to_void (tree expr, impl_conv_vo
*** 1285,1372 ****
  	  complete_type (type);
  	int is_complete = COMPLETE_TYPE_P (type);
  
! 	/* Can't load the value if we don't know the type.  */
! 	if (is_volatile && !is_complete)
            {
!             if (complain & tf_warning)
  	      switch (implicit)
  		{
  	      	  case ICV_CAST:
  		    warning_at (loc, 0, "conversion to void will not access "
! 				"object of incomplete type %qT", type);
  		    break;
  		  case ICV_SECOND_OF_COND:
! 		    warning_at (loc, 0, "indirection will not access object of "
! 				"incomplete type %qT in second operand "
! 				"of conditional expression", type);
  		    break;
  		  case ICV_THIRD_OF_COND:
! 		    warning_at (loc, 0, "indirection will not access object of "
! 				"incomplete type %qT in third operand "
! 				"of conditional expression", type);
  		    break;
  		  case ICV_RIGHT_OF_COMMA:
! 		    warning_at (loc, 0, "indirection will not access object of "
! 				"incomplete type %qT in right operand of "
  				"comma operator", type);
  		    break;
  		  case ICV_LEFT_OF_COMMA:
! 		    warning_at (loc, 0, "indirection will not access object of "
! 				"incomplete type %qT in left operand of "
! 				"comma operator", type);
  		    break;
  		  case ICV_STATEMENT:
! 		    warning_at (loc, 0, "indirection will not access object of "
! 				"incomplete type %qT in statement", type);
  		     break;
  		  case ICV_THIRD_IN_FOR:
! 		    warning_at (loc, 0, "indirection will not access object of "
! 				"incomplete type %qT in for increment "
! 				"expression", type);
  		    break;
  		  default:
  		    gcc_unreachable ();
  		}
            }
! 	/* Don't load the value if this is an implicit dereference, or if
! 	   the type needs to be handled by ctors/dtors.  */
! 	else if (is_volatile && is_reference)
            {
              if (complain & tf_warning)
  	      switch (implicit)
  		{
  	      	  case ICV_CAST:
  		    warning_at (loc, 0, "conversion to void will not access "
! 				"object of type %qT", type);
  		    break;
  		  case ICV_SECOND_OF_COND:
! 		    warning_at (loc, 0, "implicit dereference will not access "
! 				"object of type %qT in second operand of "
! 				"conditional expression", type);
  		    break;
  		  case ICV_THIRD_OF_COND:
! 		    warning_at (loc, 0, "implicit dereference will not access "
! 				"object of type %qT in third operand of "
! 				"conditional expression", type);
  		    break;
  		  case ICV_RIGHT_OF_COMMA:
! 		    warning_at (loc, 0, "implicit dereference will not access "
! 				"object of type %qT in right operand of "
  				"comma operator", type);
  		    break;
  		  case ICV_LEFT_OF_COMMA:
! 		    warning_at (loc, 0, "implicit dereference will not access "
! 				"object of type %qT in left operand of comma "
! 				"operator", type);
  		    break;
  		  case ICV_STATEMENT:
! 		    warning_at (loc, 0, "implicit dereference will not access "
! 				"object of type %qT in statement",  type);
  		     break;
  		  case ICV_THIRD_IN_FOR:
! 		    warning_at (loc, 0, "implicit dereference will not access "
! 				"object of type %qT in for increment expression",
! 				type);
  		    break;
  		  default:
  		    gcc_unreachable ();
--- 1285,1380 ----
  	  complete_type (type);
  	int is_complete = COMPLETE_TYPE_P (type);
  
! 	/* Don't load the value if this is an implicit dereference, or if
! 	   the type needs to be handled by ctors/dtors.  */
! 	if (is_reference)
            {
!             if (is_volatile && (complain & tf_warning)
! 		/* A co_await expression, in its await_resume expression, also
! 		   contains an implicit dereference.  As a result, we don't
! 		   need to warn about them here.  */
! 		&& TREE_CODE (TREE_OPERAND (expr, 0)) != CO_AWAIT_EXPR)
  	      switch (implicit)
  		{
  	      	  case ICV_CAST:
  		    warning_at (loc, 0, "conversion to void will not access "
! 				"object of type %qT", type);
  		    break;
  		  case ICV_SECOND_OF_COND:
! 		    warning_at (loc, 0, "implicit dereference will not access "
! 				"object of type %qT in second operand of "
! 				"conditional expression", type);
  		    break;
  		  case ICV_THIRD_OF_COND:
! 		    warning_at (loc, 0, "implicit dereference will not access "
! 				"object of type %qT in third operand of "
! 				"conditional expression", type);
  		    break;
  		  case ICV_RIGHT_OF_COMMA:
! 		    warning_at (loc, 0, "implicit dereference will not access "
! 				"object of type %qT in right operand of "
  				"comma operator", type);
  		    break;
  		  case ICV_LEFT_OF_COMMA:
! 		    warning_at (loc, 0, "implicit dereference will not access "
! 				"object of type %qT in left operand of comma "
! 				"operator", type);
  		    break;
  		  case ICV_STATEMENT:
! 		    warning_at (loc, 0, "implicit dereference will not access "
! 				"object of type %qT in statement",  type);
  		     break;
  		  case ICV_THIRD_IN_FOR:
! 		    warning_at (loc, 0, "implicit dereference will not access "
! 				"object of type %qT in for increment expression",
! 				type);
  		    break;
  		  default:
  		    gcc_unreachable ();
  		}
+ 
+ 	    /* Since this was an implicit dereference, we should also act as if
+ 	       it was never there.  */
+ 	    return convert_to_void (TREE_OPERAND (expr, 0), implicit, complain);
            }
! 	/* Can't load the value if we don't know the type.  */
! 	else if (is_volatile && !is_complete)
            {
              if (complain & tf_warning)
  	      switch (implicit)
  		{
  	      	  case ICV_CAST:
  		    warning_at (loc, 0, "conversion to void will not access "
! 				"object of incomplete type %qT", type);
  		    break;
  		  case ICV_SECOND_OF_COND:
! 		    warning_at (loc, 0, "indirection will not access object of "
! 				"incomplete type %qT in second operand "
! 				"of conditional expression", type);
  		    break;
  		  case ICV_THIRD_OF_COND:
! 		    warning_at (loc, 0, "indirection will not access object of "
! 				"incomplete type %qT in third operand "
! 				"of conditional expression", type);
  		    break;
  		  case ICV_RIGHT_OF_COMMA:
! 		    warning_at (loc, 0, "indirection will not access object of "
! 				"incomplete type %qT in right operand of "
  				"comma operator", type);
  		    break;
  		  case ICV_LEFT_OF_COMMA:
! 		    warning_at (loc, 0, "indirection will not access object of "
! 				"incomplete type %qT in left operand of "
! 				"comma operator", type);
  		    break;
  		  case ICV_STATEMENT:
! 		    warning_at (loc, 0, "indirection will not access object of "
! 				"incomplete type %qT in statement", type);
  		     break;
  		  case ICV_THIRD_IN_FOR:
! 		    warning_at (loc, 0, "indirection will not access object of "
! 				"incomplete type %qT in for increment "
! 				"expression", type);
  		    break;
  		  default:
  		    gcc_unreachable ();
*************** convert_to_void (tree expr, impl_conv_vo
*** 1416,1422 ****
  		    gcc_unreachable ();
  		}
  	  }
! 	if (is_reference || !is_volatile || !is_complete || TREE_ADDRESSABLE (type))
            {
              /* Emit a warning (if enabled) when the "effect-less" INDIRECT_REF
                 operation is stripped off. Note that we don't warn about
--- 1424,1430 ----
  		    gcc_unreachable ();
  		}
  	  }
! 	if (!is_volatile || !is_complete || TREE_ADDRESSABLE (type))
            {
              /* Emit a warning (if enabled) when the "effect-less" INDIRECT_REF
                 operation is stripped off. Note that we don't warn about
*************** convert_to_void (tree expr, impl_conv_vo
*** 1431,1439 ****
                  && !is_reference)
                warning_at (loc, OPT_Wunused_value, "value computed is not used");
              expr = TREE_OPERAND (expr, 0);
- 	    if (TREE_CODE (expr) == CALL_EXPR
- 		&& (complain & tf_warning))
- 	      maybe_warn_nodiscard (expr, implicit);
            }
  
  	break;
--- 1439,1444 ----
*************** convert_to_void (tree expr, impl_conv_vo
*** 1515,1520 ****
--- 1520,1530 ----
  	maybe_warn_nodiscard (expr, implicit);
        break;
  
+     case CO_AWAIT_EXPR:
+       if (auto awr = co_await_get_resume_call (expr))
+ 	convert_to_void (awr, implicit, complain);
+       break;
+ 
      default:;
      }
    expr = resolve_nondeduced_context (expr, complain);
diff -Nrcpad gcc-14-20250502/gcc/cp/decl.cc gcc-14-20250509/gcc/cp/decl.cc
*** gcc-14-20250502/gcc/cp/decl.cc	Fri May  2 22:32:17 2025
--- gcc-14-20250509/gcc/cp/decl.cc	Fri May  9 22:32:12 2025
*************** cxx_maybe_build_cleanup (tree decl, tsub
*** 19082,19088 ****
    /* Assume no cleanup is required.  */
    cleanup = NULL_TREE;
  
!   if (error_operand_p (decl))
      return cleanup;
  
    /* Handle "__attribute__((cleanup))".  We run the cleanup function
--- 19082,19088 ----
    /* Assume no cleanup is required.  */
    cleanup = NULL_TREE;
  
!   if (!decl || error_operand_p (decl))
      return cleanup;
  
    /* Handle "__attribute__((cleanup))".  We run the cleanup function
*************** cxx_comdat_group (tree decl)
*** 19280,19285 ****
--- 19280,19292 ----
  	  else
  	    break;
  	}
+       /* If a ctor/dtor has already set the comdat group by
+ 	 maybe_clone_body, don't override it.  */
+       if (SUPPORTS_ONE_ONLY
+ 	  && TREE_CODE (decl) == FUNCTION_DECL
+ 	  && DECL_CLONED_FUNCTION_P (decl))
+ 	if (tree comdat = DECL_COMDAT_GROUP (decl))
+ 	  return comdat;
      }
  
    return decl;
diff -Nrcpad gcc-14-20250502/gcc/cp/decl2.cc gcc-14-20250509/gcc/cp/decl2.cc
*** gcc-14-20250502/gcc/cp/decl2.cc	Fri May  2 22:32:17 2025
--- gcc-14-20250509/gcc/cp/decl2.cc	Fri May  9 22:32:12 2025
*************** tentative_decl_linkage (tree decl)
*** 3328,3343 ****
  	     linkage of all functions, and as that causes writes to
  	     the data mapped in from the PCH file, it's advantageous
  	     to mark the functions at this point.  */
! 	  if (DECL_DECLARED_INLINE_P (decl)
! 	      && (!DECL_IMPLICIT_INSTANTIATION (decl)
! 		  || DECL_DEFAULTED_FN (decl)))
  	    {
! 	      /* This function must have external linkage, as
! 		 otherwise DECL_INTERFACE_KNOWN would have been
! 		 set.  */
! 	      gcc_assert (TREE_PUBLIC (decl));
! 	      comdat_linkage (decl);
! 	      DECL_INTERFACE_KNOWN (decl) = 1;
  	    }
  	}
        else if (VAR_P (decl))
--- 3328,3350 ----
  	     linkage of all functions, and as that causes writes to
  	     the data mapped in from the PCH file, it's advantageous
  	     to mark the functions at this point.  */
! 	  if (DECL_DECLARED_INLINE_P (decl))
  	    {
! 	      if (!DECL_IMPLICIT_INSTANTIATION (decl)
! 		  || DECL_DEFAULTED_FN (decl))
! 		{
! 		  /* This function must have external linkage, as
! 		     otherwise DECL_INTERFACE_KNOWN would have been
! 		     set.  */
! 		  gcc_assert (TREE_PUBLIC (decl));
! 		  comdat_linkage (decl);
! 		  DECL_INTERFACE_KNOWN (decl) = 1;
! 		}
! 	      else if (DECL_MAYBE_IN_CHARGE_CDTOR_P (decl))
! 		/* For implicit instantiations of cdtors try to make
! 		   it comdat, so that maybe_clone_body can use aliases.
! 		   See PR113208.  */
! 		maybe_make_one_only (decl);
  	    }
  	}
        else if (VAR_P (decl))
*************** import_export_decl (tree decl)
*** 3584,3592 ****
      }
  
    DECL_INTERFACE_KNOWN (decl) = 1;
- 
-   if (DECL_CLONED_FUNCTION_P (decl))
-     maybe_optimize_cdtor (decl);
  }
  
  /* Return an expression that performs the destruction of DECL, which
--- 3591,3596 ----
*************** c_parse_final_cleanups (void)
*** 5312,5318 ****
  		node = node->get_alias_target ();
  
  	      node->call_for_symbol_thunks_and_aliases (clear_decl_external,
! 						      NULL, true);
  	      /* If we mark !DECL_EXTERNAL one of the symbols in some comdat
  		 group, we need to mark all symbols in the same comdat group
  		 that way.  */
--- 5316,5322 ----
  		node = node->get_alias_target ();
  
  	      node->call_for_symbol_thunks_and_aliases (clear_decl_external,
! 							NULL, true);
  	      /* If we mark !DECL_EXTERNAL one of the symbols in some comdat
  		 group, we need to mark all symbols in the same comdat group
  		 that way.  */
*************** c_parse_final_cleanups (void)
*** 5322,5328 ****
  		     next != node;
  		     next = dyn_cast<cgraph_node *> (next->same_comdat_group))
  		  next->call_for_symbol_thunks_and_aliases (clear_decl_external,
! 							  NULL, true);
  	    }
  
  	  /* If we're going to need to write this function out, and
--- 5326,5332 ----
  		     next != node;
  		     next = dyn_cast<cgraph_node *> (next->same_comdat_group))
  		  next->call_for_symbol_thunks_and_aliases (clear_decl_external,
! 							    NULL, true);
  	    }
  
  	  /* If we're going to need to write this function out, and
diff -Nrcpad gcc-14-20250502/gcc/cp/optimize.cc gcc-14-20250509/gcc/cp/optimize.cc
*** gcc-14-20250502/gcc/cp/optimize.cc	Fri May  2 22:32:17 2025
--- gcc-14-20250509/gcc/cp/optimize.cc	Fri May  9 22:32:12 2025
*************** can_alias_cdtor (tree fn)
*** 221,230 ****
    gcc_assert (DECL_MAYBE_IN_CHARGE_CDTOR_P (fn));
    /* Don't use aliases for weak/linkonce definitions unless we can put both
       symbols in the same COMDAT group.  */
!   return (DECL_INTERFACE_KNOWN (fn)
! 	  && (SUPPORTS_ONE_ONLY || !DECL_WEAK (fn))
! 	  && (!DECL_ONE_ONLY (fn)
! 	      || (HAVE_COMDAT_GROUP && DECL_WEAK (fn))));
  }
  
  /* FN is a [cd]tor, fns is a pointer to an array of length 3.  Fill fns
--- 221,228 ----
    gcc_assert (DECL_MAYBE_IN_CHARGE_CDTOR_P (fn));
    /* Don't use aliases for weak/linkonce definitions unless we can put both
       symbols in the same COMDAT group.  */
!   return (DECL_WEAK (fn) ? (HAVE_COMDAT_GROUP && DECL_ONE_ONLY (fn))
! 			 : (DECL_INTERFACE_KNOWN (fn) && !DECL_ONE_ONLY (fn)));
  }
  
  /* FN is a [cd]tor, fns is a pointer to an array of length 3.  Fill fns
*************** maybe_clone_body (tree fn)
*** 718,724 ****
  	  if (expand_or_defer_fn_1 (clone))
  	    emit_associated_thunks (clone);
  	  /* We didn't generate a body, so remove the empty one.  */
! 	  DECL_SAVED_TREE (clone) = NULL_TREE;
  	}
        else
  	expand_or_defer_fn (clone);
--- 716,722 ----
  	  if (expand_or_defer_fn_1 (clone))
  	    emit_associated_thunks (clone);
  	  /* We didn't generate a body, so remove the empty one.  */
! 	  DECL_SAVED_TREE (clone) = void_node;
  	}
        else
  	expand_or_defer_fn (clone);
*************** maybe_clone_body (tree fn)
*** 729,786 ****
    /* We don't need to process the original function any further.  */
    return 1;
  }
- 
- /* If maybe_clone_body is called while the cdtor is still tentative,
-    DECL_ONE_ONLY will be false and so will be can_alias_cdtor (fn).
-    In that case we wouldn't try to optimize using an alias and instead
-    would emit separate base and complete cdtor.  The following function
-    attempts to still optimize that case when we import_export_decl
-    is called first time on one of the clones.  */
- 
- void
- maybe_optimize_cdtor (tree orig_decl)
- {
-   tree fns[3];
-   tree fn = DECL_CLONED_FUNCTION (orig_decl);
-   gcc_checking_assert (DECL_MAYBE_IN_CHARGE_CDTOR_P (fn));
-   if (DECL_INTERFACE_KNOWN (fn)
-       || !TREE_ASM_WRITTEN (fn)
-       || !DECL_ONE_ONLY (orig_decl)
-       || symtab->global_info_ready)
-     return;
- 
-   populate_clone_array (fn, fns);
- 
-   if (!fns[0] || !fns[1])
-     return;
-   for (int i = 2 - !fns[2]; i >= 0; --i)
-     if (fns[i] != orig_decl && DECL_INTERFACE_KNOWN (fns[i]))
-       return;
-   DECL_INTERFACE_KNOWN (fn) = 1;
-   comdat_linkage (fn);
-   if (!can_alias_cdtor (fn))
-     return;
-   /* For comdat base and complete cdtors put them into the same,
-      *[CD]5* comdat group instead of *[CD][12]*.  */
-   auto n0 = cgraph_node::get_create (fns[0]);
-   auto n1 = cgraph_node::get_create (fns[1]);
-   auto n2 = fns[2] ? cgraph_node::get_create (fns[1]) : NULL;
-   if (n0->lowered || n1->lowered || (n2 && n2->lowered))
-     return;
-   import_export_decl (fns[0]);
-   n1->definition = false;
-   if (!n0->create_same_body_alias (fns[1], fns[0]))
-     return;
- 
-   tree comdat_group = cdtor_comdat_group (fns[1], fns[0]);
-   n1 = cgraph_node::get (fns[1]);
-   n0->set_comdat_group (comdat_group);
-   if (n1->same_comdat_group)
-     n1->remove_from_same_comdat_group ();
-   n1->add_to_same_comdat_group (n0);
-   if (fns[2])
-     n2->add_to_same_comdat_group (n0);
-   import_export_decl (fns[1]);
-   /* Remove the body now that it is an alias.  */
-   release_function_body (fns[1]);
- }
--- 727,729 ----
diff -Nrcpad gcc-14-20250502/gcc/internal-fn.def gcc-14-20250509/gcc/internal-fn.def
*** gcc-14-20250502/gcc/internal-fn.def	Fri May  2 22:32:17 2025
--- gcc-14-20250509/gcc/internal-fn.def	Fri May  9 22:32:17 2025
*************** DEF_INTERNAL_FN (DIVMOD, ECF_CONST | ECF
*** 559,565 ****
  
  /* For coroutines.  */
  DEF_INTERNAL_FN (CO_ACTOR, ECF_NOTHROW | ECF_LEAF, NULL)
! DEF_INTERNAL_FN (CO_YIELD, ECF_NOTHROW, NULL)
  DEF_INTERNAL_FN (CO_SUSPN, ECF_NOTHROW, NULL)
  DEF_INTERNAL_FN (CO_FRAME, ECF_PURE | ECF_NOTHROW | ECF_LEAF, NULL)
  
--- 559,565 ----
  
  /* For coroutines.  */
  DEF_INTERNAL_FN (CO_ACTOR, ECF_NOTHROW | ECF_LEAF, NULL)
! DEF_INTERNAL_FN (CO_YIELD, ECF_NOTHROW | ECF_LEAF, NULL)
  DEF_INTERNAL_FN (CO_SUSPN, ECF_NOTHROW, NULL)
  DEF_INTERNAL_FN (CO_FRAME, ECF_PURE | ECF_NOTHROW | ECF_LEAF, NULL)
  
diff -Nrcpad gcc-14-20250502/gcc/ipa-cp.cc gcc-14-20250509/gcc/ipa-cp.cc
*** gcc-14-20250502/gcc/ipa-cp.cc	Fri May  2 22:32:17 2025
--- gcc-14-20250509/gcc/ipa-cp.cc	Fri May  9 22:32:17 2025
*************** ipcp_store_vr_results (void)
*** 6355,6360 ****
--- 6355,6365 ----
  						     TYPE_PRECISION (type),
  						     TYPE_SIGN (type)));
  		  r.update_bitmask (bm);
+ 		  // Reflecting the bitmask on the ranges can sometime
+ 		  // produce an UNDEFINED value if the the bitmask update
+ 		  // was previously deferred.  See PR 120048.
+ 		  if (tmp.undefined_p ())
+ 		    tmp.set_varying (type);
  		  ipa_vr vr (tmp);
  		  ts->m_vr->quick_push (vr);
  		}
*************** ipcp_store_vr_results (void)
*** 6377,6382 ****
--- 6382,6392 ----
  						 TYPE_PRECISION (type),
  						 TYPE_SIGN (type)));
  	      r.update_bitmask (bm);
+ 	      // Reflecting the bitmask on the ranges can sometime
+ 	      // produce an UNDEFINED value if the the bitmask update
+ 	      // was previously deferred.  See PR 120048.
+ 	      if (tmp.undefined_p ())
+ 		tmp.set_varying (type);
  	      ipa_vr vr (tmp);
  	      ts->m_vr->quick_push (vr);
  	    }
diff -Nrcpad gcc-14-20250502/gcc/testsuite/ChangeLog gcc-14-20250509/gcc/testsuite/ChangeLog
*** gcc-14-20250502/gcc/testsuite/ChangeLog	Fri May  2 22:32:22 2025
--- gcc-14-20250509/gcc/testsuite/ChangeLog	Fri May  9 22:32:18 2025
***************
*** 1,3 ****
--- 1,189 ----
+ 2025-05-08  Richard Sandiford  <richard.sandiford@arm.com>
+ 
+ 	Backported from master:
+ 	2025-04-24  Richard Sandiford  <richard.sandiford@arm.com>
+ 
+ 	PR target/119610
+ 	* g++.dg/torture/pr119610.C: New test.
+ 	* g++.target/aarch64/sve/pr119610-sve.C: Likewise.
+ 
+ 2025-05-08  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	Backported from master:
+ 	2025-04-22  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR target/119327
+ 	* g++.dg/opt/pr119327.C: New test.
+ 
+ 2025-05-08  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR preprocessor/108900
+ 	PR preprocessor/116047
+ 	PR preprocessor/120061
+ 	* gcc.dg/plugin/plugin.exp: Add location-overflow-test-pr116047.c
+ 	and location-overflow-test-pr120061.c.
+ 	* gcc.dg/plugin/location_overflow_plugin.c (plugin_init): Don't error
+ 	on unknown values, instead just break.
+ 	* gcc.dg/plugin/location-overflow-test-pr116047.c: New test.
+ 	* gcc.dg/plugin/location-overflow-test-pr116047-1.h: New test.
+ 	* gcc.dg/plugin/location-overflow-test-pr116047-2.h: New test.
+ 	* gcc.dg/plugin/location-overflow-test-pr120061.c: New test.
+ 	* gcc.dg/plugin/location-overflow-test-pr120061-1.h: New test.
+ 	* gcc.dg/plugin/location-overflow-test-pr120061-2.h: New test.
+ 
+ 2025-05-07  Robin Dapp  <rdapp@ventanamicro.com>
+ 
+ 	Backported from master:
+ 	2025-02-24  Robin Dapp  <rdapp@ventanamicro.com>
+ 
+ 	PR middle-end/118950
+ 	* gcc.target/riscv/rvv/autovec/pr118950.c: New test.
+ 
+ 2025-05-06  Andrew MacLeod  <amacleod@redhat.com>
+ 
+ 	PR tree-optimization/120048
+ 	* gcc.dg/pr120048.c: New.
+ 
+ 2025-05-06  Patrick Palka  <ppalka@redhat.com>
+ 
+ 	Backported from master:
+ 	2024-07-19  Patrick Palka  <ppalka@redhat.com>
+ 
+ 	PR c++/109464
+ 	* g++.dg/template/explicit-instantiation8.C: New test.
+ 
+ 2025-05-06  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	Backported from master:
+ 	2024-05-15  Jakub Jelinek  <jakub@redhat.com>
+ 		    Jason Merrill  <jason@redhat.com>
+ 
+ 	PR lto/113208
+ 	* g++.dg/abi/comdat3.C: New test.
+ 	* g++.dg/abi/comdat4.C: New test.
+ 
+ 2025-05-05  Iain Sandoe  <iains.gcc@gmail.com>
+ 
+ 	Backported from master:
+ 	2025-02-03  Iain Sandoe  <iains.gcc@gmail.com>
+ 		    Jason Merrill  <jason@redhat.com>
+ 
+ 	PR c++/116506
+ 	PR c++/116880
+ 	* g++.dg/coroutines/pr116506.C: New test.
+ 	* g++.dg/coroutines/pr116880.C: New test.
+ 
+ 2025-05-05  Iain Sandoe  <iain@sandoe.co.uk>
+ 
+ 	Backported from master:
+ 	2024-12-15  Iain Sandoe  <iain@sandoe.co.uk>
+ 
+ 	PR c++/98935
+ 	* g++.dg/coroutines/pr98935.C: New test.
+ 
+ 2025-05-05  Arsen Arsenović  <arsen@aarsen.me>
+ 
+ 	Backported from master:
+ 	2024-09-27  Arsen Arsenović  <arsen@aarsen.me>
+ 
+ 	PR c++/116793
+ 	* g++.dg/coroutines/pr116793-1.C: New test.
+ 
+ 2025-05-05  Arsen Arsenović  <arsen@aarsen.me>
+ 
+ 	Backported from master:
+ 	2024-09-27  Arsen Arsenović  <arsen@aarsen.me>
+ 
+ 	* g++.dg/coroutines/nodiscard-1.C: New test.
+ 
+ 2025-05-05  Arsen Arsenović  <arsen@aarsen.me>
+ 
+ 	Backported from master:
+ 	2024-09-27  Arsen Arsenović  <arsen@aarsen.me>
+ 
+ 	PR c++/116502
+ 	* g++.dg/coroutines/maybe-unused-1.C: New test.
+ 	* g++.dg/coroutines/pr116502.C: New test.
+ 
+ 2025-05-05  Iain Sandoe  <iain@sandoe.co.uk>
+ 
+ 	Backported from master:
+ 	2024-09-15  Iain Sandoe  <iain@sandoe.co.uk>
+ 
+ 	PR c++/115905
+ 	* g++.dg/coroutines/torture/pr115905.C: New test.
+ 
+ 2025-05-05  Arsen Arsenović  <arsen@aarsen.me>
+ 
+ 	Backported from master:
+ 	2024-09-04  Arsen Arsenović  <arsen@aarsen.me>
+ 
+ 	PR c++/106973
+ 	* g++.dg/coroutines/pr106973.C: New test.
+ 
+ 2025-05-05  Arsen Arsenović  <arsen@aarsen.me>
+ 
+ 	Backported from master:
+ 	2024-08-29  Arsen Arsenović  <arsen@aarsen.me>
+ 
+ 	PR c++/105104
+ 	* g++.dg/coroutines/torture/pr105104.C: New test.
+ 
+ 2025-05-05  Iain Sandoe  <iain@sandoe.co.uk>
+ 
+ 	Backported from master:
+ 	2024-08-27  Iain Sandoe  <iain@sandoe.co.uk>
+ 
+ 	PR c++/116482
+ 	* g++.dg/coroutines/pr116482.C: New test.
+ 
+ 2025-05-05  Arsen Arsenović  <arsen@aarsen.me>
+ 
+ 	Backported from master:
+ 	2024-08-26  Arsen Arsenović  <arsen@aarsen.me>
+ 
+ 	PR c++/113457
+ 	* g++.dg/coroutines/pr113457-1.C: New test.
+ 	* g++.dg/coroutines/pr113457.C: New test.
+ 
+ 2025-05-05  Iain Sandoe  <iain@sandoe.co.uk>
+ 
+ 	Backported from master:
+ 	2024-08-24  Iain Sandoe  <iain@sandoe.co.uk>
+ 
+ 	PR c++/110635
+ 	* g++.dg/coroutines/pr110635.C: New test.
+ 
+ 2025-05-05  Iain Sandoe  <iain@sandoe.co.uk>
+ 
+ 	Backported from master:
+ 	2024-08-24  Iain Sandoe  <iain@sandoe.co.uk>
+ 
+ 	PR c++/102051
+ 	* g++.dg/coroutines/pr102051.C: New test.
+ 
+ 2025-05-05  Iain Sandoe  <iain@sandoe.co.uk>
+ 
+ 	Backported from master:
+ 	2024-08-24  Iain Sandoe  <iain@sandoe.co.uk>
+ 
+ 	PR c++/109682
+ 	* g++.dg/coroutines/pr109682.C: New test.
+ 
+ 2025-05-05  Iain Sandoe  <iain@sandoe.co.uk>
+ 
+ 	Backported from master:
+ 	2024-08-24  Iain Sandoe  <iain@sandoe.co.uk>
+ 
+ 	PR c++/100476
+ 	* g++.dg/coroutines/coro-bad-gro-01-void-gro-non-class-coro.C:
+ 	Adjust expected diagnostic.
+ 	* g++.dg/coroutines/pr102489.C: Avoid void get_return_object.
+ 	* g++.dg/coroutines/pr103868.C: Likewise.
+ 	* g++.dg/coroutines/pr94879-folly-1.C: Likewise.
+ 	* g++.dg/coroutines/pr94883-folly-2.C: Likewise.
+ 	* g++.dg/coroutines/pr96749-2.C: Likewise.
+ 
  2025-05-01  Iain Sandoe  <iain@sandoe.co.uk>
  
  	Backported from master:
diff -Nrcpad gcc-14-20250502/gcc/testsuite/g++.dg/abi/comdat3.C gcc-14-20250509/gcc/testsuite/g++.dg/abi/comdat3.C
*** gcc-14-20250502/gcc/testsuite/g++.dg/abi/comdat3.C	Thu Jan  1 00:00:00 1970
--- gcc-14-20250509/gcc/testsuite/g++.dg/abi/comdat3.C	Fri May  9 22:32:18 2025
***************
*** 0 ****
--- 1,22 ----
+ // PR lto/113208
+ // { dg-do compile { target { c++11 && { *-*-*gnu* } } } }
+ // { dg-additional-options "-O2" }
+ // { dg-final { scan-assembler "_ZN1M1SINS_1P1TELN1N1LE2EEC5Ev,comdat" } }
+ // { dg-final { scan-assembler-not "_ZN1M1SINS_1P1TELN1N1LE2EEC1Ev,comdat" } }
+ // { dg-final { scan-assembler-not "_ZN1M1SINS_1P1TELN1N1LE2EEC2Ev,comdat" } }
+ 
+ namespace N { enum L { L1, L2, L3 } const O = L3; }
+ namespace M {
+   using N::O;
+   using N::L;
+   template <typename, L = O>
+   struct S { constexpr S () {} };
+   namespace P {
+     struct T;
+     struct U { S<T> u; };
+     void foo () { U (); }
+   }
+   extern template class S<P::T>;
+ }
+ namespace p = M::P;
+ template class M::S<p::T>;
diff -Nrcpad gcc-14-20250502/gcc/testsuite/g++.dg/abi/comdat4.C gcc-14-20250509/gcc/testsuite/g++.dg/abi/comdat4.C
*** gcc-14-20250502/gcc/testsuite/g++.dg/abi/comdat4.C	Thu Jan  1 00:00:00 1970
--- gcc-14-20250509/gcc/testsuite/g++.dg/abi/comdat4.C	Fri May  9 22:32:18 2025
***************
*** 0 ****
--- 1,28 ----
+ // PR lto/113208
+ // { dg-do compile { target { c++11 && { *-*-*gnu* } } } }
+ // { dg-additional-options "-O2" }
+ // { dg-final { scan-assembler "_ZN1BI1CEC5ERKS1_,comdat" } }
+ // { dg-final { scan-assembler-not "_ZN1BI1CEC1ERKS1_,comdat" } }
+ // { dg-final { scan-assembler-not "_ZN1BI1CEC2ERKS1_,comdat" } }
+ 
+ template <typename T>
+ struct A {
+   int foo () const;
+   A (int, int);
+ };
+ template <typename T>
+ struct B : A<T> {
+   constexpr B (const B &x) : A<T> (1, x.foo ()) {}
+   B () : A<T> (1, 2) {}
+ };
+ struct C;
+ struct D : B<C> {};
+ void bar (D);
+ 
+ void
+ baz (D x)
+ {
+   bar (x);
+ }
+ 
+ template struct B<C>;
diff -Nrcpad gcc-14-20250502/gcc/testsuite/g++.dg/coroutines/coro-bad-gro-01-void-gro-non-class-coro.C gcc-14-20250509/gcc/testsuite/g++.dg/coroutines/coro-bad-gro-01-void-gro-non-class-coro.C
*** gcc-14-20250502/gcc/testsuite/g++.dg/coroutines/coro-bad-gro-01-void-gro-non-class-coro.C	Fri May  2 22:32:26 2025
--- gcc-14-20250509/gcc/testsuite/g++.dg/coroutines/coro-bad-gro-01-void-gro-non-class-coro.C	Fri May  9 22:32:18 2025
*************** struct std::coroutine_traits<R, HandleRe
*** 27,37 ****
  };
  
  int
! my_coro (std::coroutine_handle<>& h)
  {
    PRINT ("coro1: about to return");
    co_return;
! } // { dg-error {cannot initialize a return object of type 'int' with an rvalue of type 'void'} }
  
  int main ()
  {
--- 27,37 ----
  };
  
  int
! my_coro (std::coroutine_handle<>& h) // { dg-error {no viable conversion from 'void' provided by 'get_return_object' to return type 'int'} }
  {
    PRINT ("coro1: about to return");
    co_return;
! }
  
  int main ()
  {
diff -Nrcpad gcc-14-20250502/gcc/testsuite/g++.dg/coroutines/maybe-unused-1.C gcc-14-20250509/gcc/testsuite/g++.dg/coroutines/maybe-unused-1.C
*** gcc-14-20250502/gcc/testsuite/g++.dg/coroutines/maybe-unused-1.C	Thu Jan  1 00:00:00 1970
--- gcc-14-20250509/gcc/testsuite/g++.dg/coroutines/maybe-unused-1.C	Fri May  9 22:32:18 2025
***************
*** 0 ****
--- 1,33 ----
+ // https://gcc.gnu.org/PR116502
+ #include <coroutine>
+ 
+ struct SuspendNever {
+   bool await_ready() noexcept;
+   void await_suspend(std::coroutine_handle<>) noexcept;
+   void await_resume() noexcept;
+ };
+ 
+ struct Coroutine;
+ 
+ struct PromiseType {
+   Coroutine get_return_object();
+   SuspendNever initial_suspend();
+   SuspendNever final_suspend() noexcept;
+   void return_void();
+   void unhandled_exception();
+ };
+ 
+ struct Coroutine {
+   using promise_type = PromiseType;
+ };
+ 
+ struct Awaiter {
+   bool await_ready();
+   void await_suspend(std::coroutine_handle<>);
+   [[nodiscard]] int& await_resume();
+ };
+ 
+ Coroutine foo()
+ {
+   co_await Awaiter {}; // { dg-warning "Wunused-result" }
+ }
diff -Nrcpad gcc-14-20250502/gcc/testsuite/g++.dg/coroutines/nodiscard-1.C gcc-14-20250509/gcc/testsuite/g++.dg/coroutines/nodiscard-1.C
*** gcc-14-20250502/gcc/testsuite/g++.dg/coroutines/nodiscard-1.C	Thu Jan  1 00:00:00 1970
--- gcc-14-20250509/gcc/testsuite/g++.dg/coroutines/nodiscard-1.C	Fri May  9 22:32:18 2025
***************
*** 0 ****
--- 1,77 ----
+ #include <coroutine>
+ /* Make sure that we correctly warn for unused co_await results.  */
+ 
+ struct task
+ {
+   struct promise_type
+   {
+     std::suspend_never initial_suspend () noexcept;
+     std::suspend_never final_suspend () noexcept;
+     void return_void ();
+     void unhandled_exception ();
+     task get_return_object ();
+   };
+ };
+ 
+ template<typename T>
+ struct nodiscardable : std::suspend_never
+ { [[nodiscard]] T await_resume (); };
+ 
+ template<typename T>
+ struct discardable : std::suspend_never
+ { T await_resume (); };
+ 
+ task
+ thing ()
+ {
+   co_await nodiscardable<int&>{}; /* { dg-warning "attribute 'nodiscard'" }  */
+   co_await nodiscardable<int>{}; /* { dg-warning "attribute 'nodiscard'" }  */
+ 
+   (void) co_await nodiscardable<int&>{};
+   (void) co_await nodiscardable<int>{};
+ 
+   co_await discardable<int&>{};
+   co_await discardable<volatile int&>{};
+   /* { dg-warning "implicit dereference will not access" "" { target *-*-* } {.-1} }  */
+ }
+ 
+ template<typename>
+ task
+ other_thing ()
+ {
+   co_await nodiscardable<int&>{}; /* { dg-warning "attribute 'nodiscard'" }  */
+   co_await nodiscardable<int>{}; /* { dg-warning "attribute 'nodiscard'" }  */
+ 
+   (void) co_await nodiscardable<int&>{};
+   (void) co_await nodiscardable<int>{};
+ 
+   co_await discardable<int&>{};
+   co_await discardable<volatile int&>{};
+   /* { dg-warning "implicit dereference will not access" "" { target *-*-* } {.-1} }  */
+ }
+ 
+ void
+ other_thing_caller ()
+ {
+   other_thing <int> ();
+ }
+ 
+ task
+ yet_another_thing (auto)
+ {
+   co_await nodiscardable<int&>{}; /* { dg-warning "attribute 'nodiscard'" }  */
+   co_await nodiscardable<int>{}; /* { dg-warning "attribute 'nodiscard'" }  */
+ 
+   (void) co_await nodiscardable<int&>{};
+   (void) co_await nodiscardable<int>{};
+ 
+   co_await discardable<int&>{};
+   co_await discardable<volatile int&>{};
+   /* { dg-warning "implicit dereference will not access" "" { target *-*-* } {.-1} }  */
+ }
+ 
+ void
+ yet_another_thing_caller ()
+ {
+   yet_another_thing (1);
+ }
diff -Nrcpad gcc-14-20250502/gcc/testsuite/g++.dg/coroutines/pr102051.C gcc-14-20250509/gcc/testsuite/g++.dg/coroutines/pr102051.C
*** gcc-14-20250502/gcc/testsuite/g++.dg/coroutines/pr102051.C	Thu Jan  1 00:00:00 1970
--- gcc-14-20250509/gcc/testsuite/g++.dg/coroutines/pr102051.C	Fri May  9 22:32:18 2025
***************
*** 0 ****
--- 1,16 ----
+ #include <coroutine>
+ 
+ struct Foo {
+     ~Foo() noexcept(false); // true succeeds
+     struct promise_type {
+         Foo get_return_object() { return {}; }
+         std::suspend_never initial_suspend() { return {}; }
+         void return_void() {}
+         void unhandled_exception() {}
+         std::suspend_always final_suspend() noexcept { return {}; }
+     };
+ };
+ 
+ Foo bar() {
+     co_return;
+ }
diff -Nrcpad gcc-14-20250502/gcc/testsuite/g++.dg/coroutines/pr102489.C gcc-14-20250509/gcc/testsuite/g++.dg/coroutines/pr102489.C
*** gcc-14-20250502/gcc/testsuite/g++.dg/coroutines/pr102489.C	Fri May  2 22:32:26 2025
--- gcc-14-20250509/gcc/testsuite/g++.dg/coroutines/pr102489.C	Fri May  9 22:32:18 2025
*************** struct footask {
*** 9,15 ****
      std::suspend_never initial_suspend();
      std::suspend_never final_suspend() noexcept;
      void unhandled_exception();
!     void get_return_object();
    };
    std::suspend_always foo;
    footask taskfun() { co_await foo; }
--- 9,15 ----
      std::suspend_never initial_suspend();
      std::suspend_never final_suspend() noexcept;
      void unhandled_exception();
!     footask get_return_object();
    };
    std::suspend_always foo;
    footask taskfun() { co_await foo; }
diff -Nrcpad gcc-14-20250502/gcc/testsuite/g++.dg/coroutines/pr103868.C gcc-14-20250509/gcc/testsuite/g++.dg/coroutines/pr103868.C
*** gcc-14-20250502/gcc/testsuite/g++.dg/coroutines/pr103868.C	Fri May  2 22:32:26 2025
--- gcc-14-20250509/gcc/testsuite/g++.dg/coroutines/pr103868.C	Fri May  9 22:32:18 2025
*************** struct awaitable_frame_base {
*** 116,122 ****
    template <typename T> auto await_transform(T a) { return a; }
  };
  template <> struct awaitable_frame<void> : awaitable_frame_base {
!   void get_return_object();
  };
  } // namespace detail
  } // namespace asio
--- 116,122 ----
    template <typename T> auto await_transform(T a) { return a; }
  };
  template <> struct awaitable_frame<void> : awaitable_frame_base {
!   awaitable<void> get_return_object();
  };
  } // namespace detail
  } // namespace asio
diff -Nrcpad gcc-14-20250502/gcc/testsuite/g++.dg/coroutines/pr106973.C gcc-14-20250509/gcc/testsuite/g++.dg/coroutines/pr106973.C
*** gcc-14-20250502/gcc/testsuite/g++.dg/coroutines/pr106973.C	Thu Jan  1 00:00:00 1970
--- gcc-14-20250509/gcc/testsuite/g++.dg/coroutines/pr106973.C	Fri May  9 22:32:18 2025
***************
*** 0 ****
--- 1,22 ----
+ // https://gcc.gnu.org/PR106973
+ // { dg-require-effective-target indirect_jumps }
+ #include <coroutine>
+ #include <setjmp.h>
+ 
+ struct generator;
+ struct generator_promise {
+   generator get_return_object();
+   std::suspend_always initial_suspend();
+   std::suspend_always final_suspend() noexcept;
+   std::suspend_always yield_value(int);
+   void unhandled_exception();
+ };
+ 
+ struct generator {
+   using promise_type = generator_promise;
+ };
+ jmp_buf foo_env;
+ generator foo() {
+   setjmp(foo_env);
+   co_yield 1;
+ }
diff -Nrcpad gcc-14-20250502/gcc/testsuite/g++.dg/coroutines/pr109682.C gcc-14-20250509/gcc/testsuite/g++.dg/coroutines/pr109682.C
*** gcc-14-20250502/gcc/testsuite/g++.dg/coroutines/pr109682.C	Thu Jan  1 00:00:00 1970
--- gcc-14-20250509/gcc/testsuite/g++.dg/coroutines/pr109682.C	Fri May  9 22:32:18 2025
***************
*** 0 ****
--- 1,28 ----
+ 
+ #include <coroutine>
+ #include <new>
+ 
+ struct test
+ {
+   test () {}
+   test (int) {}
+ 
+   struct promise_type {
+     test get_return_object () { return {}; }
+     //     vvv
+     static int get_return_object_on_allocation_failure () { return {}; }
+     std::suspend_never initial_suspend () noexcept { return {}; }
+     std::suspend_never final_suspend () noexcept { return {}; }
+     void return_void () {}
+     void unhandled_exception () {}
+   };
+ };
+ 
+ test
+ f () { co_return; }
+ 
+ int
+ main ()
+ {
+   f ();
+ }
diff -Nrcpad gcc-14-20250502/gcc/testsuite/g++.dg/coroutines/pr110635.C gcc-14-20250509/gcc/testsuite/g++.dg/coroutines/pr110635.C
*** gcc-14-20250502/gcc/testsuite/g++.dg/coroutines/pr110635.C	Thu Jan  1 00:00:00 1970
--- gcc-14-20250509/gcc/testsuite/g++.dg/coroutines/pr110635.C	Fri May  9 22:32:18 2025
***************
*** 0 ****
--- 1,72 ----
+ 
+ #define CASE 0
+ #include <coroutine>
+ #include <iostream>
+ 
+ struct Coroutine {
+ 
+     struct promise_type;
+ 
+     using handler_type = std::coroutine_handle<promise_type>;
+ 
+     struct initial_suspend_awaiter {
+ 
+         bool await_ready() noexcept {
+             std::cout << "await_ready" << std::endl;
+             return false;
+         }
+         
+         void await_suspend(handler_type h) noexcept {
+             std::cout << "await_suspend" << std::endl;
+         }
+ 
+ #if CASE == 0
+         struct await_resume_return_object {
+             await_resume_return_object() noexcept {
+                 std::cout << "await_resume_return_object" << std::endl;
+             }
+             
+             ~await_resume_return_object() noexcept {
+                 std::cout << "~await_resume_return_object" << std::endl;
+             }
+         };
+ #elif CASE == 1
+         using await_resume_return_object = struct{};
+ #elif CASE == 2
+         using await_resume_return_object = int;
+ #else
+         using await_resume_return_object = void;
+ #endif
+         await_resume_return_object await_resume() noexcept {
+             std::cout << "await_resume" << std::endl;
+ #if CASE == 0 || CASE == 1 || CASE == 2
+             return {};
+ #endif
+         }
+ 
+         initial_suspend_awaiter() noexcept {
+             std::cout << "initial_suspend_awaiter" << std::endl;
+         }
+ 
+         ~initial_suspend_awaiter() noexcept {
+             std::cout << "~initial_suspend_awaiter" << std::endl;
+         }
+     };
+ 
+     struct promise_type {
+         void return_void() noexcept {}
+         void unhandled_exception() noexcept { std::terminate();}
+         initial_suspend_awaiter initial_suspend() noexcept { return {}; }
+         std::suspend_never final_suspend() noexcept { return {}; }
+         Coroutine get_return_object() {
+             return Coroutine{handler_type::from_promise(*this)};
+         }
+     };
+ 
+     handler_type handler;
+ };
+ 
+ int main() {
+     auto coro = []()->Coroutine { co_return; }();
+     coro.handler.resume();
+ }
diff -Nrcpad gcc-14-20250502/gcc/testsuite/g++.dg/coroutines/pr113457-1.C gcc-14-20250509/gcc/testsuite/g++.dg/coroutines/pr113457-1.C
*** gcc-14-20250502/gcc/testsuite/g++.dg/coroutines/pr113457-1.C	Thu Jan  1 00:00:00 1970
--- gcc-14-20250509/gcc/testsuite/g++.dg/coroutines/pr113457-1.C	Fri May  9 22:32:18 2025
***************
*** 0 ****
--- 1,25 ----
+ // https://gcc.gnu.org/PR113457
+ #include <coroutine>
+ 
+ struct coro
+ {
+   struct promise_type
+   {
+     std::suspend_never initial_suspend ();
+     std::suspend_never final_suspend () noexcept;
+     void return_void ();
+     void unhandled_exception ();
+     coro get_return_object ();
+   };
+ };
+ 
+ struct not_quite_suspend_never : std::suspend_never
+ {};
+ 
+ coro
+ foo ()
+ {
+   co_await std::suspend_never{},
+     [] () -> coro { co_return; },
+     co_await not_quite_suspend_never{};
+ }
diff -Nrcpad gcc-14-20250502/gcc/testsuite/g++.dg/coroutines/pr113457.C gcc-14-20250509/gcc/testsuite/g++.dg/coroutines/pr113457.C
*** gcc-14-20250502/gcc/testsuite/g++.dg/coroutines/pr113457.C	Thu Jan  1 00:00:00 1970
--- gcc-14-20250509/gcc/testsuite/g++.dg/coroutines/pr113457.C	Fri May  9 22:32:18 2025
***************
*** 0 ****
--- 1,178 ----
+ // https://gcc.gnu.org/PR113457
+ namespace std {
+ template <typename _Tp, typename _Up = _Tp &&> _Up __declval(int);
+ template <typename _Tp> auto declval() noexcept -> decltype(__declval<_Tp>(0));
+ template <typename _Tp> struct remove_cv {
+   using type = __remove_cv(_Tp);
+ };
+ template <typename _Tp> using remove_cv_t = typename remove_cv<_Tp>::type;
+ template <typename _Tp> struct remove_reference {
+   using type = __remove_reference(_Tp);
+ };
+ template <typename _Tp>
+ using remove_reference_t = typename remove_reference<_Tp>::type;
+ template <typename _Tp> inline constexpr bool is_array_v = __is_array(_Tp);
+ template <typename _Tp> struct remove_cvref {};
+ namespace ranges {
+ } // namespace ranges
+ template <typename _Tp>
+ [[__nodiscard__]] constexpr typename std::remove_reference<_Tp>::type &&
+ move(_Tp &&__t) noexcept {
+   return static_cast<typename std::remove_reference<_Tp>::type &&>(__t);
+ }
+ template <typename _Iterator> struct iterator_traits;
+ namespace __detail {
+ template <typename _Iter, typename _Tp> struct __iter_traits_impl {
+   using type = iterator_traits<_Iter>;
+ };
+ template <typename _Iter, typename _Tp = _Iter>
+ using __iter_traits = typename __iter_traits_impl<_Iter, _Tp>::type;
+ } // namespace __detail
+ template <typename> struct indirectly_readable_traits {};
+ namespace __detail {
+ template <typename _Tp>
+ using __iter_value_t =
+     typename __iter_traits<_Tp, indirectly_readable_traits<_Tp>>::value_type;
+ }
+ template <typename _Tp>
+ using iter_value_t = __detail::__iter_value_t<_Tp>;
+ namespace ranges::__access {
+ template <typename _Tp> auto __begin(_Tp &__t) {
+     return __t + 0;
+ }
+ } // namespace ranges::__access
+ namespace __detail {
+ template <typename _Tp>
+ using __range_iter_t =
+     decltype(ranges::__access::__begin(std::declval<_Tp &>()));
+ }
+ template <typename _Tp> struct iterator_traits<_Tp *> {
+   using value_type = remove_cv_t<_Tp>;
+ };
+   namespace ranges {
+   namespace __access {
+   struct _Begin {
+     template <typename _Tp>
+     constexpr auto operator() [[nodiscard]] (_Tp &&__t) const
+ 	{
+       if constexpr (is_array_v<remove_reference_t<_Tp>>)
+       {
+         return __t + 0;
+       }
+     }
+   };
+   } // namespace __access
+   inline namespace _Cpo {
+   inline constexpr ranges::__access::_Begin begin{};
+   } // namespace _Cpo
+   template <typename _Tp>
+   concept range = requires(_Tp &__t) { ranges::begin(__t); };
+   template <typename _Tp> using iterator_t = std::__detail::__range_iter_t<_Tp>;
+   template <range _Range>
+   using range_value_t = iter_value_t<iterator_t<_Range>>;
+   template <range _Range>
+   struct elements_of {
+     _Range range;
+   };
+   template <typename _Range>
+   elements_of(_Range &&) -> elements_of<_Range &&>;
+   } // namespace ranges
+   inline namespace __n4861 {
+   template <typename _Result, typename = void>
+   struct __coroutine_traits_impl {};
+   template <typename _Result> struct __coroutine_traits_impl<_Result, void> {
+     using promise_type = typename _Result::promise_type;
+   };
+   template <typename _Result, typename... _ArgTypes>
+   struct coroutine_traits : __coroutine_traits_impl<_Result> {};
+   template <typename _Promise = void> struct coroutine_handle;
+   template <typename _Promise> struct coroutine_handle {
+     constexpr void *address() const noexcept { return _M_fr_ptr; }
+     constexpr static coroutine_handle from_address(void *__a) noexcept {
+       coroutine_handle __self;
+       return __self;
+     }
+     constexpr operator coroutine_handle<>() const noexcept {
+       return coroutine_handle<>::from_address(address());
+     }
+     void *_M_fr_ptr = nullptr;
+   };
+   struct suspend_always {
+     constexpr bool await_ready() const noexcept { return false; }
+     constexpr void await_suspend(coroutine_handle<>) const noexcept {}
+     constexpr void await_resume() const noexcept {}
+   };
+   } // namespace __n4861
+   template <typename _Ref, typename _V = void>
+   class generator;
+   namespace __gen {
+   template <typename _Yielded> class _Promise_erased {
+     template <typename _Gen> struct _Recursive_awaiter;
+     struct _Final_awaiter;
+   public:
+     suspend_always initial_suspend() const noexcept;
+     suspend_always yield_value(_Yielded __val) noexcept;
+     template <typename _R2, typename _V2>
+     auto yield_value(
+         ranges::elements_of<generator<_R2, _V2> &&> __r) noexcept {
+       return _Recursive_awaiter{std::move(__r.range)};
+     }
+     template <typename _R>
+     auto yield_value(ranges::elements_of<_R> __r) noexcept {
+       auto __n = []( ranges::iterator_t<_R> __i)
+           -> generator<_Yielded, ranges::range_value_t<_R>>
+ 	  {
+         co_yield static_cast<_Yielded>(*__i);
+       };
+       return
+       yield_value
+       (
+       ranges::elements_of
+       (
+       __n
+       (  ranges::begin(__r.range))));
+     }
+     _Final_awaiter final_suspend() noexcept;
+     void unhandled_exception() {}
+   };
+   template <typename _Yielded>
+   struct _Promise_erased<_Yielded>::_Final_awaiter {
+     bool await_ready() noexcept;
+     template <typename _Promise>
+     void await_suspend(std::coroutine_handle<_Promise> __c) noexcept {}
+     void await_resume() noexcept {}
+   };
+   template <typename _Yielded>
+   template <typename _Gen>
+   struct _Promise_erased<_Yielded>::_Recursive_awaiter {
+     _Gen _M_gen;
+     constexpr bool await_ready() const noexcept { return false; }
+     template <typename _Promise>
+     void
+     await_suspend(std::coroutine_handle<_Promise> __p) noexcept {}
+     void await_resume() {}
+   };
+   } // namespace __gen
+   template <typename _Ref, typename _V>
+   struct generator
+   {
+     struct promise_type
+     :   __gen::_Promise_erased<const int &>
+     {
+       generator get_return_object() noexcept;
+     };
+   };
+ } // namespace std
+ using namespace std;
+ template <typename... Ranges>
+ auto concat(Ranges &&...ranges) -> generator<double, double> {
+   (
+   co_yield
+   ranges::elements_of(ranges), ...);
+ }
+ auto main() -> int {
+   int const numbers1[] = {4, 8, 15, 16, 23, 42};
+   double const numbers2[] = {4, 8, 15, 16, 23, 42};
+   concat(numbers1, numbers2)
+   ;
+ }
diff -Nrcpad gcc-14-20250502/gcc/testsuite/g++.dg/coroutines/pr116482.C gcc-14-20250509/gcc/testsuite/g++.dg/coroutines/pr116482.C
*** gcc-14-20250502/gcc/testsuite/g++.dg/coroutines/pr116482.C	Thu Jan  1 00:00:00 1970
--- gcc-14-20250509/gcc/testsuite/g++.dg/coroutines/pr116482.C	Fri May  9 22:32:18 2025
***************
*** 0 ****
--- 1,30 ----
+ // Override default options.
+ // { dg-options "-std=c++20 -fno-exceptions -Wall -Wextra" }
+ 
+ #include <coroutine>
+ 
+ struct SuspendNever {
+     bool await_ready();
+     void await_suspend(std::coroutine_handle<>);
+     void await_resume();
+ };
+ 
+ struct Coroutine;
+ 
+ struct PromiseType {
+     Coroutine get_return_object();
+     SuspendNever initial_suspend();
+     SuspendNever final_suspend();
+ #if __cpp_exceptions
+     void unhandled_exception() { /*std::terminate();*/ };
+ #endif
+     void return_void();
+ };
+ 
+ struct Coroutine {
+     using promise_type = PromiseType;
+ };
+ 
+ Coroutine __async_test_input_basic() {
+     co_return;
+ }
diff -Nrcpad gcc-14-20250502/gcc/testsuite/g++.dg/coroutines/pr116502.C gcc-14-20250509/gcc/testsuite/g++.dg/coroutines/pr116502.C
*** gcc-14-20250502/gcc/testsuite/g++.dg/coroutines/pr116502.C	Thu Jan  1 00:00:00 1970
--- gcc-14-20250509/gcc/testsuite/g++.dg/coroutines/pr116502.C	Fri May  9 22:32:18 2025
***************
*** 0 ****
--- 1,33 ----
+ // https://gcc.gnu.org/PR116502
+ #include <coroutine>
+ 
+ struct SuspendNever {
+   bool await_ready() noexcept;
+   void await_suspend(std::coroutine_handle<>) noexcept;
+   void await_resume() noexcept;
+ };
+ 
+ struct Coroutine;
+ 
+ struct PromiseType {
+   Coroutine get_return_object();
+   SuspendNever initial_suspend();
+   SuspendNever final_suspend() noexcept;
+   void return_void();
+   void unhandled_exception();
+ };
+ 
+ struct Coroutine {
+   using promise_type = PromiseType;
+ };
+ 
+ struct Awaiter {
+   bool await_ready();
+   void await_suspend(std::coroutine_handle<>);
+   [[nodiscard]] int& await_resume();
+ };
+ 
+ Coroutine foo()
+ {
+   (void)co_await Awaiter {};
+ }
diff -Nrcpad gcc-14-20250502/gcc/testsuite/g++.dg/coroutines/pr116506.C gcc-14-20250509/gcc/testsuite/g++.dg/coroutines/pr116506.C
*** gcc-14-20250502/gcc/testsuite/g++.dg/coroutines/pr116506.C	Thu Jan  1 00:00:00 1970
--- gcc-14-20250509/gcc/testsuite/g++.dg/coroutines/pr116506.C	Fri May  9 22:32:18 2025
***************
*** 0 ****
--- 1,53 ----
+ // { dg-do run }
+ // { dg-additional-options "-fno-exceptions" }
+                                                        
+ #include <coroutine>
+ 
+ bool g_too_early = true;
+ std::coroutine_handle<> g_handle;
+ 
+ struct Awaiter {
+     Awaiter() {}
+     ~Awaiter() {
+         if (g_too_early) {
+             __builtin_abort ();
+         }
+     }
+ 
+     bool await_ready() { return false; }
+     void await_suspend(std::coroutine_handle<> handle) {
+         g_handle = handle;
+     }
+ 
+     void await_resume() {}
+ };
+ 
+ struct SuspendNever {
+     bool await_ready() noexcept { return true; }
+     void await_suspend(std::coroutine_handle<>) noexcept {}
+     void await_resume() noexcept {}
+ };
+ 
+ struct Coroutine {
+     struct promise_type {
+         Coroutine get_return_object() { return {}; }
+         SuspendNever initial_suspend() { return {}; }
+         SuspendNever final_suspend() noexcept { return {}; }
+         void return_void() {}
+         void unhandled_exception() {}
+ 
+         Awaiter&& await_transform(Awaiter&& u) {
+             return static_cast<Awaiter&&>(u);
+         }
+     };
+ };
+ 
+ Coroutine foo() {
+     co_await Awaiter{};
+ }
+ 
+ int main() {
+     foo();
+     g_too_early = false;
+     g_handle.destroy();
+ }
diff -Nrcpad gcc-14-20250502/gcc/testsuite/g++.dg/coroutines/pr116793-1.C gcc-14-20250509/gcc/testsuite/g++.dg/coroutines/pr116793-1.C
*** gcc-14-20250502/gcc/testsuite/g++.dg/coroutines/pr116793-1.C	Thu Jan  1 00:00:00 1970
--- gcc-14-20250509/gcc/testsuite/g++.dg/coroutines/pr116793-1.C	Fri May  9 22:32:18 2025
***************
*** 0 ****
--- 1,26 ----
+ // https://gcc.gnu.org/PR116793
+ #include <tuple>
+ #include <coroutine>
+ struct _cleanup_task {
+   bool await_ready() const noexcept;
+   template <typename Promise>
+   bool await_suspend(std::coroutine_handle<Promise> parent) noexcept;
+   std::tuple<int &> await_resume() noexcept;
+ };
+ struct _task1 {
+   struct promise_type final {
+     std::suspend_always initial_suspend() noexcept;
+     _task1 get_return_object() noexcept;
+     void unhandled_exception() noexcept;
+     struct awaiter final {
+       bool await_ready() noexcept;
+       void await_resume() noexcept;
+       void await_suspend(std::coroutine_handle<promise_type> h) noexcept;
+     };
+     awaiter final_suspend() noexcept;
+   };
+ };
+ _cleanup_task func(int &&);
+ _task1 g() {
+   auto &&[i] = co_await func(3);
+ }
diff -Nrcpad gcc-14-20250502/gcc/testsuite/g++.dg/coroutines/pr116880.C gcc-14-20250509/gcc/testsuite/g++.dg/coroutines/pr116880.C
*** gcc-14-20250502/gcc/testsuite/g++.dg/coroutines/pr116880.C	Thu Jan  1 00:00:00 1970
--- gcc-14-20250509/gcc/testsuite/g++.dg/coroutines/pr116880.C	Fri May  9 22:32:18 2025
***************
*** 0 ****
--- 1,36 ----
+ #include <coroutine>
+ 
+ struct promise_type;
+ using handle_type = std::coroutine_handle<promise_type>;
+ 
+ struct Co {
+     handle_type handle;
+     using promise_type = ::promise_type;
+ 
+     explicit Co(handle_type handle) : handle(handle) {}
+ 
+     bool await_ready() { return false; }
+     std::coroutine_handle<> await_suspend(handle_type handle);
+     void await_resume() {}
+ };
+ 
+ struct Done {};
+ 
+ struct promise_type {
+     Co get_return_object();
+ 
+     std::suspend_always initial_suspend() { return {}; };
+     std::suspend_always final_suspend() noexcept { return {}; };
+     void return_value(Done) {}
+     void return_value(Co&&);
+     void unhandled_exception() { throw; };
+     Co&& await_transform(Co&& co) { return static_cast<Co&&>(co); }
+ };
+ 
+ Co tryToRun();
+ 
+ Co init()
+ {
+     co_await tryToRun();
+     co_return Done{};
+ }
diff -Nrcpad gcc-14-20250502/gcc/testsuite/g++.dg/coroutines/pr94879-folly-1.C gcc-14-20250509/gcc/testsuite/g++.dg/coroutines/pr94879-folly-1.C
*** gcc-14-20250502/gcc/testsuite/g++.dg/coroutines/pr94879-folly-1.C	Fri May  2 22:32:26 2025
--- gcc-14-20250509/gcc/testsuite/g++.dg/coroutines/pr94879-folly-1.C	Fri May  9 22:32:18 2025
*************** public:
*** 39,47 ****
    std::g initial_suspend();
    l final_suspend() noexcept;
  };
  class m : public j {
  public:
!   void get_return_object();
    void unhandled_exception();
  };
  class n {
--- 39,48 ----
    std::g initial_suspend();
    l final_suspend() noexcept;
  };
+ class n;
  class m : public j {
  public:
!   n get_return_object();
    void unhandled_exception();
  };
  class n {
diff -Nrcpad gcc-14-20250502/gcc/testsuite/g++.dg/coroutines/pr94883-folly-2.C gcc-14-20250509/gcc/testsuite/g++.dg/coroutines/pr94883-folly-2.C
*** gcc-14-20250502/gcc/testsuite/g++.dg/coroutines/pr94883-folly-2.C	Fri May  2 22:32:26 2025
--- gcc-14-20250509/gcc/testsuite/g++.dg/coroutines/pr94883-folly-2.C	Fri May  9 22:32:18 2025
*************** struct b {
*** 16,40 ****
    void await_resume();
  };
  } // namespace std
! 
! template <typename d> auto ab(int ac, d ad) -> decltype(ad.e(ac));
! int f;
! class h {
!   class j {
!   public:
!     bool await_ready() noexcept;
!     void await_suspend(std::coroutine_handle<>) noexcept;
!     void await_resume() noexcept;
!   };
! 
! public:
!   void get_return_object();
!   std::b initial_suspend();
!   j final_suspend() noexcept;
!   void unhandled_exception();
!   template <typename g> 
!     auto await_transform (g c) { return ab(f, c); }
! };
  template <typename, typename = int> class k {
  public:
    using promise_type = h;
--- 16,22 ----
    void await_resume();
  };
  } // namespace std
! class h;
  template <typename, typename = int> class k {
  public:
    using promise_type = h;
*************** my_coro (k<aj, ak> am, ai) {
*** 64,69 ****
--- 46,70 ----
      ;
  }
  
+ template <typename d> auto ab(int ac, d ad) -> decltype(ad.e(ac));
+ int f;
+ class h {
+   class j {
+   public:
+     bool await_ready() noexcept;
+     void await_suspend(std::coroutine_handle<>) noexcept;
+     void await_resume() noexcept;
+   };
+ 
+ public:
+   k<int> get_return_object();
+   std::b initial_suspend();
+   j final_suspend() noexcept;
+   void unhandled_exception();
+   template <typename g> 
+     auto await_transform (g c) { return ab(f, c); }
+ };
+ 
  void foo () {
    k<int> a;
    my_coro (a, [] {});
diff -Nrcpad gcc-14-20250502/gcc/testsuite/g++.dg/coroutines/pr96749-2.C gcc-14-20250509/gcc/testsuite/g++.dg/coroutines/pr96749-2.C
*** gcc-14-20250502/gcc/testsuite/g++.dg/coroutines/pr96749-2.C	Fri May  2 22:32:26 2025
--- gcc-14-20250509/gcc/testsuite/g++.dg/coroutines/pr96749-2.C	Fri May  9 22:32:18 2025
*************** struct Task {
*** 27,33 ****
  	struct promise_type {
  		auto initial_suspend() { return std::suspend_always{}; }
  		auto final_suspend() noexcept { return std::suspend_always{}; }
! 		void get_return_object() {}
  		void unhandled_exception() {}
  	};
  };
--- 27,33 ----
  	struct promise_type {
  		auto initial_suspend() { return std::suspend_always{}; }
  		auto final_suspend() noexcept { return std::suspend_always{}; }
! 		Task get_return_object() ;
  		void unhandled_exception() {}
  	};
  };
diff -Nrcpad gcc-14-20250502/gcc/testsuite/g++.dg/coroutines/pr98935.C gcc-14-20250509/gcc/testsuite/g++.dg/coroutines/pr98935.C
*** gcc-14-20250502/gcc/testsuite/g++.dg/coroutines/pr98935.C	Thu Jan  1 00:00:00 1970
--- gcc-14-20250509/gcc/testsuite/g++.dg/coroutines/pr98935.C	Fri May  9 22:32:18 2025
***************
*** 0 ****
--- 1,27 ----
+ //  { dg-additional-options "-Wno-pedantic" }
+ 
+ #if __has_include(<coroutine>)
+ #include <coroutine>
+ #elif __has_include(<experimental/coroutine>)
+ #include <experimental/coroutine>
+ namespace std {
+ using namespace std::experimental;
+ }
+ #endif
+ 
+ struct future {
+   struct promise_type {
+     void return_void() {}
+     std::suspend_always initial_suspend() noexcept { return {}; }
+     std::suspend_always final_suspend() noexcept { return {}; }
+     void unhandled_exception() {}
+     future get_return_object() { return {}; }
+   };
+   bool await_ready() { return false; }
+   void await_suspend(std::coroutine_handle<>) {}
+   int await_resume() { return 42; }
+ };
+ 
+ future failcase() {
+   co_await ({auto x = future{}; x;});
+ }
diff -Nrcpad gcc-14-20250502/gcc/testsuite/g++.dg/coroutines/torture/pr105104.C gcc-14-20250509/gcc/testsuite/g++.dg/coroutines/torture/pr105104.C
*** gcc-14-20250502/gcc/testsuite/g++.dg/coroutines/torture/pr105104.C	Thu Jan  1 00:00:00 1970
--- gcc-14-20250509/gcc/testsuite/g++.dg/coroutines/torture/pr105104.C	Fri May  9 22:32:18 2025
***************
*** 0 ****
--- 1,40 ----
+ // https://gcc.gnu.org/PR105104
+ // { dg-additional-options "-O" }
+ 
+ #include <coroutine>
+ 
+ // ICE during GIMPLE pass: coro-early-expand-ifs. final_awaiter::await_resume is
+ // non-void, and optimizations are enabled.
+ 
+ struct return_object
+ {
+   struct promise_type
+   {
+     static constexpr std::suspend_always initial_suspend () noexcept
+     {
+       return {};
+     }
+ 
+     struct final_awaiter
+     {
+       static constexpr bool await_ready () noexcept { return false; }
+       static constexpr void await_suspend (std::coroutine_handle<>) noexcept {}
+       static constexpr int await_resume () noexcept { return {}; }
+     };
+     static constexpr final_awaiter final_suspend () noexcept { return {}; }
+ 
+     static void unhandled_exception () { throw; }
+ 
+     return_object get_return_object () { return {}; }
+ 
+     static constexpr void return_void () noexcept {}
+   };
+ };
+ 
+ return_object
+ coroutine ()
+ {
+   co_return;
+ }
+ 
+ return_object f = coroutine ();
diff -Nrcpad gcc-14-20250502/gcc/testsuite/g++.dg/coroutines/torture/pr115905.C gcc-14-20250509/gcc/testsuite/g++.dg/coroutines/torture/pr115905.C
*** gcc-14-20250502/gcc/testsuite/g++.dg/coroutines/torture/pr115905.C	Thu Jan  1 00:00:00 1970
--- gcc-14-20250509/gcc/testsuite/g++.dg/coroutines/torture/pr115905.C	Fri May  9 22:32:18 2025
***************
*** 0 ****
--- 1,64 ----
+ // { dg-do run }
+ // { dg-additional-options "-std=c++20" }
+ 
+ #include <coroutine>
+ #ifdef OUTPUT
+ #include <iostream>
+ #endif
+ 
+ struct Promise;
+ 
+ struct Handle : std::coroutine_handle<Promise> {
+     using promise_type = Promise;
+ };
+ 
+ struct Promise {
+     Handle get_return_object() noexcept {
+         return {Handle::from_promise(*this)};
+     }
+     std::suspend_never initial_suspend() const noexcept { return {}; }
+     std::suspend_never final_suspend() const noexcept { return {}; }
+     void return_void() const noexcept {}
+     void unhandled_exception() const noexcept {}
+ };
+ 
+ struct Awaiter {
+     auto await_ready() const noexcept {
+         return false;
+     }
+ 
+     auto await_suspend(auto self) const noexcept {
+         self.resume();
+         return false;
+     }
+ 
+     int await_resume() const noexcept { return 42; }
+ };
+ 
+ bool OK = false;
+ 
+ Handle Coro() {
+ #ifdef OUTPUT
+     std::cout << "1\n";
+     std::cout << co_await Awaiter{} << '\n';
+ #else
+     (void) co_await Awaiter{};
+ #endif
+ #ifdef OUTPUT
+     std::cout << "2\n";
+ #endif
+     co_await std::suspend_always{};
+ #ifdef OUTPUT
+     std::cout << "3\n";
+ #endif
+     OK = true;
+     co_return;
+ }
+ 
+ int main() {
+     Coro();
+ 
+     if (!OK)
+       __builtin_abort ();
+     return 0;
+ }
diff -Nrcpad gcc-14-20250502/gcc/testsuite/g++.dg/opt/pr119327.C gcc-14-20250509/gcc/testsuite/g++.dg/opt/pr119327.C
*** gcc-14-20250502/gcc/testsuite/g++.dg/opt/pr119327.C	Thu Jan  1 00:00:00 1970
--- gcc-14-20250509/gcc/testsuite/g++.dg/opt/pr119327.C	Fri May  9 22:32:20 2025
***************
*** 0 ****
--- 1,16 ----
+ // PR target/119327
+ // { dg-do compile { target c++11 } }
+ // { dg-options "-Os" }
+ 
+ #pragma GCC optimize "fp-contract=off"
+ 
+ template <class T>
+ void
+ foo (T f)
+ {
+   f ();
+ }
+ 
+ struct S {
+   S () { [] {}; foo ([] __attribute__((always_inline)) {}); }
+ } s;
diff -Nrcpad gcc-14-20250502/gcc/testsuite/g++.dg/template/explicit-instantiation8.C gcc-14-20250509/gcc/testsuite/g++.dg/template/explicit-instantiation8.C
*** gcc-14-20250502/gcc/testsuite/g++.dg/template/explicit-instantiation8.C	Thu Jan  1 00:00:00 1970
--- gcc-14-20250509/gcc/testsuite/g++.dg/template/explicit-instantiation8.C	Fri May  9 22:32:20 2025
***************
*** 0 ****
--- 1,24 ----
+ // PR c++/109464
+ // { dg-do compile { target c++11 } }
+ 
+ template<typename T>
+ struct shallow
+  {
+    int len;
+    constexpr shallow() : len(0) { }
+   };
+ 
+ template<typename T>
+ struct use_shallow
+   {
+    static constexpr shallow<T> s_zstr = { };
+    static_assert(s_zstr.len == 0, "");
+   };
+ 
+ extern template struct shallow<char>;
+ extern template struct use_shallow<char>;
+ 
+ template struct shallow<char>;
+ template struct use_shallow<char>;
+ 
+ // { dg-final { scan-assembler "_ZN7shallowIcEC2Ev" } }
diff -Nrcpad gcc-14-20250502/gcc/testsuite/g++.dg/torture/pr119610.C gcc-14-20250509/gcc/testsuite/g++.dg/torture/pr119610.C
*** gcc-14-20250502/gcc/testsuite/g++.dg/torture/pr119610.C	Thu Jan  1 00:00:00 1970
--- gcc-14-20250509/gcc/testsuite/g++.dg/torture/pr119610.C	Fri May  9 22:32:20 2025
***************
*** 0 ****
--- 1,18 ----
+ // { dg-do run }
+ // { dg-additional-options "-fstack-protector-strong" { target fstack_protector } }
+ // { dg-additional-options "-fstack-clash-protection" { target supports_stack_clash_protection } }
+ 
+ int *ptr;
+ void foo() {
+   int c[1024*128];
+   ptr = c;
+   throw 1;
+ }
+ int main()
+ {
+   try {
+     foo();
+   } catch(int x) {
+     return 0;
+   }
+ }
diff -Nrcpad gcc-14-20250502/gcc/testsuite/g++.target/aarch64/sve/pr119610-sve.C gcc-14-20250509/gcc/testsuite/g++.target/aarch64/sve/pr119610-sve.C
*** gcc-14-20250502/gcc/testsuite/g++.target/aarch64/sve/pr119610-sve.C	Thu Jan  1 00:00:00 1970
--- gcc-14-20250509/gcc/testsuite/g++.target/aarch64/sve/pr119610-sve.C	Fri May  9 22:32:21 2025
***************
*** 0 ****
--- 1,20 ----
+ // { dg-do run { target aarch64_sve_hw } }
+ // { dg-additional-options "-fstack-protector-strong" { target fstack_protector } }
+ // { dg-additional-options "-fstack-clash-protection" { target supports_stack_clash_protection } }
+ 
+ void *a_ptr, *b_ptr;
+ void foo() {
+   __SVInt32_t a;
+   int b[1024*128];
+   a_ptr = &a;
+   b_ptr = b;
+   throw 1;
+ }
+ int main()
+ {
+   try {
+     foo();
+   } catch(int x) {
+     return 0;
+   }
+ }
diff -Nrcpad gcc-14-20250502/gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr116047-1.h gcc-14-20250509/gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr116047-1.h
*** gcc-14-20250502/gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr116047-1.h	Thu Jan  1 00:00:00 1970
--- gcc-14-20250509/gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr116047-1.h	Fri May  9 22:32:24 2025
***************
*** 0 ****
--- 1,6 ----
+ 
+ 
+ 
+ 
+ #include "location-overflow-test-pr116047-2.h"
+ static_assert (__LINE__ == 6, "");
diff -Nrcpad gcc-14-20250502/gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr116047-2.h gcc-14-20250509/gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr116047-2.h
*** gcc-14-20250502/gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr116047-2.h	Thu Jan  1 00:00:00 1970
--- gcc-14-20250509/gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr116047-2.h	Fri May  9 22:32:24 2025
***************
*** 0 ****
--- 1 ----
+ int i;
diff -Nrcpad gcc-14-20250502/gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr116047.c gcc-14-20250509/gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr116047.c
*** gcc-14-20250502/gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr116047.c	Thu Jan  1 00:00:00 1970
--- gcc-14-20250509/gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr116047.c	Fri May  9 22:32:24 2025
***************
*** 0 ****
--- 1,5 ----
+ /* PR preprocessor/116047 */
+ /* { dg-do preprocess } */
+ /* { dg-options "-nostdinc -std=c23 -fplugin-arg-location_overflow_plugin-value=0x4fff8080" } */
+ #include "location-overflow-test-pr116047-1.h"
+ /* { dg-final { scan-file location-overflow-test-pr116047.i "static_assert\[^\n\r]\*6\[^\n\r]\*== 6" } } */
diff -Nrcpad gcc-14-20250502/gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr120061-1.h gcc-14-20250509/gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr120061-1.h
*** gcc-14-20250502/gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr120061-1.h	Thu Jan  1 00:00:00 1970
--- gcc-14-20250509/gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr120061-1.h	Fri May  9 22:32:24 2025
***************
*** 0 ****
--- 1,6 ----
+ 
+ 
+ 
+ 
+ #include "location-overflow-test-pr120061-2.h"
+ 
diff -Nrcpad gcc-14-20250502/gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr120061-2.h gcc-14-20250509/gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr120061-2.h
*** gcc-14-20250502/gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr120061-2.h	Thu Jan  1 00:00:00 1970
--- gcc-14-20250509/gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr120061-2.h	Fri May  9 22:32:24 2025
***************
*** 0 ****
--- 1 ----
+ int i;
diff -Nrcpad gcc-14-20250502/gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr120061.c gcc-14-20250509/gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr120061.c
*** gcc-14-20250502/gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr120061.c	Thu Jan  1 00:00:00 1970
--- gcc-14-20250509/gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr120061.c	Fri May  9 22:32:24 2025
***************
*** 0 ****
--- 1,6 ----
+ /* PR preprocessor/120061 */
+ /* { dg-do preprocess } */
+ /* { dg-options "-nostdinc -std=c23 -fplugin-arg-location_overflow_plugin-value=0x61000000" } */
+ #include "location-overflow-test-pr120061-1.h"
+ static_assert (__LINE__ == 5, "");
+ /* { dg-final { scan-file location-overflow-test-pr120061.i "static_assert\[^\n\r]\*5\[^\n\r]\*== 5" } } */
diff -Nrcpad gcc-14-20250502/gcc/testsuite/gcc.dg/plugin/location_overflow_plugin.c gcc-14-20250509/gcc/testsuite/gcc.dg/plugin/location_overflow_plugin.c
*** gcc-14-20250502/gcc/testsuite/gcc.dg/plugin/location_overflow_plugin.c	Fri May  2 22:32:36 2025
--- gcc-14-20250509/gcc/testsuite/gcc.dg/plugin/location_overflow_plugin.c	Fri May  9 22:32:24 2025
*************** plugin_init (struct plugin_name_args *pl
*** 101,107 ****
        break;
  
      default:
!       error_at (UNKNOWN_LOCATION, "unrecognized value for plugin argument");
      }
  
    return 0;
--- 101,107 ----
        break;
  
      default:
!       break;
      }
  
    return 0;
diff -Nrcpad gcc-14-20250502/gcc/testsuite/gcc.dg/plugin/plugin.exp gcc-14-20250509/gcc/testsuite/gcc.dg/plugin/plugin.exp
*** gcc-14-20250502/gcc/testsuite/gcc.dg/plugin/plugin.exp	Fri May  2 22:32:36 2025
--- gcc-14-20250509/gcc/testsuite/gcc.dg/plugin/plugin.exp	Fri May  9 22:32:24 2025
*************** set plugin_test_list [list \
*** 126,132 ****
      { location_overflow_plugin.c \
  	  location-overflow-test-1.c \
  	  location-overflow-test-2.c \
! 	  location-overflow-test-pr83173.c } \
      { must_tail_call_plugin.c \
  	  must-tail-call-1.c \
  	  must-tail-call-2.c } \
--- 126,134 ----
      { location_overflow_plugin.c \
  	  location-overflow-test-1.c \
  	  location-overflow-test-2.c \
! 	  location-overflow-test-pr83173.c \
! 	  location-overflow-test-pr116047.c \
! 	  location-overflow-test-pr120061.c } \
      { must_tail_call_plugin.c \
  	  must-tail-call-1.c \
  	  must-tail-call-2.c } \
diff -Nrcpad gcc-14-20250502/gcc/testsuite/gcc.dg/pr120048.c gcc-14-20250509/gcc/testsuite/gcc.dg/pr120048.c
*** gcc-14-20250502/gcc/testsuite/gcc.dg/pr120048.c	Thu Jan  1 00:00:00 1970
--- gcc-14-20250509/gcc/testsuite/gcc.dg/pr120048.c	Fri May  9 22:32:24 2025
***************
*** 0 ****
--- 1,12 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -fno-tree-vrp -fno-tree-fre" } */
+ 
+ int a, b, c;
+ static int d(short e) { return e || (a && e) ? 0 : a; }
+ static void f(int e) {
+   if (!e) {
+     d(0);
+     b = d(e);
+   }
+ }
+ int main() { f(c | 1); }
diff -Nrcpad gcc-14-20250502/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr118950.c gcc-14-20250509/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr118950.c
*** gcc-14-20250502/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr118950.c	Thu Jan  1 00:00:00 1970
--- gcc-14-20250509/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr118950.c	Fri May  9 22:32:53 2025
***************
*** 0 ****
--- 1,29 ----
+ /* { dg-do run } */
+ /* { dg-require-effective-target riscv_v_ok } */
+ /* { dg-add-options riscv_v } */
+ /* { dg-additional-options "-std=gnu99 -Wno-pedantic" } */
+ 
+ unsigned char a;
+ long long r;
+ _Bool h = 1;
+ short j[23];
+ _Bool k[3][23];
+ 
+ void b(_Bool h, short j[], _Bool k[][23]) {
+   for (int m = 0; m < 23; m += 3)
+     for (short n = 0; n < 22; n += 4)
+       a = ({
+         unsigned char o = a;
+         unsigned char p = j[n] ? h : k[m][n];
+         o > p ? o : p;
+       });
+ }
+ 
+ int main() {
+   for (int m = 0; m < 23; ++m)
+     j[m] = 10;
+   b(h, j, k);
+   r = a;
+   if (r != 1)
+     __builtin_abort ();
+ }
diff -Nrcpad gcc-14-20250502/gcc/testsuite/gnat.dg/opt106.adb gcc-14-20250509/gcc/testsuite/gnat.dg/opt106.adb
*** gcc-14-20250502/gcc/testsuite/gnat.dg/opt106.adb	Thu Jan  1 00:00:00 1970
--- gcc-14-20250509/gcc/testsuite/gnat.dg/opt106.adb	Fri May  9 22:33:00 2025
***************
*** 0 ****
--- 1,11 ----
+ -- { dg-do run }
+ -- { dg-options "-O2" }
+ 
+ with Opt106_Pkg1; use Opt106_Pkg1;
+ 
+ procedure Opt106 is
+   Obj : T := (False, 0, 0, 0, True);
+ 
+ begin
+   Proc (Obj, 0, False, True);
+ end;
diff -Nrcpad gcc-14-20250502/gcc/testsuite/gnat.dg/opt106_pkg1.adb gcc-14-20250509/gcc/testsuite/gnat.dg/opt106_pkg1.adb
*** gcc-14-20250502/gcc/testsuite/gnat.dg/opt106_pkg1.adb	Thu Jan  1 00:00:00 1970
--- gcc-14-20250509/gcc/testsuite/gnat.dg/opt106_pkg1.adb	Fri May  9 22:33:00 2025
***************
*** 0 ****
--- 1,39 ----
+ with Opt106_Pkg2; use Opt106_Pkg2;
+ 
+ package body Opt106_Pkg1 is
+ 
+   procedure Proc (Obj     : in out T;
+                   Data    : Integer;
+                   Last    : Boolean;
+                   Stretch : Boolean) is
+ 
+   begin
+     if Stretch and then (Obj.Delayed /= 0 or else not Obj.Attach_Last) then
+       raise Program_Error;
+     end if;
+ 
+     if Obj.Delayed /= 0 then
+       Stop (Obj.Delayed, Obj.Before, Data, False);
+     end if;
+ 
+     if Last or (Obj.Delayed = 0 and not Stretch) then
+       Stop (Data, Obj.Before, 0, Last);
+ 
+       if Last then
+         Obj.Initialized := False;
+       else
+         Obj.Next := 0;
+         Obj.Before := Data;
+       end if;
+ 
+     else
+       if Stretch then
+         Obj.Next := 1;
+       else
+         Obj.Before := Obj.Delayed;
+       end if;
+       Obj.Delayed := Data;
+     end if;
+   end;
+ 
+ end Opt106_Pkg1;
diff -Nrcpad gcc-14-20250502/gcc/testsuite/gnat.dg/opt106_pkg1.ads gcc-14-20250509/gcc/testsuite/gnat.dg/opt106_pkg1.ads
*** gcc-14-20250502/gcc/testsuite/gnat.dg/opt106_pkg1.ads	Thu Jan  1 00:00:00 1970
--- gcc-14-20250509/gcc/testsuite/gnat.dg/opt106_pkg1.ads	Fri May  9 22:33:00 2025
***************
*** 0 ****
--- 1,16 ----
+ package Opt106_Pkg1 is
+ 
+   type T is record
+     Initialized   : Boolean;
+     Before        : Integer;
+     Delayed       : Integer;
+     Next          : Integer;
+     Attach_Last   : Boolean;
+   end record;
+ 
+   procedure Proc (Obj     : in out T;
+                   Data    : Integer;
+                   Last    : Boolean;
+                   Stretch : Boolean);
+ 
+ end Opt106_Pkg1;
diff -Nrcpad gcc-14-20250502/gcc/testsuite/gnat.dg/opt106_pkg2.adb gcc-14-20250509/gcc/testsuite/gnat.dg/opt106_pkg2.adb
*** gcc-14-20250502/gcc/testsuite/gnat.dg/opt106_pkg2.adb	Thu Jan  1 00:00:00 1970
--- gcc-14-20250509/gcc/testsuite/gnat.dg/opt106_pkg2.adb	Fri May  9 22:33:00 2025
***************
*** 0 ****
--- 1,11 ----
+ package body Opt106_Pkg2 is
+ 
+   procedure Stop (Delayed : Integer;
+                   Before  : Integer;
+                   After   : Integer;
+                   Last    : Boolean) is
+   begin
+      raise Program_Error;
+   end;
+ 
+ end Opt106_Pkg2;
diff -Nrcpad gcc-14-20250502/gcc/testsuite/gnat.dg/opt106_pkg2.ads gcc-14-20250509/gcc/testsuite/gnat.dg/opt106_pkg2.ads
*** gcc-14-20250502/gcc/testsuite/gnat.dg/opt106_pkg2.ads	Thu Jan  1 00:00:00 1970
--- gcc-14-20250509/gcc/testsuite/gnat.dg/opt106_pkg2.ads	Fri May  9 22:33:00 2025
***************
*** 0 ****
--- 1,8 ----
+ package Opt106_Pkg2 is
+ 
+   procedure Stop (Delayed : Integer;
+                   Before  : Integer;
+                   After   : Integer;
+                   Last    : Boolean);
+ 
+ end Opt106_Pkg2;
diff -Nrcpad gcc-14-20250502/gcc/tree-ssa-alias.cc gcc-14-20250509/gcc/tree-ssa-alias.cc
*** gcc-14-20250502/gcc/tree-ssa-alias.cc	Fri May  2 22:33:29 2025
--- gcc-14-20250509/gcc/tree-ssa-alias.cc	Fri May  9 22:33:01 2025
*************** ptr_deref_may_alias_decl_p (tree ptr, tr
*** 295,300 ****
--- 295,305 ----
    if (!may_be_aliased (decl))
      return false;
  
+   /* From here we require a SSA name pointer.  Anything else aliases.  */
+   if (TREE_CODE (ptr) != SSA_NAME
+       || !POINTER_TYPE_P (TREE_TYPE (ptr)))
+     return true;
+ 
    /* If we do not have useful points-to information for this pointer
       we cannot disambiguate anything else.  */
    pi = SSA_NAME_PTR_INFO (ptr);
diff -Nrcpad gcc-14-20250502/gcc/tree-vect-patterns.cc gcc-14-20250509/gcc/tree-vect-patterns.cc
*** gcc-14-20250502/gcc/tree-vect-patterns.cc	Fri May  2 22:33:29 2025
--- gcc-14-20250509/gcc/tree-vect-patterns.cc	Fri May  9 22:33:01 2025
*************** vect_recog_gather_scatter_pattern (vec_i
*** 6264,6270 ****
        else
  	pattern_stmt = gimple_build_call_internal (gs_info.ifn, 4, base,
  						   offset, scale, zero);
!       tree load_lhs = vect_recog_temp_ssa_var (gs_info.element_type, NULL);
        gimple_call_set_lhs (pattern_stmt, load_lhs);
      }
    else
--- 6264,6271 ----
        else
  	pattern_stmt = gimple_build_call_internal (gs_info.ifn, 4, base,
  						   offset, scale, zero);
!       tree lhs = gimple_get_lhs (stmt_info->stmt);
!       tree load_lhs = vect_recog_temp_ssa_var (TREE_TYPE (lhs), NULL);
        gimple_call_set_lhs (pattern_stmt, load_lhs);
      }
    else
diff -Nrcpad gcc-14-20250502/gcc/vr-values.cc gcc-14-20250509/gcc/vr-values.cc
*** gcc-14-20250502/gcc/vr-values.cc	Fri May  2 22:33:29 2025
--- gcc-14-20250509/gcc/vr-values.cc	Fri May  9 22:33:01 2025
*************** simplify_using_ranges::simplify (gimple_
*** 1956,1965 ****
  
  	case BIT_AND_EXPR:
  	case BIT_IOR_EXPR:
! 	  /* Optimize away BIT_AND_EXPR and BIT_IOR_EXPR
! 	     if all the bits being cleared are already cleared or
! 	     all the bits being set are already set.  */
! 	  if (INTEGRAL_TYPE_P (TREE_TYPE (rhs1)))
  	    return simplify_bit_ops_using_ranges (gsi, stmt);
  	  break;
  
--- 1956,1968 ----
  
  	case BIT_AND_EXPR:
  	case BIT_IOR_EXPR:
! 	  /* Optimize away BIT_AND_EXPR and BIT_IOR_EXPR if all the bits
! 	     being cleared are already cleared or all the bits being set
! 	     are already set.  Beware that boolean types must be handled
! 	     logically (see range-op.cc) unless they have precision 1.  */
! 	  if (INTEGRAL_TYPE_P (TREE_TYPE (rhs1))
! 	      && (TREE_CODE (TREE_TYPE (rhs1)) != BOOLEAN_TYPE
! 		  || TYPE_PRECISION (TREE_TYPE (rhs1)) == 1))
  	    return simplify_bit_ops_using_ranges (gsi, stmt);
  	  break;
  
diff -Nrcpad gcc-14-20250502/libcpp/ChangeLog gcc-14-20250509/libcpp/ChangeLog
*** gcc-14-20250502/libcpp/ChangeLog	Fri May  2 22:33:30 2025
--- gcc-14-20250509/libcpp/ChangeLog	Fri May  9 22:33:01 2025
***************
*** 1,3 ****
--- 1,16 ----
+ 2025-05-08  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR preprocessor/108900
+ 	PR preprocessor/116047
+ 	PR preprocessor/120061
+ 	* files.cc (_cpp_stack_file): Revert 2025-03-28 change.
+ 	* line-map.cc (linemap_add): Use
+ 	SOURCE_LINE (from, linemap_included_from (map - 1)) + 1; instead of
+ 	SOURCE_LINE (from, from[1].start_location); to compute to_line
+ 	for LC_LEAVE if from[1].reason is LC_RENAME.  For LC_ENTER
+ 	included_from computation, look at map[-2] or even lower if map[-1]
+ 	has the same start_location as map[0].
+ 
  2025-04-23  Jeremy Bettis  <jbettis@google.com>
  
  	Backported from master:
diff -Nrcpad gcc-14-20250502/libcpp/files.cc gcc-14-20250509/libcpp/files.cc
*** gcc-14-20250502/libcpp/files.cc	Fri May  2 22:33:30 2025
--- gcc-14-20250509/libcpp/files.cc	Fri May  9 22:33:01 2025
*************** _cpp_stack_file (cpp_reader *pfile, _cpp
*** 1006,1019 ****
  		    && (pfile->line_table->highest_location
  			!= LINE_MAP_MAX_LOCATION - 1));
  
-   if (decrement && LINEMAPS_ORDINARY_USED (pfile->line_table))
-     {
-       const line_map_ordinary *map
- 	= LINEMAPS_LAST_ORDINARY_MAP (pfile->line_table);
-       if (map && map->start_location == pfile->line_table->highest_location)
- 	decrement = false;
-     }
- 
    if (decrement)
      pfile->line_table->highest_location--;
  
--- 1006,1011 ----
diff -Nrcpad gcc-14-20250502/libcpp/line-map.cc gcc-14-20250509/libcpp/line-map.cc
*** gcc-14-20250502/libcpp/line-map.cc	Fri May  2 22:33:30 2025
--- gcc-14-20250509/libcpp/line-map.cc	Fri May  9 22:33:01 2025
*************** linemap_add (line_maps *set, enum lc_rea
*** 618,625 ****
  	 #include "included", inside the same "includer" file.  */
  
        linemap_assert (!MAIN_FILE_P (map - 1));
!       /* (MAP - 1) points to the map we are leaving. The
! 	 map from which (MAP - 1) got included should be the map
  	 that comes right before MAP in the same file.  */
        from = linemap_included_from_linemap (set, map - 1);
  
--- 618,625 ----
  	 #include "included", inside the same "includer" file.  */
  
        linemap_assert (!MAIN_FILE_P (map - 1));
!       /* (MAP - 1) points to the map we are leaving.  The
! 	 map from which (MAP - 1) got included should be usually the map
  	 that comes right before MAP in the same file.  */
        from = linemap_included_from_linemap (set, map - 1);
  
*************** linemap_add (line_maps *set, enum lc_rea
*** 627,633 ****
        if (to_file == NULL)
  	{
  	  to_file = ORDINARY_MAP_FILE_NAME (from);
! 	  to_line = SOURCE_LINE (from, from[1].start_location);
  	  sysp = ORDINARY_MAP_IN_SYSTEM_HEADER_P (from);
  	}
        else
--- 627,650 ----
        if (to_file == NULL)
  	{
  	  to_file = ORDINARY_MAP_FILE_NAME (from);
! 	  /* Compute the line on which the map resumes, for #include this
! 	     should be the line after the #include line.  Usually FROM is
! 	     the map right before LC_ENTER map - the first map of the included
! 	     file, and in that case SOURCE_LINE (from, from[1].start_location);
! 	     computes the right line (and does handle even some special cases
! 	     (e.g. where for returning from <command line> we still want to
! 	     be at line 0 or some -traditional-cpp cases).  In rare cases
! 	     FROM can be followed by LC_RENAME created by linemap_line_start
! 	     for line right after #include line.  If that happens,
! 	     start_location of the FROM[1] map will be the same as
! 	     start_location of FROM[2] LC_ENTER, but FROM[1] start_location
! 	     might not have advance enough for moving to a full next line.
! 	     In that case compute the line of #include line and add 1 to it
! 	     to advance to the next line.  See PR120061.  */
! 	  if (from[1].reason == LC_RENAME)
! 	    to_line = SOURCE_LINE (from, linemap_included_from (map - 1)) + 1;
! 	  else
! 	    to_line = SOURCE_LINE (from, from[1].start_location);
  	  sysp = ORDINARY_MAP_IN_SYSTEM_HEADER_P (from);
  	}
        else
*************** linemap_add (line_maps *set, enum lc_rea
*** 657,667 ****
        if (set->depth == 0)
  	map->included_from = 0;
        else
! 	/* The location of the end of the just-closed map.  */
! 	map->included_from
! 	  = (((map[0].start_location - 1 - map[-1].start_location)
! 	      & ~((1 << map[-1].m_column_and_range_bits) - 1))
! 	     + map[-1].start_location);
        set->depth++;
        if (set->trace_includes)
  	trace_include (set, map);
--- 674,699 ----
        if (set->depth == 0)
  	map->included_from = 0;
        else
! 	{
! 	  /* Compute location from whence this line map was included.
! 	     For #include this should be preferrably column 0 of the
! 	     line on which #include directive appears.
! 	     map[-1] is the just closed map and usually included_from
! 	     falls within that map.  In rare cases linemap_line_start
! 	     can insert a new LC_RENAME map for the line immediately
! 	     after #include line, in that case map[-1] will have the
! 	     same start_location as the new one and so included_from
! 	     would not be from map[-1] but likely map[-2].  If that
! 	     happens, mask off map[-2] m_column_and_range_bits bits
! 	     instead of map[-1].  See PR120061.  */
! 	  int i = -1;
! 	  while (map[i].start_location == map[0].start_location)
! 	    --i;
! 	  map->included_from
! 	    = (((map[0].start_location - 1 - map[i].start_location)
! 		& ~((1 << map[i].m_column_and_range_bits) - 1))
! 	       + map[i].start_location);
! 	}
        set->depth++;
        if (set->trace_includes)
  	trace_include (set, map);
diff -Nrcpad gcc-14-20250502/libstdc++-v3/ChangeLog gcc-14-20250509/libstdc++-v3/ChangeLog
*** gcc-14-20250502/libstdc++-v3/ChangeLog	Fri May  2 22:33:37 2025
--- gcc-14-20250509/libstdc++-v3/ChangeLog	Fri May  9 22:33:06 2025
***************
*** 1,3 ****
--- 1,12 ----
+ 2025-05-06  Dhruv Chawla  <dhruvc@nvidia.com>
+ 
+ 	Backported from master:
+ 	2025-05-02  Dhruv Chawla  <dhruvc@nvidia.com>
+ 
+ 	* include/std/memory: Define __glibcxx_want_addressof_constexpr.
+ 	* testsuite/20_util/headers/memory/version.cc: Test for macro
+ 	value.
+ 
  2025-04-30  François Dumont  <frs.dumont@gmail.com>
  
  	Backported from master:
diff -Nrcpad gcc-14-20250502/libstdc++-v3/include/std/memory gcc-14-20250509/libstdc++-v3/include/std/memory
*** gcc-14-20250502/libstdc++-v3/include/std/memory	Fri May  2 22:33:38 2025
--- gcc-14-20250509/libstdc++-v3/include/std/memory	Fri May  9 22:33:07 2025
***************
*** 95,100 ****
--- 95,101 ----
  #  include <bits/out_ptr.h>
  #endif
  
+ #define __glibcxx_want_addressof_constexpr
  #define __glibcxx_want_allocator_traits_is_always_equal
  #define __glibcxx_want_assume_aligned
  #define __glibcxx_want_atomic_shared_ptr
diff -Nrcpad gcc-14-20250502/libstdc++-v3/testsuite/20_util/headers/memory/version.cc gcc-14-20250509/libstdc++-v3/testsuite/20_util/headers/memory/version.cc
*** gcc-14-20250502/libstdc++-v3/testsuite/20_util/headers/memory/version.cc	Fri May  2 22:33:38 2025
--- gcc-14-20250509/libstdc++-v3/testsuite/20_util/headers/memory/version.cc	Fri May  9 22:33:07 2025
***************
*** 6,8 ****
--- 6,12 ----
  #if __cpp_lib_allocator_traits_is_always_equal != 201411L
  # error "Feature-test macro __cpp_lib_allocator_traits_is_always_equal has wrong value in <version>"
  #endif
+ 
+ #if __cpp_lib_addressof_constexpr != 201603L
+ # error "Feature-test macro __cpp_lib_addressof_constexpr has wrong value in <version>"
+ #endif
