diff -Nrcpad gcc-16-20260125/LAST_UPDATED gcc-16-20260201/LAST_UPDATED
*** gcc-16-20260125/LAST_UPDATED	Sun Jan 25 22:32:23 2026
--- gcc-16-20260201/LAST_UPDATED	Sun Feb  1 22:32:21 2026
***************
*** 1 ****
! Obtained from git: master revision 9077e2067bc8667084745c7746b48d0e3e49b063
--- 1 ----
! Obtained from git: master revision 7eac62572c7955e38760a906debea5cbed846491
diff -Nrcpad gcc-16-20260125/MD5SUMS gcc-16-20260201/MD5SUMS
*** gcc-16-20260125/MD5SUMS	Sun Jan 25 22:32:28 2026
--- gcc-16-20260201/MD5SUMS	Sun Feb  1 22:32:26 2026
***************
*** 1,5 ****
  # This file contains the MD5 checksums of the files in the
! # gcc-16-20260125.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-16-20260201.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
*************** e7934fd1dc002b83ffe40322ac8a4348  Change
*** 28,34 ****
  fd4ecdf5d672efe2b0e409aca9cf9446  ChangeLog.jit
  09538b708302f1735f6fa05b622ecf5e  ChangeLog.tree-ssa
  24ab760126489e69436a43185dc3d202  INSTALL/README
! 8e673411903b567ccb917dc65363e92d  LAST_UPDATED
  b8fa044b3336d9cc6214e6ff3e9b467d  MAINTAINERS
  af43617880b3cd9c10627c97e639d29e  Makefile.def
  1ce83cd940f8facbf202979ac1b7b2c4  Makefile.in
--- 28,34 ----
  fd4ecdf5d672efe2b0e409aca9cf9446  ChangeLog.jit
  09538b708302f1735f6fa05b622ecf5e  ChangeLog.tree-ssa
  24ab760126489e69436a43185dc3d202  INSTALL/README
! c7a54e9606fd1c455fa128286d867200  LAST_UPDATED
  b8fa044b3336d9cc6214e6ff3e9b467d  MAINTAINERS
  af43617880b3cd9c10627c97e639d29e  Makefile.def
  1ce83cd940f8facbf202979ac1b7b2c4  Makefile.in
*************** e2dc6b4fd62b77bff96b7951ef74f78f  config
*** 159,165 ****
  db74a73c3c9c3cc71edec37c2436e082  config/zstd.m4
  a4cf7c1e80a4ca16c7140da014eb6160  configure
  c6c041ed3d45073918c4c65f8b25e93c  configure.ac
! 018170b373a2624c9703a9cc6b5cbe07  contrib/ChangeLog
  5fc435c7928f858246df931ea3f3ece7  contrib/ChangeLog.jit
  7af8d2979bf1a7cfa88e30d05fa22be2  contrib/ChangeLog.tree-ssa
  0928ae42250fbb57246cf6e9bff2276b  contrib/analyze_brprob.py
--- 159,165 ----
  db74a73c3c9c3cc71edec37c2436e082  config/zstd.m4
  a4cf7c1e80a4ca16c7140da014eb6160  configure
  c6c041ed3d45073918c4c65f8b25e93c  configure.ac
! 7a6e3f8796c0c2e0d31adea588bbc109  contrib/ChangeLog
  5fc435c7928f858246df931ea3f3ece7  contrib/ChangeLog.jit
  7af8d2979bf1a7cfa88e30d05fa22be2  contrib/ChangeLog.tree-ssa
  0928ae42250fbb57246cf6e9bff2276b  contrib/analyze_brprob.py
*************** fc345f1413e7f99f00e4cb2870f02723  contri
*** 182,188 ****
  8ae4a4d45e23f2defa74aef0b7cabbeb  contrib/compare-debug
  e1d12a65b82fa451f8d0d4ef0f849895  contrib/compare-lto
  d09c16bcb6b535fb130486ef9ee3beec  contrib/compareSumTests3
! 036122880600e04a6dc9e6c49fcd070c  contrib/compare_tests
  652ed31d99697495ddefe9885ce403da  contrib/compare_two_ftime_report_sets
  6617ffafaa212bc8e53229479c2f2f4c  contrib/config-list.mk
  50d60ebb1e537550506cd7352443d454  contrib/dg-cmp-results.sh
--- 182,188 ----
  8ae4a4d45e23f2defa74aef0b7cabbeb  contrib/compare-debug
  e1d12a65b82fa451f8d0d4ef0f849895  contrib/compare-lto
  d09c16bcb6b535fb130486ef9ee3beec  contrib/compareSumTests3
! c0b13a476b5e57b6d55b304f67f69581  contrib/compare_tests
  652ed31d99697495ddefe9885ce403da  contrib/compare_two_ftime_report_sets
  6617ffafaa212bc8e53229479c2f2f4c  contrib/config-list.mk
  50d60ebb1e537550506cd7352443d454  contrib/dg-cmp-results.sh
*************** f15bc3c5de22eac0bdd4f611502139a0  gcc/AB
*** 520,526 ****
  a916467b91076e631dd8edb7424769c7  gcc/COPYING.LIB
  d32239bcb673463ab874e80d47fae504  gcc/COPYING3
  6a6a8e020838b23406c81b19c1d46df6  gcc/COPYING3.LIB
! 7b75a684202cb2ec0b6e9a2323754bd0  gcc/ChangeLog
  51281e73aa07fb62394bd72f3c9299ba  gcc/ChangeLog-1997
  f77af8c9ac412064886b00c5506123b5  gcc/ChangeLog-1998
  00a2e4ead1b289bf69bca0196fed6f9f  gcc/ChangeLog-1999
--- 520,526 ----
  a916467b91076e631dd8edb7424769c7  gcc/COPYING.LIB
  d32239bcb673463ab874e80d47fae504  gcc/COPYING3
  6a6a8e020838b23406c81b19c1d46df6  gcc/COPYING3.LIB
! fde7f4867799dcd5b4c0bb191aae5331  gcc/ChangeLog
  51281e73aa07fb62394bd72f3c9299ba  gcc/ChangeLog-1997
  f77af8c9ac412064886b00c5506123b5  gcc/ChangeLog-1998
  00a2e4ead1b289bf69bca0196fed6f9f  gcc/ChangeLog-1999
*************** fb3fadb88e1d2b3b640cfaaa5ff11780  gcc/Ch
*** 558,564 ****
  3eb07e0b2e542409bf73d359f7f65609  gcc/ChangeLog.ptr
  e13638e26743ba41e6011b76cc00d9a9  gcc/ChangeLog.tree-ssa
  739ab47f6425bcea1d05e4fc0542de54  gcc/ChangeLog.tuples
! ed84b57624d6d0b5e00bde4c0b805221  gcc/DATESTAMP
  deb513e591f23901188e22323bd3b1d4  gcc/DEV-PHASE
  eb92e1ff5e982ca07e173e0eb286d243  gcc/FSFChangeLog
  30e1e33411566388b3164558482dc5e6  gcc/FSFChangeLog.10
--- 558,564 ----
  3eb07e0b2e542409bf73d359f7f65609  gcc/ChangeLog.ptr
  e13638e26743ba41e6011b76cc00d9a9  gcc/ChangeLog.tree-ssa
  739ab47f6425bcea1d05e4fc0542de54  gcc/ChangeLog.tuples
! ba0283137050d8feb04f9801cc212fed  gcc/DATESTAMP
  deb513e591f23901188e22323bd3b1d4  gcc/DEV-PHASE
  eb92e1ff5e982ca07e173e0eb286d243  gcc/FSFChangeLog
  30e1e33411566388b3164558482dc5e6  gcc/FSFChangeLog.10
*************** a817c5577f2b35f8d2481c787e3ff7e2  gcc/LA
*** 567,576 ****
  2ee667f2715e04f707186820f083d854  gcc/Makefile.in
  ec6799501b2eb2923d5de6a66169dbd2  gcc/ONEWS
  c8c9dd1eaee4ffd4d5d9f3ab70fddd4b  gcc/README.Portability
! ad60bbbc1a86c00cde3257eac7028538  gcc/acinclude.m4
  e74733ebf762151e601c9e0aa1461a20  gcc/aclocal.m4
  16a499934b71eb6cf7c0d6899cd6006a  gcc/ada/.gitignore
! 92442c85e6bea648cdeb4e36d91ac5dc  gcc/ada/ChangeLog
  c2094c0d3135f9ac89917f162046ee04  gcc/ada/ChangeLog-2001
  fa410b57f5d814d5d3ac3b45f486cdcf  gcc/ada/ChangeLog-2002
  2dbefa7bdc8dc28ec746002028861278  gcc/ada/ChangeLog-2003
--- 567,576 ----
  2ee667f2715e04f707186820f083d854  gcc/Makefile.in
  ec6799501b2eb2923d5de6a66169dbd2  gcc/ONEWS
  c8c9dd1eaee4ffd4d5d9f3ab70fddd4b  gcc/README.Portability
! 868da9a9c47854ff127b79f03744e4f3  gcc/acinclude.m4
  e74733ebf762151e601c9e0aa1461a20  gcc/aclocal.m4
  16a499934b71eb6cf7c0d6899cd6006a  gcc/ada/.gitignore
! a023d4e9557c72473b4f724ba17887d0  gcc/ada/ChangeLog
  c2094c0d3135f9ac89917f162046ee04  gcc/ada/ChangeLog-2001
  fa410b57f5d814d5d3ac3b45f486cdcf  gcc/ada/ChangeLog-2002
  2dbefa7bdc8dc28ec746002028861278  gcc/ada/ChangeLog-2003
*************** c2c2ce0ac85db6276eb58438ed0655a7  gcc/ad
*** 660,666 ****
  4f4e391248e66a4b9cc396f9765ce4f2  gcc/ada/butil.ads
  29d9f902f66fe8415f5b9f300ca23b66  gcc/ada/casing.adb
  25bd0c7e9883d8c218b0ab36b2859de6  gcc/ada/casing.ads
! 5c93349a93227cbc150fd84c3153a4c5  gcc/ada/checks.adb
  718318d8ff137c5dfb3728ef75ba7f59  gcc/ada/checks.ads
  403bc6a6d72b88976a0ccc8ff9459d77  gcc/ada/cio.c
  87a1a7be553e1cbb5ccf25ba67166d4c  gcc/ada/clean.adb
--- 660,666 ----
  4f4e391248e66a4b9cc396f9765ce4f2  gcc/ada/butil.ads
  29d9f902f66fe8415f5b9f300ca23b66  gcc/ada/casing.adb
  25bd0c7e9883d8c218b0ab36b2859de6  gcc/ada/casing.ads
! 71c263de33c7499416e241827179b220  gcc/ada/checks.adb
  718318d8ff137c5dfb3728ef75ba7f59  gcc/ada/checks.ads
  403bc6a6d72b88976a0ccc8ff9459d77  gcc/ada/cio.c
  87a1a7be553e1cbb5ccf25ba67166d4c  gcc/ada/clean.adb
*************** bfede432412bc3d7ee70e14cbda137e3  gcc/ad
*** 772,778 ****
  52ca7939bd6b0e1da9e20d902813d109  gcc/ada/exp_ch3.ads
  629380143b0e6151369479581deb68ab  gcc/ada/exp_ch4.adb
  2d9cf8b148fdc7a07edde2cf9fbb59f8  gcc/ada/exp_ch4.ads
! ddf0f7579d44875aadf8fc958683527b  gcc/ada/exp_ch5.adb
  962c51f1fad8395553b843179ba06b79  gcc/ada/exp_ch5.ads
  e2ddc82245007b8fcfc73282161cd124  gcc/ada/exp_ch6.adb
  757670a84e9c01219a219c4bc68ea62b  gcc/ada/exp_ch6.ads
--- 772,778 ----
  52ca7939bd6b0e1da9e20d902813d109  gcc/ada/exp_ch3.ads
  629380143b0e6151369479581deb68ab  gcc/ada/exp_ch4.adb
  2d9cf8b148fdc7a07edde2cf9fbb59f8  gcc/ada/exp_ch4.ads
! 14be4614e917c455830a799b3e214921  gcc/ada/exp_ch5.adb
  962c51f1fad8395553b843179ba06b79  gcc/ada/exp_ch5.ads
  e2ddc82245007b8fcfc73282161cd124  gcc/ada/exp_ch6.adb
  757670a84e9c01219a219c4bc68ea62b  gcc/ada/exp_ch6.ads
*************** e837e02763d429cb690f4aa38c5c1da2  gcc/ad
*** 792,798 ****
  ce990621220fd6489426c319eb93cec4  gcc/ada/exp_dist.ads
  23f9e2de53a292fd54bac01c5bf3a794  gcc/ada/exp_fixd.adb
  a68a87f80c2a7f799dba65186bf644df  gcc/ada/exp_fixd.ads
! 6f00c299d8a388e5ca814c6cd9b9833f  gcc/ada/exp_imgv.adb
  34fc29154c68ffe19f5d9e5cb9f5be59  gcc/ada/exp_imgv.ads
  ee534f378918dac3d346695bf4bcf9a2  gcc/ada/exp_intr.adb
  98fffa8af9ba75158eeab9097a7838a3  gcc/ada/exp_intr.ads
--- 792,798 ----
  ce990621220fd6489426c319eb93cec4  gcc/ada/exp_dist.ads
  23f9e2de53a292fd54bac01c5bf3a794  gcc/ada/exp_fixd.adb
  a68a87f80c2a7f799dba65186bf644df  gcc/ada/exp_fixd.ads
! 70833c97f0d9e2674da0c2a72e122b27  gcc/ada/exp_imgv.adb
  34fc29154c68ffe19f5d9e5cb9f5be59  gcc/ada/exp_imgv.ads
  ee534f378918dac3d346695bf4bcf9a2  gcc/ada/exp_intr.adb
  98fffa8af9ba75158eeab9097a7838a3  gcc/ada/exp_intr.ads
*************** ee534f378918dac3d346695bf4bcf9a2  gcc/ad
*** 800,807 ****
  4a687a32bfa3449e71b6e5eb050497b1  gcc/ada/exp_pakd.ads
  67c749c20d685df7377ae13924346b73  gcc/ada/exp_prag.adb
  72a4e0a905bb5ed9604683cb4aa8f9dc  gcc/ada/exp_prag.ads
! 3fdda4ad7c247386dc8a7fa33d7a5ad0  gcc/ada/exp_put_image.adb
! ca500b7c34773c1b0cf94d79d988f37f  gcc/ada/exp_put_image.ads
  113ca62ed0736ce6088da621227c3d67  gcc/ada/exp_sel.adb
  8573714354a5f8299d234cb15aec7bee  gcc/ada/exp_sel.ads
  98efb9e91a5f81d72a65db5d6bdd4abf  gcc/ada/exp_smem.adb
--- 800,807 ----
  4a687a32bfa3449e71b6e5eb050497b1  gcc/ada/exp_pakd.ads
  67c749c20d685df7377ae13924346b73  gcc/ada/exp_prag.adb
  72a4e0a905bb5ed9604683cb4aa8f9dc  gcc/ada/exp_prag.ads
! 3c4cc16c00054e6b71e1305c3a35b2a6  gcc/ada/exp_put_image.adb
! 809ac6dc6426a2989a6eafd2dc0dc837  gcc/ada/exp_put_image.ads
  113ca62ed0736ce6088da621227c3d67  gcc/ada/exp_sel.adb
  8573714354a5f8299d234cb15aec7bee  gcc/ada/exp_sel.ads
  98efb9e91a5f81d72a65db5d6bdd4abf  gcc/ada/exp_smem.adb
*************** ca2981f8b50b4289c62f1e8d5b970912  gcc/ad
*** 2905,2911 ****
  f682892145d1a369cdc5b3f73935f8d9  gcc/ada/sem_case.ads
  40833d5de1791e4a88cb023d6bd0ddb5  gcc/ada/sem_cat.adb
  8380d3577b9f637d6e110b2f500d0e0b  gcc/ada/sem_cat.ads
! dd633dfa49e61aba1bc06652b843bf5a  gcc/ada/sem_ch10.adb
  ad2bb60b9c4c67653f4da4b0e70277d7  gcc/ada/sem_ch10.ads
  e3dc2d270994bba222e70ec02479ac37  gcc/ada/sem_ch11.adb
  7efb6a0f371113d8b55b421ee56dd1dd  gcc/ada/sem_ch11.ads
--- 2905,2911 ----
  f682892145d1a369cdc5b3f73935f8d9  gcc/ada/sem_case.ads
  40833d5de1791e4a88cb023d6bd0ddb5  gcc/ada/sem_cat.adb
  8380d3577b9f637d6e110b2f500d0e0b  gcc/ada/sem_cat.ads
! bd02733d13b54612fc6d4cd0e340b3ea  gcc/ada/sem_ch10.adb
  ad2bb60b9c4c67653f4da4b0e70277d7  gcc/ada/sem_ch10.ads
  e3dc2d270994bba222e70ec02479ac37  gcc/ada/sem_ch11.adb
  7efb6a0f371113d8b55b421ee56dd1dd  gcc/ada/sem_ch11.ads
*************** d42a4473c13b65b1a1f63bb19737f187  gcc/ad
*** 2917,2923 ****
  ea86a0345845800d7aaf07f22bb4bf6c  gcc/ada/sem_ch2.ads
  ef8e53eb15ef5d38328a1da2e3a54fda  gcc/ada/sem_ch3.adb
  2d8f83bc46638356bc311ccd50015b1f  gcc/ada/sem_ch3.ads
! 45921b6878e002aaa9ac0405d5ee6a09  gcc/ada/sem_ch4.adb
  fdd750bd30c3186d912dfed4717a2c0c  gcc/ada/sem_ch4.ads
  372b91efba4677bbb8b51f4359144013  gcc/ada/sem_ch5.adb
  d3937c73217b5f3ef2540a47e52cbf4a  gcc/ada/sem_ch5.ads
--- 2917,2923 ----
  ea86a0345845800d7aaf07f22bb4bf6c  gcc/ada/sem_ch2.ads
  ef8e53eb15ef5d38328a1da2e3a54fda  gcc/ada/sem_ch3.adb
  2d8f83bc46638356bc311ccd50015b1f  gcc/ada/sem_ch3.ads
! c47ba9b98b3b3fcb6b4ff2a07c14b657  gcc/ada/sem_ch4.adb
  fdd750bd30c3186d912dfed4717a2c0c  gcc/ada/sem_ch4.ads
  372b91efba4677bbb8b51f4359144013  gcc/ada/sem_ch5.adb
  d3937c73217b5f3ef2540a47e52cbf4a  gcc/ada/sem_ch5.ads
*************** e0baeb5c3e8c2acb3432fb3e0074e9fb  gcc/ad
*** 2925,2931 ****
  9ac8c4c57213097618cdb7c0b7b4f47b  gcc/ada/sem_ch6.ads
  6c05670fbd82229849d311d294644670  gcc/ada/sem_ch7.adb
  fb1c349ef07024975dc745e7e7908a34  gcc/ada/sem_ch7.ads
! 67721b32116cdf51d3f103f62828b5e7  gcc/ada/sem_ch8.adb
  5bcf24e9f3725dd07ba44097469a5101  gcc/ada/sem_ch8.ads
  11b35ab89dbfce560ffd5198a3d59135  gcc/ada/sem_ch9.adb
  11764389473d404a17921f767d1eadd4  gcc/ada/sem_ch9.ads
--- 2925,2931 ----
  9ac8c4c57213097618cdb7c0b7b4f47b  gcc/ada/sem_ch6.ads
  6c05670fbd82229849d311d294644670  gcc/ada/sem_ch7.adb
  fb1c349ef07024975dc745e7e7908a34  gcc/ada/sem_ch7.ads
! 381e134a3e123f88cef08be7a83e237e  gcc/ada/sem_ch8.adb
  5bcf24e9f3725dd07ba44097469a5101  gcc/ada/sem_ch8.ads
  11b35ab89dbfce560ffd5198a3d59135  gcc/ada/sem_ch9.adb
  11764389473d404a17921f767d1eadd4  gcc/ada/sem_ch9.ads
*************** bde96e6a1464ed682c5655d726cdd21a  gcc/ad
*** 2953,2959 ****
  64ae38c93be63a67f143484eba77604b  gcc/ada/sem_scil.ads
  102f98875b216b8fcbe1ed80f8079009  gcc/ada/sem_smem.adb
  21afb93e10bb9446fcbf7577bbf39c7f  gcc/ada/sem_smem.ads
! cda32b91a0e825a5f5c65df8d6ba7003  gcc/ada/sem_type.adb
  65653b347d1d3f800e49cd916a551d1c  gcc/ada/sem_type.ads
  16750cf36ad11693048a818ffb8d2b22  gcc/ada/sem_util.adb
  ec5c6d315fe729aab9bd7b8889560f62  gcc/ada/sem_util.ads
--- 2953,2959 ----
  64ae38c93be63a67f143484eba77604b  gcc/ada/sem_scil.ads
  102f98875b216b8fcbe1ed80f8079009  gcc/ada/sem_smem.adb
  21afb93e10bb9446fcbf7577bbf39c7f  gcc/ada/sem_smem.ads
! b206c38c506b809f66fb07036016356f  gcc/ada/sem_type.adb
  65653b347d1d3f800e49cd916a551d1c  gcc/ada/sem_type.ads
  16750cf36ad11693048a818ffb8d2b22  gcc/ada/sem_util.adb
  ec5c6d315fe729aab9bd7b8889560f62  gcc/ada/sem_util.ads
*************** d22c314f3748309f812d78f5217dda61  gcc/ad
*** 3061,3074 ****
  06b46bffb1b84e16a6f48b29177f42c4  gcc/ada/xutil.ads
  faeebcb240c1559aceb7d9c18c8e6b89  gcc/addresses.h
  ebe64421041bf4ef9153e26a6dc60532  gcc/adjust-alignment.cc
! fd1a7b6f9524bc4203cd10f8ec2b460a  gcc/algol68/ChangeLog
  f60acb6e085140c1368b22851361db0e  gcc/algol68/Make-lang.in
  3d3f2f95b917d0f77d57d977f3eb93d8  gcc/algol68/README
  fb43be530798e23528ffc144413b80a9  gcc/algol68/a68-diagnostics.cc
  5a0aa2bd361bf3a8eef0d814a0d93611  gcc/algol68/a68-exports.cc
  237db35c9725eb65027ad7adf2f0527e  gcc/algol68/a68-imports.cc
  0904dc65c8116eaecb8d99576391c5dc  gcc/algol68/a68-lang.cc
! c7f3e4b6ca328ed109839fb6af254e6b  gcc/algol68/a68-low-bits.cc
  284cf6c8827f78791575949cc1f634ef  gcc/algol68/a68-low-bools.cc
  421c70a781dc2c00722aa019bc39f683  gcc/algol68/a68-low-builtins.cc
  ade291f272227055db98bddb78ff715f  gcc/algol68/a68-low-chars.cc
--- 3061,3074 ----
  06b46bffb1b84e16a6f48b29177f42c4  gcc/ada/xutil.ads
  faeebcb240c1559aceb7d9c18c8e6b89  gcc/addresses.h
  ebe64421041bf4ef9153e26a6dc60532  gcc/adjust-alignment.cc
! 55e8918dfe462fca3ca765cd59322521  gcc/algol68/ChangeLog
  f60acb6e085140c1368b22851361db0e  gcc/algol68/Make-lang.in
  3d3f2f95b917d0f77d57d977f3eb93d8  gcc/algol68/README
  fb43be530798e23528ffc144413b80a9  gcc/algol68/a68-diagnostics.cc
  5a0aa2bd361bf3a8eef0d814a0d93611  gcc/algol68/a68-exports.cc
  237db35c9725eb65027ad7adf2f0527e  gcc/algol68/a68-imports.cc
  0904dc65c8116eaecb8d99576391c5dc  gcc/algol68/a68-lang.cc
! ff5aa147ff361b3bce9b86c3c7c059c9  gcc/algol68/a68-low-bits.cc
  284cf6c8827f78791575949cc1f634ef  gcc/algol68/a68-low-bools.cc
  421c70a781dc2c00722aa019bc39f683  gcc/algol68/a68-low-builtins.cc
  ade291f272227055db98bddb78ff715f  gcc/algol68/a68-low-chars.cc
*************** c57bfad420a3fc9e3f36e22e0b61c523  gcc/al
*** 3082,3088 ****
  8e958b50675b076eba75cf460e2332bb  gcc/algol68/a68-low-moids.cc
  1234b64ced731d809a0b56edb4104ead  gcc/algol68/a68-low-multiples.cc
  27c76eb63da6836b08745b3bd22e8c64  gcc/algol68/a68-low-posix.cc
! 24baed5d34eb4e6bd861957e1a8a4a94  gcc/algol68/a68-low-prelude.cc
  b761d3ea5bc6d29640619297fd8a70b6  gcc/algol68/a68-low-procs.cc
  335ffa6c3b75121835fb8d3c30f87b67  gcc/algol68/a68-low-ranges.cc
  4d895047574428a4a2c4f2452766f8ff  gcc/algol68/a68-low-reals.cc
--- 3082,3088 ----
  8e958b50675b076eba75cf460e2332bb  gcc/algol68/a68-low-moids.cc
  1234b64ced731d809a0b56edb4104ead  gcc/algol68/a68-low-multiples.cc
  27c76eb63da6836b08745b3bd22e8c64  gcc/algol68/a68-low-posix.cc
! 330fabf65d0991fd441e559288552da6  gcc/algol68/a68-low-prelude.cc
  b761d3ea5bc6d29640619297fd8a70b6  gcc/algol68/a68-low-procs.cc
  335ffa6c3b75121835fb8d3c30f87b67  gcc/algol68/a68-low-ranges.cc
  4d895047574428a4a2c4f2452766f8ff  gcc/algol68/a68-low-reals.cc
*************** aebb4c3b9e607164c25541593333b832  gcc/al
*** 3092,3133 ****
  a3640e0464c9f225e1f6e23c6e1b7a25  gcc/algol68/a68-low-strings.cc
  de4cb485173b396d55860a98e328be5b  gcc/algol68/a68-low-structs.cc
  7675b3dfcea25bedcbe52f98cecdf7e2  gcc/algol68/a68-low-unions.cc
! 27b9df3dd30fc83653f96545db4f63b3  gcc/algol68/a68-low-units.cc
! 272887da216391b972c669d1c883d541  gcc/algol68/a68-low.cc
  406bb4b4a8736ed19545acebc61effbd  gcc/algol68/a68-moids-diagnostics.cc
! 42fb87b330e8ce57b613abaaca7beeb8  gcc/algol68/a68-moids-misc.cc
  93ab5a30cda3f697bee77eba313c66d6  gcc/algol68/a68-moids-to-string.cc
! c324f111303d399ec78ee3371488176f  gcc/algol68/a68-parser-attrs.def
! c3c90ed30df176e0dc435306dae0d9c4  gcc/algol68/a68-parser-bottom-up.cc
  11c6e7547ee9292410a3b91692ea6ad1  gcc/algol68/a68-parser-brackets.cc
  06167f432b9437d0cc135868d1067782  gcc/algol68/a68-parser-debug.cc
! 3816551ecc87b5ba8df5fc1d87c0c7b1  gcc/algol68/a68-parser-extract.cc
! 5aa1c44cc0b96934ca5906eb2e0e500e  gcc/algol68/a68-parser-keywords.cc
  233e85e1d109735e63bc9c3367f89a54  gcc/algol68/a68-parser-modes.cc
! 451910827918a165063a77e10deebc2a  gcc/algol68/a68-parser-moids-check.cc
  eb200628692c30c1ade0eaeabcddf008  gcc/algol68/a68-parser-moids-coerce.cc
  3789b4b4b2b84341d4e2c050f5f10acf  gcc/algol68/a68-parser-moids-equivalence.cc
  6f1acfebba6072c81c25a2597686d0e4  gcc/algol68/a68-parser-pragmat.cc
! d4efd9d376769274d84b32631d2de56b  gcc/algol68/a68-parser-prelude.cc
! aea7baccdaeef6bc91479adae70dd2a3  gcc/algol68/a68-parser-scanner.cc
  612e0ec636b03716ad03bda261dffe29  gcc/algol68/a68-parser-scope.cc
  d259fcdbab02c9c536b330f7111ae7cf  gcc/algol68/a68-parser-serial-dsa.cc
  a9ddec5672076028211732bc7255ace7  gcc/algol68/a68-parser-taxes.cc
  fc36c82bc446f517d1380e1795c8936d  gcc/algol68/a68-parser-top-down.cc
  c54eef49e5d275f325d29b6c54fb4644  gcc/algol68/a68-parser-victal.cc
! 6b2c8ed061c6f0d612717d93d226fa96  gcc/algol68/a68-parser.cc
  bb6a9492686645cd8ede63a3aa41bb2e  gcc/algol68/a68-postulates.cc
  614ee2f3c97cf1910484b4ba1b697352  gcc/algol68/a68-tree.def
  fad4cc97edd0db85ad312f03ccd4fc64  gcc/algol68/a68-types.h
  384e3fcca47f6f61b529f8d95656824a  gcc/algol68/a68-unistr.c
! 923dc46b2b03c95c003f7bdc42e0e606  gcc/algol68/a68.h
  cbc2ddca0589edc81c7df109b1a1927b  gcc/algol68/a68spec.cc
  ca4abac71b91773df74abdea22798551  gcc/algol68/config-lang.in
! 9f347ad15eafa59e8edd49f1e41fd950  gcc/algol68/ga68-coding-guidelines.texi
  3944dc558e8139d69cdc73ffdbe90cc7  gcc/algol68/ga68-exports.pk
  f150e2c760036b980e94ec7bb14e1172  gcc/algol68/ga68-internals.texi
! 92277ea694ba7685ee1866b88682ad05  gcc/algol68/ga68.texi
! 4810fa1d976ad329fa7a115292ce8fe8  gcc/algol68/ga68.vw
  0a91d85c360d5ee3eb6258aecdab4636  gcc/algol68/lang-specs.h
  4dee1792b7542097a5ee3314742a16b4  gcc/algol68/lang.opt
  411f26970a0d93b07c697a1bcfeda50c  gcc/algol68/lang.opt.urls
--- 3092,3133 ----
  a3640e0464c9f225e1f6e23c6e1b7a25  gcc/algol68/a68-low-strings.cc
  de4cb485173b396d55860a98e328be5b  gcc/algol68/a68-low-structs.cc
  7675b3dfcea25bedcbe52f98cecdf7e2  gcc/algol68/a68-low-unions.cc
! 6e2abc0aeb32c0385697bad24b0f3637  gcc/algol68/a68-low-units.cc
! 3c528918f475a9a774f20d1fc8e6760b  gcc/algol68/a68-low.cc
  406bb4b4a8736ed19545acebc61effbd  gcc/algol68/a68-moids-diagnostics.cc
! f78fd344dd937e8275e01a56a0bfd210  gcc/algol68/a68-moids-misc.cc
  93ab5a30cda3f697bee77eba313c66d6  gcc/algol68/a68-moids-to-string.cc
! 5cba262e501051ca9bc9e3c0cec33e74  gcc/algol68/a68-parser-attrs.def
! ffe54034f666cf5a46987107130cf11d  gcc/algol68/a68-parser-bottom-up.cc
  11c6e7547ee9292410a3b91692ea6ad1  gcc/algol68/a68-parser-brackets.cc
  06167f432b9437d0cc135868d1067782  gcc/algol68/a68-parser-debug.cc
! ecacb7da96af4cd85137e15a6aa3fa6f  gcc/algol68/a68-parser-extract.cc
! fc7ae86022255700f5866b320d5b195d  gcc/algol68/a68-parser-keywords.cc
  233e85e1d109735e63bc9c3367f89a54  gcc/algol68/a68-parser-modes.cc
! 1b5ff58c15f9dc7aab0bc4b94d6e492a  gcc/algol68/a68-parser-moids-check.cc
  eb200628692c30c1ade0eaeabcddf008  gcc/algol68/a68-parser-moids-coerce.cc
  3789b4b4b2b84341d4e2c050f5f10acf  gcc/algol68/a68-parser-moids-equivalence.cc
  6f1acfebba6072c81c25a2597686d0e4  gcc/algol68/a68-parser-pragmat.cc
! 133fe12498284adfd895c3ea6328cd37  gcc/algol68/a68-parser-prelude.cc
! 22e93101ff8950867e31706bb62248d9  gcc/algol68/a68-parser-scanner.cc
  612e0ec636b03716ad03bda261dffe29  gcc/algol68/a68-parser-scope.cc
  d259fcdbab02c9c536b330f7111ae7cf  gcc/algol68/a68-parser-serial-dsa.cc
  a9ddec5672076028211732bc7255ace7  gcc/algol68/a68-parser-taxes.cc
  fc36c82bc446f517d1380e1795c8936d  gcc/algol68/a68-parser-top-down.cc
  c54eef49e5d275f325d29b6c54fb4644  gcc/algol68/a68-parser-victal.cc
! 962041c4a7f7c6bba6bd41c7521e1791  gcc/algol68/a68-parser.cc
  bb6a9492686645cd8ede63a3aa41bb2e  gcc/algol68/a68-postulates.cc
  614ee2f3c97cf1910484b4ba1b697352  gcc/algol68/a68-tree.def
  fad4cc97edd0db85ad312f03ccd4fc64  gcc/algol68/a68-types.h
  384e3fcca47f6f61b529f8d95656824a  gcc/algol68/a68-unistr.c
! 5bc121bfb8108e8aa4180b123c348a2c  gcc/algol68/a68.h
  cbc2ddca0589edc81c7df109b1a1927b  gcc/algol68/a68spec.cc
  ca4abac71b91773df74abdea22798551  gcc/algol68/config-lang.in
! bb6b91d4e3b8db4de664e7697a23229d  gcc/algol68/ga68-coding-guidelines.texi
  3944dc558e8139d69cdc73ffdbe90cc7  gcc/algol68/ga68-exports.pk
  f150e2c760036b980e94ec7bb14e1172  gcc/algol68/ga68-internals.texi
! 23271afd5f7350feb53f4fda76fc4b9f  gcc/algol68/ga68.texi
! 6e162644e83dbcfbcfbacd36f1e64f3c  gcc/algol68/ga68.vw
  0a91d85c360d5ee3eb6258aecdab4636  gcc/algol68/lang-specs.h
  4dee1792b7542097a5ee3314742a16b4  gcc/algol68/lang.opt
  411f26970a0d93b07c697a1bcfeda50c  gcc/algol68/lang.opt.urls
*************** b7dd8bd2dd68f81643704bf0b73553a1  gcc/al
*** 3136,3142 ****
  71901705cb0e11732bae53ff9de25faf  gcc/align.h
  f2345b2fdc9d2d5a75fe90d30444a114  gcc/alloc-pool.cc
  7657598f465321837951c858ab918f57  gcc/alloc-pool.h
! e51bdf29d796de9a77150b57f432bb92  gcc/analyzer/ChangeLog
  a53ebffbaabe6bc3664d659c554fedb3  gcc/analyzer/access-diagram.cc
  c41fa6be7ca91f40a15a7b8f03732d25  gcc/analyzer/access-diagram.h
  d97e417faf9694fdbd68f91aee129bd2  gcc/analyzer/ana-state-to-diagnostic-state.cc
--- 3136,3142 ----
  71901705cb0e11732bae53ff9de25faf  gcc/align.h
  f2345b2fdc9d2d5a75fe90d30444a114  gcc/alloc-pool.cc
  7657598f465321837951c858ab918f57  gcc/alloc-pool.h
! c5039f04545dc04643f87ad7ccf9ea46  gcc/analyzer/ChangeLog
  a53ebffbaabe6bc3664d659c554fedb3  gcc/analyzer/access-diagram.cc
  c41fa6be7ca91f40a15a7b8f03732d25  gcc/analyzer/access-diagram.h
  d97e417faf9694fdbd68f91aee129bd2  gcc/analyzer/ana-state-to-diagnostic-state.cc
*************** bedbea78751b139538f4c906011432fe  gcc/an
*** 3151,3158 ****
  380f2a7c04a014441f78569ef397a8a4  gcc/analyzer/analyzer-selftests.cc
  e87a9090a957efa1653cc5a6e36ec346  gcc/analyzer/analyzer-selftests.h
  566c10c510fcd3ec28b63b769c57bea3  gcc/analyzer/analyzer.cc
! 7ba5dc34b6341080447ab04b6bc10613  gcc/analyzer/analyzer.opt
! 8da6e11724c67aff3fcc4467cc5abca6  gcc/analyzer/analyzer.opt.urls
  4a17f3766ca5b4ec528ac459c519fc61  gcc/analyzer/bar-chart.cc
  745aa2e3472448c5c97fb4908c8d4397  gcc/analyzer/bar-chart.h
  428a88c1b122c5af9e323db258b6024d  gcc/analyzer/bounds-checking.cc
--- 3151,3158 ----
  380f2a7c04a014441f78569ef397a8a4  gcc/analyzer/analyzer-selftests.cc
  e87a9090a957efa1653cc5a6e36ec346  gcc/analyzer/analyzer-selftests.h
  566c10c510fcd3ec28b63b769c57bea3  gcc/analyzer/analyzer.cc
! e7d438dbe37d47fa87041a69feedd52f  gcc/analyzer/analyzer.opt
! 72ab818cea4a66ffb80a0afe7abff21c  gcc/analyzer/analyzer.opt.urls
  4a17f3766ca5b4ec528ac459c519fc61  gcc/analyzer/bar-chart.cc
  745aa2e3472448c5c97fb4908c8d4397  gcc/analyzer/bar-chart.h
  428a88c1b122c5af9e323db258b6024d  gcc/analyzer/bounds-checking.cc
*************** f2a1d7a4677cd4523c0638208513d259  gcc/an
*** 3175,3181 ****
  7d0cf2441abcd960f97e29dd071829e5  gcc/analyzer/constraint-manager.h
  2728e4b1b06abaf098bfdc996d29a5af  gcc/analyzer/diagnostic-manager.cc
  ca695b2d13762f05a1ab6018eba991c7  gcc/analyzer/diagnostic-manager.h
! eeeb02789ddcd92c89f61e0c4ed88033  gcc/analyzer/engine.cc
  42e3e00aa33d20f2e141615939577290  gcc/analyzer/engine.h
  f35c6c791ba815800582950c54998869  gcc/analyzer/event-loc-info.h
  dac4d88af8620f1805a41dfb31dd5c1b  gcc/analyzer/exploded-graph.h
--- 3175,3181 ----
  7d0cf2441abcd960f97e29dd071829e5  gcc/analyzer/constraint-manager.h
  2728e4b1b06abaf098bfdc996d29a5af  gcc/analyzer/diagnostic-manager.cc
  ca695b2d13762f05a1ab6018eba991c7  gcc/analyzer/diagnostic-manager.h
! fc8812cde2dad249bb0818d4b916f2a5  gcc/analyzer/engine.cc
  42e3e00aa33d20f2e141615939577290  gcc/analyzer/engine.h
  f35c6c791ba815800582950c54998869  gcc/analyzer/event-loc-info.h
  dac4d88af8620f1805a41dfb31dd5c1b  gcc/analyzer/exploded-graph.h
*************** cac91a789fdfacaa1976b3d8668cc2d3  gcc/an
*** 3198,3204 ****
  83f167b1c386352684ebdd1ca0e408c2  gcc/analyzer/pending-diagnostic.h
  77b023b2349d390847d2dd7baa9d75db  gcc/analyzer/program-point.cc
  83761973cc08ccbe996d4f80b0224df3  gcc/analyzer/program-point.h
! 3bbff946afc6c91788f29dcd5e6584cd  gcc/analyzer/program-state.cc
  af63d5fc2aa77cb59b5eba8f9a30905d  gcc/analyzer/program-state.h
  a23706e970c248ed5f79513768075f32  gcc/analyzer/ranges.cc
  294a35ef33c273bbc3dce75b76b6583a  gcc/analyzer/ranges.h
--- 3198,3204 ----
  83f167b1c386352684ebdd1ca0e408c2  gcc/analyzer/pending-diagnostic.h
  77b023b2349d390847d2dd7baa9d75db  gcc/analyzer/program-point.cc
  83761973cc08ccbe996d4f80b0224df3  gcc/analyzer/program-point.h
! a13b7896a578ec8d2d38eb116cd388c2  gcc/analyzer/program-state.cc
  af63d5fc2aa77cb59b5eba8f9a30905d  gcc/analyzer/program-state.h
  a23706e970c248ed5f79513768075f32  gcc/analyzer/ranges.cc
  294a35ef33c273bbc3dce75b76b6583a  gcc/analyzer/ranges.h
*************** f93ef89d263e02c779ec129aeead8a28  gcc/an
*** 3208,3216 ****
  8998fc6abdaaf4914e8f43f86a20d895  gcc/analyzer/region-model-asm.cc
  e00de8d56fc6c1cec16403016173a26a  gcc/analyzer/region-model-manager.cc
  1659367392030852cffeaddae0f5baac  gcc/analyzer/region-model-manager.h
! 9d299a68b3e8b7a347ec3b170d1d0669  gcc/analyzer/region-model-reachability.cc
  93431d9eca086e4c7811afc3a66197ea  gcc/analyzer/region-model-reachability.h
! 9c5ae9d1f24071b17075c2b3e667af60  gcc/analyzer/region-model.cc
  17f7242ed2e91e694ce2a1fce4e1b4a5  gcc/analyzer/region-model.h
  50ff3eeb08a83ff50dc62d1777c7bc57  gcc/analyzer/region.cc
  7b478bc40e78865e5c23d8a7790c707c  gcc/analyzer/region.h
--- 3208,3216 ----
  8998fc6abdaaf4914e8f43f86a20d895  gcc/analyzer/region-model-asm.cc
  e00de8d56fc6c1cec16403016173a26a  gcc/analyzer/region-model-manager.cc
  1659367392030852cffeaddae0f5baac  gcc/analyzer/region-model-manager.h
! c24460f53b22bdecc3b9e8af24da1575  gcc/analyzer/region-model-reachability.cc
  93431d9eca086e4c7811afc3a66197ea  gcc/analyzer/region-model-reachability.h
! e616edc58dab106d90d562c455fd713a  gcc/analyzer/region-model.cc
  17f7242ed2e91e694ce2a1fce4e1b4a5  gcc/analyzer/region-model.h
  50ff3eeb08a83ff50dc62d1777c7bc57  gcc/analyzer/region.cc
  7b478bc40e78865e5c23d8a7790c707c  gcc/analyzer/region.h
*************** f0dcebb9979e1da7d7bd6fb4ad06a54e  gcc/an
*** 3228,3235 ****
  b667de4f07c660c4cd4e91834ea39073  gcc/analyzer/sm.h
  3624f55d83e9b0bc535b28c37079b437  gcc/analyzer/state-purge.cc
  8a3af8bab2c3a2bb873540dfd49ae5c5  gcc/analyzer/state-purge.h
! a3d75d93f67787f397fd5fdc8098986d  gcc/analyzer/store.cc
! 4ae0a463d0982d67a2bb074f46406b3a  gcc/analyzer/store.h
  33d9be73a4d262226af82d56d077167b  gcc/analyzer/supergraph-fixup-locations.cc
  2b1f8d482dc79d6594c1772d53f983a3  gcc/analyzer/supergraph-manipulation.h
  466a7599dd2372bf97c1a40ec8d04feb  gcc/analyzer/supergraph-simplify.cc
--- 3228,3235 ----
  b667de4f07c660c4cd4e91834ea39073  gcc/analyzer/sm.h
  3624f55d83e9b0bc535b28c37079b437  gcc/analyzer/state-purge.cc
  8a3af8bab2c3a2bb873540dfd49ae5c5  gcc/analyzer/state-purge.h
! 2f1ee4c02671a5d1ce23248062130292  gcc/analyzer/store.cc
! ce8b6d3a44b0f46186df88102edf3c2e  gcc/analyzer/store.h
  33d9be73a4d262226af82d56d077167b  gcc/analyzer/supergraph-fixup-locations.cc
  2b1f8d482dc79d6594c1772d53f983a3  gcc/analyzer/supergraph-manipulation.h
  466a7599dd2372bf97c1a40ec8d04feb  gcc/analyzer/supergraph-simplify.cc
*************** ea987115b0f67bce5cc4745e6d5bc4d1  gcc/at
*** 3252,3258 ****
  2d462a57a0a7bbe8bcb22db63f9377ef  gcc/attr-callback.h
  cbe63f3e975481a17ed49898fbbb9d2a  gcc/attr-fnspec.h
  3d7a71537ed817b2c8f0c30cd04c9201  gcc/attr-urls.def
! f96e7a70b4d9a642a8afb6be156a04f4  gcc/attribs.cc
  feed071e9f711f8ebbc91f8636422f93  gcc/attribs.h
  bd317e24faffad6f2106396f1c3401b1  gcc/auto-inc-dec.cc
  fc353966a860a12cbc161a87f5619b51  gcc/auto-obstack.h
--- 3252,3258 ----
  2d462a57a0a7bbe8bcb22db63f9377ef  gcc/attr-callback.h
  cbe63f3e975481a17ed49898fbbb9d2a  gcc/attr-fnspec.h
  3d7a71537ed817b2c8f0c30cd04c9201  gcc/attr-urls.def
! 3ea409edde3349b724cd812b3e68eb39  gcc/attribs.cc
  feed071e9f711f8ebbc91f8636422f93  gcc/attribs.h
  bd317e24faffad6f2106396f1c3401b1  gcc/auto-inc-dec.cc
  fc353966a860a12cbc161a87f5619b51  gcc/auto-obstack.h
*************** ebb1ceb69d6cf8ac2cdc227ae45f0eca  gcc/bi
*** 3273,3287 ****
  5063344c8646701a891f026a67570182  gcc/builtins.cc
  4dbe6686097ec6c197a24ac373bb9554  gcc/builtins.def
  99d9ddd60ff804d8e24732db43d38bca  gcc/builtins.h
! 5c8f922641f331431b18a9f1cd8e2208  gcc/c-family/ChangeLog
  ea3fa1f4d7390a105fa3caab4f79aaf7  gcc/c-family/ChangeLog.gimple-classes
  aaea141fd41a559841cb76e33800c289  gcc/c-family/c-ada-spec.cc
  f60a13b470e8e51db83383bf9f9f921e  gcc/c-family/c-ada-spec.h
  374e50066ee36fc7f227105c350323f6  gcc/c-family/c-attribs.cc
! 331cd0c18482e6a628766b5a8ae4add6  gcc/c-family/c-common.cc
  6522339cd83ff225a1ff9e0eab971eab  gcc/c-family/c-common.def
! 59099f61824881ba7cb37a7bc50fc50a  gcc/c-family/c-common.h
! 2233f5c418a9657d8108d93b154cac3c  gcc/c-family/c-cppbuiltin.cc
  0b9194e38297d00cf3fac80365cc07af  gcc/c-family/c-dump.cc
  6ae3bdb693669aee234a91cd79302dcf  gcc/c-family/c-format.cc
  1adde7951b864b565a2b79c5461d43fa  gcc/c-family/c-format.h
--- 3273,3287 ----
  5063344c8646701a891f026a67570182  gcc/builtins.cc
  4dbe6686097ec6c197a24ac373bb9554  gcc/builtins.def
  99d9ddd60ff804d8e24732db43d38bca  gcc/builtins.h
! 816014c976497cf3855d6df39498e7c9  gcc/c-family/ChangeLog
  ea3fa1f4d7390a105fa3caab4f79aaf7  gcc/c-family/ChangeLog.gimple-classes
  aaea141fd41a559841cb76e33800c289  gcc/c-family/c-ada-spec.cc
  f60a13b470e8e51db83383bf9f9f921e  gcc/c-family/c-ada-spec.h
  374e50066ee36fc7f227105c350323f6  gcc/c-family/c-attribs.cc
! 5e55cbd1b8f16d0f2becbaaef489a011  gcc/c-family/c-common.cc
  6522339cd83ff225a1ff9e0eab971eab  gcc/c-family/c-common.def
! 81cb275a3cf181ff08d23b453a35d711  gcc/c-family/c-common.h
! 5d6539c5507200bcf1317ef3b4ed7d6a  gcc/c-family/c-cppbuiltin.cc
  0b9194e38297d00cf3fac80365cc07af  gcc/c-family/c-dump.cc
  6ae3bdb693669aee234a91cd79302dcf  gcc/c-family/c-format.cc
  1adde7951b864b565a2b79c5461d43fa  gcc/c-family/c-format.h
*************** a7304c009aa63ce6c8e80612b426724a  gcc/c-
*** 3296,3302 ****
  cb9706138b571f810527200a1e24035c  gcc/c-family/c-ppoutput.cc
  1c45b9d8f8a674aa74dc09d32ee9a453  gcc/c-family/c-pragma.cc
  3b95dd511ff85485cf453d6f6db28832  gcc/c-family/c-pragma.h
! f9090af031a905eabc803c10af6ac315  gcc/c-family/c-pretty-print.cc
  add7082619c416c63f42baa032fa2666  gcc/c-family/c-pretty-print.h
  0fe18953433ec4d075e22bb895480c86  gcc/c-family/c-semantics.cc
  1c08425571c12c15e23385919a5d702c  gcc/c-family/c-spellcheck.cc
--- 3296,3302 ----
  cb9706138b571f810527200a1e24035c  gcc/c-family/c-ppoutput.cc
  1c45b9d8f8a674aa74dc09d32ee9a453  gcc/c-family/c-pragma.cc
  3b95dd511ff85485cf453d6f6db28832  gcc/c-family/c-pragma.h
! 3b3930bb1784f2b99997e9bc20f629f2  gcc/c-family/c-pretty-print.cc
  add7082619c416c63f42baa032fa2666  gcc/c-family/c-pretty-print.h
  0fe18953433ec4d075e22bb895480c86  gcc/c-family/c-semantics.cc
  1c08425571c12c15e23385919a5d702c  gcc/c-family/c-spellcheck.cc
*************** ea821c9d267c64dd8b74aad9d0189834  gcc/c-
*** 3309,3337 ****
  01c192d46b70ed6bbb440272922e8aad  gcc/c-family/c-ubsan.cc
  298f1278576690ff4398c33310700f52  gcc/c-family/c-ubsan.h
  29b7425b7315dcfbd0c9f89296e90df0  gcc/c-family/c-warn.cc
! 2afaeb8df63598c454549912cc4f6777  gcc/c-family/c.opt
! c6f2ebf0bd576913d48ff99f6771d40e  gcc/c-family/c.opt.urls
  6453e733397a8ab931434f4f73ee7d7b  gcc/c-family/cppspec.cc
! a6870df006b63aff6866778bb7b5ccaf  gcc/c-family/known-headers.cc
! 5e25e31b36b0b7bce3036f8db904b31d  gcc/c-family/known-headers.h
  431045382c41554804be1959c1596be4  gcc/c-family/name-hint.h
  3bae9e281cc87b35f63e906373f3b446  gcc/c-family/stub-objc.cc
! 9fd28720f9157980fa6fc05e3e3d59d2  gcc/c/ChangeLog
  0586ab6ff2671f06da9bce04f0604810  gcc/c/Make-lang.in
  3920e3ee16f5b5955d40584fea53c441  gcc/c/c-aux-info.cc
  cd5bab8a4deeaa0369ae59b9403d06a2  gcc/c/c-convert.cc
! 321bf3dbe35a7d3f45dc0b40c82c051e  gcc/c/c-decl.cc
  92707173973fa48fbb8dda88f5af625a  gcc/c/c-errors.cc
  a59a5f126151616976b68fde0c703dd4  gcc/c/c-fold.cc
  817e08cf2d2f4169cb1e5cc26bad1174  gcc/c/c-lang.cc
  62012039da265ed806754029f67a24a9  gcc/c/c-lang.h
! 1c9369d5b3d8abe53761b5e048d56351  gcc/c/c-objc-common.cc
! cbfdd140f14c43c01a6bdf8b1c24b317  gcc/c/c-objc-common.h
! fd1bfa732fcce57df7166d01b1fb7749  gcc/c/c-parser.cc
  f6b634d7c0204c419cf4fb7b48193fad  gcc/c/c-parser.h
  4db955734effe2d0c9aac0379d2e6a8c  gcc/c/c-tree.def
! 13c823cb921888cb458c5573917275ac  gcc/c/c-tree.h
! ebff8b16d4ccdf483642a370681bcdba  gcc/c/c-typeck.cc
  5804f7ee3eccdfb7c9a64e40b20ccc79  gcc/c/config-lang.in
  58370619d5c4739b7d81d5f899913a0c  gcc/c/gccspec.cc
  3ae90e1d8085765b7e7488ac9673a927  gcc/c/gimple-parser.cc
--- 3309,3337 ----
  01c192d46b70ed6bbb440272922e8aad  gcc/c-family/c-ubsan.cc
  298f1278576690ff4398c33310700f52  gcc/c-family/c-ubsan.h
  29b7425b7315dcfbd0c9f89296e90df0  gcc/c-family/c-warn.cc
! 64f70ea877ef6fdb6e5a9fc36357732d  gcc/c-family/c.opt
! 7da074d32aa90f2a5114f2295f2e6063  gcc/c-family/c.opt.urls
  6453e733397a8ab931434f4f73ee7d7b  gcc/c-family/cppspec.cc
! 58ecef7621a9577e43ac42cfceae8864  gcc/c-family/known-headers.cc
! 377686cbbf62a7d61d251d3f74cddb5b  gcc/c-family/known-headers.h
  431045382c41554804be1959c1596be4  gcc/c-family/name-hint.h
  3bae9e281cc87b35f63e906373f3b446  gcc/c-family/stub-objc.cc
! 598f5cfbba0e4bb473b0952522015ddf  gcc/c/ChangeLog
  0586ab6ff2671f06da9bce04f0604810  gcc/c/Make-lang.in
  3920e3ee16f5b5955d40584fea53c441  gcc/c/c-aux-info.cc
  cd5bab8a4deeaa0369ae59b9403d06a2  gcc/c/c-convert.cc
! e89ce53193092280d00cb0317549ca4d  gcc/c/c-decl.cc
  92707173973fa48fbb8dda88f5af625a  gcc/c/c-errors.cc
  a59a5f126151616976b68fde0c703dd4  gcc/c/c-fold.cc
  817e08cf2d2f4169cb1e5cc26bad1174  gcc/c/c-lang.cc
  62012039da265ed806754029f67a24a9  gcc/c/c-lang.h
! 0edcb3b119c5211635518c4820f27c03  gcc/c/c-objc-common.cc
! 758b8d0dd97c8edc41d5ed80b46e66ba  gcc/c/c-objc-common.h
! d926ea3d2c0d6447d24fb642eacc58b3  gcc/c/c-parser.cc
  f6b634d7c0204c419cf4fb7b48193fad  gcc/c/c-parser.h
  4db955734effe2d0c9aac0379d2e6a8c  gcc/c/c-tree.def
! 76a04f8cce4749dd7af46e1f6a162e7a  gcc/c/c-tree.h
! 92c9e65e5efca1dc0ebb0a34585f44d5  gcc/c/c-typeck.cc
  5804f7ee3eccdfb7c9a64e40b20ccc79  gcc/c/config-lang.in
  58370619d5c4739b7d81d5f899913a0c  gcc/c/gccspec.cc
  3ae90e1d8085765b7e7488ac9673a927  gcc/c/gimple-parser.cc
*************** d48c86bc52a7b8ee38281d6069d3eb6a  gcc/co
*** 3429,3435 ****
  903401554d90de06743fb9a836e6a45b  gcc/combine-stack-adj.cc
  3e1637e8961c0810ea91ca702bb69aa1  gcc/combine.cc
  9f2835a8fa18cfce2249127014eb7edd  gcc/common.md
! e155e1b1cc0bce65fa81b205e554d488  gcc/common.opt
  b555a79a0cb9f4062f9c73e695b6f2cb  gcc/common.opt.urls
  d3b28fb0d49a8d683dde6011400fd7e7  gcc/common/common-target-def.h
  93cf11d6a27d42f73799ae012d2f876e  gcc/common/common-target.def
--- 3429,3435 ----
  903401554d90de06743fb9a836e6a45b  gcc/combine-stack-adj.cc
  3e1637e8961c0810ea91ca702bb69aa1  gcc/combine.cc
  9f2835a8fa18cfce2249127014eb7edd  gcc/common.md
! 4b25af59e1f8a07782dbddb00afc272c  gcc/common.opt
  b555a79a0cb9f4062f9c73e695b6f2cb  gcc/common.opt.urls
  d3b28fb0d49a8d683dde6011400fd7e7  gcc/common/common-target-def.h
  93cf11d6a27d42f73799ae012d2f876e  gcc/common/common-target.def
*************** c47b4191f7bac0196ab63ca2c66bfa98  gcc/co
*** 3500,3508 ****
  148fedc3acd410f7a82133d0e78b02df  gcc/config/aarch64/aarch64-abi-ms.h
  9b6ffa67b7e7f7cc2348fa0dc728072e  gcc/config/aarch64/aarch64-arches.def
  c8a924cfcb693679febdcde3a0cc0809  gcc/config/aarch64/aarch64-builtin-pairs.def
! 9b34a74cb5c8d16fb00a6d81055a7a1b  gcc/config/aarch64/aarch64-builtins.cc
  a1a7d26ecab3d6681a1d3f5c2cb77275  gcc/config/aarch64/aarch64-builtins.h
! fcd0fcfcb8acaff13bfddc1210b22b85  gcc/config/aarch64/aarch64-c.cc
  3effce0415a0994753b7865834e56638  gcc/config/aarch64/aarch64-coff.h
  03957b4f14c24bce5a9481c68f66d495  gcc/config/aarch64/aarch64-cores.def
  bcce5dd39758c850fbdc3654c590eec0  gcc/config/aarch64/aarch64-cost-tables.h
--- 3500,3508 ----
  148fedc3acd410f7a82133d0e78b02df  gcc/config/aarch64/aarch64-abi-ms.h
  9b6ffa67b7e7f7cc2348fa0dc728072e  gcc/config/aarch64/aarch64-arches.def
  c8a924cfcb693679febdcde3a0cc0809  gcc/config/aarch64/aarch64-builtin-pairs.def
! f71747259d211660ba533c6a71fa2504  gcc/config/aarch64/aarch64-builtins.cc
  a1a7d26ecab3d6681a1d3f5c2cb77275  gcc/config/aarch64/aarch64-builtins.h
! 700590c50f17b709a32297930716ab22  gcc/config/aarch64/aarch64-c.cc
  3effce0415a0994753b7865834e56638  gcc/config/aarch64/aarch64-coff.h
  03957b4f14c24bce5a9481c68f66d495  gcc/config/aarch64/aarch64-cores.def
  bcce5dd39758c850fbdc3654c590eec0  gcc/config/aarch64/aarch64-cost-tables.h
*************** ae97d0dbf9bfd663b119e34bbaf94183  gcc/co
*** 3541,3551 ****
  b824341b8f6fdb8eb1667425adf63db8  gcc/config/aarch64/aarch64-sched-dispatch.h
  da15606bcbef7961db958c042bf81c05  gcc/config/aarch64/aarch64-simd-builtin-types.def
  9a92557ac11986ea17d11d6ca82c01e6  gcc/config/aarch64/aarch64-simd-builtins.def
! 8bf4dd498a2811516e5786f5dfa2bac1  gcc/config/aarch64/aarch64-simd-pragma-builtins.def
  71901785550838e15612d25168186e8d  gcc/config/aarch64/aarch64-simd.md
  435ec14d0c7365192bbd08eecbc2b91b  gcc/config/aarch64/aarch64-sme.md
  680d9861c361f5e0db24978600b2a134  gcc/config/aarch64/aarch64-speculation.cc
! 1553cfc68bdd19cb61a2755767842c1c  gcc/config/aarch64/aarch64-sve-builtins-base.cc
  cc3e36cd6335911c4199669958386c9e  gcc/config/aarch64/aarch64-sve-builtins-base.def
  296e628c73cdebb4c5a0c2335cae4084  gcc/config/aarch64/aarch64-sve-builtins-base.h
  df14a744242cdd5396d7f9e578f7838e  gcc/config/aarch64/aarch64-sve-builtins-functions.h
--- 3541,3551 ----
  b824341b8f6fdb8eb1667425adf63db8  gcc/config/aarch64/aarch64-sched-dispatch.h
  da15606bcbef7961db958c042bf81c05  gcc/config/aarch64/aarch64-simd-builtin-types.def
  9a92557ac11986ea17d11d6ca82c01e6  gcc/config/aarch64/aarch64-simd-builtins.def
! 8f0acfd5455d9572e381b98441bf47a5  gcc/config/aarch64/aarch64-simd-pragma-builtins.def
  71901785550838e15612d25168186e8d  gcc/config/aarch64/aarch64-simd.md
  435ec14d0c7365192bbd08eecbc2b91b  gcc/config/aarch64/aarch64-sme.md
  680d9861c361f5e0db24978600b2a134  gcc/config/aarch64/aarch64-speculation.cc
! e3b47e812748e5bfcc877f836d554a0d  gcc/config/aarch64/aarch64-sve-builtins-base.cc
  cc3e36cd6335911c4199669958386c9e  gcc/config/aarch64/aarch64-sve-builtins-base.def
  296e628c73cdebb4c5a0c2335cae4084  gcc/config/aarch64/aarch64-sve-builtins-base.h
  df14a744242cdd5396d7f9e578f7838e  gcc/config/aarch64/aarch64-sve-builtins-functions.h
*************** ca5f6a89d79c08d79fe5ff052e836a69  gcc/co
*** 3555,3575 ****
  b7970cc46633371d0ac4e877297d804a  gcc/config/aarch64/aarch64-sve-builtins-sme.def
  85e1ee139787d52dcd3b9e3d8240453e  gcc/config/aarch64/aarch64-sve-builtins-sme.h
  e3b84b8c70b76f20a6d8123da2876317  gcc/config/aarch64/aarch64-sve-builtins-sve2.cc
! 19516809b6c0c9277cfc67da64b67275  gcc/config/aarch64/aarch64-sve-builtins-sve2.def
  2cdc75f9c6df91167d77d8f46b2b4c5a  gcc/config/aarch64/aarch64-sve-builtins-sve2.h
  49330d59221903e05f3ad03c9f6a6a7b  gcc/config/aarch64/aarch64-sve-builtins.cc
  0aaa296fe7e877e67b85468885fdb8b5  gcc/config/aarch64/aarch64-sve-builtins.def
  88f4473ff255da227dee1dbc66c11a5f  gcc/config/aarch64/aarch64-sve-builtins.h
! 46a43d04c58205391b00f499f50291cf  gcc/config/aarch64/aarch64-sve.md
! db4dcc42c469f00dd02e500c189fa78d  gcc/config/aarch64/aarch64-sve2.md
  229d0046517455cf526c12527127f3b8  gcc/config/aarch64/aarch64-sys-regs.def
  33a2011b9d1511f6f2a48135ef9c91dc  gcc/config/aarch64/aarch64-tune.md
  dec4c8fd03ac5636ba08d9523bee06be  gcc/config/aarch64/aarch64-tuning-enums.def
  fb86888a7b4a251db9c62262e379d564  gcc/config/aarch64/aarch64-tuning-flags.def
  b2ed7b4c85a1fa71b919148f60e2984f  gcc/config/aarch64/aarch64-vxworks.h
! c89ca1cfc0f4e326f65df203917b44e2  gcc/config/aarch64/aarch64.cc
! 1e616694750b4b74f9712a90feb26349  gcc/config/aarch64/aarch64.h
! 877d4216a9b555eb0133ec125080e7f8  gcc/config/aarch64/aarch64.md
  c5cf87f72305a6ea92d9fd65a668c5f0  gcc/config/aarch64/aarch64.opt
  f8862c1a17df0d9164d1f07fc8288527  gcc/config/aarch64/aarch64.opt.urls
  82e9259865afd63b716cc9b316e7f2e9  gcc/config/aarch64/arm_acle.h
--- 3555,3575 ----
  b7970cc46633371d0ac4e877297d804a  gcc/config/aarch64/aarch64-sve-builtins-sme.def
  85e1ee139787d52dcd3b9e3d8240453e  gcc/config/aarch64/aarch64-sve-builtins-sme.h
  e3b84b8c70b76f20a6d8123da2876317  gcc/config/aarch64/aarch64-sve-builtins-sve2.cc
! 7742fc1106ddcf7261e10d6eeac7d1e9  gcc/config/aarch64/aarch64-sve-builtins-sve2.def
  2cdc75f9c6df91167d77d8f46b2b4c5a  gcc/config/aarch64/aarch64-sve-builtins-sve2.h
  49330d59221903e05f3ad03c9f6a6a7b  gcc/config/aarch64/aarch64-sve-builtins.cc
  0aaa296fe7e877e67b85468885fdb8b5  gcc/config/aarch64/aarch64-sve-builtins.def
  88f4473ff255da227dee1dbc66c11a5f  gcc/config/aarch64/aarch64-sve-builtins.h
! fcd162fcd7283eef4840616707e697be  gcc/config/aarch64/aarch64-sve.md
! aed1c7a89b093d7a786a6ab457841e24  gcc/config/aarch64/aarch64-sve2.md
  229d0046517455cf526c12527127f3b8  gcc/config/aarch64/aarch64-sys-regs.def
  33a2011b9d1511f6f2a48135ef9c91dc  gcc/config/aarch64/aarch64-tune.md
  dec4c8fd03ac5636ba08d9523bee06be  gcc/config/aarch64/aarch64-tuning-enums.def
  fb86888a7b4a251db9c62262e379d564  gcc/config/aarch64/aarch64-tuning-flags.def
  b2ed7b4c85a1fa71b919148f60e2984f  gcc/config/aarch64/aarch64-vxworks.h
! 431ad00d3c24ebb903e6c05d73100c77  gcc/config/aarch64/aarch64.cc
! 6d08684e5861c8b32845dc6aff2539b8  gcc/config/aarch64/aarch64.h
! c8b74735b920099887b23d3009d7565c  gcc/config/aarch64/aarch64.md
  c5cf87f72305a6ea92d9fd65a668c5f0  gcc/config/aarch64/aarch64.opt
  f8862c1a17df0d9164d1f07fc8288527  gcc/config/aarch64/aarch64.opt.urls
  82e9259865afd63b716cc9b316e7f2e9  gcc/config/aarch64/arm_acle.h
*************** f7165d62ef852e1929a8fc9a85c01ab2  gcc/co
*** 3594,3600 ****
  190b8ad2102cd90ce935883b736ff024  gcc/config/aarch64/geniterators.sh
  b8dedf1142526bb86368b620384f877a  gcc/config/aarch64/gentune.sh
  86eaf33edeb885c2c9ae2a9825879e59  gcc/config/aarch64/host-aarch64-darwin.cc
! 828714e7f8305274c7643ff335beeea6  gcc/config/aarch64/iterators.md
  811f43b19ba5f415244c59b4ab377445  gcc/config/aarch64/neoversev2.md
  b382a70dce13e2b3d554e31443c0dbf0  gcc/config/aarch64/olympus.md
  38f51f94de89d54e9076031bb9368473  gcc/config/aarch64/predicates.md
--- 3594,3600 ----
  190b8ad2102cd90ce935883b736ff024  gcc/config/aarch64/geniterators.sh
  b8dedf1142526bb86368b620384f877a  gcc/config/aarch64/gentune.sh
  86eaf33edeb885c2c9ae2a9825879e59  gcc/config/aarch64/host-aarch64-darwin.cc
! 84a2bd11e63defac1cddbb6aa47cfff8  gcc/config/aarch64/iterators.md
  811f43b19ba5f415244c59b4ab377445  gcc/config/aarch64/neoversev2.md
  b382a70dce13e2b3d554e31443c0dbf0  gcc/config/aarch64/olympus.md
  38f51f94de89d54e9076031bb9368473  gcc/config/aarch64/predicates.md
*************** f6aab9bc45ad00d57114a8b08ef41921  gcc/co
*** 3988,3994 ****
  c7e412de5ff9b19c0c75fdd820594114  gcc/config/csky/t-csky-elf
  e8ba563b7eff9a7c1a380d760e1a30a9  gcc/config/csky/t-csky-linux
  37fe320f04a151fdb79bb04b209376d4  gcc/config/darwin-c.cc
! 3b53947a8442e9f7ece381ed9457a104  gcc/config/darwin-d.cc
  99e4c8d1b4129343e5e17017e70a7d9c  gcc/config/darwin-driver.cc
  3ace0bc8572ce616566da404afc795e6  gcc/config/darwin-f.cc
  9c2d09708b2f6cc651ef66ec1ba67645  gcc/config/darwin-ppc-ldouble-patch.def
--- 3988,3994 ----
  c7e412de5ff9b19c0c75fdd820594114  gcc/config/csky/t-csky-elf
  e8ba563b7eff9a7c1a380d760e1a30a9  gcc/config/csky/t-csky-linux
  37fe320f04a151fdb79bb04b209376d4  gcc/config/darwin-c.cc
! 788e553fba034bd51970934ac61aeeda  gcc/config/darwin-d.cc
  99e4c8d1b4129343e5e17017e70a7d9c  gcc/config/darwin-driver.cc
  3ace0bc8572ce616566da404afc795e6  gcc/config/darwin-f.cc
  9c2d09708b2f6cc651ef66ec1ba67645  gcc/config/darwin-ppc-ldouble-patch.def
*************** e8ba563b7eff9a7c1a380d760e1a30a9  gcc/co
*** 3996,4002 ****
  8e7a3be360635581116c45ad4ce9f11a  gcc/config/darwin-rust.cc
  cf8b9e265eb733c7c120218863142390  gcc/config/darwin-sections.def
  9d8acb6c9358ead72b77fe0f6c52ad36  gcc/config/darwin.cc
! f64c0a8e3e79c445281147d0e4547e36  gcc/config/darwin.h
  148592c1bf513e56d281629f94b70d9b  gcc/config/darwin.opt
  fa92b7f7b8bd38472af4bfd5a8254310  gcc/config/darwin.opt.urls
  4a5f649b74df564d653882eaeaa75adf  gcc/config/default-c.cc
--- 3996,4002 ----
  8e7a3be360635581116c45ad4ce9f11a  gcc/config/darwin-rust.cc
  cf8b9e265eb733c7c120218863142390  gcc/config/darwin-sections.def
  9d8acb6c9358ead72b77fe0f6c52ad36  gcc/config/darwin.cc
! bac21aa0a86c8fcc448f29c200988083  gcc/config/darwin.h
  148592c1bf513e56d281629f94b70d9b  gcc/config/darwin.opt
  fa92b7f7b8bd38472af4bfd5a8254310  gcc/config/darwin.opt.urls
  4a5f649b74df564d653882eaeaa75adf  gcc/config/default-c.cc
*************** c28514790f4784d421517c5a6b2f7d4f  gcc/co
*** 4291,4297 ****
  25b3947a11eb9ca52892133ddb36f3f2  gcc/config/i386/i386-rust.h
  6054f2632e87ad634387f120d7a12ffa  gcc/config/i386/i386.cc
  483853f45756ffc10a3acbe55d2d0920  gcc/config/i386/i386.h
! 8d7171c2d59a73707e6b828a2c65a955  gcc/config/i386/i386.md
  f431cbff6410e63b4e2de0e11adf19fb  gcc/config/i386/i386.opt
  b9e680863ab278314c1f2990d2d04fcc  gcc/config/i386/i386.opt.urls
  7570cb8763bf53e7144db7d6cd97f846  gcc/config/i386/i386elf.h
--- 4291,4297 ----
  25b3947a11eb9ca52892133ddb36f3f2  gcc/config/i386/i386-rust.h
  6054f2632e87ad634387f120d7a12ffa  gcc/config/i386/i386.cc
  483853f45756ffc10a3acbe55d2d0920  gcc/config/i386/i386.h
! 89df2a613c67e17ead3c5e21ec133f78  gcc/config/i386/i386.md
  f431cbff6410e63b4e2de0e11adf19fb  gcc/config/i386/i386.opt
  b9e680863ab278314c1f2990d2d04fcc  gcc/config/i386/i386.opt.urls
  7570cb8763bf53e7144db7d6cd97f846  gcc/config/i386/i386elf.h
*************** db114ac74c87743a142214fddaad2687  gcc/co
*** 4354,4360 ****
  92210572b9f9f6481e4649a42d9ac3b0  gcc/config/i386/sm4intrin.h
  5298b8261e081859bbf068b710158e8f  gcc/config/i386/smmintrin.h
  5a24de64038248c06d15ab8e479dc295  gcc/config/i386/sol2.h
! a14f246d623e21be5fcec57c3185c50d  gcc/config/i386/sse.md
  52e0114cb9ab8d55aac3c17d06657d71  gcc/config/i386/ssemath.h
  8a6ab9e02097018bc9f1c2b347d29cfa  gcc/config/i386/stringop.def
  a626b4e6cd3e15f4e9d5c769b6391243  gcc/config/i386/subst.md
--- 4354,4360 ----
  92210572b9f9f6481e4649a42d9ac3b0  gcc/config/i386/sm4intrin.h
  5298b8261e081859bbf068b710158e8f  gcc/config/i386/smmintrin.h
  5a24de64038248c06d15ab8e479dc295  gcc/config/i386/sol2.h
! 17cb91030abdc14d8fea2151d8b24f9e  gcc/config/i386/sse.md
  52e0114cb9ab8d55aac3c17d06657d71  gcc/config/i386/ssemath.h
  8a6ab9e02097018bc9f1c2b347d29cfa  gcc/config/i386/stringop.def
  a626b4e6cd3e15f4e9d5c769b6391243  gcc/config/i386/subst.md
*************** ce049501c9736e269332c4a1b19c32ea  gcc/co
*** 4504,4510 ****
  8fd8b25469c1db970309fa5b27f6b7a1  gcc/config/loongarch/lasx.md
  27fce87abf98871f7537919ba724e7ee  gcc/config/loongarch/lasxintrin.h
  787cab00aedf1fc937ded71896742e8d  gcc/config/loongarch/linux.h
! bc5393e4cea7b67dd63da49d0b4ef75b  gcc/config/loongarch/loongarch-builtins.cc
  5b8cdbae35775ac7ae20ea1b0d14b9e5  gcc/config/loongarch/loongarch-c.cc
  81d96d87b071262e2275de4768972236  gcc/config/loongarch/loongarch-cpu.cc
  0058282b8d62d5ee0444b96b7dd58010  gcc/config/loongarch/loongarch-cpu.h
--- 4504,4510 ----
  8fd8b25469c1db970309fa5b27f6b7a1  gcc/config/loongarch/lasx.md
  27fce87abf98871f7537919ba724e7ee  gcc/config/loongarch/lasxintrin.h
  787cab00aedf1fc937ded71896742e8d  gcc/config/loongarch/linux.h
! 5692851b73184b2e9a81fe327493fd5c  gcc/config/loongarch/loongarch-builtins.cc
  5b8cdbae35775ac7ae20ea1b0d14b9e5  gcc/config/loongarch/loongarch-c.cc
  81d96d87b071262e2275de4768972236  gcc/config/loongarch/loongarch-cpu.cc
  0058282b8d62d5ee0444b96b7dd58010  gcc/config/loongarch/loongarch-cpu.h
*************** ca077531f284e5bbf280885aab4378bd  gcc/co
*** 4518,4524 ****
  512199b1c047cd7923d0fd0681680a54  gcc/config/loongarch/loongarch-evol-attr.def
  88164bbb3c94b0dd29d120ec494dffef  gcc/config/loongarch/loongarch-evolution.cc
  dc2f2182b815a3d30579f3cd907f60ea  gcc/config/loongarch/loongarch-evolution.h
! f18a11c4d5c559c8fb259cf9a7626977  gcc/config/loongarch/loongarch-ftypes.def
  c7eeb48ab4223ecfdb09fa5e4ce61d71  gcc/config/loongarch/loongarch-modes.def
  4f6f228dac0484d6ba3fbad6ddb6d8af  gcc/config/loongarch/loongarch-opts.cc
  5e852be9fbcd6b98822c986918099da1  gcc/config/loongarch/loongarch-opts.h
--- 4518,4524 ----
  512199b1c047cd7923d0fd0681680a54  gcc/config/loongarch/loongarch-evol-attr.def
  88164bbb3c94b0dd29d120ec494dffef  gcc/config/loongarch/loongarch-evolution.cc
  dc2f2182b815a3d30579f3cd907f60ea  gcc/config/loongarch/loongarch-evolution.h
! 21f748b92e5b2e0d11cc3ee27fba55b4  gcc/config/loongarch/loongarch-ftypes.def
  c7eeb48ab4223ecfdb09fa5e4ce61d71  gcc/config/loongarch/loongarch-modes.def
  4f6f228dac0484d6ba3fbad6ddb6d8af  gcc/config/loongarch/loongarch-opts.cc
  5e852be9fbcd6b98822c986918099da1  gcc/config/loongarch/loongarch-opts.h
*************** c7eeb48ab4223ecfdb09fa5e4ce61d71  gcc/co
*** 4526,4534 ****
  dadec2097ca9c4947a49a5766ac8ee89  gcc/config/loongarch/loongarch-str.h
  7ccddf81e7d405d89aab58e4ff863b49  gcc/config/loongarch/loongarch-target-attr.cc
  3cfb174db8bc99a9361e597a3e9bd35e  gcc/config/loongarch/loongarch-tune.h
! 31bf1d806e32f2eadc637aa14c4ca039  gcc/config/loongarch/loongarch.cc
  57abfb8c653a24903f61e5cf93ac929f  gcc/config/loongarch/loongarch.h
! b032e221ac6d63e1a9d9fd88bad38dd6  gcc/config/loongarch/loongarch.md
  62f9bea81246c3dac622d969dabefc1b  gcc/config/loongarch/loongarch.opt
  387011bb9dde5e25493f3602b2fd17bb  gcc/config/loongarch/loongarch.opt.urls
  8a90e5171c01a3ce4c5a78cf857008c8  gcc/config/loongarch/lsx.md
--- 4526,4534 ----
  dadec2097ca9c4947a49a5766ac8ee89  gcc/config/loongarch/loongarch-str.h
  7ccddf81e7d405d89aab58e4ff863b49  gcc/config/loongarch/loongarch-target-attr.cc
  3cfb174db8bc99a9361e597a3e9bd35e  gcc/config/loongarch/loongarch-tune.h
! bebb396b217212d6444ab23ee428788d  gcc/config/loongarch/loongarch.cc
  57abfb8c653a24903f61e5cf93ac929f  gcc/config/loongarch/loongarch.h
! 1b11d059c390458cbbf8e16a8efa5e6f  gcc/config/loongarch/loongarch.md
  62f9bea81246c3dac622d969dabefc1b  gcc/config/loongarch/loongarch.opt
  387011bb9dde5e25493f3602b2fd17bb  gcc/config/loongarch/loongarch.opt.urls
  8a90e5171c01a3ce4c5a78cf857008c8  gcc/config/loongarch/lsx.md
*************** c54bf2d4fd13bb74bc3d510b8f75f0b1  gcc/co
*** 4972,4978 ****
  4698ae42c9ec92a8bae25c6aae87cafa  gcc/config/pdp11/predicates.md
  26b5d6f5cdadb599cdb807f09b982399  gcc/config/pdp11/t-pdp11
  925e489f0f0a258ea2e7ced256fb3ab5  gcc/config/phoenix.h
! 25f5cae96ca6dccf778b14baf3c1e570  gcc/config/picolibc-spec.h
  193423b938033c62e286142c7adf5f39  gcc/config/picolibc.opt
  50d6bfcb4715df0cad89992c362dcfaa  gcc/config/picolibc.opt.urls
  fcbf9f8c84143f4aa31a271f8995d1ce  gcc/config/print-sysroot-suffix.sh
--- 4972,4978 ----
  4698ae42c9ec92a8bae25c6aae87cafa  gcc/config/pdp11/predicates.md
  26b5d6f5cdadb599cdb807f09b982399  gcc/config/pdp11/t-pdp11
  925e489f0f0a258ea2e7ced256fb3ab5  gcc/config/phoenix.h
! c11972bf63fa008aee2bbef33d586f7b  gcc/config/picolibc-spec.h
  193423b938033c62e286142c7adf5f39  gcc/config/picolibc.opt
  50d6bfcb4715df0cad89992c362dcfaa  gcc/config/picolibc.opt.urls
  fcbf9f8c84143f4aa31a271f8995d1ce  gcc/config/print-sysroot-suffix.sh
*************** b8f6d36a9d7d3ef28a80c20bec990411  gcc/co
*** 5059,5086 ****
  c171108cfab16c74097a841489b04298  gcc/config/riscv/riscv-selftests.cc
  41d585e61cee0deacc33bd07c93e79e2  gcc/config/riscv/riscv-shorten-memrefs.cc
  62b31689063eeeca8f0e7ae25da92d0a  gcc/config/riscv/riscv-sr.cc
! b3add452de40e1251155f0c29559d9a7  gcc/config/riscv/riscv-string.cc
  83bc8b8b85874456078c4c683d82a3e6  gcc/config/riscv/riscv-subset.h
  51b1afa956c93e4b97d72843aa227d86  gcc/config/riscv/riscv-target-attr.cc
  6c563e0baf9031dcc0a4e26a55330b2e  gcc/config/riscv/riscv-v.cc
  23f9fe60c9f6f052bd55875310c01b0e  gcc/config/riscv/riscv-v.h
  3d17a86fd1ba10efb8809c613d1eb6cf  gcc/config/riscv/riscv-vect-permconst.cc
! 98a11833aec7ba0b68cdde01fea5d57e  gcc/config/riscv/riscv-vector-builtins-bases.cc
  7fc09f50e292c52420537953650fa0de  gcc/config/riscv/riscv-vector-builtins-bases.h
  4a25523a7d997f5ddf9f1164da651e71  gcc/config/riscv/riscv-vector-builtins-functions.def
  99633c5e82aa1fc497802b59d54e23a8  gcc/config/riscv/riscv-vector-builtins-shapes.cc
  2a2b16ff55b4e9c8265561eb12d0aa49  gcc/config/riscv/riscv-vector-builtins-shapes.h
  a6642c27cbc8f18cf3cab4881911ed3f  gcc/config/riscv/riscv-vector-builtins-types.def
! c73717c287edea2d33632f9072f13635  gcc/config/riscv/riscv-vector-builtins.cc
  6f087b25674ebed60ebd0e55c4fe30e1  gcc/config/riscv/riscv-vector-builtins.def
  b65281b3d979c9c774d30d65281a07ab  gcc/config/riscv/riscv-vector-builtins.h
  9c783e57e05c70a808213ceff7299df9  gcc/config/riscv/riscv-vector-costs.cc
  8c1680c1bc7e171e4992d3aa9ea64d18  gcc/config/riscv/riscv-vector-costs.h
  4dd506c7e0c9b67fb2b6c5acdf4f44b7  gcc/config/riscv/riscv-vector-switch.def
! 1408ee27e2fe3fea4f994902802d9746  gcc/config/riscv/riscv-vsetvl.cc
  10ae51c30c9b8e6dce66f20016fae344  gcc/config/riscv/riscv-vsetvl.def
  85dee253312a7f85a1d4f8554a601105  gcc/config/riscv/riscv-zicfilp.cc
! 34a9166fc59f0b58319fb277f61c0f6a  gcc/config/riscv/riscv.cc
  cff2fc59ab1defbd178f75bdcd643bcc  gcc/config/riscv/riscv.h
  69bf57d0406b6ab66b5fd796932171e7  gcc/config/riscv/riscv.md
  2d23f30f1a22bd9edff8821ece67599e  gcc/config/riscv/riscv.opt
--- 5059,5086 ----
  c171108cfab16c74097a841489b04298  gcc/config/riscv/riscv-selftests.cc
  41d585e61cee0deacc33bd07c93e79e2  gcc/config/riscv/riscv-shorten-memrefs.cc
  62b31689063eeeca8f0e7ae25da92d0a  gcc/config/riscv/riscv-sr.cc
! daee381b824c8a8cb719d30db0094ae6  gcc/config/riscv/riscv-string.cc
  83bc8b8b85874456078c4c683d82a3e6  gcc/config/riscv/riscv-subset.h
  51b1afa956c93e4b97d72843aa227d86  gcc/config/riscv/riscv-target-attr.cc
  6c563e0baf9031dcc0a4e26a55330b2e  gcc/config/riscv/riscv-v.cc
  23f9fe60c9f6f052bd55875310c01b0e  gcc/config/riscv/riscv-v.h
  3d17a86fd1ba10efb8809c613d1eb6cf  gcc/config/riscv/riscv-vect-permconst.cc
! 5c3100beef34fe1879075f8cfb95e70e  gcc/config/riscv/riscv-vector-builtins-bases.cc
  7fc09f50e292c52420537953650fa0de  gcc/config/riscv/riscv-vector-builtins-bases.h
  4a25523a7d997f5ddf9f1164da651e71  gcc/config/riscv/riscv-vector-builtins-functions.def
  99633c5e82aa1fc497802b59d54e23a8  gcc/config/riscv/riscv-vector-builtins-shapes.cc
  2a2b16ff55b4e9c8265561eb12d0aa49  gcc/config/riscv/riscv-vector-builtins-shapes.h
  a6642c27cbc8f18cf3cab4881911ed3f  gcc/config/riscv/riscv-vector-builtins-types.def
! 2eebb6b1ce2689efdd037d60ed33cc66  gcc/config/riscv/riscv-vector-builtins.cc
  6f087b25674ebed60ebd0e55c4fe30e1  gcc/config/riscv/riscv-vector-builtins.def
  b65281b3d979c9c774d30d65281a07ab  gcc/config/riscv/riscv-vector-builtins.h
  9c783e57e05c70a808213ceff7299df9  gcc/config/riscv/riscv-vector-costs.cc
  8c1680c1bc7e171e4992d3aa9ea64d18  gcc/config/riscv/riscv-vector-costs.h
  4dd506c7e0c9b67fb2b6c5acdf4f44b7  gcc/config/riscv/riscv-vector-switch.def
! 1e7e450b48a1c3bd178cfe23f0da0001  gcc/config/riscv/riscv-vsetvl.cc
  10ae51c30c9b8e6dce66f20016fae344  gcc/config/riscv/riscv-vsetvl.def
  85dee253312a7f85a1d4f8554a601105  gcc/config/riscv/riscv-zicfilp.cc
! f1bc8a048bbc35768f52b5568382daf7  gcc/config/riscv/riscv.cc
  cff2fc59ab1defbd178f75bdcd643bcc  gcc/config/riscv/riscv.h
  69bf57d0406b6ab66b5fd796932171e7  gcc/config/riscv/riscv.md
  2d23f30f1a22bd9edff8821ece67599e  gcc/config/riscv/riscv.opt
*************** bcf728ad2379630774fd5bb529d4ee86  gcc/co
*** 5118,5125 ****
  a95321fbec5a4da32a9ee8145b8b0c6d  gcc/config/riscv/tt-ascalon-d8.md
  dcbac9d3c6831ff1cd18effca9c7bb28  gcc/config/riscv/vector-bfloat16.md
  1efc7e76b1f8a6c41de01fba7e0d33b9  gcc/config/riscv/vector-crypto.md
! b55d2fd4003ec0324ba5452376c19666  gcc/config/riscv/vector-iterators.md
! 53bb8f454c5ae9e2ad35a49a1dd4b0ee  gcc/config/riscv/vector.md
  18d213c106fe52eebc74017d5ff892ce  gcc/config/riscv/xiangshan.md
  39ba96197510d4ac114a827d7ffbf806  gcc/config/riscv/zc.md
  e07a4370b20c2e0a34273d5b3c3b77d6  gcc/config/riscv/zicond.md
--- 5118,5125 ----
  a95321fbec5a4da32a9ee8145b8b0c6d  gcc/config/riscv/tt-ascalon-d8.md
  dcbac9d3c6831ff1cd18effca9c7bb28  gcc/config/riscv/vector-bfloat16.md
  1efc7e76b1f8a6c41de01fba7e0d33b9  gcc/config/riscv/vector-crypto.md
! 604805ea8530b1a6391150e8388a63fb  gcc/config/riscv/vector-iterators.md
! bf625c679ac7e93fd590211caaeb9139  gcc/config/riscv/vector.md
  18d213c106fe52eebc74017d5ff892ce  gcc/config/riscv/xiangshan.md
  39ba96197510d4ac114a827d7ffbf806  gcc/config/riscv/zc.md
  e07a4370b20c2e0a34273d5b3c3b77d6  gcc/config/riscv/zicond.md
*************** c60f07bed189e2a8fb8abfe19368e9f9  gcc/co
*** 5617,5624 ****
  2341d28c3ca91d40bbe37ba41a733448  gcc/config/xtensa/xtensa.md
  093588e637649f5260b04ad13fe609e6  gcc/config/xtensa/xtensa.opt
  db57d7603312357e8c0cfb21c32353d1  gcc/config/xtensa/xtensa.opt.urls
! ee3e83373502a2d1d2c643fb77bf3290  gcc/configure
! adec7c7394070f2b560bbb59c6a4681f  gcc/configure.ac
  1f52ef379dc4198df7f2c7ab63c8b70e  gcc/configure.tgt
  8a46839a73059f70ef105be9706c2554  gcc/context.cc
  08023c1005def168a8b675813b95d9f4  gcc/context.h
--- 5617,5624 ----
  2341d28c3ca91d40bbe37ba41a733448  gcc/config/xtensa/xtensa.md
  093588e637649f5260b04ad13fe609e6  gcc/config/xtensa/xtensa.opt
  db57d7603312357e8c0cfb21c32353d1  gcc/config/xtensa/xtensa.opt.urls
! d5b8865fe825e8bfbedd210d04ff98c4  gcc/configure
! 1e7cce041054b20b922a29556b0f6832  gcc/configure.ac
  1f52ef379dc4198df7f2c7ab63c8b70e  gcc/configure.tgt
  8a46839a73059f70ef105be9706c2554  gcc/context.cc
  08023c1005def168a8b675813b95d9f4  gcc/context.h
*************** c5ad0142a191862e3e81ecd3573754b3  gcc/co
*** 5629,5635 ****
  55a33ae415bde0fd2e36ba584894e50b  gcc/coroutine-passes.cc
  7c2ad47e271f9b832badf1740a09c77e  gcc/coverage.cc
  8524318f81a8af8cfaa8d35966d8fdc2  gcc/coverage.h
! f194df3a8fdc52b4eab1cb72541e220c  gcc/cp/ChangeLog
  70c059f2b75a2fc1bb95a526b21b8cd7  gcc/cp/ChangeLog-1993
  7cbd106e10a0ba7c052bee3fe20671c2  gcc/cp/ChangeLog-1994
  3b1e3ed23ad4363f75e6fd2fbb583dee  gcc/cp/ChangeLog-1995
--- 5629,5635 ----
  55a33ae415bde0fd2e36ba584894e50b  gcc/coroutine-passes.cc
  7c2ad47e271f9b832badf1740a09c77e  gcc/coverage.cc
  8524318f81a8af8cfaa8d35966d8fdc2  gcc/coverage.h
! 98668a3173e7fb7faf7c3c9a345ef428  gcc/cp/ChangeLog
  70c059f2b75a2fc1bb95a526b21b8cd7  gcc/cp/ChangeLog-1993
  7cbd106e10a0ba7c052bee3fe20671c2  gcc/cp/ChangeLog-1994
  3b1e3ed23ad4363f75e6fd2fbb583dee  gcc/cp/ChangeLog-1995
*************** f39635970f98bbc4591f6363fe70504b  gcc/cp
*** 5666,5698 ****
  c1c7801b9b0f379e702a4f6cb83972e7  gcc/cp/ChangeLog.ptr
  9aa3cd9f75c785de9f51446e3f295515  gcc/cp/ChangeLog.tree-ssa
  da351065af25977c46f56d82f11e47f8  gcc/cp/Make-lang.in
! 0c977d6cad918b58f50e98b57afb2da8  gcc/cp/call.cc
  144dd1ae510a7436b569b007470b62da  gcc/cp/cfns.gperf
  39dd4c5a96c7ea132eb3c7ed039a065e  gcc/cp/cfns.h
! 4560067043be9e91a7d2ac4006d81d29  gcc/cp/class.cc
  e51f295e858583af5f9cf88b9530adf7  gcc/cp/config-lang.in
! e80ac175ec6ab39c7f0b8741537c8fe4  gcc/cp/constexpr.cc
  695da628b2b27b6a8e2f34609d54da00  gcc/cp/constraint.cc
! a64fe7cc5ccde7066aea6b97c300a103  gcc/cp/contracts.cc
! 8879da565f6e94b207c0df0a49c8178d  gcc/cp/contracts.h
! dc90e9919159154c06debd29a17af999  gcc/cp/coroutines.cc
  1817def94193f0cfabd4fa5b321af011  gcc/cp/coroutines.h
! 171d90f69741e058788961d59240f09a  gcc/cp/cp-gimplify.cc
  9e1ca3d04fdc65b5e7817d5ca8e96146  gcc/cp/cp-lang.cc
  1a3e309babdfdd0ff5e03d09e6b5870d  gcc/cp/cp-name-hint.h
! 4e87bd2d97e6a7980386cd4223079852  gcc/cp/cp-objcp-common.cc
! 370b42bcdf211125186c37665052c30c  gcc/cp/cp-objcp-common.h
  64fa302e46b7097f7d989f5ab418d244  gcc/cp/cp-trait.def
! 1e7a568329babf60fb2ba95082a49de0  gcc/cp/cp-tree.def
! 57d0720166d3631ca7f11163e3c79325  gcc/cp/cp-tree.h
  e2854dfa428fab45fc41bf58fef71e61  gcc/cp/cp-ubsan.cc
  450c80eca4c5b1adb25016bc5d9d7a59  gcc/cp/cvt.cc
  f067718cf3d629084d8347c4e017afd4  gcc/cp/cxx-pretty-print.cc
  1d04eec9859d91686ca501e9221f30ac  gcc/cp/cxx-pretty-print.h
  82a41d873e1c90067158c89e6c1bd4bb  gcc/cp/cxxapi-data.csv
! ab5b4c04cae57370ae488c1e714cc95e  gcc/cp/decl.cc
  6b0c9433f7d3f129a44b59d54babb4eb  gcc/cp/decl.h
! 929cc6bcf957e1084e50878e0da20724  gcc/cp/decl2.cc
  12ccd5244973d74a0536adf58261b416  gcc/cp/dump.cc
  1be2f9764d51e88964ee290314f203a1  gcc/cp/error.cc
  59d3d272a504a462c1f7081637e7f3e5  gcc/cp/except.cc
--- 5666,5698 ----
  c1c7801b9b0f379e702a4f6cb83972e7  gcc/cp/ChangeLog.ptr
  9aa3cd9f75c785de9f51446e3f295515  gcc/cp/ChangeLog.tree-ssa
  da351065af25977c46f56d82f11e47f8  gcc/cp/Make-lang.in
! 1d2e1cc8f67dfdbc32f9c3ee3ede59d4  gcc/cp/call.cc
  144dd1ae510a7436b569b007470b62da  gcc/cp/cfns.gperf
  39dd4c5a96c7ea132eb3c7ed039a065e  gcc/cp/cfns.h
! 9455033ae8eace23403f6a010e7702a7  gcc/cp/class.cc
  e51f295e858583af5f9cf88b9530adf7  gcc/cp/config-lang.in
! d70ce6b228703d85344edccf5d935ebb  gcc/cp/constexpr.cc
  695da628b2b27b6a8e2f34609d54da00  gcc/cp/constraint.cc
! 99c403ab218e024bcf6d5d2108ad1f3b  gcc/cp/contracts.cc
! e77a681f560f3e9500f126febdc67ef6  gcc/cp/contracts.h
! f31a917ecaa91652f1ddad33816b79d8  gcc/cp/coroutines.cc
  1817def94193f0cfabd4fa5b321af011  gcc/cp/coroutines.h
! 3bbda7b539934efbaca409affb67d728  gcc/cp/cp-gimplify.cc
  9e1ca3d04fdc65b5e7817d5ca8e96146  gcc/cp/cp-lang.cc
  1a3e309babdfdd0ff5e03d09e6b5870d  gcc/cp/cp-name-hint.h
! d6f2be2c3f6c7fa85d49419b90a903e9  gcc/cp/cp-objcp-common.cc
! 1bcfc7131c03e9ba3cec5bfa46543be4  gcc/cp/cp-objcp-common.h
  64fa302e46b7097f7d989f5ab418d244  gcc/cp/cp-trait.def
! bc9b29434f2e35fa68caf656161b5c0f  gcc/cp/cp-tree.def
! 9dda3a082311fad4dbe2eeb6f12e0cba  gcc/cp/cp-tree.h
  e2854dfa428fab45fc41bf58fef71e61  gcc/cp/cp-ubsan.cc
  450c80eca4c5b1adb25016bc5d9d7a59  gcc/cp/cvt.cc
  f067718cf3d629084d8347c4e017afd4  gcc/cp/cxx-pretty-print.cc
  1d04eec9859d91686ca501e9221f30ac  gcc/cp/cxx-pretty-print.h
  82a41d873e1c90067158c89e6c1bd4bb  gcc/cp/cxxapi-data.csv
! 249c45e0c08893ff854ee7ad27c4bf44  gcc/cp/decl.cc
  6b0c9433f7d3f129a44b59d54babb4eb  gcc/cp/decl.h
! 604caef71e607a1c086b5a2fe2908469  gcc/cp/decl2.cc
  12ccd5244973d74a0536adf58261b416  gcc/cp/dump.cc
  1be2f9764d51e88964ee290314f203a1  gcc/cp/error.cc
  59d3d272a504a462c1f7081637e7f3e5  gcc/cp/except.cc
*************** ab5b4c04cae57370ae488c1e714cc95e  gcc/cp
*** 5701,5736 ****
  014d3891b4172014c0ad5386223c4f4c  gcc/cp/g++spec.cc
  a29b3e9192657e81a1574fb99466348d  gcc/cp/gen-cxxapi-file.py
  5e26ca8cdaa75c6b2e929225fc545870  gcc/cp/init.cc
! dcc164c09c53fdba9fb51ac5bc9d2710  gcc/cp/lambda.cc
  bc388fb8287f2de7cdf4d78eb8f5d998  gcc/cp/lang-specs.h
! 902272b48beecccfddccf439a6cfd382  gcc/cp/lex.cc
  e4ccdd9cbe95dde4cce27394a7613dd9  gcc/cp/logic.cc
! 4afadfd154343b88df902b1e9c3a65c9  gcc/cp/mangle.cc
  3d68343c4a9d614bb00b91ad53e79a0b  gcc/cp/mapper-client.cc
  27465babcaf6195d4f438ed36bdd6aff  gcc/cp/mapper-client.h
  4be7487ea09330ba02fb0695bc32c905  gcc/cp/mapper-resolver.cc
  acc5732b886d522f7c4a9362587d7c8c  gcc/cp/metafns.gperf
  f3f2070329f6fd771c8e7610a97b8153  gcc/cp/metafns.h
  99dcd5706d056d3c446e2d90d8060632  gcc/cp/method.cc
! 7461d63cc03067885d58c224b25bb8d7  gcc/cp/module.cc
! f749adc56a07245bc4882810bd47eb67  gcc/cp/name-lookup.cc
! 00ce2aa60b041d84cd6cdcd75cb30271  gcc/cp/name-lookup.h
  b98d31c57aa038618db60991b17e0d35  gcc/cp/operators.def
  9efebf39da56d681d4405dfb9e55e3f5  gcc/cp/optimize.cc
! c960df735a91d1b69cab3b2ab6c9d81f  gcc/cp/parser.cc
  7973a34c47e3d3c580832655a3a5c3c2  gcc/cp/parser.h
! e1d4b6e8dc1b80d20ae7efe8767d5e39  gcc/cp/pt.cc
  25322928eaff39cf167372554c639e02  gcc/cp/ptree.cc
! 0f6dcc8e298669a0e1edb5604061ca65  gcc/cp/reflect.cc
  97df067b24bdcb46ea1a2ca984c26a33  gcc/cp/rtti.cc
! b9408f726725803049cb0278946364b9  gcc/cp/search.cc
! b3183b4523c689aff807e374dac1bf52  gcc/cp/semantics.cc
  64c36b2ea66c9f8f477b19d24e06a2cb  gcc/cp/std-name-hint.gperf
  15cc409f13a8952feb90e94d99ecefa2  gcc/cp/std-name-hint.h
! e2dc2cb2e5e3a1e73fd5caf42e783a11  gcc/cp/tree.cc
  01e9a381e6fcf3d016d0170ee0ad71d7  gcc/cp/type-utils.h
! 50b170b21816f19193b526b58ae3550c  gcc/cp/typeck.cc
! fa2059a62914b51814221a48ce5dec3a  gcc/cp/typeck2.cc
  12d19e5abc1e436004b8885cde4765f0  gcc/cp/vtable-class-hierarchy.cc
  556f791fb43a25890d32717884f67cd1  gcc/cppbuiltin.cc
  51b40c4eab2c9321ddb49d1acb80edc3  gcc/cppbuiltin.h
--- 5701,5736 ----
  014d3891b4172014c0ad5386223c4f4c  gcc/cp/g++spec.cc
  a29b3e9192657e81a1574fb99466348d  gcc/cp/gen-cxxapi-file.py
  5e26ca8cdaa75c6b2e929225fc545870  gcc/cp/init.cc
! b3ff7f1e11444c1a8a1b9471e54c8cdd  gcc/cp/lambda.cc
  bc388fb8287f2de7cdf4d78eb8f5d998  gcc/cp/lang-specs.h
! 2c33328276b7ca5633320581eb891129  gcc/cp/lex.cc
  e4ccdd9cbe95dde4cce27394a7613dd9  gcc/cp/logic.cc
! 768356082fa712f738301fb19baf2da7  gcc/cp/mangle.cc
  3d68343c4a9d614bb00b91ad53e79a0b  gcc/cp/mapper-client.cc
  27465babcaf6195d4f438ed36bdd6aff  gcc/cp/mapper-client.h
  4be7487ea09330ba02fb0695bc32c905  gcc/cp/mapper-resolver.cc
  acc5732b886d522f7c4a9362587d7c8c  gcc/cp/metafns.gperf
  f3f2070329f6fd771c8e7610a97b8153  gcc/cp/metafns.h
  99dcd5706d056d3c446e2d90d8060632  gcc/cp/method.cc
! 73ea6d347913707fcbfad464b90d2f3d  gcc/cp/module.cc
! 71a14c7d084dfa4f47828306158ad741  gcc/cp/name-lookup.cc
! 2cc34a773d90c2531a10a90b908de661  gcc/cp/name-lookup.h
  b98d31c57aa038618db60991b17e0d35  gcc/cp/operators.def
  9efebf39da56d681d4405dfb9e55e3f5  gcc/cp/optimize.cc
! f360acc7ac480f32ca5db147a3e525b7  gcc/cp/parser.cc
  7973a34c47e3d3c580832655a3a5c3c2  gcc/cp/parser.h
! 92d028261a366427611994fc631cab57  gcc/cp/pt.cc
  25322928eaff39cf167372554c639e02  gcc/cp/ptree.cc
! 5804bee315e500d2adc9da8ea6883466  gcc/cp/reflect.cc
  97df067b24bdcb46ea1a2ca984c26a33  gcc/cp/rtti.cc
! 9f7af4d4e940116a4fb0176d09ad180a  gcc/cp/search.cc
! fa38b7868f5962d3e4b22c38cd8b1b09  gcc/cp/semantics.cc
  64c36b2ea66c9f8f477b19d24e06a2cb  gcc/cp/std-name-hint.gperf
  15cc409f13a8952feb90e94d99ecefa2  gcc/cp/std-name-hint.h
! baa5f1a1ac981f3d2ccd6301adda32ae  gcc/cp/tree.cc
  01e9a381e6fcf3d016d0170ee0ad71d7  gcc/cp/type-utils.h
! be58a75c6bcbb6245f1ddd8526101d5a  gcc/cp/typeck.cc
! a4081c9094d5d8e820f5610a0e881a14  gcc/cp/typeck2.cc
  12d19e5abc1e436004b8885cde4765f0  gcc/cp/vtable-class-hierarchy.cc
  556f791fb43a25890d32717884f67cd1  gcc/cppbuiltin.cc
  51b40c4eab2c9321ddb49d1acb80edc3  gcc/cppbuiltin.h
*************** c503ae44e590daab467a1996ccce967a  gcc/cu
*** 5752,5758 ****
  86700ca4710faebe1a0dbd2da6bcc75d  gcc/custom-sarif-properties/digraphs.h
  cdc60d179f923c009f0432beb1054e5b  gcc/custom-sarif-properties/state-graphs.cc
  58306e5ac720b353f4c495abf155e8a1  gcc/custom-sarif-properties/state-graphs.h
! 3608c336c123e4ada4f0b9c25a36414e  gcc/d/ChangeLog
  94dbce564aba342900829d11192f8905  gcc/d/ChangeLog-2006
  1a0536d6571bca334bb5c00dbdf257ab  gcc/d/ChangeLog-2007
  362a026d745031260b2e4dd8eba9becc  gcc/d/ChangeLog-2008
--- 5752,5758 ----
  86700ca4710faebe1a0dbd2da6bcc75d  gcc/custom-sarif-properties/digraphs.h
  cdc60d179f923c009f0432beb1054e5b  gcc/custom-sarif-properties/state-graphs.cc
  58306e5ac720b353f4c495abf155e8a1  gcc/custom-sarif-properties/state-graphs.h
! c3c7785c715934cbd2fcc046b7994087  gcc/d/ChangeLog
  94dbce564aba342900829d11192f8905  gcc/d/ChangeLog-2006
  1a0536d6571bca334bb5c00dbdf257ab  gcc/d/ChangeLog-2007
  362a026d745031260b2e4dd8eba9becc  gcc/d/ChangeLog-2008
*************** e432bfc5c605ae0b1beedf0492ad40d1  gcc/d/
*** 5773,5796 ****
  4c7bd4d8dfadc612e88b52f720d6557a  gcc/d/ChangeLog-2023
  515b6760ee63421bed220a6d374a6795  gcc/d/ChangeLog-2024
  0cffef9989da6c718b41fafd16b8ea70  gcc/d/ChangeLog-2025
! 876374c77c9a0d69899ed658e05e5484  gcc/d/Make-lang.in
  426254b45d40584d0597c63f3fd1f889  gcc/d/README.gcc
  5170dc7fc8ad21399dd35a73673a1b1b  gcc/d/config-lang.in
  9e39f510891a4f491726675c0efc323c  gcc/d/d-attribs.cc
  03ab4b5dfdd537bdc840ab95224d060a  gcc/d/d-builtins.cc
! 0a0f17bd69b1a2ce7d3bb0653645c33e  gcc/d/d-codegen.cc
  7e3e1840d6b811828c6e3b2a0caf2eef  gcc/d/d-compiler.cc
! 9a346687af1f5ec6a98b359fd8b15aab  gcc/d/d-convert.cc
  62c9322bb6952c891db5089737edce22  gcc/d/d-ctfloat.cc
  0702f938fb930cf54d0ed1a0620cf839  gcc/d/d-diagnostic.cc
  c5ee2a286608e2d9385816b39f8ae5c5  gcc/d/d-frontend.cc
  bc2edbcb94ab8817426f7e3b458ba478  gcc/d/d-frontend.h
  703fd954a886eae772ae6a46261eb6b5  gcc/d/d-gimplify.cc
  1550526040df2e081ea18cfc0993b2fa  gcc/d/d-incpath.cc
! a407750cc3f1349bc5b85aa4d2000e29  gcc/d/d-lang.cc
  d3387225b6b0b4988843166a343aed79  gcc/d/d-longdouble.cc
  1b4f279195786abd8aaf36b97cbe9b5c  gcc/d/d-port.cc
! 2852aebce3c66ca992eb9a0682a67174  gcc/d/d-spec.cc
  ff0e8b453455e8497536165eae7c1f31  gcc/d/d-system.h
  5e46b2a1e062794f11ffd6b0844c5883  gcc/d/d-target-def.h
  661fd46901b62cd9a9ce15a4629779cd  gcc/d/d-target.cc
--- 5773,5796 ----
  4c7bd4d8dfadc612e88b52f720d6557a  gcc/d/ChangeLog-2023
  515b6760ee63421bed220a6d374a6795  gcc/d/ChangeLog-2024
  0cffef9989da6c718b41fafd16b8ea70  gcc/d/ChangeLog-2025
! d916ef405eeaa878b1c2ef9dcf535196  gcc/d/Make-lang.in
  426254b45d40584d0597c63f3fd1f889  gcc/d/README.gcc
  5170dc7fc8ad21399dd35a73673a1b1b  gcc/d/config-lang.in
  9e39f510891a4f491726675c0efc323c  gcc/d/d-attribs.cc
  03ab4b5dfdd537bdc840ab95224d060a  gcc/d/d-builtins.cc
! 9b83da3ce937c546cebd8c5610d837a6  gcc/d/d-codegen.cc
  7e3e1840d6b811828c6e3b2a0caf2eef  gcc/d/d-compiler.cc
! 2b83c5d5a0799c33bd6fc2625d7c2001  gcc/d/d-convert.cc
  62c9322bb6952c891db5089737edce22  gcc/d/d-ctfloat.cc
  0702f938fb930cf54d0ed1a0620cf839  gcc/d/d-diagnostic.cc
  c5ee2a286608e2d9385816b39f8ae5c5  gcc/d/d-frontend.cc
  bc2edbcb94ab8817426f7e3b458ba478  gcc/d/d-frontend.h
  703fd954a886eae772ae6a46261eb6b5  gcc/d/d-gimplify.cc
  1550526040df2e081ea18cfc0993b2fa  gcc/d/d-incpath.cc
! efbdd1e29dc0a1044de1b6bbf25ef5e4  gcc/d/d-lang.cc
  d3387225b6b0b4988843166a343aed79  gcc/d/d-longdouble.cc
  1b4f279195786abd8aaf36b97cbe9b5c  gcc/d/d-port.cc
! 1418416a89dc816b826036a01b553171  gcc/d/d-spec.cc
  ff0e8b453455e8497536165eae7c1f31  gcc/d/d-system.h
  5e46b2a1e062794f11ffd6b0844c5883  gcc/d/d-target-def.h
  661fd46901b62cd9a9ce15a4629779cd  gcc/d/d-target.cc
*************** ff0e8b453455e8497536165eae7c1f31  gcc/d/
*** 5798,5929 ****
  0cbefb1fe5798619dd31fbc791502b11  gcc/d/d-target.h
  96ebb03b303e0c71e962dea84e5154e5  gcc/d/d-tree.def
  02cdbdf57638633e0d58f820bcf9fc7f  gcc/d/d-tree.h
! 58fc2db445347b1615fc53ebb5c91c65  gcc/d/decl.cc
! e6320d8163671e43446e19cf6b36a9ce  gcc/d/dmd/MERGE
! ed33de5a82bf58502d473e8138f61580  gcc/d/dmd/README.md
! a0b3558bc182f44d37822b5dc59b6307  gcc/d/dmd/VERSION
! b818ddf6a39740acae2eb47295e0f1fb  gcc/d/dmd/access.d
! fb6d738af52d8cad02dcac9315926090  gcc/d/dmd/aggregate.d
! 8b7abca10989b57e2b1a337047b541a9  gcc/d/dmd/aggregate.h
  e944b3cc5977f3146f04cacf8649d8c0  gcc/d/dmd/aliasthis.d
  21422b359d959535fbad9bf3f51f180b  gcc/d/dmd/aliasthis.h
! 55b4f49be939e30abb173343e03dd335  gcc/d/dmd/arrayop.d
! 5fa512dfd95add6ad41d6efbff2a737a  gcc/d/dmd/arraytypes.d
! cf930f6cc74f2bc7d767e940c2ffd21b  gcc/d/dmd/arraytypes.h
  01cbde9d907bb77b44dbe04be21a6f71  gcc/d/dmd/ast_node.d
  70f509253981e582b4624b0083ff0168  gcc/d/dmd/ast_node.h
  57cb6c7031a80421f88153e98afe31f3  gcc/d/dmd/astcodegen.d
! 0760f0c07f9d2cf437bc15301cc8cfdb  gcc/d/dmd/astenums.d
! 933563785c5912a16fce5201dcd5f5fa  gcc/d/dmd/attrib.d
! 1c20c574865b06fa534ff7b176b2b697  gcc/d/dmd/attrib.h
  943555853b7c59e093cd477cd9794ea8  gcc/d/dmd/attribsem.d
  a09656153939f703358bc0a6c41ef21a  gcc/d/dmd/blockexit.d
  e4224ccaecb14d942c71d31bef20d78c  gcc/d/dmd/boostlicense.txt
  ffbb2d95e81b841ff7bac85a068c0112  gcc/d/dmd/builtin.d
! 1a6ea937a8db72e91d95ff5b34c5ef62  gcc/d/dmd/canthrow.d
  f06dcabf07ca33abd8042db6230fb74d  gcc/d/dmd/chkformat.d
! 2cb1dc7e6ee2505c0c0be7884176359f  gcc/d/dmd/clone.d
  a439029b15d096cc69638a68c99a808b  gcc/d/dmd/common/README.md
! 037a0a18739d15a7b061c28dd94b1b6d  gcc/d/dmd/common/bitfields.d
  3628ea219c6c040036b67adfa51494c0  gcc/d/dmd/common/charactertables.d
  6cceed759afed97d547aff75c2c15c79  gcc/d/dmd/common/charactertables.h
  975edc6df7e6175d4dabacf4ae9d4347  gcc/d/dmd/common/file.d
  8ff83d9e9276172a609feb344d4d66a6  gcc/d/dmd/common/identifiertables.d
! 7507056373b7526b5c5e404d0a9b15fe  gcc/d/dmd/common/outbuffer.d
! be5d2a22cd7b54b40de5ce69a5cc4e3e  gcc/d/dmd/common/outbuffer.h
  3477544e923a7b650bb698eb226c8257  gcc/d/dmd/common/smallbuffer.d
  6f057b8810015d334068d7cbbf962353  gcc/d/dmd/compiler.d
  fbb0ae262e4dd1a6040c572e7821dc73  gcc/d/dmd/compiler.h
! a1a559dd0220e4d7ccfb7fc30f58cf41  gcc/d/dmd/cond.d
! 74929b69e4641ec2be9c8da627c6d8e0  gcc/d/dmd/cond.h
! e09e2817f528e498e2afe76c674d9464  gcc/d/dmd/constfold.d
! 0cf100b027320fe92c77d033f480aff8  gcc/d/dmd/cparse.d
  cb8ca96ec048cb51fb90613655fea60b  gcc/d/dmd/ctfe.h
! dbc7f47a944225ff8b9ebb7faecf4fe5  gcc/d/dmd/ctfeexpr.d
  e8058c4a1e43bd8181d63ea36242b7aa  gcc/d/dmd/ctorflow.d
! 5b942e14b2c08f4e8a1a0c162d11a55d  gcc/d/dmd/cxxfrontend.d
! 3a83643e1fe8bbb21cfe6ce5368545fb  gcc/d/dmd/dcast.d
! 43d7fecf6deb021aa24d8432c93c46dd  gcc/d/dmd/dclass.d
! a48a4ee2cd3540e5c77ea306a2d3846b  gcc/d/dmd/declaration.d
! 24d816a785cadcf068f576433f7a84de  gcc/d/dmd/declaration.h
! 56970f8125d1808817a082af7c0b9f9c  gcc/d/dmd/delegatize.d
! 0ce7e1188ca76c29c36c950566d8d73f  gcc/d/dmd/denum.d
  b7652028ee382a4aaecb375c91e4977e  gcc/d/dmd/deps.d
! e709d6a28beb11f8c651582f70acb0f6  gcc/d/dmd/dimport.d
! 2de665e69f77072b66d454a25089fe1c  gcc/d/dmd/dinterpret.d
  b3d304f752e7ec702c1dd074f2b48ef7  gcc/d/dmd/dmacro.d
! b2b026993f2da0b3e9e7f6290fc8bcb6  gcc/d/dmd/dmodule.d
  2be8ff7f27948129a43b303b576d07ce  gcc/d/dmd/doc.d
  195f1b30a72207fedc96bc6e1f7e659d  gcc/d/dmd/doc.h
! 531f0b0dc26d5fa766c1a6ad8fd5c6a1  gcc/d/dmd/dscope.d
! 15e39c85ba0ade700511655050de5a21  gcc/d/dmd/dstruct.d
! eb0aeb1f0ede07f12adcc05cd6cf0744  gcc/d/dmd/dsymbol.d
! ca1a08093ef4a65eb384cd88cc4f8fca  gcc/d/dmd/dsymbol.h
! 73142db8d99a598b158f5124d7cfe32e  gcc/d/dmd/dsymbolsem.d
! e2c508484c40d69a3987f1fdb57bfe37  gcc/d/dmd/dtemplate.d
! 096134456f999372823467d453c441b6  gcc/d/dmd/dtoh.d
! 9b51e5c381ea385410b2e7d3a2b7d7e1  gcc/d/dmd/dversion.d
  48b7e8ef8c8fb8f90bf8f5c0109396ba  gcc/d/dmd/entity.d
! ff052580ded9445c92fd8a55b6690c37  gcc/d/dmd/enum.h
! ec4304aa83bc81704d89b6a14d71673b  gcc/d/dmd/enumsem.d
  99564ec2089202a4a13cabcb17caecbb  gcc/d/dmd/errors.d
  c11c5cfd4fdd11b63a4352df36a9ef5f  gcc/d/dmd/errors.h
  7e088d325b6d26d2f38488fa13bac5e6  gcc/d/dmd/errorsink.d
! f438269b47c2d3efda8470c29ab8ed29  gcc/d/dmd/escape.d
! 9da8f80dd8307a5dfb834dcf6cc54456  gcc/d/dmd/expression.d
! a3dce4bb1f49cc3ab05a60dffee4296e  gcc/d/dmd/expression.h
! 8ecfd89b60aa46ad66146d3fcdbd73b6  gcc/d/dmd/expressionsem.d
! be033e6fad53a08d4db9763e381f7ab9  gcc/d/dmd/file_manager.d
! b350694b946368a7b829819a884d2256  gcc/d/dmd/func.d
! 367d03c9aaa2264acc9c9a79333fc77c  gcc/d/dmd/funcsem.d
! 8f5471686a185426111fe7bad5e7c16f  gcc/d/dmd/globals.d
! 1aff601b9d844aa7c7f172e0326e0a5c  gcc/d/dmd/globals.h
! 2d82a89e8ef7c65cc95cf88a6cf932e9  gcc/d/dmd/gluelayer.d
! bb5ac9d0411e4dcec791ec353f20dd92  gcc/d/dmd/hdrgen.d
  28b2f516151b8a169e2ddc3380136d36  gcc/d/dmd/hdrgen.h
! 9a798c0a26c7a5dc788fe64bb4a10c2f  gcc/d/dmd/iasm.d
! 3f0d9e5dd9097f9ac6ae960d24e6fdc4  gcc/d/dmd/iasmgcc.d
! 39a2594895da0df639a53a9ce8e212d2  gcc/d/dmd/id.d
  b9968103c21e7625be8785b7233d5458  gcc/d/dmd/id.h
! 85b6e19f3d843166d17225762d1f9551  gcc/d/dmd/identifier.d
  361dab90a974e3a1568338b6e038361a  gcc/d/dmd/identifier.h
  69d47c63cbd0c5a1755dc0d9ce0e0f43  gcc/d/dmd/impcnvtab.d
! 9ed00161498e0e88fe43a745daa5ba0b  gcc/d/dmd/imphint.d
! aa787e5b252ffd6599d42b4396eb5f85  gcc/d/dmd/import.h
! ff3aae9ccc633b83b935d92fbc6e64b5  gcc/d/dmd/importc.d
  ebaa8569b51ce450bf547c517fa32112  gcc/d/dmd/init.d
  b1a67469ba80a1b41c849d88c1b56076  gcc/d/dmd/init.h
! 08b5c1f81e2466fec59938b82fde35f0  gcc/d/dmd/initsem.d
  ff633e312d7cee2d4d876ad633695f1a  gcc/d/dmd/inline.d
  cca417e92c8a4a90d788db454961363d  gcc/d/dmd/intrange.d
  5a6abdcc965745ca7057547bcd91f2dd  gcc/d/dmd/json.d
  987273b221dd2deeb71b6c3186560a57  gcc/d/dmd/json.h
! 5fc447f9b7821d4a97a41a33a9f30857  gcc/d/dmd/lambdacomp.d
! 2ef9ff81b5bfe38823f36e884bc4a705  gcc/d/dmd/lexer.d
! 39a9c1637884040efe49ada4620a6201  gcc/d/dmd/location.d
  28fa018da64572c2e2dc65eb4df10f79  gcc/d/dmd/mangle.h
  435a784d47452f93ee9b3bf600bfa6c8  gcc/d/dmd/mangle/basic.d
! ce74443c05b827b691522d0f218d7e75  gcc/d/dmd/mangle/cpp.d
! e7dcc9989eafae433d0f8702e4dc9d18  gcc/d/dmd/mangle/package.d
! 36c628e36853d4fe1cb6688ba8e28e74  gcc/d/dmd/module.h
! ba24c35b38b66fc3a7dd97153ba75ee7  gcc/d/dmd/mtype.d
! f51b18fe3e0bfc9473eb73697c1b3217  gcc/d/dmd/mtype.h
! f0b76ef08e13c32744e26b71b0149f21  gcc/d/dmd/mustuse.d
! c301fa7382b518a2c84dc5e3ab6d7e0e  gcc/d/dmd/nogc.d
! 1037fb3845c07e23d5bf86d6dcd9b2a4  gcc/d/dmd/nspace.d
! 05fc90e8a6483addc0deab1cc270da9d  gcc/d/dmd/nspace.h
! a16bcb156b728cd5ef64bbb2d71e6ac6  gcc/d/dmd/ob.d
! 11d29276ab54409a37e4600b49b42681  gcc/d/dmd/objc.d
  3d6c6139ccbadbe77a2bbcc1ae115744  gcc/d/dmd/objc.h
! 70ca32795af16f10e3965ee138dcec7a  gcc/d/dmd/opover.d
! 14cdae4c4c5b15d21b4d2f7a83328620  gcc/d/dmd/optimize.d
! 3d71db68a6ca472193f2d715125efe59  gcc/d/dmd/parse.d
  80f0858e0622b90b499915c0ba12f30c  gcc/d/dmd/pragmasem.d
  af8f146f317e2645be528c4cd0c2a2c8  gcc/d/dmd/printast.d
  f38789894c6b0b28bedba3bb9ec03010  gcc/d/dmd/res/default_ddoc_theme.ddoc
  04f57d64eeeaa73285101503465b193b  gcc/d/dmd/root/README.md
  7016ea479a4606b18f1325d8cb8b8dd4  gcc/d/dmd/root/aav.d
! d172a60dd5f3fb0b9d284cd995ca5250  gcc/d/dmd/root/array.d
  3a41bdad676b84caeb898e9ad930e5f3  gcc/d/dmd/root/array.h
  0fa1ced8009674df801797bfc9bad57a  gcc/d/dmd/root/bitarray.d
  c4ef4ae6beb95af2dac84081c2254eb4  gcc/d/dmd/root/bitarray.h
--- 5798,5928 ----
  0cbefb1fe5798619dd31fbc791502b11  gcc/d/d-target.h
  96ebb03b303e0c71e962dea84e5154e5  gcc/d/d-tree.def
  02cdbdf57638633e0d58f820bcf9fc7f  gcc/d/d-tree.h
! 0c43e8bd64df294f87a9fc0dc34a8b8c  gcc/d/decl.cc
! 246c09f9f74bea91c8087ac3a6dc2d25  gcc/d/dmd/MERGE
! a49fe241b8f5613c02449448de72e45b  gcc/d/dmd/README.md
! c4998964d29d4f54378a463f3278b604  gcc/d/dmd/VERSION
! 38aadc65e68d4e75b77165f181b78cc5  gcc/d/dmd/access.d
! 1669ac25814e8b48213c679ff7ba8372  gcc/d/dmd/aggregate.d
! 597144cd639019aef8d753ea4ce7c304  gcc/d/dmd/aggregate.h
  e944b3cc5977f3146f04cacf8649d8c0  gcc/d/dmd/aliasthis.d
  21422b359d959535fbad9bf3f51f180b  gcc/d/dmd/aliasthis.h
! 3223b63dea4d7f561a03159288ae9e7c  gcc/d/dmd/arrayop.d
! 358e6e9dc1ecd2c86a7aae08dd3aa396  gcc/d/dmd/arraytypes.d
! 65bee38915358909d57f9d907f25049b  gcc/d/dmd/arraytypes.h
  01cbde9d907bb77b44dbe04be21a6f71  gcc/d/dmd/ast_node.d
  70f509253981e582b4624b0083ff0168  gcc/d/dmd/ast_node.h
  57cb6c7031a80421f88153e98afe31f3  gcc/d/dmd/astcodegen.d
! 46e2c9f64c6194c022664e7c7534d3ec  gcc/d/dmd/astenums.d
! 11ba25c0ec007dc3557596d4f00182fe  gcc/d/dmd/attrib.d
! 5ea6f705780bed876b445e09d8052e18  gcc/d/dmd/attrib.h
  943555853b7c59e093cd477cd9794ea8  gcc/d/dmd/attribsem.d
  a09656153939f703358bc0a6c41ef21a  gcc/d/dmd/blockexit.d
  e4224ccaecb14d942c71d31bef20d78c  gcc/d/dmd/boostlicense.txt
  ffbb2d95e81b841ff7bac85a068c0112  gcc/d/dmd/builtin.d
! 2f7de6673e57e3265d77fabf5c6f6f83  gcc/d/dmd/canthrow.d
  f06dcabf07ca33abd8042db6230fb74d  gcc/d/dmd/chkformat.d
! 6ea1c12bcf71e2d03a559a8bb98b393e  gcc/d/dmd/clone.d
  a439029b15d096cc69638a68c99a808b  gcc/d/dmd/common/README.md
! 130ca8ebce5898b9d08a0931bc114651  gcc/d/dmd/common/bitfields.d
  3628ea219c6c040036b67adfa51494c0  gcc/d/dmd/common/charactertables.d
  6cceed759afed97d547aff75c2c15c79  gcc/d/dmd/common/charactertables.h
  975edc6df7e6175d4dabacf4ae9d4347  gcc/d/dmd/common/file.d
  8ff83d9e9276172a609feb344d4d66a6  gcc/d/dmd/common/identifiertables.d
! b78e48bcd127669df98a0d76f4164456  gcc/d/dmd/common/outbuffer.d
! 293347c6b9d7527810fa8f5be99ef420  gcc/d/dmd/common/outbuffer.h
  3477544e923a7b650bb698eb226c8257  gcc/d/dmd/common/smallbuffer.d
  6f057b8810015d334068d7cbbf962353  gcc/d/dmd/compiler.d
  fbb0ae262e4dd1a6040c572e7821dc73  gcc/d/dmd/compiler.h
! b242aa2b07ba84c6d8c1d04fe9282917  gcc/d/dmd/cond.d
! fbec442dc6d3871213b7cbbf71d36f22  gcc/d/dmd/cond.h
! e85d84b669948f180e0bc5c8c38de562  gcc/d/dmd/constfold.d
! 19ec2ff301236e4cf5a20cdeba944f75  gcc/d/dmd/cparse.d
  cb8ca96ec048cb51fb90613655fea60b  gcc/d/dmd/ctfe.h
! 9fe1ccdcb05b602bf7a59d0ffcdcbc18  gcc/d/dmd/ctfeexpr.d
  e8058c4a1e43bd8181d63ea36242b7aa  gcc/d/dmd/ctorflow.d
! 7a25cf2f6e3a6ee4b7922e51f8b798f4  gcc/d/dmd/cxxfrontend.d
! 7d356e4ad519d6c051596e87fc76332f  gcc/d/dmd/dcast.d
! 3c9c6b444c5f9f08aff3ed9135f2fdfe  gcc/d/dmd/dclass.d
! 68d5151970acb4aafca90735c91a6e73  gcc/d/dmd/declaration.d
! 861803159a512566caec94c0de24e700  gcc/d/dmd/declaration.h
! a9c8acfcb034fbaac8a873df2b4c11bc  gcc/d/dmd/delegatize.d
! 078a5242dea7835b1a02e6fd2ec520ea  gcc/d/dmd/denum.d
  b7652028ee382a4aaecb375c91e4977e  gcc/d/dmd/deps.d
! aea607afc97eacc73af0ce60e5e19d0d  gcc/d/dmd/dimport.d
! a58640b111d32cecee136ad5f1e8f651  gcc/d/dmd/dinterpret.d
  b3d304f752e7ec702c1dd074f2b48ef7  gcc/d/dmd/dmacro.d
! bba1f1b7dd8779836f494fd94fb03f1f  gcc/d/dmd/dmodule.d
  2be8ff7f27948129a43b303b576d07ce  gcc/d/dmd/doc.d
  195f1b30a72207fedc96bc6e1f7e659d  gcc/d/dmd/doc.h
! 7259a9d0c0650834e46f31781d8bb8fc  gcc/d/dmd/dscope.d
! 0b8b3bdb7317061879c1a4f32b867970  gcc/d/dmd/dstruct.d
! bc15ecb5016625ff56cbb22ad856870d  gcc/d/dmd/dsymbol.d
! 9f16c7a658b93a4a515ef54cac444094  gcc/d/dmd/dsymbol.h
! 9f54c9673d99f9f850fcca125731984b  gcc/d/dmd/dsymbolsem.d
! 676ea5dc50a877d781cb9ef2197f843a  gcc/d/dmd/dtemplate.d
! 4662835a77551548d96af4e8c6f32c96  gcc/d/dmd/dtoh.d
! a8cd917e0d7faf286a9a965402c6f6cb  gcc/d/dmd/dversion.d
  48b7e8ef8c8fb8f90bf8f5c0109396ba  gcc/d/dmd/entity.d
! 92fab10b8f2516eb309ace256afcd22c  gcc/d/dmd/enum.h
! 04845faf9b1e5a40f4f5123c95bd73bf  gcc/d/dmd/enumsem.d
  99564ec2089202a4a13cabcb17caecbb  gcc/d/dmd/errors.d
  c11c5cfd4fdd11b63a4352df36a9ef5f  gcc/d/dmd/errors.h
  7e088d325b6d26d2f38488fa13bac5e6  gcc/d/dmd/errorsink.d
! 84824249f04577b3a8072330432dc134  gcc/d/dmd/escape.d
! f0a8d1856255921f64b3f029eb79f2fc  gcc/d/dmd/expression.d
! 9b76b3150aa7b38711c1b3df74124ec1  gcc/d/dmd/expression.h
! df911a8311386ce2107fe58ae1d320dc  gcc/d/dmd/expressionsem.d
! f1ee03e3a2ecedb262ec2acb00cec1fe  gcc/d/dmd/file_manager.d
! 0980ef0301e1eec417dc8827bd7344e3  gcc/d/dmd/func.d
! 2c5c14775dcce5e5866366e6771c0b9b  gcc/d/dmd/funcsem.d
! 36673977685d141f23bd05311dc2d5a3  gcc/d/dmd/globals.d
! 7f9fcb37b827772500f71fd0ec050981  gcc/d/dmd/globals.h
! d89269382d66970dba370032a5d5a6e2  gcc/d/dmd/hdrgen.d
  28b2f516151b8a169e2ddc3380136d36  gcc/d/dmd/hdrgen.h
! ebc2b8792faa7073835e2e68286431a5  gcc/d/dmd/iasm/gcc.d
! 1f224789b07bf27944f15968dcca62ae  gcc/d/dmd/iasm/package.d
! 324aa0598806cb981d6308aa0c6ae7e4  gcc/d/dmd/id.d
  b9968103c21e7625be8785b7233d5458  gcc/d/dmd/id.h
! c5093b16631a844ee943983d8f1cc8b9  gcc/d/dmd/identifier.d
  361dab90a974e3a1568338b6e038361a  gcc/d/dmd/identifier.h
  69d47c63cbd0c5a1755dc0d9ce0e0f43  gcc/d/dmd/impcnvtab.d
! 8f78c7ba10cb7e92ecb58d48be12612e  gcc/d/dmd/imphint.d
! 98480099777c590dc0216776cb99ef79  gcc/d/dmd/import.h
! 1ba1aa9dd17dd99f413777156b84140d  gcc/d/dmd/importc.d
  ebaa8569b51ce450bf547c517fa32112  gcc/d/dmd/init.d
  b1a67469ba80a1b41c849d88c1b56076  gcc/d/dmd/init.h
! 3e74863433be4a61bd4ade6bf432ec1b  gcc/d/dmd/initsem.d
  ff633e312d7cee2d4d876ad633695f1a  gcc/d/dmd/inline.d
  cca417e92c8a4a90d788db454961363d  gcc/d/dmd/intrange.d
  5a6abdcc965745ca7057547bcd91f2dd  gcc/d/dmd/json.d
  987273b221dd2deeb71b6c3186560a57  gcc/d/dmd/json.h
! 98262b2f926f919522306e7ac418ce8c  gcc/d/dmd/lambdacomp.d
! 8856eff0f2e897fc65bcb3f3ed16c88f  gcc/d/dmd/lexer.d
! bbe450c0d87dbb29796015b7e2862068  gcc/d/dmd/location.d
  28fa018da64572c2e2dc65eb4df10f79  gcc/d/dmd/mangle.h
  435a784d47452f93ee9b3bf600bfa6c8  gcc/d/dmd/mangle/basic.d
! a25a5c3e565d956209a70ab04aad843b  gcc/d/dmd/mangle/cpp.d
! 22b7f26df845c7c567b222c4e56dda53  gcc/d/dmd/mangle/package.d
! 2518f255e98a5e181f4e6ccaf111a096  gcc/d/dmd/module.h
! 5797eb414b20d21c1c58e949e885f578  gcc/d/dmd/mtype.d
! f6843b219d0751e422985de034202da2  gcc/d/dmd/mtype.h
! 29993a83d3593416c9e5a8476b93c34f  gcc/d/dmd/mustuse.d
! 3c248bcd7bedcf1d5d002506fc6893cf  gcc/d/dmd/nogc.d
! f484912afd45dd9a420a7e2942c609c2  gcc/d/dmd/nspace.d
! 9fd22735ec5defc239c823bf4cc7dafc  gcc/d/dmd/nspace.h
! 5869587fe71c5844e272bb3d342fca3b  gcc/d/dmd/ob.d
! 376f75da96b05a6baebff97b897f60c1  gcc/d/dmd/objc.d
  3d6c6139ccbadbe77a2bbcc1ae115744  gcc/d/dmd/objc.h
! f05896a75756b05966d682c32bf2ee52  gcc/d/dmd/opover.d
! d0c9822528f749d4ce9c48db2a318b4c  gcc/d/dmd/optimize.d
! 37d052bc4000343f32ef23e1b2872224  gcc/d/dmd/parse.d
  80f0858e0622b90b499915c0ba12f30c  gcc/d/dmd/pragmasem.d
  af8f146f317e2645be528c4cd0c2a2c8  gcc/d/dmd/printast.d
  f38789894c6b0b28bedba3bb9ec03010  gcc/d/dmd/res/default_ddoc_theme.ddoc
  04f57d64eeeaa73285101503465b193b  gcc/d/dmd/root/README.md
  7016ea479a4606b18f1325d8cb8b8dd4  gcc/d/dmd/root/aav.d
! 856889c149983edb6838d9eb6fb92905  gcc/d/dmd/root/array.d
  3a41bdad676b84caeb898e9ad930e5f3  gcc/d/dmd/root/array.h
  0fa1ced8009674df801797bfc9bad57a  gcc/d/dmd/root/bitarray.d
  c4ef4ae6beb95af2dac84081c2254eb4  gcc/d/dmd/root/bitarray.h
*************** a16a8a0a72db5419fc4f65cf1e7296f6  gcc/d/
*** 5934,5942 ****
  90d7b81f18ef716664525dda431ae045  gcc/d/dmd/root/dcompat.h
  7c536a32ccf522d80e0058c3ef4e8b29  gcc/d/dmd/root/dsystem.h
  51237492c7a6682d3a0fd602a817f605  gcc/d/dmd/root/file.d
! a5933a7c4e4d960242e3c5fdbe722d40  gcc/d/dmd/root/filename.d
  c4f196857093b4920d7e76e2dccfce55  gcc/d/dmd/root/filename.h
! 696a66f062eee480ed2762889c5c4776  gcc/d/dmd/root/hash.d
  b9c373949801135e1bddbde0e56df358  gcc/d/dmd/root/longdouble.d
  00323e5d7995f24455211f287db2933b  gcc/d/dmd/root/optional.d
  18757675f78f2f0ef44cf35d70708a95  gcc/d/dmd/root/optional.h
--- 5933,5941 ----
  90d7b81f18ef716664525dda431ae045  gcc/d/dmd/root/dcompat.h
  7c536a32ccf522d80e0058c3ef4e8b29  gcc/d/dmd/root/dsystem.h
  51237492c7a6682d3a0fd602a817f605  gcc/d/dmd/root/file.d
! 3be0f2f6af9b9edf403a8b3d92607ca1  gcc/d/dmd/root/filename.d
  c4f196857093b4920d7e76e2dccfce55  gcc/d/dmd/root/filename.h
! 9e4c2b55c18d8b70866f75f7851e7392  gcc/d/dmd/root/hash.d
  b9c373949801135e1bddbde0e56df358  gcc/d/dmd/root/longdouble.d
  00323e5d7995f24455211f287db2933b  gcc/d/dmd/root/optional.d
  18757675f78f2f0ef44cf35d70708a95  gcc/d/dmd/root/optional.h
*************** b9117650575c4354e53bc2c692c5cfe1  gcc/d/
*** 5951,6006 ****
  18265bb7937a4657c9b8dcca3a08557f  gcc/d/dmd/root/utf.d
  4aa5e14d4aef6717daa6346b1e22978b  gcc/d/dmd/rootobject.d
  35bb066b88f98925eafe80f5ce892847  gcc/d/dmd/rootobject.h
! c6e4bbbfe757057b64a5745846f8ca67  gcc/d/dmd/safe.d
! 8e526100e7bf3490d6aae3b27cd6c64a  gcc/d/dmd/scope.h
! 0f370f208efa374833d9529d5b97e663  gcc/d/dmd/semantic2.d
! 0ec93e93ca84e6d8e6d1782eadeeb3ea  gcc/d/dmd/semantic3.d
! 4f24eea98190d73e27db8d6d7b019ebe  gcc/d/dmd/sideeffect.d
! 674263f7e7411b6eed907302b3d46d4d  gcc/d/dmd/statement.d
! edb6d8223f05ab2864b358638d06ed9a  gcc/d/dmd/statement.h
! 4f9bc15277b3a727096b6b4f22850af7  gcc/d/dmd/statementsem.d
  a7e9cf50e8838033012ebcec68f57592  gcc/d/dmd/staticassert.d
  999cc27e94e3906d8ed37c8c3c20a7fe  gcc/d/dmd/staticassert.h
  134f187402100d2906a774b8ab3427b7  gcc/d/dmd/staticcond.d
  851920b00561bdde300cee788d9492cd  gcc/d/dmd/stmtstate.d
! 7c3c024842bc047e8b7fb73a16b67c2b  gcc/d/dmd/target.d
  de14423883f55275283db320ae89c3e8  gcc/d/dmd/target.h
! 7444c8d8cd3c5fce2d40f15d8dd5bbe8  gcc/d/dmd/template.h
  f8585ff2e05dec64066829cf36679520  gcc/d/dmd/templateparamsem.d
! 4192fc208cd0cc51e50d47b5f0b83c95  gcc/d/dmd/templatesem.d
  93c08d197b7750e5b8801132db8b7fe4  gcc/d/dmd/timetrace.d
! 77d0ae6e05d855d690e9fb765f09e4ee  gcc/d/dmd/tokens.d
  bc4b3569ee8f00b59569280216e7b102  gcc/d/dmd/tokens.h
! f9b656c3757577132b122ea27cd3a2a1  gcc/d/dmd/traits.d
! e9e71a20188e2dffecc2608e1b4a2e64  gcc/d/dmd/typesem.d
! 025f593bbc65910e06f0e09de2380d1f  gcc/d/dmd/typinf.d
  f372f14ecea0c837d34ff099f7aef870  gcc/d/dmd/typinf.h
  af456a0015267d13132f5795b031b8c6  gcc/d/dmd/utils.d
  f0862f7d5405cfe64d4c8d0d7618be1b  gcc/d/dmd/version.h
  fef5dd05c8434b3837dae89255d97dca  gcc/d/dmd/visitor.h
! 9b26582c9e4a3532010a8d7ae6768aeb  gcc/d/dmd/visitor/foreachvar.d
  a3cd575b3088ab06aa23c81c93ace7e7  gcc/d/dmd/visitor/package.d
  5b977a7d574f832916a0653671ca2073  gcc/d/dmd/visitor/parsetime.d
  3db1547c5541dea5b6b7b3580f33c117  gcc/d/dmd/visitor/permissive.d
! 0d315416551f6b73f1ad743aac72797f  gcc/d/dmd/visitor/postorder.d
  9b22040efac930e873d2a2565a2867da  gcc/d/dmd/visitor/statement_rewrite_walker.d
  1cbd9c1c0ec261f10e9d9443fc16f987  gcc/d/dmd/visitor/transitive.d
! 548a0a92b2ae7c08cd6c442657f3e96a  gcc/d/expr.cc
  ae98ef7253f51b9c2283da08c3df60b1  gcc/d/gdc.texi
  fe75e0460d453b2242165e5b49a6f5dc  gcc/d/implement-d.texi
! 592f60bfad2e16232bee84341eff19d0  gcc/d/imports.cc
  f3f7af7813097c4eb0e00abeaa1c93d9  gcc/d/intrinsics.cc
  64cd87579fb52ccd072a1358f13f2b97  gcc/d/intrinsics.def
  b57c47a44a7c09a7b62838a41eb3723f  gcc/d/lang-specs.h
  ac98f1dd54a2046a375bb109b247c2e9  gcc/d/lang.opt
  47e9096961d9bb77ddbb6c4623d2cc8d  gcc/d/lang.opt.urls
  a84c5c8dc5dd34c74b6c874a99718559  gcc/d/longdouble.h
! 34b56594cf99c8440b6943bd717a4067  gcc/d/modules.cc
  57d0e5ed4dbe3f57708cbc58bfb514a6  gcc/d/runtime.cc
! 2cb7841f4101ede23f6f9a87d4b3601d  gcc/d/runtime.def
! 91e040702241ed2cf64d06e7af0afa46  gcc/d/toir.cc
! fd3b675ce668cc57645ae178a2e347b2  gcc/d/typeinfo.cc
! 281dae422063b8bb3072876f139761f3  gcc/d/types.cc
  97d491fba0dd57fe8e4fb67f2c7f8b88  gcc/data-streamer-in.cc
  d1658e0b3a01487789371ee847def1b2  gcc/data-streamer-out.cc
  63245724941a35dfab045b09f88d3ab4  gcc/data-streamer.cc
--- 5950,6005 ----
  18265bb7937a4657c9b8dcca3a08557f  gcc/d/dmd/root/utf.d
  4aa5e14d4aef6717daa6346b1e22978b  gcc/d/dmd/rootobject.d
  35bb066b88f98925eafe80f5ce892847  gcc/d/dmd/rootobject.h
! b38eca3b8c5173ead86754f138858f65  gcc/d/dmd/safe.d
! 6cb1695d9cf3f04d0b1e1085c5f2d9f2  gcc/d/dmd/scope.h
! 95333c46e6a7916562d3375de1e2d528  gcc/d/dmd/semantic2.d
! f910700f45aa435cc63b7131a8a96cbe  gcc/d/dmd/semantic3.d
! 564c9aa01e32272ea315e2123fe1376d  gcc/d/dmd/sideeffect.d
! 7f525aab9fca4912bad3abf43c7b114e  gcc/d/dmd/statement.d
! 8e7e95803a6b747d0e046c94e11699e7  gcc/d/dmd/statement.h
! 3d5ee2be7178b94403ace7f517408b48  gcc/d/dmd/statementsem.d
  a7e9cf50e8838033012ebcec68f57592  gcc/d/dmd/staticassert.d
  999cc27e94e3906d8ed37c8c3c20a7fe  gcc/d/dmd/staticassert.h
  134f187402100d2906a774b8ab3427b7  gcc/d/dmd/staticcond.d
  851920b00561bdde300cee788d9492cd  gcc/d/dmd/stmtstate.d
! 7b7435ff2e95d0a2c3426dd35f4b4980  gcc/d/dmd/target.d
  de14423883f55275283db320ae89c3e8  gcc/d/dmd/target.h
! 17415a01e2dd7a4abcc9af86c6bae13c  gcc/d/dmd/template.h
  f8585ff2e05dec64066829cf36679520  gcc/d/dmd/templateparamsem.d
! 98f2748faeccbcc723d7126220be72f7  gcc/d/dmd/templatesem.d
  93c08d197b7750e5b8801132db8b7fe4  gcc/d/dmd/timetrace.d
! 6790d7d97ac383f2fe69e7a1e24defae  gcc/d/dmd/tokens.d
  bc4b3569ee8f00b59569280216e7b102  gcc/d/dmd/tokens.h
! 613f4b298cb8c767fcd103fd6a599bb4  gcc/d/dmd/traits.d
! 54de664b099dfcc8544cac0f4d7ea527  gcc/d/dmd/typesem.d
! a89b84fb0a39f583489d122186c58691  gcc/d/dmd/typinf.d
  f372f14ecea0c837d34ff099f7aef870  gcc/d/dmd/typinf.h
  af456a0015267d13132f5795b031b8c6  gcc/d/dmd/utils.d
  f0862f7d5405cfe64d4c8d0d7618be1b  gcc/d/dmd/version.h
  fef5dd05c8434b3837dae89255d97dca  gcc/d/dmd/visitor.h
! 0b1d6fa0933e322c5fbf8986f95bff37  gcc/d/dmd/visitor/foreachvar.d
  a3cd575b3088ab06aa23c81c93ace7e7  gcc/d/dmd/visitor/package.d
  5b977a7d574f832916a0653671ca2073  gcc/d/dmd/visitor/parsetime.d
  3db1547c5541dea5b6b7b3580f33c117  gcc/d/dmd/visitor/permissive.d
! 9f4b31afc643d000331d393fbdc8bff3  gcc/d/dmd/visitor/postorder.d
  9b22040efac930e873d2a2565a2867da  gcc/d/dmd/visitor/statement_rewrite_walker.d
  1cbd9c1c0ec261f10e9d9443fc16f987  gcc/d/dmd/visitor/transitive.d
! e0a965798a80f5fcc52dc0decb83063a  gcc/d/expr.cc
  ae98ef7253f51b9c2283da08c3df60b1  gcc/d/gdc.texi
  fe75e0460d453b2242165e5b49a6f5dc  gcc/d/implement-d.texi
! 4acffd3a865ffe3456f9be4cb0fd0a51  gcc/d/imports.cc
  f3f7af7813097c4eb0e00abeaa1c93d9  gcc/d/intrinsics.cc
  64cd87579fb52ccd072a1358f13f2b97  gcc/d/intrinsics.def
  b57c47a44a7c09a7b62838a41eb3723f  gcc/d/lang-specs.h
  ac98f1dd54a2046a375bb109b247c2e9  gcc/d/lang.opt
  47e9096961d9bb77ddbb6c4623d2cc8d  gcc/d/lang.opt.urls
  a84c5c8dc5dd34c74b6c874a99718559  gcc/d/longdouble.h
! 315914960c100ee43441bdcb728d419c  gcc/d/modules.cc
  57d0e5ed4dbe3f57708cbc58bfb514a6  gcc/d/runtime.cc
! e1c0ee6456e9c0e34c3f6e43544b19b1  gcc/d/runtime.def
! e718440c7bcce04d4ab5bf458c766e04  gcc/d/toir.cc
! 9dc91fde485274c7e0ed4032120ebcd5  gcc/d/typeinfo.cc
! e319d2fdd9d192594ed7e3994b7a8594  gcc/d/types.cc
  97d491fba0dd57fe8e4fb67f2c7f8b88  gcc/data-streamer-in.cc
  d1658e0b3a01487789371ee847def1b2  gcc/data-streamer-out.cc
  63245724941a35dfab045b09f88d3ab4  gcc/data-streamer.cc
*************** b8034736dae3f6d654eba555f64e1c26  gcc/di
*** 6076,6082 ****
  009ecd89188fdd51b7313ff581575aa3  gcc/diagnostics/paths-output.cc
  35957f691aa90b1f7b9f489e7da9e720  gcc/diagnostics/paths.cc
  91f77747402437b068da1e7be934adec  gcc/diagnostics/paths.h
! 2479027b9f98ea12bda061b9e46be43c  gcc/diagnostics/sarif-sink.cc
  2c419fdad8de985a25f5fe60bd707c38  gcc/diagnostics/sarif-sink.h
  04b71f2b22c1f09aaa33b8832fc5272a  gcc/diagnostics/selftest-context.cc
  3dca4c2a57fd5d49cbeeff9b7242c57a  gcc/diagnostics/selftest-context.h
--- 6075,6081 ----
  009ecd89188fdd51b7313ff581575aa3  gcc/diagnostics/paths-output.cc
  35957f691aa90b1f7b9f489e7da9e720  gcc/diagnostics/paths.cc
  91f77747402437b068da1e7be934adec  gcc/diagnostics/paths.h
! 461f01e3d7507e51625fcceac309c961  gcc/diagnostics/sarif-sink.cc
  2c419fdad8de985a25f5fe60bd707c38  gcc/diagnostics/sarif-sink.h
  04b71f2b22c1f09aaa33b8832fc5272a  gcc/diagnostics/selftest-context.cc
  3dca4c2a57fd5d49cbeeff9b7242c57a  gcc/diagnostics/selftest-context.h
*************** ee65c9e3e7c3fb1fd0128c23f4130e51  gcc/do
*** 6112,6118 ****
  301ed7e567732d1f0d5899a624068bdd  gcc/doc/cppinternals.texi
  b0cd5e1000a4e1467a9880e1d1f46201  gcc/doc/cppopts.texi
  d8b2becdc7d9c570f256e19e1b1ac4f1  gcc/doc/cppwarnopts.texi
! 7ac3d1e8a038e626920fc57d38067ffc  gcc/doc/extend.texi
  483a7b956113f0370528460e842ff7b0  gcc/doc/fragments.texi
  7fb1e4199b2e70228fda69b8065d83c4  gcc/doc/frontends.texi
  23b032ef72e5208469d1a736f460b6a1  gcc/doc/gcc.texi
--- 6111,6117 ----
  301ed7e567732d1f0d5899a624068bdd  gcc/doc/cppinternals.texi
  b0cd5e1000a4e1467a9880e1d1f46201  gcc/doc/cppopts.texi
  d8b2becdc7d9c570f256e19e1b1ac4f1  gcc/doc/cppwarnopts.texi
! 616b16564e9ace867bf3c41a6aa75360  gcc/doc/extend.texi
  483a7b956113f0370528460e842ff7b0  gcc/doc/fragments.texi
  7fb1e4199b2e70228fda69b8065d83c4  gcc/doc/frontends.texi
  23b032ef72e5208469d1a736f460b6a1  gcc/doc/gcc.texi
*************** f47d236d7ee7e48319a13461771035d6  gcc/do
*** 6134,6142 ****
  37d898a82683588b62cca104098ad182  gcc/doc/include/gcc-common.texi
  95c90bf85d3eab67f348ee3ce0bf4050  gcc/doc/include/gpl_v3.texi
  e9b8122841fbfbbc30fee8ed6613c399  gcc/doc/include/texinfo.tex
! 43a94bf43af0cd42fbd49fef38eb7281  gcc/doc/install.texi
  30a2209eee0a2bed76e2d9ff3bd646f2  gcc/doc/install.texi2html
! 306fe9678c49e4784b9d7d7393a844ef  gcc/doc/invoke.texi
  dd9d4097ebfa9e936c41913343807268  gcc/doc/languages.texi
  46d2bbbd37002bb71569d0b1f27d7a5a  gcc/doc/libgcc.texi
  ef4f00c423089323edef1d3cff31a4a2  gcc/doc/libgdiagnostics/Makefile
--- 6133,6141 ----
  37d898a82683588b62cca104098ad182  gcc/doc/include/gcc-common.texi
  95c90bf85d3eab67f348ee3ce0bf4050  gcc/doc/include/gpl_v3.texi
  e9b8122841fbfbbc30fee8ed6613c399  gcc/doc/include/texinfo.tex
! ea08d2d8f32ef2324985c5220c87a3cd  gcc/doc/install.texi
  30a2209eee0a2bed76e2d9ff3bd646f2  gcc/doc/install.texi2html
! 18d3c2e282c8ddf4f9232b65173060cc  gcc/doc/invoke.texi
  dd9d4097ebfa9e936c41913343807268  gcc/doc/languages.texi
  46d2bbbd37002bb71569d0b1f27d7a5a  gcc/doc/libgcc.texi
  ef4f00c423089323edef1d3cff31a4a2  gcc/doc/libgdiagnostics/Makefile
*************** f7e932ab983b28cd4bef523021fa9eb0  gcc/do
*** 6177,6183 ****
  03d87cf6d30b872ce723a93cd10f4264  gcc/doc/md.texi
  afaf0b9b413500a77920c3963dcd3978  gcc/doc/objc.texi
  79e8babebb4a40553fc011874ac21cbb  gcc/doc/optinfo.texi
! 2d6720735f9a20b4ebd264d3496373d1  gcc/doc/options.texi
  4f849b8e491aa0fa8b80c3cefe9dc5ec  gcc/doc/passes.texi
  e54937e427a2584ac4045286c725fab1  gcc/doc/plugins.texi
  0603ab3940871fa2a55ddbd7c2719eb7  gcc/doc/poly-int.texi
--- 6176,6182 ----
  03d87cf6d30b872ce723a93cd10f4264  gcc/doc/md.texi
  afaf0b9b413500a77920c3963dcd3978  gcc/doc/objc.texi
  79e8babebb4a40553fc011874ac21cbb  gcc/doc/optinfo.texi
! 3abb75ff788f5434702f351bf7a279c9  gcc/doc/options.texi
  4f849b8e491aa0fa8b80c3cefe9dc5ec  gcc/doc/passes.texi
  e54937e427a2584ac4045286c725fab1  gcc/doc/plugins.texi
  0603ab3940871fa2a55ddbd7c2719eb7  gcc/doc/poly-int.texi
*************** d2b53a62ec4e23a8e4cbe16d2843c100  gcc/do
*** 6193,6199 ****
  7e96646cc37dce39721bdc1ebba8e4d9  gcc/doc/tm.texi.in
  61e80fc645225b20d6a7d34c7e7a404b  gcc/doc/tree-ssa.texi
  6b9b6489bc1f2012ba803f2eaaf2d661  gcc/doc/trouble.texi
! 65bdf641eb30b0bb5d62fad59f5f2a08  gcc/doc/ux.texi
  bb1210d252c998d89648c327c54d8c48  gcc/dojump.cc
  06d1775c0518a9eb565928aa8123a666  gcc/dojump.h
  e8379699d9f307d3707c44dc4eb76468  gcc/dominance.cc
--- 6192,6198 ----
  7e96646cc37dce39721bdc1ebba8e4d9  gcc/doc/tm.texi.in
  61e80fc645225b20d6a7d34c7e7a404b  gcc/doc/tree-ssa.texi
  6b9b6489bc1f2012ba803f2eaaf2d661  gcc/doc/trouble.texi
! 83ea8ece47a3447f8da5fddd982c9d29  gcc/doc/ux.texi
  bb1210d252c998d89648c327c54d8c48  gcc/dojump.cc
  06d1775c0518a9eb565928aa8123a666  gcc/dojump.h
  e8379699d9f307d3707c44dc4eb76468  gcc/dominance.cc
*************** df86d4116f050c5e09b21441b286f26c  gcc/dw
*** 6213,6219 ****
  2d9cf6bbe6a4ec143049dcca966ba581  gcc/dwarf2codeview.h
  a6c484f3c915c3d2ca47c185e95fbba4  gcc/dwarf2ctf.cc
  6c4236fa6ead686398b8d5e7f89f8118  gcc/dwarf2ctf.h
! 349885d101640a964118a23e3276abaa  gcc/dwarf2out.cc
  5df3b4a58dc58c2bfafddd393d55496b  gcc/dwarf2out.h
  5f6d1c1c6b68b50c4051ffa41f4aed26  gcc/early-remat.cc
  db4d79959e99b05eb2b5704c5e7c3bcb  gcc/emit-rtl.cc
--- 6212,6218 ----
  2d9cf6bbe6a4ec143049dcca966ba581  gcc/dwarf2codeview.h
  a6c484f3c915c3d2ca47c185e95fbba4  gcc/dwarf2ctf.cc
  6c4236fa6ead686398b8d5e7f89f8118  gcc/dwarf2ctf.h
! c33fa1fd74d806c3561bd42998f4126c  gcc/dwarf2out.cc
  5df3b4a58dc58c2bfafddd393d55496b  gcc/dwarf2out.h
  5f6d1c1c6b68b50c4051ffa41f4aed26  gcc/early-remat.cc
  db4d79959e99b05eb2b5704c5e7c3bcb  gcc/emit-rtl.cc
*************** e3b758ef604b48f000fb865e38253381  gcc/ex
*** 6230,6236 ****
  9542db78094e70fd18442ce8a2b02264  gcc/explow.h
  82a6eed405414fee082896bb6a2bd1c6  gcc/expmed.cc
  2431f17e1f416ef0b9c38b1b975942a4  gcc/expmed.h
! c77110590041bc80265788ebd055a4a5  gcc/expr.cc
  07d490719ee3fa697cd70f3f98183258  gcc/expr.h
  8cca7ee32636f4556dceffe46dc6c948  gcc/ext-dce.cc
  8ca3dbbcb4ffeb7bd2c8f46140869732  gcc/fibonacci_heap.cc
--- 6229,6235 ----
  9542db78094e70fd18442ce8a2b02264  gcc/explow.h
  82a6eed405414fee082896bb6a2bd1c6  gcc/expmed.cc
  2431f17e1f416ef0b9c38b1b975942a4  gcc/expmed.h
! d9f26a926d640b6eac7ead980aef457f  gcc/expr.cc
  07d490719ee3fa697cd70f3f98183258  gcc/expr.h
  8cca7ee32636f4556dceffe46dc6c948  gcc/ext-dce.cc
  8ca3dbbcb4ffeb7bd2c8f46140869732  gcc/fibonacci_heap.cc
*************** e0210f6d49bd9ceab84ba5169fbcfc99  gcc/fi
*** 6239,6255 ****
  f80b38c70a85f9aeae9688b937b028ba  gcc/file-find.h
  9ca41121de6a799cd4d23363ea1c9b0c  gcc/file-prefix-map.cc
  5e60fafc10687b7792c492e27473ed4d  gcc/file-prefix-map.h
! b496da8a4db3486ee4537b0d55944601  gcc/final.cc
  3f5e6ac132421f17c9c8232626731e46  gcc/fixed-value.cc
  1caa253d024b0e3dcf3e6ba5ca8eeab1  gcc/fixed-value.h
  57d536e4a123ac5161bf8eae17154030  gcc/flag-types.h
  85741de0b8ea9e109ee1355d60bfd397  gcc/flags.h
  28f732db1eb82dab6b7ec80c73614d44  gcc/fold-const-call.cc
  0b4405bca4b699887c6a47e1d25b216c  gcc/fold-const-call.h
! ace0b2d15eb6248a41cc2e3bad22b35d  gcc/fold-const.cc
  0ec02a37dbbe9cb267f0ea1263085ed3  gcc/fold-const.h
  764b231c53a63f6a622c187ac0d381d0  gcc/fold-mem-offsets.cc
! cd2063210a8ec8b4661e1378c8c68e5b  gcc/fortran/ChangeLog
  083c53fadafdcf3be46713838a51e36c  gcc/fortran/ChangeLog-2002
  2a4ca18d211fb2603139354fd16398ed  gcc/fortran/ChangeLog-2003
  e7462609ebd0dd7c874e0fc00e2833aa  gcc/fortran/ChangeLog-2004
--- 6238,6254 ----
  f80b38c70a85f9aeae9688b937b028ba  gcc/file-find.h
  9ca41121de6a799cd4d23363ea1c9b0c  gcc/file-prefix-map.cc
  5e60fafc10687b7792c492e27473ed4d  gcc/file-prefix-map.h
! 8c0b2a616de40bb6e8e1b06b0e90c702  gcc/final.cc
  3f5e6ac132421f17c9c8232626731e46  gcc/fixed-value.cc
  1caa253d024b0e3dcf3e6ba5ca8eeab1  gcc/fixed-value.h
  57d536e4a123ac5161bf8eae17154030  gcc/flag-types.h
  85741de0b8ea9e109ee1355d60bfd397  gcc/flags.h
  28f732db1eb82dab6b7ec80c73614d44  gcc/fold-const-call.cc
  0b4405bca4b699887c6a47e1d25b216c  gcc/fold-const-call.h
! 9bf2d6d36106157c80bed68f5cf784fc  gcc/fold-const.cc
  0ec02a37dbbe9cb267f0ea1263085ed3  gcc/fold-const.h
  764b231c53a63f6a622c187ac0d381d0  gcc/fold-mem-offsets.cc
! 80a24a68ace837328d381e07a1ce1fee  gcc/fortran/ChangeLog
  083c53fadafdcf3be46713838a51e36c  gcc/fortran/ChangeLog-2002
  2a4ca18d211fb2603139354fd16398ed  gcc/fortran/ChangeLog-2003
  e7462609ebd0dd7c874e0fc00e2833aa  gcc/fortran/ChangeLog-2004
*************** c38eb0f2f19a6cb4b79be761670131e8  gcc/fo
*** 6278,6284 ****
  181571ce035e2781f9d8141b9163749a  gcc/fortran/Make-lang.in
  bcb129d4d143e6ec42b4ddec1fea30b8  gcc/fortran/arith.cc
  1f3ee645ab25a3d858b555c00c0327ae  gcc/fortran/arith.h
! 050ec8fef64e7238a868c03f6b68aefd  gcc/fortran/array.cc
  bc40e87bca719f86583a020eff2d6a73  gcc/fortran/bbt.cc
  46445812eae3031e15aec7c4fea31772  gcc/fortran/check.cc
  11a823a64183cc8fffbce6e17dca0f76  gcc/fortran/class.cc
--- 6277,6283 ----
  181571ce035e2781f9d8141b9163749a  gcc/fortran/Make-lang.in
  bcb129d4d143e6ec42b4ddec1fea30b8  gcc/fortran/arith.cc
  1f3ee645ab25a3d858b555c00c0327ae  gcc/fortran/arith.h
! b9eb124ac64250ae6b43323a196eb79f  gcc/fortran/array.cc
  bc40e87bca719f86583a020eff2d6a73  gcc/fortran/bbt.cc
  46445812eae3031e15aec7c4fea31772  gcc/fortran/check.cc
  11a823a64183cc8fffbce6e17dca0f76  gcc/fortran/class.cc
*************** edad5176d72953374d67effefef0a605  gcc/fo
*** 6291,6297 ****
  48e7987762051d8cf68633af2633e50f  gcc/fortran/cpp.h
  213bc611adee1d275a412b3ed4886e79  gcc/fortran/data.cc
  ac7321680382b23989a6637e02dfb80e  gcc/fortran/data.h
! 6ea86fd5ac2458add9f2e44a04d14812  gcc/fortran/decl.cc
  26f9d3cd778f806f891b1ae70cad3305  gcc/fortran/dependency.cc
  b66b99368e3cd17573ae64a38e36c1de  gcc/fortran/dependency.h
  fe0fcd93ad74f370b736a7f318964506  gcc/fortran/dump-parse-tree.cc
--- 6290,6296 ----
  48e7987762051d8cf68633af2633e50f  gcc/fortran/cpp.h
  213bc611adee1d275a412b3ed4886e79  gcc/fortran/data.cc
  ac7321680382b23989a6637e02dfb80e  gcc/fortran/data.h
! 4aacf7fc1e395d8a2ebfff5ae3a76818  gcc/fortran/decl.cc
  26f9d3cd778f806f891b1ae70cad3305  gcc/fortran/dependency.cc
  b66b99368e3cd17573ae64a38e36c1de  gcc/fortran/dependency.h
  fe0fcd93ad74f370b736a7f318964506  gcc/fortran/dump-parse-tree.cc
*************** fe0fcd93ad74f370b736a7f318964506  gcc/fo
*** 6301,6308 ****
  d162511ebc8080669ebdf414e36c7d62  gcc/fortran/frontend-passes.cc
  c85c9309a4274609c6ff6466621c90f6  gcc/fortran/gfc-diagnostic.def
  afb07146daad7f36a59c52e053f6772f  gcc/fortran/gfc-internals.texi
! 9539ed55392d39c4c2f2fed2c0834896  gcc/fortran/gfortran.h
! d9a929f27348cdaafaa92a2fa0caa9c8  gcc/fortran/gfortran.texi
  9da0114ccf35340d3035f21f8a0f3325  gcc/fortran/gfortranspec.cc
  e74b62dc22fe7098c12db5035b41ff3a  gcc/fortran/interface.cc
  4793e9c888307d569c02b46f858468a4  gcc/fortran/intrinsic.cc
--- 6300,6307 ----
  d162511ebc8080669ebdf414e36c7d62  gcc/fortran/frontend-passes.cc
  c85c9309a4274609c6ff6466621c90f6  gcc/fortran/gfc-diagnostic.def
  afb07146daad7f36a59c52e053f6772f  gcc/fortran/gfc-internals.texi
! 282f1fe7176631b2c0bfc7aba30c2c3b  gcc/fortran/gfortran.h
! 4b41c64e656ca5096ae5a265ff7b2116  gcc/fortran/gfortran.texi
  9da0114ccf35340d3035f21f8a0f3325  gcc/fortran/gfortranspec.cc
  e74b62dc22fe7098c12db5035b41ff3a  gcc/fortran/interface.cc
  4793e9c888307d569c02b46f858468a4  gcc/fortran/intrinsic.cc
*************** e5c0565c05cf7375c9978273f2e553e7  gcc/fo
*** 6318,6335 ****
  6c8e23a76ef7d1e3480d2026a438a31e  gcc/fortran/lang.opt
  8eb4c394776b2993c2ab25a45606b835  gcc/fortran/lang.opt.urls
  c35102e7caaf40998fe2ead86d2716da  gcc/fortran/libgfortran.h
! 5edc42defe24b51e8d8db3edd2531f28  gcc/fortran/match.cc
  f7735c64af748cdef5caffae58a94749  gcc/fortran/match.h
  bf54232c4c950ed772f4964c4f79629e  gcc/fortran/matchexp.cc
  915f6b30a8c22a5fea18690269a5a4a4  gcc/fortran/mathbuiltins.def
  9687294592a5ccef5d0b8254ab33816b  gcc/fortran/misc.cc
  f86547d523c51df822f6eb16438d46b8  gcc/fortran/module.cc
! 1d0b952568d99a85769c2e8433e1d1ed  gcc/fortran/openmp.cc
  b59741c468360dc1ed1ff70bb5b9ffbc  gcc/fortran/options.cc
  14bfc8cce7689afc9682a2e91f76a037  gcc/fortran/parse.cc
  c97a1f016de974126c688bb9c805f323  gcc/fortran/parse.h
  c5246d76c04dbc669841c906598db57e  gcc/fortran/primary.cc
! 22e3197047e8e9604254fe499672b1ed  gcc/fortran/resolve.cc
  4b8c563657dd74d2fa1431a1004eb549  gcc/fortran/scanner.cc
  18963b3f6aacca960fd6aa72b429a9d2  gcc/fortran/scanner.h
  715d95102faf740da2fefc9701cb655c  gcc/fortran/simplify.cc
--- 6317,6334 ----
  6c8e23a76ef7d1e3480d2026a438a31e  gcc/fortran/lang.opt
  8eb4c394776b2993c2ab25a45606b835  gcc/fortran/lang.opt.urls
  c35102e7caaf40998fe2ead86d2716da  gcc/fortran/libgfortran.h
! 196912aa9f300a0a4c8287ed66aa72ab  gcc/fortran/match.cc
  f7735c64af748cdef5caffae58a94749  gcc/fortran/match.h
  bf54232c4c950ed772f4964c4f79629e  gcc/fortran/matchexp.cc
  915f6b30a8c22a5fea18690269a5a4a4  gcc/fortran/mathbuiltins.def
  9687294592a5ccef5d0b8254ab33816b  gcc/fortran/misc.cc
  f86547d523c51df822f6eb16438d46b8  gcc/fortran/module.cc
! 22a81465875ac50bf5f5b33ba24d312c  gcc/fortran/openmp.cc
  b59741c468360dc1ed1ff70bb5b9ffbc  gcc/fortran/options.cc
  14bfc8cce7689afc9682a2e91f76a037  gcc/fortran/parse.cc
  c97a1f016de974126c688bb9c805f323  gcc/fortran/parse.h
  c5246d76c04dbc669841c906598db57e  gcc/fortran/primary.cc
! e96151804a5a450fc63e85b88f27ef99  gcc/fortran/resolve.cc
  4b8c563657dd74d2fa1431a1004eb549  gcc/fortran/scanner.cc
  18963b3f6aacca960fd6aa72b429a9d2  gcc/fortran/scanner.h
  715d95102faf740da2fefc9701cb655c  gcc/fortran/simplify.cc
*************** eeebf17ef1f12c809de44012289a8ab8  gcc/fo
*** 6337,6353 ****
  94fc65a2744229e5909ff74d5513a905  gcc/fortran/symbol.cc
  1c6fd4e52d7d8b97d9357ff08b660d49  gcc/fortran/target-memory.cc
  92193b934a673cebed3efed7f74a9cac  gcc/fortran/target-memory.h
! d5d965eaf5b519b3ad1e0b70ba0daaaf  gcc/fortran/trans-array.cc
  a0c40b654df0b5c5213047d26e48e97a  gcc/fortran/trans-array.h
  d92b6f7feff3882a660f0f7c2c60b7b0  gcc/fortran/trans-common.cc
  98960d7450a15e1ecc9789bd0bde16a7  gcc/fortran/trans-const.cc
  0d5cf4117521dba2aea9c8fd7ac67888  gcc/fortran/trans-const.h
! 442c63ff75d2642195a08d5b1ccdc775  gcc/fortran/trans-decl.cc
! 44758b5fc18922d48a64fba1bd9ffc25  gcc/fortran/trans-expr.cc
  811dc438c87b8d4bfc6ef1ed8633da28  gcc/fortran/trans-intrinsic.cc
  8a57cfea30bf3f2ccc14a884e7b0d1da  gcc/fortran/trans-io.cc
  06841cda6c842aae9f09268cec2b1f95  gcc/fortran/trans-openmp.cc
! 945e9bc02426eddc3ea3bd5fa63e3d48  gcc/fortran/trans-stmt.cc
  6fbc90714f9730e84515bbaadff313f9  gcc/fortran/trans-stmt.h
  b085053149417a1fab0b7f73dfcf1202  gcc/fortran/trans-types.cc
  6b00c9b76b80a96feb87d86b4b06102b  gcc/fortran/trans-types.h
--- 6336,6352 ----
  94fc65a2744229e5909ff74d5513a905  gcc/fortran/symbol.cc
  1c6fd4e52d7d8b97d9357ff08b660d49  gcc/fortran/target-memory.cc
  92193b934a673cebed3efed7f74a9cac  gcc/fortran/target-memory.h
! b6b366b7d6617c2dce9a67b7cacccb98  gcc/fortran/trans-array.cc
  a0c40b654df0b5c5213047d26e48e97a  gcc/fortran/trans-array.h
  d92b6f7feff3882a660f0f7c2c60b7b0  gcc/fortran/trans-common.cc
  98960d7450a15e1ecc9789bd0bde16a7  gcc/fortran/trans-const.cc
  0d5cf4117521dba2aea9c8fd7ac67888  gcc/fortran/trans-const.h
! 15de42985a0c7f55235f61aa3df7115b  gcc/fortran/trans-decl.cc
! 2acb7546a1daed48c8311d8df879cc0c  gcc/fortran/trans-expr.cc
  811dc438c87b8d4bfc6ef1ed8633da28  gcc/fortran/trans-intrinsic.cc
  8a57cfea30bf3f2ccc14a884e7b0d1da  gcc/fortran/trans-io.cc
  06841cda6c842aae9f09268cec2b1f95  gcc/fortran/trans-openmp.cc
! ee35535420c8c9e229f87598de1bf5eb  gcc/fortran/trans-stmt.cc
  6fbc90714f9730e84515bbaadff313f9  gcc/fortran/trans-stmt.h
  b085053149417a1fab0b7f73dfcf1202  gcc/fortran/trans-types.cc
  6b00c9b76b80a96feb87d86b4b06102b  gcc/fortran/trans-types.h
*************** cb61e8e62e8f8253c31da11a151fafb3  gcc/gc
*** 6371,6383 ****
  7b1166dad6238e1f91025f2e3204c1fb  gcc/gcc-rich-location.cc
  94d4733d194d020db563ba701aa05d9f  gcc/gcc-rich-location.h
  e4981e3b10513f53ed20b58620dfc56f  gcc/gcc-symtab.h
! 4ab35668d1ea7ab6cac04625e0bc9d91  gcc/gcc-urlifier.cc
  3ba51d67080efcd8791ea2eaf4103d72  gcc/gcc-urlifier.def
  9110b89a48e29f0f75e8c76eca85c6e2  gcc/gcc-urlifier.h
  e4f547de1e5874261fe1cd65ba0af5ce  gcc/gcc.cc
  09d73a192ef597ac58c7300df5ae4eb3  gcc/gcc.h
  1edfbdaab776ee29780fe98d767e67ed  gcc/gcov-counter.def
! 2076f7754bf36008845d58c1fffc6fdd  gcc/gcov-dump.cc
  b3c028c9d05ffaa2d3d12afa3b3d6061  gcc/gcov-io.cc
  15293b4de55e6ae02fef2f87d2745ed3  gcc/gcov-io.h
  59c446908bdce0e047d42a7886f3904a  gcc/gcov-tool.cc
--- 6370,6382 ----
  7b1166dad6238e1f91025f2e3204c1fb  gcc/gcc-rich-location.cc
  94d4733d194d020db563ba701aa05d9f  gcc/gcc-rich-location.h
  e4981e3b10513f53ed20b58620dfc56f  gcc/gcc-symtab.h
! 2e5199869e1ce8b2630e4784fbc6e5e6  gcc/gcc-urlifier.cc
  3ba51d67080efcd8791ea2eaf4103d72  gcc/gcc-urlifier.def
  9110b89a48e29f0f75e8c76eca85c6e2  gcc/gcc-urlifier.h
  e4f547de1e5874261fe1cd65ba0af5ce  gcc/gcc.cc
  09d73a192ef597ac58c7300df5ae4eb3  gcc/gcc.h
  1edfbdaab776ee29780fe98d767e67ed  gcc/gcov-counter.def
! 5254cb252da1522a0364a1ef41fa47b1  gcc/gcov-dump.cc
  b3c028c9d05ffaa2d3d12afa3b3d6061  gcc/gcov-io.cc
  15293b4de55e6ae02fef2f87d2745ed3  gcc/gcov-io.h
  59c446908bdce0e047d42a7886f3904a  gcc/gcov-tool.cc
*************** d7845f849ad3dd11fdee8ef672936b7e  gcc/gi
*** 6489,6502 ****
  8a9bf24197a610cfba7953c1233dd5ef  gcc/gimple-ssa-backprop.cc
  eea2759af1703adad9975f6c60cb27bc  gcc/gimple-ssa-isolate-paths.cc
  841e25177d0ec3b994aade444aaf7d1f  gcc/gimple-ssa-nonnull-compare.cc
! 13257b32ee813be08ac6c10d3415abe7  gcc/gimple-ssa-pta-constraints.cc
  1a13540b90afbe02c088650d3cd0b617  gcc/gimple-ssa-pta-constraints.h
  d29ad5283ef50f50d10619397e423ecf  gcc/gimple-ssa-sccopy.cc
  7be48fef79411a4592494e787939e0b4  gcc/gimple-ssa-split-paths.cc
  07a1825b625d551acbb670a51ae45fb1  gcc/gimple-ssa-sprintf.cc
  b85bb37d7fc2e1e7d1969f5ecd96f9c1  gcc/gimple-ssa-store-merging.cc
! 011e1d2608ac36840eebfd960ff5e949  gcc/gimple-ssa-strength-reduction.cc
! 4c170b8d70c14c356d6e90c5e9198c0e  gcc/gimple-ssa-warn-access.cc
  987d7fb5fd1bb73e756015bb5e1074bd  gcc/gimple-ssa-warn-access.h
  f7b0197d94bcfef5acc93f20515d5a8f  gcc/gimple-ssa-warn-alloca.cc
  331fb5561e03bdd45decaf5d8b7ca0bb  gcc/gimple-ssa-warn-restrict.cc
--- 6488,6501 ----
  8a9bf24197a610cfba7953c1233dd5ef  gcc/gimple-ssa-backprop.cc
  eea2759af1703adad9975f6c60cb27bc  gcc/gimple-ssa-isolate-paths.cc
  841e25177d0ec3b994aade444aaf7d1f  gcc/gimple-ssa-nonnull-compare.cc
! a773a19ee9b5880dae21824c39a73876  gcc/gimple-ssa-pta-constraints.cc
  1a13540b90afbe02c088650d3cd0b617  gcc/gimple-ssa-pta-constraints.h
  d29ad5283ef50f50d10619397e423ecf  gcc/gimple-ssa-sccopy.cc
  7be48fef79411a4592494e787939e0b4  gcc/gimple-ssa-split-paths.cc
  07a1825b625d551acbb670a51ae45fb1  gcc/gimple-ssa-sprintf.cc
  b85bb37d7fc2e1e7d1969f5ecd96f9c1  gcc/gimple-ssa-store-merging.cc
! 53ca8b2ca1464910f634a11084178624  gcc/gimple-ssa-strength-reduction.cc
! 7b2da39025ad992bc56879ad3d06af5d  gcc/gimple-ssa-warn-access.cc
  987d7fb5fd1bb73e756015bb5e1074bd  gcc/gimple-ssa-warn-access.h
  f7b0197d94bcfef5acc93f20515d5a8f  gcc/gimple-ssa-warn-alloca.cc
  331fb5561e03bdd45decaf5d8b7ca0bb  gcc/gimple-ssa-warn-restrict.cc
*************** f5de8589d497c4d607cadff1ce88dd5c  gcc/hw
*** 6639,6645 ****
  665c1d736f4909ccb17f662f7f060fd7  gcc/hw-doloop.h
  e5e51e93d7d72e1822440531e4d79d1d  gcc/hwint.cc
  b6b1b7e364f00e9287ee1f56254b9be1  gcc/hwint.h
! da0a89c97a078ca4046c9681c66b87b5  gcc/ifcvt.cc
  e2229f9ecac43014084b083ddf2d4637  gcc/ifcvt.h
  370b4a8b9decbb822392c32f5fb92a72  gcc/inchash.cc
  bad6404ce4e7f42ff46ce6ae70c77e99  gcc/inchash.h
--- 6638,6644 ----
  665c1d736f4909ccb17f662f7f060fd7  gcc/hw-doloop.h
  e5e51e93d7d72e1822440531e4d79d1d  gcc/hwint.cc
  b6b1b7e364f00e9287ee1f56254b9be1  gcc/hwint.h
! 20df01b09e24ecfeb31ae96ff000bd02  gcc/ifcvt.cc
  e2229f9ecac43014084b083ddf2d4637  gcc/ifcvt.h
  370b4a8b9decbb822392c32f5fb92a72  gcc/inchash.cc
  bad6404ce4e7f42ff46ce6ae70c77e99  gcc/inchash.h
*************** bc26d1c89032a321ada5015cbec7103b  gcc/ip
*** 6662,6668 ****
  2db0720673179e23a6e269afc34e1abd  gcc/ipa-devirt.cc
  ae1e2041798741a74dbd720bfa8af4c5  gcc/ipa-fnsummary.cc
  179f7c3a6fbca4d8bf253b9fc8e5b21f  gcc/ipa-fnsummary.h
! 5f829e6402cf407fdcc61ddc5b23f7f1  gcc/ipa-free-lang-data.cc
  bd8846ab41db2000eb2e2f0acea327ea  gcc/ipa-icf-gimple.cc
  8afa732b4ae1f08ca41426bc2cb25ff9  gcc/ipa-icf-gimple.h
  cd6daf6036bc08df46ce01ec22dbdba5  gcc/ipa-icf.cc
--- 6661,6667 ----
  2db0720673179e23a6e269afc34e1abd  gcc/ipa-devirt.cc
  ae1e2041798741a74dbd720bfa8af4c5  gcc/ipa-fnsummary.cc
  179f7c3a6fbca4d8bf253b9fc8e5b21f  gcc/ipa-fnsummary.h
! c4202186d7ed3511a93359f9b276438b  gcc/ipa-free-lang-data.cc
  bd8846ab41db2000eb2e2f0acea327ea  gcc/ipa-icf-gimple.cc
  8afa732b4ae1f08ca41426bc2cb25ff9  gcc/ipa-icf-gimple.h
  cd6daf6036bc08df46ce01ec22dbdba5  gcc/ipa-icf.cc
*************** ba9e8a0870296fd0192e3595d9f582ef  gcc/ip
*** 6673,6685 ****
  4be9c78f2544b781ae0f89b60cd3dee0  gcc/ipa-inline.h
  81ac9269ca4538a6d699c9371d6bd5b0  gcc/ipa-locality-cloning.cc
  e1e331896b86db8a2281657bbb21ac72  gcc/ipa-locality-cloning.h
! ab5408f83da75ccf39cc1121f179dd4b  gcc/ipa-modref-tree.cc
  c546dc75ec27388fb7fe834c0aabd230  gcc/ipa-modref-tree.h
  3dd311025cec1b6d42c0f11205077ce9  gcc/ipa-modref.cc
  323eab7a20907e08e7d9ca8e513c2259  gcc/ipa-modref.h
  5de2d46c22758bff85e4365ba687f510  gcc/ipa-param-manipulation.cc
  dba11f7340415ca54713db0009a33093  gcc/ipa-param-manipulation.h
! 5f27f25f7b777a26523479ee68fbd3cc  gcc/ipa-polymorphic-call.cc
  80b4cc7719c703dfe60955dfb86002ae  gcc/ipa-predicate.cc
  a25a62951e49120c7882ca20d2486581  gcc/ipa-predicate.h
  7e00759eeb8f2ddaa2f77da1db8adf24  gcc/ipa-profile.cc
--- 6672,6684 ----
  4be9c78f2544b781ae0f89b60cd3dee0  gcc/ipa-inline.h
  81ac9269ca4538a6d699c9371d6bd5b0  gcc/ipa-locality-cloning.cc
  e1e331896b86db8a2281657bbb21ac72  gcc/ipa-locality-cloning.h
! 4d6a8cf9b93ae2035da4279c028c0746  gcc/ipa-modref-tree.cc
  c546dc75ec27388fb7fe834c0aabd230  gcc/ipa-modref-tree.h
  3dd311025cec1b6d42c0f11205077ce9  gcc/ipa-modref.cc
  323eab7a20907e08e7d9ca8e513c2259  gcc/ipa-modref.h
  5de2d46c22758bff85e4365ba687f510  gcc/ipa-param-manipulation.cc
  dba11f7340415ca54713db0009a33093  gcc/ipa-param-manipulation.h
! 9dc9e570455ffce18e64a38bd18ab947  gcc/ipa-polymorphic-call.cc
  80b4cc7719c703dfe60955dfb86002ae  gcc/ipa-predicate.cc
  a25a62951e49120c7882ca20d2486581  gcc/ipa-predicate.h
  7e00759eeb8f2ddaa2f77da1db8adf24  gcc/ipa-profile.cc
*************** a683bef6f6721b574c76acc1efb5050c  gcc/ji
*** 6806,6814 ****
  cb2c142683e6c45261fcadd4c5e97bdc  gcc/json.cc
  e101169692be7b0591cafd905c476447  gcc/json.h
  598bd9cf01e2b97715ef52af5b0f2241  gcc/jump.cc
! db38a11d4dce106f820651752f564683  gcc/langhooks-def.h
! bd54dcceceea2f4e69957be1075e54e8  gcc/langhooks.cc
! 1ad1f65d939a28daa29eab5ed8f2a2d2  gcc/langhooks.h
  e5aaf0926ffa1d66709fdc320212070a  gcc/late-combine.cc
  4d0b64200ad1d5cc3dd88026fa268820  gcc/lazily-created.h
  e8cbb0a4e8793ea30337c86b60f8f64a  gcc/lcm.cc
--- 6805,6813 ----
  cb2c142683e6c45261fcadd4c5e97bdc  gcc/json.cc
  e101169692be7b0591cafd905c476447  gcc/json.h
  598bd9cf01e2b97715ef52af5b0f2241  gcc/jump.cc
! f8d200db506e7264760dc29b26e593b0  gcc/langhooks-def.h
! 6aae55223100f16ce5b96a5ed327d238  gcc/langhooks.cc
! a10771b08830bd53d983947d7831ffad  gcc/langhooks.h
  e5aaf0926ffa1d66709fdc320212070a  gcc/late-combine.cc
  4d0b64200ad1d5cc3dd88026fa268820  gcc/lazily-created.h
  e8cbb0a4e8793ea30337c86b60f8f64a  gcc/lcm.cc
*************** c6ab645f373e1d6e9ddd212bfc3a95ba  gcc/lo
*** 6837,6843 ****
  d49cf408f9415ef037523414c6e80764  gcc/lower-subreg.h
  1bd7d17fdacf9c764629a3def0c81b48  gcc/lra-assigns.cc
  5d1aa184ea3e3c5990e02acbdc762f00  gcc/lra-coalesce.cc
! c111eca8c5e23d9f439571bdfd28d41e  gcc/lra-constraints.cc
  2f34a2e53204408e2578f69fb831b0ac  gcc/lra-eliminations.cc
  b998a06aae46793940f70ad156ce33db  gcc/lra-int.h
  57ce9967bab48c81b11b698d319f4d8d  gcc/lra-lives.cc
--- 6836,6842 ----
  d49cf408f9415ef037523414c6e80764  gcc/lower-subreg.h
  1bd7d17fdacf9c764629a3def0c81b48  gcc/lra-assigns.cc
  5d1aa184ea3e3c5990e02acbdc762f00  gcc/lra-coalesce.cc
! 92293dff0fbd1caeedb55625725d74ff  gcc/lra-constraints.cc
  2f34a2e53204408e2578f69fb831b0ac  gcc/lra-eliminations.cc
  b998a06aae46793940f70ad156ce33db  gcc/lra-int.h
  57ce9967bab48c81b11b698d319f4d8d  gcc/lra-lives.cc
*************** e0d99466f393722c3e10caf535614ff7  gcc/lt
*** 6883,6889 ****
  351e06833ea0ad58238533d76ea0c2cf  gcc/m2/COPYING.RUNTIME
  8f0e2cd40e05189ec81232da84bd6e1a  gcc/m2/COPYING3
  6a6a8e020838b23406c81b19c1d46df6  gcc/m2/COPYING3.LIB
! f6b4ffad573dedd5e80dcc9617043f8b  gcc/m2/ChangeLog
  3be37de9095aa710a8531df456be6d24  gcc/m2/Make-lang.in
  ed6143d60ab8fbfb423b65ba791d1faf  gcc/m2/Make-maintainer.in
  6a74129fda00ca52ba9f953538250c45  gcc/m2/NEWS
--- 6882,6888 ----
  351e06833ea0ad58238533d76ea0c2cf  gcc/m2/COPYING.RUNTIME
  8f0e2cd40e05189ec81232da84bd6e1a  gcc/m2/COPYING3
  6a6a8e020838b23406c81b19c1d46df6  gcc/m2/COPYING3.LIB
! 3fbe1746899538377df1de35ddba843b  gcc/m2/ChangeLog
  3be37de9095aa710a8531df456be6d24  gcc/m2/Make-lang.in
  ed6143d60ab8fbfb423b65ba791d1faf  gcc/m2/Make-maintainer.in
  6a74129fda00ca52ba9f953538250c45  gcc/m2/NEWS
*************** f9608e9005487c369e6c38949ab36fa1  gcc/m2
*** 7858,7864 ****
  2a18164ee5f162ac117e6fedb58158a2  gcc/machmode.def
  0c9209452a934f189aa0860038b3a65c  gcc/machmode.h
  197298337dae14fdd7ab928a1f03bec6  gcc/main.cc
! da5f44b4c3de72e4508b4fa11f21f37f  gcc/match.pd
  b106a08a1793a5495dd87c412456484b  gcc/mcf.cc
  897c541ca992e145ad451c98941c7647  gcc/mem-stats-traits.h
  4f86eeea7af520ce0b773c1f2e34b5b4  gcc/mem-stats.h
--- 7857,7863 ----
  2a18164ee5f162ac117e6fedb58158a2  gcc/machmode.def
  0c9209452a934f189aa0860038b3a65c  gcc/machmode.h
  197298337dae14fdd7ab928a1f03bec6  gcc/main.cc
! 3fb491b7bf5537ffe4b377384a94bb2a  gcc/match.pd
  b106a08a1793a5495dd87c412456484b  gcc/mcf.cc
  897c541ca992e145ad451c98941c7647  gcc/mem-stats-traits.h
  4f86eeea7af520ce0b773c1f2e34b5b4  gcc/mem-stats.h
*************** aa2631a800917f0a9b68ef9c3c6722fc  gcc/ob
*** 7900,7910 ****
  ac6f2a373c263368c4451f24860f50d6  gcc/obstack-utils.h
  b53e19ed2e5aad878bc3422b5ed77de8  gcc/omp-api.h
  cdc26bd8ead0ef188e59165e859c822d  gcc/omp-builtins.def
! e7abb6250d236c57de97916c916acb3d  gcc/omp-expand.cc
  2f6456a4cc816c9b75844b1625b26349  gcc/omp-expand.h
  8b82f3e01be2ffdbcd3f14366979d838  gcc/omp-general.cc
  eec035943fdd9f32f7d83cff91c4dfcb  gcc/omp-general.h
! 0860c32a322fabba0f78dfcc2ca7d691  gcc/omp-low.cc
  1c84cef0613c186032b0fc0682b72ab8  gcc/omp-low.h
  e15278003e18a529caf759e00fbb8140  gcc/omp-oacc-kernels-decompose.cc
  e46559b06f0c63bac8a2626dcddfb876  gcc/omp-oacc-neuter-broadcast.cc
--- 7899,7909 ----
  ac6f2a373c263368c4451f24860f50d6  gcc/obstack-utils.h
  b53e19ed2e5aad878bc3422b5ed77de8  gcc/omp-api.h
  cdc26bd8ead0ef188e59165e859c822d  gcc/omp-builtins.def
! 5a3bcd60699376b2549493e2b4b4795d  gcc/omp-expand.cc
  2f6456a4cc816c9b75844b1625b26349  gcc/omp-expand.h
  8b82f3e01be2ffdbcd3f14366979d838  gcc/omp-general.cc
  eec035943fdd9f32f7d83cff91c4dfcb  gcc/omp-general.h
! feefdabfae453daa31c3ebf314bfb55e  gcc/omp-low.cc
  1c84cef0613c186032b0fc0682b72ab8  gcc/omp-low.h
  e15278003e18a529caf759e00fbb8140  gcc/omp-oacc-kernels-decompose.cc
  e46559b06f0c63bac8a2626dcddfb876  gcc/omp-oacc-neuter-broadcast.cc
*************** df4d718a9c9934a10272384f58351e0f  gcc/op
*** 7927,7933 ****
  e45c50053d2064312ea73720cdb8e5d9  gcc/optabs-query.h
  0135b6d221cd61d59fecebf7206e304e  gcc/optabs-tree.cc
  201b2569727bf062f908121f208a860f  gcc/optabs-tree.h
! 0570d9163515301e01f51c93d8248501  gcc/optabs.cc
  c5f46ef2e21b33c46222e08c7533480c  gcc/optabs.def
  81371a1b977075ff9a2b9637ac88cfa3  gcc/optabs.h
  10284dae2b1b50618cee778ef473c34c  gcc/optc-gen.awk
--- 7926,7932 ----
  e45c50053d2064312ea73720cdb8e5d9  gcc/optabs-query.h
  0135b6d221cd61d59fecebf7206e304e  gcc/optabs-tree.cc
  201b2569727bf062f908121f208a860f  gcc/optabs-tree.h
! 504fbae79c3570ba260ea6bddbd86041  gcc/optabs.cc
  c5f46ef2e21b33c46222e08c7533480c  gcc/optabs.def
  81371a1b977075ff9a2b9637ac88cfa3  gcc/optabs.h
  10284dae2b1b50618cee778ef473c34c  gcc/optc-gen.awk
*************** fef443de1557117f8c2847206a2ea8f5  gcc/or
*** 7950,7967 ****
  7c8d7dc194f39f5b8c69d7f0d05bc335  gcc/output.h
  5f96d548f10507478f5096f298505278  gcc/pair-fusion.cc
  69198894caa672a2294267474e494d8b  gcc/pair-fusion.h
! abbac2785af7dbd8bbe67350b020336c  gcc/params.opt
  2cc794e23d80a8c9f057a7e402c65fb8  gcc/params.opt.urls
  ce920ed7f2cc74b4a9bc390c39f4cbee  gcc/pass_manager.h
  1780eb05a432e44c4898abd2e995a024  gcc/passes.cc
  d77f8f9495142a091f02e74420a91a51  gcc/passes.def
! 4cd99288bcfac4253f3a849c6aed3d27  gcc/path-coverage.cc
  a804a634cdc9dbcb92434c9e03799a1e  gcc/pex.cc
  b2f9b18f946c2e60e4f6cba0ab2df54e  gcc/pex.h
  5d25ac31d9e5d9515931b16e9f7339f7  gcc/plugin.cc
  af6268dd53154434eb4c4d1c299e0ee2  gcc/plugin.def
  5678cfbc9cf98f9e69bee1118c787a42  gcc/plugin.h
! bf8786f6f2a6bf20c25e28ce3ad9e849  gcc/po/ChangeLog
  2c2fbc71d2acc1ddfb9fb9501458921b  gcc/po/EXCLUDES
  276b0e994306e3cdb1f62b8de38fa0e9  gcc/po/be.po
  4ce8480a8ed1c6ea96dcee25f16b5030  gcc/po/da.po
--- 7949,7966 ----
  7c8d7dc194f39f5b8c69d7f0d05bc335  gcc/output.h
  5f96d548f10507478f5096f298505278  gcc/pair-fusion.cc
  69198894caa672a2294267474e494d8b  gcc/pair-fusion.h
! 948f4850f7e40c5186cdf501b8504bda  gcc/params.opt
  2cc794e23d80a8c9f057a7e402c65fb8  gcc/params.opt.urls
  ce920ed7f2cc74b4a9bc390c39f4cbee  gcc/pass_manager.h
  1780eb05a432e44c4898abd2e995a024  gcc/passes.cc
  d77f8f9495142a091f02e74420a91a51  gcc/passes.def
! 51273d95ed168859744a17468a7b3bda  gcc/path-coverage.cc
  a804a634cdc9dbcb92434c9e03799a1e  gcc/pex.cc
  b2f9b18f946c2e60e4f6cba0ab2df54e  gcc/pex.h
  5d25ac31d9e5d9515931b16e9f7339f7  gcc/plugin.cc
  af6268dd53154434eb4c4d1c299e0ee2  gcc/plugin.def
  5678cfbc9cf98f9e69bee1118c787a42  gcc/plugin.h
! 57abb1c74788c97687bd92e9ccc2b7af  gcc/po/ChangeLog
  2c2fbc71d2acc1ddfb9fb9501458921b  gcc/po/EXCLUDES
  276b0e994306e3cdb1f62b8de38fa0e9  gcc/po/be.po
  4ce8480a8ed1c6ea96dcee25f16b5030  gcc/po/da.po
*************** ebb858c75f8dd61aae764a6c9b4eecb1  gcc/po
*** 7979,7991 ****
  a7784b508797b07a4ce6f68f1bacacc8  gcc/po/nl.po
  fdcd4a3815700acbdd4e1f3e6b833509  gcc/po/ru.po
  7eca9b1e93a0943a9b3e0162afc96508  gcc/po/sr.po
! d869add118f3b4328fb1691092405516  gcc/po/sv.po
  30f86071bc323d99189f4277b2844dd2  gcc/po/tr.po
  97298dbd14ff0ae2044aa6223ff15d35  gcc/po/uk.po
  6a667463af95654e143e41c99d642c20  gcc/po/vi.po
  70925d4393f1c12426d647b87a2c5a10  gcc/po/zh_CN.po
  8838373e81bbd8baacc3fd661c2b31cc  gcc/po/zh_TW.po
! 0603adbb9fbfea4784444606bc0dc981  gcc/pointer-query.cc
  728738ceae729bc0f318f8accf6244c0  gcc/pointer-query.h
  8fb747d77281aa1c6e2fbc0f106ef7f5  gcc/poly-int-types.h
  8e1ad60e1364794de50c869dcc263271  gcc/poly-int.h
--- 7978,7990 ----
  a7784b508797b07a4ce6f68f1bacacc8  gcc/po/nl.po
  fdcd4a3815700acbdd4e1f3e6b833509  gcc/po/ru.po
  7eca9b1e93a0943a9b3e0162afc96508  gcc/po/sr.po
! addbe678572b00fd728ed5da73f67e36  gcc/po/sv.po
  30f86071bc323d99189f4277b2844dd2  gcc/po/tr.po
  97298dbd14ff0ae2044aa6223ff15d35  gcc/po/uk.po
  6a667463af95654e143e41c99d642c20  gcc/po/vi.po
  70925d4393f1c12426d647b87a2c5a10  gcc/po/zh_CN.po
  8838373e81bbd8baacc3fd661c2b31cc  gcc/po/zh_TW.po
! 0016c64b1dc5e95008ae058ae7eba1a1  gcc/pointer-query.cc
  728738ceae729bc0f318f8accf6244c0  gcc/pointer-query.h
  8fb747d77281aa1c6e2fbc0f106ef7f5  gcc/poly-int-types.h
  8e1ad60e1364794de50c869dcc263271  gcc/poly-int.h
*************** f26f8ff623fefa8bdfe18ead347e914f  gcc/pr
*** 8009,8015 ****
  db24d9f938cefb2027e91a5068f5f1d0  gcc/print-tree.h
  7e39922ba013c9a602f60c45e332ff09  gcc/profile-count.cc
  4591a0265a903c86d026a1642b71188a  gcc/profile-count.h
! 848f414573cbb453da8ed9886994b38e  gcc/profile.cc
  75fc41809b74ed162233e70c20df1264  gcc/profile.h
  7f9b6625aa17fa4341b812c209fafb26  gcc/pta-andersen.cc
  bea702966301b6b7e6294ef33ec8b443  gcc/pta-andersen.h
--- 8008,8014 ----
  db24d9f938cefb2027e91a5068f5f1d0  gcc/print-tree.h
  7e39922ba013c9a602f60c45e332ff09  gcc/profile-count.cc
  4591a0265a903c86d026a1642b71188a  gcc/profile-count.h
! 66a4cbd0d34605100ec913cd7c446296  gcc/profile.cc
  75fc41809b74ed162233e70c20df1264  gcc/profile.h
  7f9b6625aa17fa4341b812c209fafb26  gcc/pta-andersen.cc
  bea702966301b6b7e6294ef33ec8b443  gcc/pta-andersen.h
*************** b21c32de4ac41afaa112df92995fbc7b  gcc/ta
*** 8687,8693 ****
  8125dc2ec6773b874996579f2c7a5a45  gcc/targhooks.cc
  407bffe68a928437a42d3979f89d8c46  gcc/targhooks.h
  f39fcaa8197187283ccfed40107b426d  gcc/testsuite/.gitattributes
! 2493853853f00c4e8df9535d51eb8c4c  gcc/testsuite/ChangeLog
  47e8e29b649ead73b8a1e4797da470ed  gcc/testsuite/ChangeLog-1993-2007
  35198a9e4fd31b935de8789faabf3351  gcc/testsuite/ChangeLog-2008
  0f19934540750356d1b91595cebfd9a8  gcc/testsuite/ChangeLog-2009
--- 8686,8692 ----
  8125dc2ec6773b874996579f2c7a5a45  gcc/targhooks.cc
  407bffe68a928437a42d3979f89d8c46  gcc/targhooks.h
  f39fcaa8197187283ccfed40107b426d  gcc/testsuite/.gitattributes
! 54620336fef70d3bff0c55b8a069fa3f  gcc/testsuite/ChangeLog
  47e8e29b649ead73b8a1e4797da470ed  gcc/testsuite/ChangeLog-1993-2007
  35198a9e4fd31b935de8789faabf3351  gcc/testsuite/ChangeLog-2008
  0f19934540750356d1b91595cebfd9a8  gcc/testsuite/ChangeLog-2009
*************** ed8937b8a485d89ad1b8dc4c0b235b82  gcc/te
*** 17014,17019 ****
--- 17013,17023 ----
  b47f251bf682b77a1fcbc0deb10309bb  gcc/testsuite/algol68/compile/error-module-nested-access-1.a68
  c2b0d2946cbab417eebb4d24da1ab5a8  gcc/testsuite/algol68/compile/error-module-not-found-1.a68
  8b0c028ef528ab0ddc26892632812b6e  gcc/testsuite/algol68/compile/error-module-ranges-1.a68
+ e4130ae439c4e60fab00ecd165ae835e  gcc/testsuite/algol68/compile/error-nest-1.a68
+ befe947eeef79ffe1618a9c101bb008f  gcc/testsuite/algol68/compile/error-nest-2.a68
+ 13c6f9bd338f2223acbb02d80fbaa6a3  gcc/testsuite/algol68/compile/error-nest-3.a68
+ 31a649a34a74377c8a82c76d12302237  gcc/testsuite/algol68/compile/error-nest-4.a68
+ fac954b3ace925bc6875ee318be3b810  gcc/testsuite/algol68/compile/error-nest-5.a68
  e74cfe8a318c62621bf56edc50d99212  gcc/testsuite/algol68/compile/error-nestable-comments-1.a68
  819697f82afa8855ae899bae58e61181  gcc/testsuite/algol68/compile/error-nested-comment-1.a68
  cc2e80ef77087324e853715ffa5b0fe9  gcc/testsuite/algol68/compile/error-no-bounds-allowed-1.a68
*************** dcdba3a1144fe7a17bead0fdaab5db51  gcc/te
*** 17027,17032 ****
--- 17031,17037 ----
  d444f95d7ebcab4d1578356ad9f289c7  gcc/testsuite/algol68/compile/error-radix-2.a68
  71a38033039539f53eda38c144d0a57c  gcc/testsuite/algol68/compile/error-radix-3.a68
  1149d2f12e64e21d8387cb81de9336fd  gcc/testsuite/algol68/compile/error-radix-4.a68
+ 23ff6c5635bdcc50447c246c0de786b8  gcc/testsuite/algol68/compile/error-selector-1.a68
  cbc4b32a4422b77e2bbd1e4179c7fd7c  gcc/testsuite/algol68/compile/error-string-break-1.a68
  082e1aec4d3067022c46c5f48103bab4  gcc/testsuite/algol68/compile/error-string-break-2.a68
  4b206cca2b5e4d6921407d726ca2dea7  gcc/testsuite/algol68/compile/error-string-break-3.a68
*************** bcedbf89df30527b662d51b4cdd3f419  gcc/te
*** 17135,17140 ****
--- 17140,17146 ----
  1da550fb7981c16c671c8d3e6d921d63  gcc/testsuite/algol68/compile/modules/program-m68-lp64.a68
  bd8246f2db2521a6818a8ce7f2476610  gcc/testsuite/algol68/compile/modules/program-module-accesses-module-1.a68
  369030bb9cdc3966fdd495f011a6c692  gcc/testsuite/algol68/compile/modules/program-proc-arg-order-1.a68
+ c90631471da8474b6ab60824f0700feb  gcc/testsuite/algol68/compile/nest-c-1.a68
  e82cbeac5b925dd4aea14322ac4ddd87  gcc/testsuite/algol68/compile/nested-comment-1.a68
  404eced62aab785780ed11e0c0f86ba4  gcc/testsuite/algol68/compile/nested-comment-2.a68
  dad298e7bccf526ef0d9d25e42b36203  gcc/testsuite/algol68/compile/operators-firmly-related.a68
*************** da2f639d00aef0837f7fe5841659a31e  gcc/te
*** 17208,17213 ****
--- 17214,17222 ----
  ae090482307635cef763b8472c5f9f63  gcc/testsuite/algol68/execute/bin-1.a68
  2b96660f217790ef4d3c30d7967e272b  gcc/testsuite/algol68/execute/bin-negative-1.a68
  136cb319d4afa76d14581fab22962bda  gcc/testsuite/algol68/execute/bin-negative-gnu-1.a68
+ 63bc31f858993dc2ed0c150e9b3e0012  gcc/testsuite/algol68/execute/bits-clear-1.a68
+ 98da66fca3eebe622d35a0f00de9dc62  gcc/testsuite/algol68/execute/bits-set-1.a68
+ 35766fbe63ac2214a1c95a4009877af8  gcc/testsuite/algol68/execute/bits-test-1.a68
  ec8d149dd4b8f99f91e13d231858cfcd  gcc/testsuite/algol68/execute/boolops-1.a68
  f081dd04a0bf5e6ab8d9e46fe1bfefb9  gcc/testsuite/algol68/execute/call-1.a68
  6dbe11ab04e61f6238e7d61772d8ba2f  gcc/testsuite/algol68/execute/call-2.a68
*************** f77aa4368e40d0be4f68f42821be3eda  gcc/te
*** 17588,17597 ****
  44689ae54d47704c6451618a25b4b054  gcc/testsuite/algol68/execute/rowing-8.a68
  6a97c2b890e66565e939e75e2bbd3d9c  gcc/testsuite/algol68/execute/rowing-9.a68
  ef0c43d9925e3d45a1ce4b92f0e8b7eb  gcc/testsuite/algol68/execute/selection-1.a68
! 90f61e47b906673ac01a5b523353e211  gcc/testsuite/algol68/execute/selection-2.a68
  1bab50f2006d388bfe33b0ae02349d9a  gcc/testsuite/algol68/execute/selection-3.a68
  9c44307d6931b51d31acbdc1baadf4c8  gcc/testsuite/algol68/execute/selection-4.a68
! cb0001402e3acf9ef08f4f192ac2545a  gcc/testsuite/algol68/execute/selection-5.a68
  4c5cb81a99a670841ff0d866444ca8aa  gcc/testsuite/algol68/execute/selection-multiple-1.a68
  cc7fadb253e3464a68897b1a7abb5e00  gcc/testsuite/algol68/execute/selection-multiple-2.a68
  190a715dac40d0dfc36d5e5fe9a92299  gcc/testsuite/algol68/execute/serial-clause-1.a68
--- 17597,17606 ----
  44689ae54d47704c6451618a25b4b054  gcc/testsuite/algol68/execute/rowing-8.a68
  6a97c2b890e66565e939e75e2bbd3d9c  gcc/testsuite/algol68/execute/rowing-9.a68
  ef0c43d9925e3d45a1ce4b92f0e8b7eb  gcc/testsuite/algol68/execute/selection-1.a68
! a7cb9d646eedd4821c9825ed229322e2  gcc/testsuite/algol68/execute/selection-2.a68
  1bab50f2006d388bfe33b0ae02349d9a  gcc/testsuite/algol68/execute/selection-3.a68
  9c44307d6931b51d31acbdc1baadf4c8  gcc/testsuite/algol68/execute/selection-4.a68
! c72c157c4aa88c1f362190a690f340c5  gcc/testsuite/algol68/execute/selection-5.a68
  4c5cb81a99a670841ff0d866444ca8aa  gcc/testsuite/algol68/execute/selection-multiple-1.a68
  cc7fadb253e3464a68897b1a7abb5e00  gcc/testsuite/algol68/execute/selection-multiple-2.a68
  190a715dac40d0dfc36d5e5fe9a92299  gcc/testsuite/algol68/execute/serial-clause-1.a68
*************** a789f5331525aaabcfdd779b2981edf6  gcc/te
*** 18706,18711 ****
--- 18715,18721 ----
  ca3a4e630befd762fc8576e74160a5a4  gcc/testsuite/c-c++-common/asan/user-section-1.c
  0a2e4001b6ac2328ef0e29cfc0519941  gcc/testsuite/c-c++-common/asan/user-section-2.c
  3e31f5c1b9397bc124776d607d15c688  gcc/testsuite/c-c++-common/asan/user-section-3.c
+ 9f17a39189af3231af774064db5bbb8f  gcc/testsuite/c-c++-common/asm-invalid-operand-1.c
  8a1805e319233a0be84ec2f57d73fdf0  gcc/testsuite/c-c++-common/asmgoto-1.c
  b52858b1b0e17f71a6cbfe1dbc98f153  gcc/testsuite/c-c++-common/asmgoto-2.c
  23fd6d68a2d88cbcf8cd954faf8fb296  gcc/testsuite/c-c++-common/asmgoto-3.c
*************** da5e564f6cffb4d2f63384ba5d7351b1  gcc/te
*** 18890,18895 ****
--- 18900,18907 ----
  8135260e5e210166919ed6d24752ad37  gcc/testsuite/c-c++-common/cpp/diagnostic-pragma-3.c
  7e07a117bfa1cbd4313441da514b62a7  gcc/testsuite/c-c++-common/cpp/dir-only-1.c
  94f40e67e3617fd463bd2b73d2f6d54c  gcc/testsuite/c-c++-common/cpp/dir-only-1.h
+ 3ddedbc00d4ff771f66edefc8d70881f  gcc/testsuite/c-c++-common/cpp/dir-only-10.c
+ 948247aa95702e920da7ab25ee7cf601  gcc/testsuite/c-c++-common/cpp/dir-only-11.c
  92a3350e430f3da6be21354b2cc4eb5d  gcc/testsuite/c-c++-common/cpp/dir-only-2.c
  d17c82849bf7f540adedf0e80d9b41df  gcc/testsuite/c-c++-common/cpp/dir-only-3.c
  f120018b9734950cca9c0e7ba0e9a33a  gcc/testsuite/c-c++-common/cpp/dir-only-3a.h
*************** f4eb480d84c0d74ec37a6a42e4f034f6  gcc/te
*** 19218,19223 ****
--- 19230,19237 ----
  a485c2cf2b8fb5018ff6ffa1d09b0291  gcc/testsuite/c-c++-common/fold-masked-cmp-1.c
  6e779ad03a964087cf36696c444f20e2  gcc/testsuite/c-c++-common/fold-masked-cmp-2.c
  9b3df6f3fe1425a3c20ed01eae079f75  gcc/testsuite/c-c++-common/fold-masked-cmp-3.c
+ e28759bbefe902d098ff4cc989af4c04  gcc/testsuite/c-c++-common/function-like-macro-1.c
+ fb15c6d3a659f7d86eeb505861506fa3  gcc/testsuite/c-c++-common/function-like-macro-2.c
  515d5329012cc0802e7d94f233e276c3  gcc/testsuite/c-c++-common/goacc-gomp/atomic.c
  77f7e923f565073d456eb38484c59f49  gcc/testsuite/c-c++-common/goacc-gomp/nesting-1.c
  dcaef014c9e9702b3fca6ddec1a2820e  gcc/testsuite/c-c++-common/goacc-gomp/nesting-fail-1.c
*************** df4d5a9505c92f441e5ea85708315fed  gcc/te
*** 19857,19862 ****
--- 19871,19877 ----
  634555b205c8283a875f5b5db0fd3609  gcc/testsuite/c-c++-common/gomp/pr96867.c
  16407f97a063776e00434477f996fecf  gcc/testsuite/c-c++-common/gomp/pr97289.c
  164aefc7e8183e2dba0d1ca04fc30cad  gcc/testsuite/c-c++-common/gomp/pr97862.c
+ 5ded39755e2eb5b05d78367d1cce31e1  gcc/testsuite/c-c++-common/gomp/pr97898-1.c
  ae2ea6f7d6a1c903e63c85894d80fa1f  gcc/testsuite/c-c++-common/gomp/pr97958.c
  c57346a518f23fd991e5f885ae2d15ea  gcc/testsuite/c-c++-common/gomp/pr98187.c
  ca8127e06402e403622dc86e29c1968a  gcc/testsuite/c-c++-common/gomp/pr99226.c
*************** a3a25e292815be4474cfe0c8eb665d70  gcc/te
*** 20156,20161 ****
--- 20171,20178 ----
  498ddd8ad30f33954c75dc8c4bb14a15  gcc/testsuite/c-c++-common/patchable_function_entry-error-3.c
  06e40a848186c44f76563561856a3ee3  gcc/testsuite/c-c++-common/pointer-to-fn1.c
  a6ce976933c82e0ff9cfe2bb28e85af5  gcc/testsuite/c-c++-common/pr100785.c
+ 280ab2738fa9f4a59440b24de22faee0  gcc/testsuite/c-c++-common/pr101312-1.c
+ 1e4a8d2edc5aa23b12908e90b5487800  gcc/testsuite/c-c++-common/pr101312-2.c
  05e5f34e1a745d2204989ec4f256e3c7  gcc/testsuite/c-c++-common/pr101537.c
  8709cca98d2978c94addb154e2c7ae32  gcc/testsuite/c-c++-common/pr102281.c
  24cfa37b3314f819eee358a0281492a7  gcc/testsuite/c-c++-common/pr102285.c
*************** c5db7a60c83a4e066bc1ef093a602a52  gcc/te
*** 22150,22155 ****
--- 22167,22173 ----
  c0c6c8a9744bdada89df289a7570f5e0  gcc/testsuite/g++.dg/analyzer/exception-path-with-cleanups.C
  6d7868807b7031a7fb5416d2c132f8c1  gcc/testsuite/g++.dg/analyzer/exception-rethrow-1.C
  5f82db64970ffaa0fc497347b171a266  gcc/testsuite/g++.dg/analyzer/exception-rethrow-2.C
+ f6352dae6206f4292fc7d67730bf81ce  gcc/testsuite/g++.dg/analyzer/exception-rethrow-3.C
  96a1738c908d386fe5fecaff94e2637b  gcc/testsuite/g++.dg/analyzer/exception-stack-1.C
  98c2414b81e410dff54a7c763ef8d630  gcc/testsuite/g++.dg/analyzer/exception-stack-2.C
  c53f1ef0c637a90cc988d801af41f460  gcc/testsuite/g++.dg/analyzer/exception-subclass-1.C
*************** f94bda44b57e3eca7abceac1801f6a89  gcc/te
*** 22559,22564 ****
--- 22577,22583 ----
  a72ced9853beafaaa9dc607bf0968c82  gcc/testsuite/g++.dg/concepts/pr101099.C
  91bbc43bd292628bdbb650fc92890934  gcc/testsuite/g++.dg/concepts/pr105061.C
  1d90209b290c2d2e5faf7245f27737b0  gcc/testsuite/g++.dg/concepts/pr120618.C
+ cc2e32ec9a133a1a0675e05778bfc64f  gcc/testsuite/g++.dg/concepts/pr121832.C
  859f5f20c5d30a982ea7c13a56774203  gcc/testsuite/g++.dg/concepts/pr65634.C
  ffe909fc3ac2f31f963535467cb70716  gcc/testsuite/g++.dg/concepts/pr65636.C
  80c8a6d6dafe1ffb7e0fa3a57cf9e2fe  gcc/testsuite/g++.dg/concepts/pr65681.C
*************** c55dcfa7cbed9be2ef74cc34caaac38e  gcc/te
*** 22617,22738 ****
  47d50ea9841dfff2e1add4fe21d8cdd8  gcc/testsuite/g++.dg/conflict-markers-1.C
  f8f8119851ae2427bb5baa9f11ad5936  gcc/testsuite/g++.dg/conflict-markers-2.C
  f25f03bef75b49b3242b2b981a26687a  gcc/testsuite/g++.dg/constexpr-null1.C
! b943cfa99f231ecca89a127be47e62bb  gcc/testsuite/g++.dg/contracts/backtrace_handler/Makefile
! 223c090c01345af06b66ab0000b3915c  gcc/testsuite/g++.dg/contracts/backtrace_handler/README
! 89a180dc1e56599e0c77c9d281e46fbb  gcc/testsuite/g++.dg/contracts/backtrace_handler/assert_fail.cpp
! bd9982768438a217a3a6ac91276d4897  gcc/testsuite/g++.dg/contracts/backtrace_handler/example_out.txt
! 899d1249603104cd5fa1439ef9d116ca  gcc/testsuite/g++.dg/contracts/backtrace_handler/example_pretty.txt
! 8084cec06f7b5af4e5a2df2d1077d4ee  gcc/testsuite/g++.dg/contracts/backtrace_handler/handle_contract_violation.cpp
! 7a12aa0409116279c5d00625b5aaa210  gcc/testsuite/g++.dg/contracts/backtrace_handler/prettytrace.sh
! b019de57b67d086b5c6474222a756532  gcc/testsuite/g++.dg/contracts/contracts-access1.C
! 0a33d55a3b2f7a7c17917bd5ec0a460e  gcc/testsuite/g++.dg/contracts/contracts-assume1.C
! e2d28a1cea50dd15e361ca84882db47e  gcc/testsuite/g++.dg/contracts/contracts-assume2.C
! f9e2c17a3707b45f68640ad9998cd01f  gcc/testsuite/g++.dg/contracts/contracts-assume3.C
! 82182397a5c16b2e826dc4e98ef4f8a6  gcc/testsuite/g++.dg/contracts/contracts-assume4.C
! e1e24cc4bbd3d5ba574a42a8343c7883  gcc/testsuite/g++.dg/contracts/contracts-assume5.C
! b8bf805ee48013f4f7b9de2fc7d93030  gcc/testsuite/g++.dg/contracts/contracts-assume6.C
! bf2dd096ed02f2ae9c83cbdcd1d4faa6  gcc/testsuite/g++.dg/contracts/contracts-comdat1.C
! bf7bda0ef348c705dab77fbe43faaed6  gcc/testsuite/g++.dg/contracts/contracts-config1.C
! f40d5bde7dd94e8c841b9b7479a0b617  gcc/testsuite/g++.dg/contracts/contracts-constexpr1.C
! 2fe69811cd9254161d24423914330718  gcc/testsuite/g++.dg/contracts/contracts-constexpr2.C
! eccfb2d04c6e65c059f0b070fc3fae96  gcc/testsuite/g++.dg/contracts/contracts-constexpr3.C
! 0ca5358b44119fc709ac5f2ab8930d02  gcc/testsuite/g++.dg/contracts/contracts-conversion1.C
! 7d9c8a094730ae5af47293ccb704bb25  gcc/testsuite/g++.dg/contracts/contracts-ctor-dtor1.C
! c9db1153e8ee5cb72849f5c0f39cf1e3  gcc/testsuite/g++.dg/contracts/contracts-ctor-dtor2.C
! 124d5f0934307b58c175aa152287e8a0  gcc/testsuite/g++.dg/contracts/contracts-cv1.C
! e441ab4fa3cbbe376b99cd549356774a  gcc/testsuite/g++.dg/contracts/contracts-deduced1.C
! bc27327e16d09c0b58bbc1db4cd65827  gcc/testsuite/g++.dg/contracts/contracts-deduced2.C
! 5c9bafac170b07d97ed4eb83dc16ef98  gcc/testsuite/g++.dg/contracts/contracts-err1.C
! ce30c4843848edfc9e110e6c39ca4df7  gcc/testsuite/g++.dg/contracts/contracts-externC.C
! ade275b9aabf3ba09153f5426fd4469d  gcc/testsuite/g++.dg/contracts/contracts-friend1.C
! 52b21bc9c9cad3844d95e311a988d68f  gcc/testsuite/g++.dg/contracts/contracts-ft1.C
! 71d1f0701de65c6343284c3a5cbb342f  gcc/testsuite/g++.dg/contracts/contracts-ignore1.C
! 8539718daca649abdb77245f710ba085  gcc/testsuite/g++.dg/contracts/contracts-ignore2.C
! bb0dd846252c3c3c1d582fa399b6fd4a  gcc/testsuite/g++.dg/contracts/contracts-large-return.C
! caba2cd20ac8020041f7a2732f10f66e  gcc/testsuite/g++.dg/contracts/contracts-multiline1.C
! 93826bdbe09e0a48115b2e9f7dd205d8  gcc/testsuite/g++.dg/contracts/contracts-multiple-inheritance1.C
! d647c3628b453645a4980cb2c7de1b6a  gcc/testsuite/g++.dg/contracts/contracts-multiple-inheritance2.C
! 2f30c236622a9703769ea01c66616f42  gcc/testsuite/g++.dg/contracts/contracts-nested-class1.C
! a4baeb8a410dce7664ad2e394fe2b7c3  gcc/testsuite/g++.dg/contracts/contracts-nested-class2.C
! d61ea23f366dae37350aa0dc5f2b4528  gcc/testsuite/g++.dg/contracts/contracts-nocopy1.C
! 01ab4dc999a96e56ee2226ac44bdbf8e  gcc/testsuite/g++.dg/contracts/contracts-override.C
! 51d94c6f242297eab641a9cd460f5f37  gcc/testsuite/g++.dg/contracts/contracts-post1.C
! 8cc91453a4494a9e20a055ccb5a3652a  gcc/testsuite/g++.dg/contracts/contracts-post2.C
! 6ac97d9fb1ea567bd577d2bd26986c06  gcc/testsuite/g++.dg/contracts/contracts-post3.C
! fd1ebb08a8584706a94c2f3a8341af7c  gcc/testsuite/g++.dg/contracts/contracts-post4.C
! e2590b46b53ec704324172e6e9b19d6e  gcc/testsuite/g++.dg/contracts/contracts-post5.C
! c20bb9e2f528699a697643b507b9d245  gcc/testsuite/g++.dg/contracts/contracts-post6.C
! 25181ce13e844c46905c30af89f284b1  gcc/testsuite/g++.dg/contracts/contracts-post7.C
! 7116878ea39c2a20c71154e676cbcc1e  gcc/testsuite/g++.dg/contracts/contracts-pre1.C
! 02c031c79f6b258f76eea9fff6c99437  gcc/testsuite/g++.dg/contracts/contracts-pre10.C
! 59791e2f48309b11f9de135f950ad4ad  gcc/testsuite/g++.dg/contracts/contracts-pre2.C
! 44f64673aac65a1ae27a3c101075e216  gcc/testsuite/g++.dg/contracts/contracts-pre2a1.C
! 2cebbfad6426a65b64033ee111bc7347  gcc/testsuite/g++.dg/contracts/contracts-pre2a2.C
! 60cfba4c74054ecde5807744d243b794  gcc/testsuite/g++.dg/contracts/contracts-pre3.C
! cb9676b0fa70be7e3ba40ff5faf0e1bf  gcc/testsuite/g++.dg/contracts/contracts-pre4.C
! f07523793b08772dcc3a9117a9a25ce3  gcc/testsuite/g++.dg/contracts/contracts-pre5.C
! b1e16c42ac54a9ddccdb5e21e4f4f5b3  gcc/testsuite/g++.dg/contracts/contracts-pre6.C
! 49d94d00c8c3cd5350ce7b7204825921  gcc/testsuite/g++.dg/contracts/contracts-pre7.C
! f8177f152c297038e62e9d6375bc81dc  gcc/testsuite/g++.dg/contracts/contracts-pre9.C
! 62ba1c4517aa7006be86df32a86b112b  gcc/testsuite/g++.dg/contracts/contracts-redecl1.C
! cb6c3d1131c86c5625a7a5cd72e4eef3  gcc/testsuite/g++.dg/contracts/contracts-redecl2.C
! 1cc34b25c3ed2e835e3b2be3f68d1759  gcc/testsuite/g++.dg/contracts/contracts-redecl3.C
! 6711ff60433421a5fa84ccf23b0f9668  gcc/testsuite/g++.dg/contracts/contracts-redecl4.C
! 82709f66f4af2a21bd6f909183dbac48  gcc/testsuite/g++.dg/contracts/contracts-redecl5.C
! 339d4a695f67e7ed801145735ee56166  gcc/testsuite/g++.dg/contracts/contracts-redecl6.C
! 9a30d0a146faea929c7751c33f7b9a0e  gcc/testsuite/g++.dg/contracts/contracts-redecl7.C
! d53c0b0fc368bda6e8adfdda351d531e  gcc/testsuite/g++.dg/contracts/contracts-redecl8.C
! a7f4a2fd7bf07439040a7b09cb4c8072  gcc/testsuite/g++.dg/contracts/contracts-tmpl-attr1.C
! 721279ea193dda609e3353e2b96a7c26  gcc/testsuite/g++.dg/contracts/contracts-tmpl-spec1.C
! 88d05eaa691b32cfa5f038aeea31d090  gcc/testsuite/g++.dg/contracts/contracts-tmpl-spec2.C
! 334f6845dea633a15c2defb6633ad1af  gcc/testsuite/g++.dg/contracts/contracts-tmpl-spec3.C
! c210cba8e1e324774b6ab401c96deeb0  gcc/testsuite/g++.dg/contracts/contracts1.C
! ddd72f980540baa9eb39255f045cfe12  gcc/testsuite/g++.dg/contracts/contracts10.C
! 7328aa3328d6837c51d49a379fb578e6  gcc/testsuite/g++.dg/contracts/contracts11.C
! 190c759120c67e0575bdf5bdfa24b64a  gcc/testsuite/g++.dg/contracts/contracts12.C
! ee120fc86148dfc73930595c4e310dd5  gcc/testsuite/g++.dg/contracts/contracts13.C
! 04ef290a2030d0ce1bc09d20bb533322  gcc/testsuite/g++.dg/contracts/contracts14.C
! b503e106a6e03d050ccdd754ecfac94a  gcc/testsuite/g++.dg/contracts/contracts15.C
! f272cb1fc2dd2dc678e80b0b6f950d0a  gcc/testsuite/g++.dg/contracts/contracts16.C
! 1626437ec76b8b8a5f5d23ca731765fa  gcc/testsuite/g++.dg/contracts/contracts17.C
! c3555a266c38d62dcb08cef1da14ab3e  gcc/testsuite/g++.dg/contracts/contracts18.C
! 2a042b6fab162fd0f27272ae8615e5c0  gcc/testsuite/g++.dg/contracts/contracts19.C
! 11101d9c38f21aadd5b2b2b306b1e6b0  gcc/testsuite/g++.dg/contracts/contracts2.C
! d854c6c14e50ba3b621cfa5a19c1e835  gcc/testsuite/g++.dg/contracts/contracts20.C
! eb1d7b08cf60bf8224289a0c6c131932  gcc/testsuite/g++.dg/contracts/contracts22.C
! 6416219b080b52d3277c5fffb0dc167b  gcc/testsuite/g++.dg/contracts/contracts24.C
! efcc6e14040abed9e611e40ae3d08b8d  gcc/testsuite/g++.dg/contracts/contracts25.C
! b94f325172fd82c853ef28923bbc93b8  gcc/testsuite/g++.dg/contracts/contracts3.C
! 9e0e87df97662b6d32cf0696e0c664ea  gcc/testsuite/g++.dg/contracts/contracts35.C
! ce662f569037891152d7969bec2685cd  gcc/testsuite/g++.dg/contracts/contracts4.C
! 4f473f895a1266b8ce95df2ba872c89b  gcc/testsuite/g++.dg/contracts/contracts5.C
! 205196cb7cfb52db1ff838dfaaea7ea1  gcc/testsuite/g++.dg/contracts/contracts6.C
! 1797d136577437bca9f5032ba326ecc1  gcc/testsuite/g++.dg/contracts/contracts7.C
! 1ab07d07d8710623da3e3582c85a642c  gcc/testsuite/g++.dg/contracts/contracts8.C
! 7c4fb137a22208c6e9240f7589edbd63  gcc/testsuite/g++.dg/contracts/contracts9.C
! 460175ab5b30061d80960faa912cdb56  gcc/testsuite/g++.dg/contracts/except_preload_handler/Makefile
! 43408545b0dc258f8b9f1b20507a7228  gcc/testsuite/g++.dg/contracts/except_preload_handler/README
! 898e3ee72371441be6b9914570dd1dba  gcc/testsuite/g++.dg/contracts/except_preload_handler/assert_fail.cpp
! 976d7e6f6d60f6f3099e288e26993286  gcc/testsuite/g++.dg/contracts/except_preload_handler/handle_contract_violation.cpp
! 460175ab5b30061d80960faa912cdb56  gcc/testsuite/g++.dg/contracts/noexcept_preload_handler/Makefile
! 5b9994a0d41a7ee4e89f793a435c6f57  gcc/testsuite/g++.dg/contracts/noexcept_preload_handler/README
! 1eef935e17a9e42132e42fbaf5825bd3  gcc/testsuite/g++.dg/contracts/noexcept_preload_handler/assert_fail.cpp
! 976d7e6f6d60f6f3099e288e26993286  gcc/testsuite/g++.dg/contracts/noexcept_preload_handler/handle_contract_violation.cpp
! addfdc1364048741e22ee32302cdf092  gcc/testsuite/g++.dg/contracts/pr110159.C
! fad9615e64b4a42988f5ba3d0b6e8552  gcc/testsuite/g++.dg/contracts/pr113968.C
! f0398ac4aacbf6c27a19e54cbf6a6347  gcc/testsuite/g++.dg/contracts/pr115434.C
! 251e1141392f1ef18a39436532cc5423  gcc/testsuite/g++.dg/contracts/pr116490.C
! 5e66eb4f6b5efc8e23309b95e8176b65  gcc/testsuite/g++.dg/contracts/pr116607.C
! d5e1613017d3f9eca3ecede804bc0b5b  gcc/testsuite/g++.dg/contracts/pr117579.C
! c81f2cfc289a492c0914488fe8b63c60  gcc/testsuite/g++.dg/contracts/preload_handler/Makefile
! 25782949ad51a3e368e55d72b148a8b7  gcc/testsuite/g++.dg/contracts/preload_handler/README
! a20f08cc18eaf6c3032e2d1b9cffe61d  gcc/testsuite/g++.dg/contracts/preload_handler/assert_fail.cpp
! dc5dacc4f67e341524d85d082bb7a2d0  gcc/testsuite/g++.dg/contracts/preload_handler/handle_contract_violation.cpp
! c756cce4ff3f49b22913831f3f1cce4d  gcc/testsuite/g++.dg/contracts/preload_nocontinue_handler/Makefile
! 7a6038918674d84254d66a174f74f23c  gcc/testsuite/g++.dg/contracts/preload_nocontinue_handler/README
! 750d70063c91e040a6eb22e224cb894e  gcc/testsuite/g++.dg/contracts/preload_nocontinue_handler/assert_fail.cpp
! 788020aa04295c84bca4ce22cde827ba  gcc/testsuite/g++.dg/contracts/preload_nocontinue_handler/handle_contract_violation.cpp
! bd7d5494b5a353e621c6049c6ee7a332  gcc/testsuite/g++.dg/contracts/preload_nocontinue_handler/nocontinue.cpp
  86b1b880d2414f17dc8db282f49ae6e2  gcc/testsuite/g++.dg/conversion/Wwrite-strings.C
  f0aed431ce3357281e21fdd3e10a7644  gcc/testsuite/g++.dg/conversion/access1.C
  cae83e7bca15183b3b346f9a00467f2c  gcc/testsuite/g++.dg/conversion/ambig1.C
--- 22636,22719 ----
  47d50ea9841dfff2e1add4fe21d8cdd8  gcc/testsuite/g++.dg/conflict-markers-1.C
  f8f8119851ae2427bb5baa9f11ad5936  gcc/testsuite/g++.dg/conflict-markers-2.C
  f25f03bef75b49b3242b2b981a26687a  gcc/testsuite/g++.dg/constexpr-null1.C
! f71f3ca44bca1415964bad43748c225e  gcc/testsuite/g++.dg/contracts/cpp26/BZ121936-workaround-noipa.C
! ea7cee7225ac6cf98ed35fdc2d404f77  gcc/testsuite/g++.dg/contracts/cpp26/assertion-statement-errors.C
! 9a4494c752ab90fc5a53a46f099340f5  gcc/testsuite/g++.dg/contracts/cpp26/assertion-statement.C
! ab54253e4e34506dbfb03e7b7330e576  gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p11-observe.C
! dfd7ebc4064b7d3712d1bcfc26b133c3  gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p14.C
! a9b769700756cb1dcb961abd70e9d0d9  gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p17-2.C
! 32f0e8c7f4c3161dd5eec7bfdecad20e  gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p17-3.C
! 32557fde6a5da5066a64ee58abe7b321  gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p17-4.C
! 84ee108297cbea1cfd9ea6b3a7ad3215  gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p17-5.C
! a4148adbc13b4ce92aabf6c3abd7efc7  gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p17-SMF-post.C
! 4bc3f37411f471e24dadccdac678e368  gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p17-SMF-pre.C
! 9a78eff3634b783bc6f02f1387b1f042  gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p17-SMF2.C
! 6b3f2dd65836ae238ef803f0cc152631  gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p17-SMF3.C
! c3b032947de9a8326acb87e3165adc4d  gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p17-SMF4.C
! 54c2df9945832d2da5eb7061bffdb675  gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p17.C
! 6b08d9759c2eb1e6585c4f5421d2fd59  gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p4-error.C
! 918360648b51ff75b27b3467749aeffa  gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p4.C
! be892275c368a2986b53d48a115a663b  gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p6.C
! b9aa686f9c07414266d02527f201d486  gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p6.observe.C
! 4577c57ef596f164df664590cfec9cb9  gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p7.3.C
! a1f6b480f3bec7ed4dbac50a5f7f89b3  gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p8-2.C
! 051716109086ec3036567a6f6adf4e44  gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p8.C
! 22e7409253edd05900bc4b7fd6eccf18  gcc/testsuite/g++.dg/contracts/cpp26/basic.scope.contract.p1.C
! 9b7ba0d56e419d6aee6c2e9bbdfde638  gcc/testsuite/g++.dg/contracts/cpp26/basic.scope.contract.p2.1.C
! 0721e8f441afab23f72a836959b87e06  gcc/testsuite/g++.dg/contracts/cpp26/callerside-checks/callerside-checks-all.C
! 111313989332adb69f74d69bd191c598  gcc/testsuite/g++.dg/contracts/cpp26/callerside-checks/callerside-checks-non-trivial.C
! bf997069dacf835ad42deae9f269b845  gcc/testsuite/g++.dg/contracts/cpp26/callerside-checks/callerside-checks-none.C
! 7143ea838ac75df54884a497eb97c9f5  gcc/testsuite/g++.dg/contracts/cpp26/callerside-checks/callerside-checks-pre.C
! 7be59953187231fbc478bf4118945511  gcc/testsuite/g++.dg/contracts/cpp26/callerside-checks/ctor.C
! d3555e373d96eb140074b9fc85043bdb  gcc/testsuite/g++.dg/contracts/cpp26/callerside-checks/freefunc-noexcept-post.C
! 37fa6550483f869bbb8045cb23f859ce  gcc/testsuite/g++.dg/contracts/cpp26/callerside-checks/freefunc-noexcept-pre.C
! d06bf8fa4631d66a9e999e287c14aa7b  gcc/testsuite/g++.dg/contracts/cpp26/contract-assert-run.C
! 811d8c0638c55322009c1eadba42687d  gcc/testsuite/g++.dg/contracts/cpp26/contract-assert-warn-attributes.C
! 50fe571f1a05ebe44e059946a0374d99  gcc/testsuite/g++.dg/contracts/cpp26/contract-violation-noexcept.C
! 2eeb8a75cfb2714d3b581644341cf31b  gcc/testsuite/g++.dg/contracts/cpp26/contract-violation-noexcept2.C
! e230ffaa5c2fae5ac62812d0c96d2091  gcc/testsuite/g++.dg/contracts/cpp26/contract_genericize.C
! 4d16f193c0791ffb54d23cbe5c00caff  gcc/testsuite/g++.dg/contracts/cpp26/contracts-friend1.C
! d1853c2ad1397a25439c4cfa963c9e27  gcc/testsuite/g++.dg/contracts/cpp26/contracts-nested-class1.C
! a1999016ae180cf90bb9af89e255f98c  gcc/testsuite/g++.dg/contracts/cpp26/contracts-nested-class2.C
! 241d2cf0448f169d8da759ade1f0cffd  gcc/testsuite/g++.dg/contracts/cpp26/contracts-tmpl-spec2.C
! 84a7fde8a31f7e41b37379498acf8103  gcc/testsuite/g++.dg/contracts/cpp26/dcl.contract.func.p4.C
! 4c7774344f58dfc19e3922ab7a31543f  gcc/testsuite/g++.dg/contracts/cpp26/dcl.contract.func.p6.C
! 456ff1a786fe2f1c8323cc8ef6ac8821  gcc/testsuite/g++.dg/contracts/cpp26/dcl.contract.func.p7-t1.C
! 9e9656451c9f44813a94cd7274318c47  gcc/testsuite/g++.dg/contracts/cpp26/dcl.contract.func.p7-t2.C
! be2e160e7e161c06c03d9dd04aaabcc0  gcc/testsuite/g++.dg/contracts/cpp26/dcl.contract.func.p7.C
! 242547f530a4b8ee83507839e03451a6  gcc/testsuite/g++.dg/contracts/cpp26/dcl.contract.res.p1-2.C
! 31de51f92bebd17cb1f7c7e8932f03d1  gcc/testsuite/g++.dg/contracts/cpp26/dcl.contract.res.p1-NT.C
! 3d182fded99412da7df4614dcfaedad4  gcc/testsuite/g++.dg/contracts/cpp26/dcl.contract.res.p1.C
! 0a6307ed5fa186a3d3b23b6a6e75cf29  gcc/testsuite/g++.dg/contracts/cpp26/dcl.contract.res.p2.C
! 334f49639dd2063761521cb66d55b558  gcc/testsuite/g++.dg/contracts/cpp26/debug-and-opt.C
! 15b35d7d6fe16233f38cd414ac2be041  gcc/testsuite/g++.dg/contracts/cpp26/deferred1.C
! d0e739a36a6e919875d0bd6ab03b615d  gcc/testsuite/g++.dg/contracts/cpp26/definition-checks/contract-assert-no-def-check.C
! 6f4d6086e61173f3e2902b260078380e  gcc/testsuite/g++.dg/contracts/cpp26/dependent_contract.C
! e39f68d4ae650b2ca0e7aea8b2451ca0  gcc/testsuite/g++.dg/contracts/cpp26/empty-nt-param.C
! 9ef6fbecc33a774f52a3be1123643336  gcc/testsuite/g++.dg/contracts/cpp26/expr.prim.id.unqual.p7-2.C
! 3a72d936409f91b7919551df2081736d  gcc/testsuite/g++.dg/contracts/cpp26/expr.prim.id.unqual.p7-3.C
! fd9b448bc1f3f1b160d80c6a681522e4  gcc/testsuite/g++.dg/contracts/cpp26/expr.prim.id.unqual.p7-4.C
! b6a1abc97434f28d3e837d5d66adda4a  gcc/testsuite/g++.dg/contracts/cpp26/expr.prim.id.unqual.p7.C
! 02ab754564954ef185777cf307e8b7dc  gcc/testsuite/g++.dg/contracts/cpp26/function-contract-specifier-seq-error.C
! bd7f977496e35749f5750a5927cb11fc  gcc/testsuite/g++.dg/contracts/cpp26/function-contract-specifier-seq.C
! adc0af6b60c5a74750b3c0ff85f1c2b3  gcc/testsuite/g++.dg/contracts/cpp26/intro.compliance.general.p2.3.4.C
! 0dfaea15e4dc739778127abf7bb77df3  gcc/testsuite/g++.dg/contracts/cpp26/lambda.C
! 1bb2219410a53db29b3c7f89a03e518a  gcc/testsuite/g++.dg/contracts/cpp26/name_mangling.C
! febc1f95c06938bcfdd0ae7c5484db5e  gcc/testsuite/g++.dg/contracts/cpp26/non-trivial-ice.C
! b0a8b0bcad6fde625cec79c3feeee4ce  gcc/testsuite/g++.dg/contracts/cpp26/outline-checks/freefunc-noexcept-post.C
! ee22e1d1ae843bd8ba2a3bd981a2b01a  gcc/testsuite/g++.dg/contracts/cpp26/outline-checks/freefunc-noexcept-pre.C
! 19824bb347e7ad2de6e9f22fa680f49f  gcc/testsuite/g++.dg/contracts/cpp26/outline-checks/func-noexcept-assert.C
! e21c71259f096aba370cb7e1dbd2c82f  gcc/testsuite/g++.dg/contracts/cpp26/outline-checks/memberfunc-noexcept-post.C
! 75654ed837bb7459f74b6cf9186b3b30  gcc/testsuite/g++.dg/contracts/cpp26/outline-checks/memberfunc-noexcept-pre.C
! fdda55e654375389d9662009987da0af  gcc/testsuite/g++.dg/contracts/cpp26/over.call.func.p3.1.C
! 96ea1ad173add3d3c0cb78b9a3d27bde  gcc/testsuite/g++.dg/contracts/cpp26/pr113968.C
! 141dc5c23ff6a83ae5ea54931f767386  gcc/testsuite/g++.dg/contracts/cpp26/src-loc-0.C
! 10549b3833ce959d2719127a0041ad34  gcc/testsuite/g++.dg/contracts/cpp26/src-loc-1.C
! b5496afc1faee5ed343f075431080efe  gcc/testsuite/g++.dg/contracts/cpp26/src-loc-2.C
! 2d9d35baa3c790e7f6d1ccd1e019f3fb  gcc/testsuite/g++.dg/contracts/cpp26/throwing-violation-handler.cc
! b4cae67120093a9f342066bb6c7fc435  gcc/testsuite/g++.dg/contracts/cpp26/unused_warning.C
! 417bc89e1d6c794b6f496fbc721411e8  gcc/testsuite/g++.dg/contracts/cpp26/vaargs.C
! 53445e69f769643e6c23e80c7863f22c  gcc/testsuite/g++.dg/contracts/cpp2a/check-err.C
  86b1b880d2414f17dc8db282f49ae6e2  gcc/testsuite/g++.dg/conversion/Wwrite-strings.C
  f0aed431ce3357281e21fdd3e10a7644  gcc/testsuite/g++.dg/conversion/access1.C
  cae83e7bca15183b3b346f9a00467f2c  gcc/testsuite/g++.dg/conversion/ambig1.C
*************** e871dade9f29aef626c6c2b971763df6  gcc/te
*** 22931,22938 ****
  2d41ae2373f79574814b547e58adf65b  gcc/testsuite/g++.dg/coroutines/pr110171.C
  a9a380461a08693fcb6e2a8d0c088a72  gcc/testsuite/g++.dg/coroutines/pr110635.C
  20c31ba7b9813c7592788f115c164999  gcc/testsuite/g++.dg/coroutines/pr110855.C
! c7e88ac061e6e43895f7a223cb84bef5  gcc/testsuite/g++.dg/coroutines/pr110871.C
! 36c888e2999e58645eb61e67fe0cb24f  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
--- 22912,22919 ----
  2d41ae2373f79574814b547e58adf65b  gcc/testsuite/g++.dg/coroutines/pr110171.C
  a9a380461a08693fcb6e2a8d0c088a72  gcc/testsuite/g++.dg/coroutines/pr110635.C
  20c31ba7b9813c7592788f115c164999  gcc/testsuite/g++.dg/coroutines/pr110855.C
! ffb931dc20a2f271234c85c6c4b80ac0  gcc/testsuite/g++.dg/coroutines/pr110871.C
! f1b3d19aaf87563df620924a78b01da3  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
*************** df7772e8bce1917bb8d1e66fcbe1ce31  gcc/te
*** 23733,23738 ****
--- 23714,23720 ----
  50c4fa620f7ec653b83dbc313350ac22  gcc/testsuite/g++.dg/cpp0x/constexpr-ctor20.C
  75570067f1748bbf63ecff0edf089f3f  gcc/testsuite/g++.dg/cpp0x/constexpr-ctor21.C
  898892e0dd2add16d81be2af167dd343  gcc/testsuite/g++.dg/cpp0x/constexpr-ctor22.C
+ c3ffed418366431e337c777209f796c0  gcc/testsuite/g++.dg/cpp0x/constexpr-ctor23.C
  6149d79aef3c5dc04bce76d97b8072e3  gcc/testsuite/g++.dg/cpp0x/constexpr-ctor3.C
  fe03ae0923ec0f159b32d4c95a97afbb  gcc/testsuite/g++.dg/cpp0x/constexpr-ctor4.C
  a15ac39628455598191a6c7526c0ea4b  gcc/testsuite/g++.dg/cpp0x/constexpr-ctor5.C
*************** cf5dbf6e27520dc069362029f5cb0540  gcc/te
*** 23789,23795 ****
  0639a526e3e93a7d7ddd53722d0d65a4  gcc/testsuite/g++.dg/cpp0x/constexpr-empty9.C
  eebd11cc85b798aa6a7a34d54749b1fd  gcc/testsuite/g++.dg/cpp0x/constexpr-ex1.C
  4e6fff7f5e83663f75c94efbf299525b  gcc/testsuite/g++.dg/cpp0x/constexpr-ex2.C
! c42ce017f72e0ac9bc977500bc2d096c  gcc/testsuite/g++.dg/cpp0x/constexpr-ex3.C
  ce75146a9a51521a3b4ff82cc14225c3  gcc/testsuite/g++.dg/cpp0x/constexpr-ex4.C
  19eb610e0af0918f7473197af97c60d4  gcc/testsuite/g++.dg/cpp0x/constexpr-expinst.C
  54953d2c31360e2eeefa3305044bd360  gcc/testsuite/g++.dg/cpp0x/constexpr-explicit-inst.C
--- 23771,23777 ----
  0639a526e3e93a7d7ddd53722d0d65a4  gcc/testsuite/g++.dg/cpp0x/constexpr-empty9.C
  eebd11cc85b798aa6a7a34d54749b1fd  gcc/testsuite/g++.dg/cpp0x/constexpr-ex1.C
  4e6fff7f5e83663f75c94efbf299525b  gcc/testsuite/g++.dg/cpp0x/constexpr-ex2.C
! ee1630d30fdca78fd9a901d17054b392  gcc/testsuite/g++.dg/cpp0x/constexpr-ex3.C
  ce75146a9a51521a3b4ff82cc14225c3  gcc/testsuite/g++.dg/cpp0x/constexpr-ex4.C
  19eb610e0af0918f7473197af97c60d4  gcc/testsuite/g++.dg/cpp0x/constexpr-expinst.C
  54953d2c31360e2eeefa3305044bd360  gcc/testsuite/g++.dg/cpp0x/constexpr-explicit-inst.C
*************** cad4897b69a9dcbf2accb6f76dc6142a  gcc/te
*** 23820,23825 ****
--- 23802,23808 ----
  b9f6048a90a69c192d74f1909302134b  gcc/testsuite/g++.dg/cpp0x/constexpr-ice2.C
  ab9f33f2432c24146907c124c5aa5f73  gcc/testsuite/g++.dg/cpp0x/constexpr-ice20.C
  b89ab8fc8681bcb1f4c9e745c59cc023  gcc/testsuite/g++.dg/cpp0x/constexpr-ice21.C
+ 2e145bafd523c12757b4f67860b95787  gcc/testsuite/g++.dg/cpp0x/constexpr-ice22.C
  8338efcd83a2b6552bc4ad1d47c18171  gcc/testsuite/g++.dg/cpp0x/constexpr-ice3.C
  31d07512ae997885ce1713c969bce7e1  gcc/testsuite/g++.dg/cpp0x/constexpr-ice4.C
  db4c14cc7fdca18c19d67657bdddb5d7  gcc/testsuite/g++.dg/cpp0x/constexpr-ice5.C
*************** cd57481c3233939f35a9152176ba0610  gcc/te
*** 25353,25358 ****
--- 25336,25342 ----
  3bffe4cc168fde4f27dd432ad19e2f12  gcc/testsuite/g++.dg/cpp0x/nullptr44.C
  afdfafb40dd063d062a20c67e4309ae4  gcc/testsuite/g++.dg/cpp0x/nullptr45.C
  b34fb57802d0e40ddc608dc33eb1600e  gcc/testsuite/g++.dg/cpp0x/nullptr46.C
+ a60d34e7d9b973abeff594c297263e66  gcc/testsuite/g++.dg/cpp0x/nullptr47.C
  c0e1a381d8dd12ff190debb04e5ee084  gcc/testsuite/g++.dg/cpp0x/overflow1.C
  fb7661df85ad6b415b31574c67fa4ee0  gcc/testsuite/g++.dg/cpp0x/overload-conv-1.C
  5ca00ae02aa7919e0b3d9730fa9f9ac5  gcc/testsuite/g++.dg/cpp0x/overload-conv-2.C
*************** eae7b1c5c4d936a1f5c31a1238405ccf  gcc/te
*** 27222,27227 ****
--- 27206,27212 ----
  58567f49e40f6546d878effc21628cbf  gcc/testsuite/g++.dg/cpp1z/constexpr-asm-3.C
  669420eda8695484550e7cbe4dd7465c  gcc/testsuite/g++.dg/cpp1z/constexpr-asm-4.C
  31c0294ddff78a97b99eb3d38a63e9f6  gcc/testsuite/g++.dg/cpp1z/constexpr-asm-5.C
+ 46999aa3169dc26f34a4b3111e434f42  gcc/testsuite/g++.dg/cpp1z/constexpr-asm-6.C
  3e441287d887fe3be7eeab84a6b5695f  gcc/testsuite/g++.dg/cpp1z/constexpr-compare1.C
  d309961f0255b13605cf111efa2b095a  gcc/testsuite/g++.dg/cpp1z/constexpr-if-lambda1.C
  6031d9adb83bdf87e2dd05c8108493d1  gcc/testsuite/g++.dg/cpp1z/constexpr-if-lambda2.C
*************** ee32c4ffc3127b060ad7d2d7978d4c00  gcc/te
*** 27684,27689 ****
--- 27669,27678 ----
  908376aadbb678dfe697398a3cf0bdb3  gcc/testsuite/g++.dg/cpp23/auto-fncast9.C
  436f3521c73eff29eb95a9935488f619  gcc/testsuite/g++.dg/cpp23/charlit-encoding1.C
  bbd34d70bffdb5659d43e105cc5654f0  gcc/testsuite/g++.dg/cpp23/charset1.C
+ f8b948f3bd58f417c8837abf4c607944  gcc/testsuite/g++.dg/cpp23/charset2.C
+ 520263925310ed180ef9cb12215dd06c  gcc/testsuite/g++.dg/cpp23/charset3.C
+ 38c0f828c58d52bc1c9da747ce2143c2  gcc/testsuite/g++.dg/cpp23/charset4.C
+ 1c8398ab63a0d995253666d53458bcc9  gcc/testsuite/g++.dg/cpp23/charset5.C
  fc95968ef690ef967f99e7fc9cf9bb22  gcc/testsuite/g++.dg/cpp23/class-deduction-inherited1.C
  289c2847fb294b33f74d735aba8d2b44  gcc/testsuite/g++.dg/cpp23/class-deduction-inherited10.C
  0bfba7997142477c825e6eac0de01c78  gcc/testsuite/g++.dg/cpp23/class-deduction-inherited2.C
*************** b18ba0cbdb9ffa0b64f76ae3a037d11a  gcc/te
*** 27902,27907 ****
--- 27891,27897 ----
  a8d270b14d34e596be9b7b19686ce435  gcc/testsuite/g++.dg/cpp26/attr-indeterminate2.C
  3d13d312049cd6d36d78018ac884112d  gcc/testsuite/g++.dg/cpp26/attr-indeterminate3.C
  2a61c0e1ca02df10172c40cb7c8e867b  gcc/testsuite/g++.dg/cpp26/attr-indeterminate4.C
+ 338535b0502f94272035010e22922f19  gcc/testsuite/g++.dg/cpp26/attr-indeterminate5.C
  766438266de7b80013064af79c387336  gcc/testsuite/g++.dg/cpp26/consteval-block1.C
  aaea35a035b24193ff3ba3cb04bbbd84  gcc/testsuite/g++.dg/cpp26/consteval-block2.C
  06b982e16422e70c9775e103750a3db7  gcc/testsuite/g++.dg/cpp26/consteval-block3.C
*************** aa7084460b314da9c28cdf37e67100c4  gcc/te
*** 27981,28006 ****
  0c6cc7bc14adc7d7cff2e19ed2f21ba9  gcc/testsuite/g++.dg/cpp26/erroneous4.C
  297da1726d3e7afdc47f8d5d6953759b  gcc/testsuite/g++.dg/cpp26/erroneous5.C
  a37be6fa19087a24f020178e94b5020d  gcc/testsuite/g++.dg/cpp26/erroneous6.C
! 954c74496d3a7aab6f8eedc25fa7fae1  gcc/testsuite/g++.dg/cpp26/expansion-stmt1.C
  550ad6705c2ee18c462420135db42434  gcc/testsuite/g++.dg/cpp26/expansion-stmt10.C
  27464fb36f9adff660032384a5f744d1  gcc/testsuite/g++.dg/cpp26/expansion-stmt11.C
  d2f3d1d0903cd9aafbe5cfc699f5e974  gcc/testsuite/g++.dg/cpp26/expansion-stmt12.C
  1a8ea65a8bfe4f48807a4cb121d02f77  gcc/testsuite/g++.dg/cpp26/expansion-stmt13.C
  9a15f7dee81311d83ad9aea2e046e956  gcc/testsuite/g++.dg/cpp26/expansion-stmt14.C
  8b57ea067d4cae17a4720a89345931b4  gcc/testsuite/g++.dg/cpp26/expansion-stmt15.C
! 14352b0cb38dc6eeb6188f47cd518b4a  gcc/testsuite/g++.dg/cpp26/expansion-stmt16.C
  40a9f0169438dcc0077a4b3f3a07e396  gcc/testsuite/g++.dg/cpp26/expansion-stmt17.C
! e3a8dec9a6c102a45b488c0902a817d7  gcc/testsuite/g++.dg/cpp26/expansion-stmt18.C
  a9c707a9b9460b695998400fa35fced5  gcc/testsuite/g++.dg/cpp26/expansion-stmt19.C
! b9aba1d42afeda7f7d3906234c8c2fd9  gcc/testsuite/g++.dg/cpp26/expansion-stmt2.C
  a430b39e1be5d1fb74398b6e2ed2bc77  gcc/testsuite/g++.dg/cpp26/expansion-stmt20.C
  6d0dfe9eb3ad7d8109fbb3b138464ecc  gcc/testsuite/g++.dg/cpp26/expansion-stmt21.C
  f8d8f977a2ce10a22535ceb90309b531  gcc/testsuite/g++.dg/cpp26/expansion-stmt22.C
  acbce95791211ede09f67fcd376b48cb  gcc/testsuite/g++.dg/cpp26/expansion-stmt23.C
  4f56781af7d20030274d9a133126e14b  gcc/testsuite/g++.dg/cpp26/expansion-stmt24.C
  6e0ba6570c6704c45f502e328e1b9c51  gcc/testsuite/g++.dg/cpp26/expansion-stmt27.C
  311dc4c09c0e312fcde6a0fa7a18ea60  gcc/testsuite/g++.dg/cpp26/expansion-stmt28.C
! b2b33bdc39d1d27a4c8029e91514b3c1  gcc/testsuite/g++.dg/cpp26/expansion-stmt3.C
  05972a123b20a66b9c7899c2bb0b5042  gcc/testsuite/g++.dg/cpp26/expansion-stmt4.C
  7cfc2afc603d55bfd66b320b3d190acd  gcc/testsuite/g++.dg/cpp26/expansion-stmt5.C
  8419176a2bf5898de53901daf6efe2a9  gcc/testsuite/g++.dg/cpp26/expansion-stmt6.C
--- 27971,27998 ----
  0c6cc7bc14adc7d7cff2e19ed2f21ba9  gcc/testsuite/g++.dg/cpp26/erroneous4.C
  297da1726d3e7afdc47f8d5d6953759b  gcc/testsuite/g++.dg/cpp26/erroneous5.C
  a37be6fa19087a24f020178e94b5020d  gcc/testsuite/g++.dg/cpp26/erroneous6.C
! b64ca644cecdc2d2f9240f5060f15ddd  gcc/testsuite/g++.dg/cpp26/expansion-stmt1.C
  550ad6705c2ee18c462420135db42434  gcc/testsuite/g++.dg/cpp26/expansion-stmt10.C
  27464fb36f9adff660032384a5f744d1  gcc/testsuite/g++.dg/cpp26/expansion-stmt11.C
  d2f3d1d0903cd9aafbe5cfc699f5e974  gcc/testsuite/g++.dg/cpp26/expansion-stmt12.C
  1a8ea65a8bfe4f48807a4cb121d02f77  gcc/testsuite/g++.dg/cpp26/expansion-stmt13.C
  9a15f7dee81311d83ad9aea2e046e956  gcc/testsuite/g++.dg/cpp26/expansion-stmt14.C
  8b57ea067d4cae17a4720a89345931b4  gcc/testsuite/g++.dg/cpp26/expansion-stmt15.C
! ef8ede6e959f4c1988242abcb8b18569  gcc/testsuite/g++.dg/cpp26/expansion-stmt16.C
  40a9f0169438dcc0077a4b3f3a07e396  gcc/testsuite/g++.dg/cpp26/expansion-stmt17.C
! 44a7aaec2d961560ddb9933095e7006f  gcc/testsuite/g++.dg/cpp26/expansion-stmt18.C
  a9c707a9b9460b695998400fa35fced5  gcc/testsuite/g++.dg/cpp26/expansion-stmt19.C
! 5392426c185f1cc8b0fc76ba4a048564  gcc/testsuite/g++.dg/cpp26/expansion-stmt2.C
  a430b39e1be5d1fb74398b6e2ed2bc77  gcc/testsuite/g++.dg/cpp26/expansion-stmt20.C
  6d0dfe9eb3ad7d8109fbb3b138464ecc  gcc/testsuite/g++.dg/cpp26/expansion-stmt21.C
  f8d8f977a2ce10a22535ceb90309b531  gcc/testsuite/g++.dg/cpp26/expansion-stmt22.C
  acbce95791211ede09f67fcd376b48cb  gcc/testsuite/g++.dg/cpp26/expansion-stmt23.C
  4f56781af7d20030274d9a133126e14b  gcc/testsuite/g++.dg/cpp26/expansion-stmt24.C
+ e4f69d4b2b27a3693509dcdd3e3fa00e  gcc/testsuite/g++.dg/cpp26/expansion-stmt25.C
+ c03cbe0eeea49adccea22e13d8e8abf1  gcc/testsuite/g++.dg/cpp26/expansion-stmt26.C
  6e0ba6570c6704c45f502e328e1b9c51  gcc/testsuite/g++.dg/cpp26/expansion-stmt27.C
  311dc4c09c0e312fcde6a0fa7a18ea60  gcc/testsuite/g++.dg/cpp26/expansion-stmt28.C
! 023f480b6fe6eb322955e11226585a32  gcc/testsuite/g++.dg/cpp26/expansion-stmt3.C
  05972a123b20a66b9c7899c2bb0b5042  gcc/testsuite/g++.dg/cpp26/expansion-stmt4.C
  7cfc2afc603d55bfd66b320b3d190acd  gcc/testsuite/g++.dg/cpp26/expansion-stmt5.C
  8419176a2bf5898de53901daf6efe2a9  gcc/testsuite/g++.dg/cpp26/expansion-stmt6.C
*************** edb46bdf72eaeb378f5f0d557153ad9d  gcc/te
*** 28207,28212 ****
--- 28199,28205 ----
  ce0107015099b9bc8bbb6308d69d1335  gcc/testsuite/g++.dg/cpp2a/concepts-decltype2.C
  20942197b42aecb2031c455e6c7139db  gcc/testsuite/g++.dg/cpp2a/concepts-decltype3.C
  bd5315a1ae1bb7ab6b080320eca4e7cc  gcc/testsuite/g++.dg/cpp2a/concepts-decltype4.C
+ 22508583fabe144a053070d600a2f4ff  gcc/testsuite/g++.dg/cpp2a/concepts-decltype5.C
  2ff1559b74cd8147b9de258edac783b1  gcc/testsuite/g++.dg/cpp2a/concepts-defarg1.C
  8b450b687a58857141c45425bdbf8e80  gcc/testsuite/g++.dg/cpp2a/concepts-defarg2.C
  e0a60fccd4fe206005be1e84cfb2682d  gcc/testsuite/g++.dg/cpp2a/concepts-defarg3.C
*************** d730bf14b7c6a0ff4579eb13739f7d2f  gcc/te
*** 28370,28375 ****
--- 28363,28371 ----
  10c26b1079f1b79e271e63ca28b96ecd  gcc/testsuite/g++.dg/cpp2a/concepts-pr112436.C
  bc013e85b03083defb9345b90c812b79  gcc/testsuite/g++.dg/cpp2a/concepts-pr116477.C
  4b3fe1ba64fb6a81fe92d55b090adf3a  gcc/testsuite/g++.dg/cpp2a/concepts-pr116681.C
+ 24814124a2638795704cea1177c1d93c  gcc/testsuite/g++.dg/cpp2a/concepts-pr122494.C
+ f5d0f986539b8cf3edb4d60aaa9e06d0  gcc/testsuite/g++.dg/cpp2a/concepts-pr123663.C
+ c3a5a8ffeaedc47bb7c475c240bce1c2  gcc/testsuite/g++.dg/cpp2a/concepts-pr123814.C
  2e23f19968091d773a47c43a32a784ae  gcc/testsuite/g++.dg/cpp2a/concepts-pr58500.C
  07c6a4dff1357ef61c0d30b12db5c948  gcc/testsuite/g++.dg/cpp2a/concepts-pr58534.C
  b6ba42db630bfd3259d65662fc03aaa0  gcc/testsuite/g++.dg/cpp2a/concepts-pr58535.C
*************** d29f558af48deff313645aecd90adb8d  gcc/te
*** 28754,28763 ****
  1d3b0e7bd64b76d92b8ff4d82aba48e9  gcc/testsuite/g++.dg/cpp2a/constexpr-prvalue1.C
  7ab8f2bb925385f3c907d1d36a81ac9b  gcc/testsuite/g++.dg/cpp2a/constexpr-prvalue2.C
  081a94c39fa972dab2d9f8590e087bc6  gcc/testsuite/g++.dg/cpp2a/constexpr-ref1.C
  fe2e298a3cf2e9094a79a25a4ffd8fc2  gcc/testsuite/g++.dg/cpp2a/constexpr-shift1.C
! 1d1e610556de3295af12cf17177f42b7  gcc/testsuite/g++.dg/cpp2a/constexpr-try1.C
! 27ac7e1957f04ea6ee6160a7f7c14ecc  gcc/testsuite/g++.dg/cpp2a/constexpr-try2.C
! c169c0f663257a769b1da0d94c0c7307  gcc/testsuite/g++.dg/cpp2a/constexpr-try3.C
  d74e93a21b21eb22ce0742e9b6bbb923  gcc/testsuite/g++.dg/cpp2a/constexpr-try4.C
  02c2a396d7fac0a627ada9a52c486da3  gcc/testsuite/g++.dg/cpp2a/constexpr-try5.C
  e8575fbcf5a3e212ea28a4b89fbf8253  gcc/testsuite/g++.dg/cpp2a/constexpr-typeid1.C
--- 28750,28760 ----
  1d3b0e7bd64b76d92b8ff4d82aba48e9  gcc/testsuite/g++.dg/cpp2a/constexpr-prvalue1.C
  7ab8f2bb925385f3c907d1d36a81ac9b  gcc/testsuite/g++.dg/cpp2a/constexpr-prvalue2.C
  081a94c39fa972dab2d9f8590e087bc6  gcc/testsuite/g++.dg/cpp2a/constexpr-ref1.C
+ 4e9e96fc4d4d62f845bac315ec17677d  gcc/testsuite/g++.dg/cpp2a/constexpr-ref2.C
  fe2e298a3cf2e9094a79a25a4ffd8fc2  gcc/testsuite/g++.dg/cpp2a/constexpr-shift1.C
! 1f5b8000b29315ba3af28b7bd9f18540  gcc/testsuite/g++.dg/cpp2a/constexpr-try1.C
! 998420d0a57cce98957e79abdb9865d3  gcc/testsuite/g++.dg/cpp2a/constexpr-try2.C
! 7735fb04b9642ba24ab00207340cff41  gcc/testsuite/g++.dg/cpp2a/constexpr-try3.C
  d74e93a21b21eb22ce0742e9b6bbb923  gcc/testsuite/g++.dg/cpp2a/constexpr-try4.C
  02c2a396d7fac0a627ada9a52c486da3  gcc/testsuite/g++.dg/cpp2a/constexpr-try5.C
  e8575fbcf5a3e212ea28a4b89fbf8253  gcc/testsuite/g++.dg/cpp2a/constexpr-typeid1.C
*************** da710eb2889fcf39c429bcbbfdc2abef  gcc/te
*** 29213,29218 ****
--- 29210,29216 ----
  475c14632e683c843d48238b8c5514f2  gcc/testsuite/g++.dg/cpp2a/pr114426.C
  9d5c0df7ab0b6e3e5ab03bc8eb135452  gcc/testsuite/g++.dg/cpp2a/pr117317-1.C
  4b52a1949fed25dc03d5cfb83047e7c5  gcc/testsuite/g++.dg/cpp2a/pr117317-2.C
+ 938acbb8068f7a8fc2c3f43271324ef4  gcc/testsuite/g++.dg/cpp2a/pr123578.C
  0695fd641b9e046ab279a8c21ce3e2b0  gcc/testsuite/g++.dg/cpp2a/pr123677.C
  7d1c1719a1c3e44cf69662819769f8a5  gcc/testsuite/g++.dg/cpp2a/pr88534.C
  3a4139bbe15eef2dce96cb020b2681f7  gcc/testsuite/g++.dg/cpp2a/pr88537.C
*************** bb6210157c020f23ddd7ebb126fc5a71  gcc/te
*** 29492,29497 ****
--- 29490,29496 ----
  b117227269644a100a7a06bf2bc9bf6f  gcc/testsuite/g++.dg/debug/dwarf2/pr101378.C
  660a2a2e1e89fe3e9cfe2899e7f1e627  gcc/testsuite/g++.dg/debug/dwarf2/pr104407.C
  b43f4d6e4f27dc96c0e870436aa41ff2  gcc/testsuite/g++.dg/debug/dwarf2/pr108716.C
+ 889184ba41631525c8808ff926aa3762  gcc/testsuite/g++.dg/debug/dwarf2/pr110885.C
  7054dc65c88179389afb9e79cad0df38  gcc/testsuite/g++.dg/debug/dwarf2/pr41063.C
  9118e81e091fae9d3d9c8c39a846e724  gcc/testsuite/g++.dg/debug/dwarf2/pr44641.C
  90028c65be83718cb8e154df1b502d99  gcc/testsuite/g++.dg/debug/dwarf2/pr45997-1.C
*************** bd9b993605b269dc55604ebbb4049ea6  gcc/te
*** 29791,29796 ****
--- 29790,29796 ----
  5d7c98f57af8d51803bc217bfb5be718  gcc/testsuite/g++.dg/diagnostic/ptrtomem1.C
  22810075c6736e148fdad4df31746f9b  gcc/testsuite/g++.dg/diagnostic/ptrtomem2.C
  31a4f22f01b86144e8c21918ef3d701b  gcc/testsuite/g++.dg/diagnostic/ptrtomem3.C
+ d075b059ce62ec565e4bd991cc4a0bd7  gcc/testsuite/g++.dg/diagnostic/ptrtomem4.C
  28d2cfc7c717fd3639026aaded3ecf23  gcc/testsuite/g++.dg/diagnostic/recur-align.C
  4ee1f32732b9fb22db15523307f14e5f  gcc/testsuite/g++.dg/diagnostic/redeclaration-1.C
  b366f10d78ca81d757eef37957892a2f  gcc/testsuite/g++.dg/diagnostic/redeclaration-2.C
*************** c381c4b49afc01681227afe62ee90730  gcc/te
*** 31239,31250 ****
  8d2f51c6219acb542e4c2677ca13822c  gcc/testsuite/g++.dg/gcov/gcov-15.C
  ededa0d876b23bc0fe9e743f3d0c0b44  gcc/testsuite/g++.dg/gcov/gcov-16.C
  e8dbfe76d290650a16be586144c7615c  gcc/testsuite/g++.dg/gcov/gcov-17.C
! 57de8c53a557c12f4442187a603e8d04  gcc/testsuite/g++.dg/gcov/gcov-18.C
  7aa62590e00d7efa953e27fe67ddbc81  gcc/testsuite/g++.dg/gcov/gcov-19.C
  2455bd4b9fa2af5fd0575899e21a2f69  gcc/testsuite/g++.dg/gcov/gcov-2.C
  b1029c1175d7075e7d5eecde29abeccd  gcc/testsuite/g++.dg/gcov/gcov-20.C
  47e027a95bd97879056be58bd4b8d7e0  gcc/testsuite/g++.dg/gcov/gcov-21.C
! 165abeae2952a999a1ae5519bf3d883d  gcc/testsuite/g++.dg/gcov/gcov-22.C
  1640d03782f51bc43a15596b0614cf56  gcc/testsuite/g++.dg/gcov/gcov-23-1.h
  167b6b9dc0c8d8fdcd57ab138cca6d8f  gcc/testsuite/g++.dg/gcov/gcov-23-2.h
  8495b0bdef14ea0acbbd658edf296ae6  gcc/testsuite/g++.dg/gcov/gcov-23.C
--- 31239,31250 ----
  8d2f51c6219acb542e4c2677ca13822c  gcc/testsuite/g++.dg/gcov/gcov-15.C
  ededa0d876b23bc0fe9e743f3d0c0b44  gcc/testsuite/g++.dg/gcov/gcov-16.C
  e8dbfe76d290650a16be586144c7615c  gcc/testsuite/g++.dg/gcov/gcov-17.C
! 08a1a827f9448f97581ed2d933681ede  gcc/testsuite/g++.dg/gcov/gcov-18.C
  7aa62590e00d7efa953e27fe67ddbc81  gcc/testsuite/g++.dg/gcov/gcov-19.C
  2455bd4b9fa2af5fd0575899e21a2f69  gcc/testsuite/g++.dg/gcov/gcov-2.C
  b1029c1175d7075e7d5eecde29abeccd  gcc/testsuite/g++.dg/gcov/gcov-20.C
  47e027a95bd97879056be58bd4b8d7e0  gcc/testsuite/g++.dg/gcov/gcov-21.C
! f5a1d6ce677b906bfb8219ed5270d8e3  gcc/testsuite/g++.dg/gcov/gcov-22.C
  1640d03782f51bc43a15596b0614cf56  gcc/testsuite/g++.dg/gcov/gcov-23-1.h
  167b6b9dc0c8d8fdcd57ab138cca6d8f  gcc/testsuite/g++.dg/gcov/gcov-23-2.h
  8495b0bdef14ea0acbbd658edf296ae6  gcc/testsuite/g++.dg/gcov/gcov-23.C
*************** b37a08c48590ee57a45669e3a61fc899  gcc/te
*** 31767,31773 ****
  dfe63b7d52f6d97e04da25f267ac330c  gcc/testsuite/g++.dg/graphite/pr42930.C
  4cf735ba9e5b65e201dbbd4ec916b359  gcc/testsuite/g++.dg/graphite/pr43026.C
  972ae62627d5778f45f285feb6661317  gcc/testsuite/g++.dg/guality/decomp1.C
! 3b9d501fc9eef91ef2236daa832c0d52  gcc/testsuite/g++.dg/guality/guality.exp
  2e0a2ac35d8a11426ad1e59f818a5d03  gcc/testsuite/g++.dg/guality/guality.h
  9f6bd16255ea79978f41ff1fd8300ddc  gcc/testsuite/g++.dg/guality/pr46815.C
  be57153d0806c5827262dfc205d1ddd5  gcc/testsuite/g++.dg/guality/pr55541.C
--- 31767,31773 ----
  dfe63b7d52f6d97e04da25f267ac330c  gcc/testsuite/g++.dg/graphite/pr42930.C
  4cf735ba9e5b65e201dbbd4ec916b359  gcc/testsuite/g++.dg/graphite/pr43026.C
  972ae62627d5778f45f285feb6661317  gcc/testsuite/g++.dg/guality/decomp1.C
! 096880536f5c5745bf4b6de14ae54539  gcc/testsuite/g++.dg/guality/guality.exp
  2e0a2ac35d8a11426ad1e59f818a5d03  gcc/testsuite/g++.dg/guality/guality.h
  9f6bd16255ea79978f41ff1fd8300ddc  gcc/testsuite/g++.dg/guality/pr46815.C
  be57153d0806c5827262dfc205d1ddd5  gcc/testsuite/g++.dg/guality/pr55541.C
*************** f1d9eed0025353353019a54838c87ed9  gcc/te
*** 33050,33056 ****
  56055cfb3b55c9e36f0d7e5af4adee7f  gcc/testsuite/g++.dg/lto/pr114790_0.C
  944a89dbdddf4ca4f396efb802bbd896  gcc/testsuite/g++.dg/lto/pr114790_1.C
  09299bd83d910caa117e38cf3391ebd9  gcc/testsuite/g++.dg/lto/pr118785_0.C
! 50e4e380af101cf3819f543c64d428ba  gcc/testsuite/g++.dg/lto/pr118817_0.C
  170fab8219ca5d2db78f5026f9bf82c8  gcc/testsuite/g++.dg/lto/pr119067_0.C
  c2fbc4281a4940f3ba50c956b391e55a  gcc/testsuite/g++.dg/lto/pr119067_1.C
  f8d194a431c9313cc0e794b5fcc15ac6  gcc/testsuite/g++.dg/lto/pr119614_0.C
--- 33050,33056 ----
  56055cfb3b55c9e36f0d7e5af4adee7f  gcc/testsuite/g++.dg/lto/pr114790_0.C
  944a89dbdddf4ca4f396efb802bbd896  gcc/testsuite/g++.dg/lto/pr114790_1.C
  09299bd83d910caa117e38cf3391ebd9  gcc/testsuite/g++.dg/lto/pr118785_0.C
! 0bf8e2e773617db748eeab48c9570419  gcc/testsuite/g++.dg/lto/pr118817_0.C
  170fab8219ca5d2db78f5026f9bf82c8  gcc/testsuite/g++.dg/lto/pr119067_0.C
  c2fbc4281a4940f3ba50c956b391e55a  gcc/testsuite/g++.dg/lto/pr119067_1.C
  f8d194a431c9313cc0e794b5fcc15ac6  gcc/testsuite/g++.dg/lto/pr119614_0.C
*************** d15d49ffd84e37cdcbb1e23564c8c44e  gcc/te
*** 33060,33065 ****
--- 33060,33066 ----
  33f0830281538872a0dd25b4e22f1759  gcc/testsuite/g++.dg/lto/pr122905.h
  da4bb7bd422fbc928dca8b82012b7265  gcc/testsuite/g++.dg/lto/pr122905_0.C
  7be91aa845a7810b3947d606a1ffa169  gcc/testsuite/g++.dg/lto/pr122905_1.C
+ c1520ffb1e8996e77b2da492ecc42175  gcc/testsuite/g++.dg/lto/pr123376_0.C
  ba9b686c163762488051ec4094a838b2  gcc/testsuite/g++.dg/lto/pr40818_0.C
  08a786b250f802e56e458c7d60a358fc  gcc/testsuite/g++.dg/lto/pr42987_0.C
  1b56fef803fe85ec97121919ad3ba2b9  gcc/testsuite/g++.dg/lto/pr42987_1.C
*************** d975bcfcc66f10d16ed8c046fec4ba04  gcc/te
*** 33219,33225 ****
  314ee1208d31d73f6b8581612ceea903  gcc/testsuite/g++.dg/modules/adl-11_a.C
  d5e6364be38f2a4bd3ffc35aed9b8edd  gcc/testsuite/g++.dg/modules/adl-11_b.C
  098dcbc5ef632f9258da5c6fdbafb2ff  gcc/testsuite/g++.dg/modules/adl-12_a.C
! 8872836fee2731305f41b19ed42637c2  gcc/testsuite/g++.dg/modules/adl-12_b.C
  9c824c1a28f6bcf79fd72186d79fe93c  gcc/testsuite/g++.dg/modules/adl-1_a.C
  3bb31e23ac383185d41cda2c5fcbdaf3  gcc/testsuite/g++.dg/modules/adl-1_b.C
  46103f57f3287176308fc33634d7da8e  gcc/testsuite/g++.dg/modules/adl-1_c.C
--- 33220,33226 ----
  314ee1208d31d73f6b8581612ceea903  gcc/testsuite/g++.dg/modules/adl-11_a.C
  d5e6364be38f2a4bd3ffc35aed9b8edd  gcc/testsuite/g++.dg/modules/adl-11_b.C
  098dcbc5ef632f9258da5c6fdbafb2ff  gcc/testsuite/g++.dg/modules/adl-12_a.C
! 3deaf8eb226b5b7cd4060737c498ff45  gcc/testsuite/g++.dg/modules/adl-12_b.C
  9c824c1a28f6bcf79fd72186d79fe93c  gcc/testsuite/g++.dg/modules/adl-1_a.C
  3bb31e23ac383185d41cda2c5fcbdaf3  gcc/testsuite/g++.dg/modules/adl-1_b.C
  46103f57f3287176308fc33634d7da8e  gcc/testsuite/g++.dg/modules/adl-1_c.C
*************** c39c3f7a341b146e69c63c081b322363  gcc/te
*** 33442,33462 ****
  01798381571908b0203cb2b810de2362  gcc/testsuite/g++.dg/modules/constexpr-if-1_b.C
  065c21c126c925a3e00aca89ecd68082  gcc/testsuite/g++.dg/modules/constrained-partial-1_a.C
  36ec67bdeefa980122cd592ead6b309b  gcc/testsuite/g++.dg/modules/constrained-partial-1_b.C
- 9df1ea9ca907c8f2312f674344fbc6da  gcc/testsuite/g++.dg/modules/contracts-1_a.C
- 7de452dd7c2dfe577b17d75b29cb4846  gcc/testsuite/g++.dg/modules/contracts-1_b.C
- f4deac9dd3dcb31606cfdadfcbb2b9fb  gcc/testsuite/g++.dg/modules/contracts-2_a.C
- 72311670b9ce8066ef64e3ff97af5c05  gcc/testsuite/g++.dg/modules/contracts-2_b.C
- c3aa378b4d40c2a73a91d1ed014b3379  gcc/testsuite/g++.dg/modules/contracts-2_c.C
- b472dba3fdf2a7c27b19a89b32625c82  gcc/testsuite/g++.dg/modules/contracts-3_a.C
- 022a467cbf4db8e57f28e8d77795ece8  gcc/testsuite/g++.dg/modules/contracts-3_b.C
- de63e89e94e5fff1212510906c8fadba  gcc/testsuite/g++.dg/modules/contracts-4_a.C
- ce1ebf06dbe7cdae676970830da2a4e7  gcc/testsuite/g++.dg/modules/contracts-4_b.C
- f536f28baebb566f8e0524872a79e757  gcc/testsuite/g++.dg/modules/contracts-4_c.C
- 628e576ce9c14f472e2d338d1fab5bd5  gcc/testsuite/g++.dg/modules/contracts-4_d.C
- fae22c7cff0bae185284077ff2e72523  gcc/testsuite/g++.dg/modules/contracts-5_a.C
- ddd245a6fdf7bbde1cb8101f2380e708  gcc/testsuite/g++.dg/modules/contracts-5_b.C
- 8924e09c1bf99205db3bf2a95baa7701  gcc/testsuite/g++.dg/modules/contracts-tpl-friend-1_a.C
- 0a66e0a40527f0507cceaeb322c91a15  gcc/testsuite/g++.dg/modules/contracts-tpl-friend-1_b.C
  097ffafa56bf8b6bcbb8f85c58b0e187  gcc/testsuite/g++.dg/modules/convop-1_a.C
  02940f3eec05ab2c1e44ea29d72255b6  gcc/testsuite/g++.dg/modules/convop-1_b.C
  f9fb2c7fc295df949a65ad17e27cbfe7  gcc/testsuite/g++.dg/modules/convop-2_a.H
--- 33443,33448 ----
*************** cde88381b648ca388094d436f6491fc7  gcc/te
*** 33800,33805 ****
--- 33786,33794 ----
  aa9990e199a4ca7bcea61cc9ef2c7056  gcc/testsuite/g++.dg/modules/init-7_b.C
  e46f6de7f74585cce611bff70b637ed9  gcc/testsuite/g++.dg/modules/inline-1_a.C
  aee9db0889b7fd5e3f8598900d34fd85  gcc/testsuite/g++.dg/modules/inline-1_b.C
+ 8f21a1a7f9e362a7c3403fc90a74c4f8  gcc/testsuite/g++.dg/modules/inst-10_a.C
+ e64c8ed90a2f6519daa2c42a6b57c533  gcc/testsuite/g++.dg/modules/inst-10_b.C
+ 74fd6485aafe9b4d5d2a6b558e5a71b3  gcc/testsuite/g++.dg/modules/inst-10_c.C
  30908e323612f1e35765a18cc68bc403  gcc/testsuite/g++.dg/modules/inst-1_a.C
  c1563babb7ad3b33d7a48b6846276373  gcc/testsuite/g++.dg/modules/inst-1_b.C
  3a7d1df29e3e9ca965b7f8c21b60b189  gcc/testsuite/g++.dg/modules/inst-2_a.C
*************** c8f6159c50d59c6586f5797b42391c86  gcc/te
*** 33814,33819 ****
--- 33803,33813 ----
  78bafa91ce71486fc147f8fef051956f  gcc/testsuite/g++.dg/modules/inst-6_b.C
  45f2bcdae473c2a99d7a5de022749d34  gcc/testsuite/g++.dg/modules/inst-7_a.C
  2b141f9dc25a6cb3cfca4a8e6b99e23d  gcc/testsuite/g++.dg/modules/inst-7_b.C
+ f24575ef22ac086e405d3ce32b928661  gcc/testsuite/g++.dg/modules/inst-8_a.C
+ b148ff221b4dd52919ebbac1b2c00afe  gcc/testsuite/g++.dg/modules/inst-8_b.C
+ 4ea72c920009dcb25464df5070120efd  gcc/testsuite/g++.dg/modules/inst-8_c.C
+ 6a0fd9d1ffd718902b044037bf0d78ab  gcc/testsuite/g++.dg/modules/inst-9_a.C
+ 6476ed8647b39bbe987f20b848825254  gcc/testsuite/g++.dg/modules/inst-9_b.C
  a345a5bfe397e84c45d084024a9acbf2  gcc/testsuite/g++.dg/modules/internal-1.C
  e6b16a33fb2c85abf4f99ad0d5ad33bb  gcc/testsuite/g++.dg/modules/internal-10.C
  8fe7459b1e2ebdf33715cdab3dbafaf9  gcc/testsuite/g++.dg/modules/internal-11.C
*************** a8cbc7218d2f85e1382a0c6fab6b026c  gcc/te
*** 34596,34601 ****
--- 34590,34597 ----
  0944092d3f91b04b84818ee55ea1cdcb  gcc/testsuite/g++.dg/modules/preproc-2_b.C
  c6e1edb52b5891ae1f08bf6d3cf18168  gcc/testsuite/g++.dg/modules/printf-1_a.H
  9c1772c0b13c48601f0ed1233cc497f1  gcc/testsuite/g++.dg/modules/printf-1_b.C
+ b41e83b0fbbe80aa3d6788f61b378834  gcc/testsuite/g++.dg/modules/reflect-1_a.H
+ 2400f655fe26c75ad6acf92a914b4d13  gcc/testsuite/g++.dg/modules/reflect-1_b.C
  5cd56fd1bbc5b89cb15ebc8d548cfaa0  gcc/testsuite/g++.dg/modules/reparent-1_a.C
  da0cfcb5ac1aec80b1194aff6f469086  gcc/testsuite/g++.dg/modules/reparent-1_b.C
  80377818c6b4a03409e16213b4ffc90a  gcc/testsuite/g++.dg/modules/reparent-1_c.C
*************** da0cfcb5ac1aec80b1194aff6f469086  gcc/te
*** 34603,34608 ****
--- 34599,34606 ----
  381497aeb07dcdcf0ac1dff8bae080e4  gcc/testsuite/g++.dg/modules/scc-2.C
  1ea36c9c27e88f193688e35c7e951ff1  gcc/testsuite/g++.dg/modules/shadow-1_a.C
  049e6f7d1e704ee70bcb37a5fe369595  gcc/testsuite/g++.dg/modules/shadow-1_b.C
+ d45376729207e4cfed2bc5fd08566e8d  gcc/testsuite/g++.dg/modules/splice-scope-tree_a.C
+ 3f1d1ad50918dd7069ad4793c05567ff  gcc/testsuite/g++.dg/modules/splice-scope-tree_b.C
  53de506d5cdbf9ce04c575dd3302dd90  gcc/testsuite/g++.dg/modules/src-loc-1.h
  903450e142559451ac9a44c43999cfa9  gcc/testsuite/g++.dg/modules/src-loc-1_a.H
  75032200eb312d5290471c55ee50f11f  gcc/testsuite/g++.dg/modules/src-loc-1_b.C
*************** e736fe25d4b99f710b70de0825fffdc1  gcc/te
*** 36805,36810 ****
--- 36803,36809 ----
  80867666af42eef238ead0c293e5bc0e  gcc/testsuite/g++.dg/pr121757.C
  e6de60b5642934aef50f416afd0dfef5  gcc/testsuite/g++.dg/pr122348.C
  0ad246e348b6ea4bf54b74b0d8e3dce0  gcc/testsuite/g++.dg/pr123383.C
+ 9b72294c06cceb517f37832e017f79c1  gcc/testsuite/g++.dg/pr123575.C
  2ac64817a39fe1a5c2dc328f4233cda1  gcc/testsuite/g++.dg/pr37742.C
  32b2fbda29ffd2ac2181c43c971f3a7d  gcc/testsuite/g++.dg/pr44328.C
  e43b4ea2d038b181b57782d5d56d22ba  gcc/testsuite/g++.dg/pr44486.C
*************** ba996bbdd4fa7d29eb83826ce56286db  gcc/te
*** 37044,37049 ****
--- 37043,37049 ----
  a1fd3a6a97a773f4f193235ad05dca1c  gcc/testsuite/g++.dg/reflect/alignment_of1.C
  db186235554be9b7c4c4cd1d64102448  gcc/testsuite/g++.dg/reflect/alignment_of2.C
  11bc606636185e720abfec102a446450  gcc/testsuite/g++.dg/reflect/annotations1.C
+ e0ee95e9b95793ee4d57f8204bf8645d  gcc/testsuite/g++.dg/reflect/annotations10.C
  34282065614c60c1eeb497cec04d2977  gcc/testsuite/g++.dg/reflect/annotations2.C
  fb8ce2f40d098f2bd078b7384d6665b6  gcc/testsuite/g++.dg/reflect/annotations3.C
  95036b72f565c8ac8e22eb21a94626f1  gcc/testsuite/g++.dg/reflect/annotations4.C
*************** fe0836ae8bc2eae4db9cf55e6fe58e5e  gcc/te
*** 37051,37056 ****
--- 37051,37057 ----
  52183ac252419247bd1a55d28d356534  gcc/testsuite/g++.dg/reflect/annotations6.C
  7197de7986e56e47fffcc516a0a6e28d  gcc/testsuite/g++.dg/reflect/annotations7.C
  bae6d6398266dd286951a779994c5fea  gcc/testsuite/g++.dg/reflect/annotations8.C
+ 82bae5061eb1327bb8aad907bc7464e6  gcc/testsuite/g++.dg/reflect/annotations9.C
  92881a77a05ad9d04320fc70d49d0772  gcc/testsuite/g++.dg/reflect/anon1.C
  240095cc5fa8d5e850cc3b6a3df6cdf5  gcc/testsuite/g++.dg/reflect/anon2.C
  c43e40fe08389dac58e1fabc0937b315  gcc/testsuite/g++.dg/reflect/anon3.C
*************** d7f568645ceb8b10a63daaa599492f93  gcc/te
*** 37103,37108 ****
--- 37104,37110 ----
  edae344ef3c025f6bb140bdcc41cfbac  gcc/testsuite/g++.dg/reflect/crash7.C
  d7c8a0736148c190a05cdcf0be278b45  gcc/testsuite/g++.dg/reflect/crash8.C
  f1964d85b7740c85c6c38271bf60d85d  gcc/testsuite/g++.dg/reflect/crash9.C
+ 4e6d9aa2459457638b2bf169d9aa74d9  gcc/testsuite/g++.dg/reflect/cwg3153.C
  70bab2b27c8038d6662ee1a47f3a127b  gcc/testsuite/g++.dg/reflect/data_member_spec1.C
  84824ffeeab45a95e4adbcc635355664  gcc/testsuite/g++.dg/reflect/data_member_spec2.C
  d9a7fd232d445f9b66afc3bae1204b42  gcc/testsuite/g++.dg/reflect/data_member_spec3.C
*************** ba847f7d57294ccd6b282e81baaaf83b  gcc/te
*** 37112,37118 ****
  c9d4dece58db866f00e39bcc4cadb5f8  gcc/testsuite/g++.dg/reflect/dealias3.C
  35fb9a6b3789fdd6b10d806ba69be6d5  gcc/testsuite/g++.dg/reflect/define_aggregate1.C
  f0f21ad05d20f33170e5464386bbc04a  gcc/testsuite/g++.dg/reflect/define_aggregate2.C
! 7b54a7bab7b1b68ff7081522927b7b63  gcc/testsuite/g++.dg/reflect/define_aggregate3.C
  04bc06581deb87721ec02d1eb0d3ea6e  gcc/testsuite/g++.dg/reflect/define_aggregate4.C
  1bc6bc2f0fee0e8ab828d7554483c997  gcc/testsuite/g++.dg/reflect/define_aggregate5.C
  bb13d688f1deb2ff9d5bf3af088bfaec  gcc/testsuite/g++.dg/reflect/define_static_array1.C
--- 37114,37120 ----
  c9d4dece58db866f00e39bcc4cadb5f8  gcc/testsuite/g++.dg/reflect/dealias3.C
  35fb9a6b3789fdd6b10d806ba69be6d5  gcc/testsuite/g++.dg/reflect/define_aggregate1.C
  f0f21ad05d20f33170e5464386bbc04a  gcc/testsuite/g++.dg/reflect/define_aggregate2.C
! 39bd2120b97c0707f5d4525b080369ff  gcc/testsuite/g++.dg/reflect/define_aggregate3.C
  04bc06581deb87721ec02d1eb0d3ea6e  gcc/testsuite/g++.dg/reflect/define_aggregate4.C
  1bc6bc2f0fee0e8ab828d7554483c997  gcc/testsuite/g++.dg/reflect/define_aggregate5.C
  bb13d688f1deb2ff9d5bf3af088bfaec  gcc/testsuite/g++.dg/reflect/define_static_array1.C
*************** c383f7bdf34cc8248e3fb9c61011574a  gcc/te
*** 37150,37155 ****
--- 37152,37158 ----
  2b40a02f1ed53b6bab1a344d5edd8aa2  gcc/testsuite/g++.dg/reflect/enumerators_of1.C
  04d9a22b5b43c4289de935dbccac2ed6  gcc/testsuite/g++.dg/reflect/error1.C
  30da2651e0378b27ad373e3c60c0aa0f  gcc/testsuite/g++.dg/reflect/error10.C
+ 2c9f13a2651383956671a08269662579  gcc/testsuite/g++.dg/reflect/error11.C
  69edf1172a90d65c86d8d9bb69b88b21  gcc/testsuite/g++.dg/reflect/error2.C
  eb3f835094fc060a3320066f75665133  gcc/testsuite/g++.dg/reflect/error3.C
  5caf93c84084cbeab5b7f76875d678ae  gcc/testsuite/g++.dg/reflect/error4.C
*************** b9523a1696257196719fca0c617d3dc0  gcc/te
*** 37163,37168 ****
--- 37166,37172 ----
  964315bf14acc51f2e2f42297e2050c2  gcc/testsuite/g++.dg/reflect/expr12.C
  d09ceac0ed381b8e6d87478d7da5ecea  gcc/testsuite/g++.dg/reflect/expr13.C
  cb62b6f411eaa0edabe6a10520d7652c  gcc/testsuite/g++.dg/reflect/expr14.C
+ 7d931bd0fd71d114fa6a17dce607e802  gcc/testsuite/g++.dg/reflect/expr15.C
  8a9b940805893540797936869da281d7  gcc/testsuite/g++.dg/reflect/expr2.C
  4acc2b0f142d132010d761dd1e262871  gcc/testsuite/g++.dg/reflect/expr3.C
  6db5cf1cb9ce8e043687a3df14680bc3  gcc/testsuite/g++.dg/reflect/expr4.C
*************** cb62b6f411eaa0edabe6a10520d7652c  gcc/te
*** 37171,37178 ****
  160b9d3b4135ae1cabc2c2562502ca2f  gcc/testsuite/g++.dg/reflect/expr7.C
  1cd7741d2f6f90710374d1931630135d  gcc/testsuite/g++.dg/reflect/expr8.C
  8fe2397dfdbd64875570160305cc0f58  gcc/testsuite/g++.dg/reflect/expr9.C
! 166ed633fdf7a3919373502387089502  gcc/testsuite/g++.dg/reflect/extract1.C
! 7976a4c8067258e3c7d7ddc773103c02  gcc/testsuite/g++.dg/reflect/extract2.C
  515a58bb25a97ee5979dc2cc0a4acce9  gcc/testsuite/g++.dg/reflect/extract3.C
  31ce562c358fd306cdee178e270282ea  gcc/testsuite/g++.dg/reflect/extract4.C
  a6e387dcf0ed9a031e5cfe55cef693b1  gcc/testsuite/g++.dg/reflect/extract5.C
--- 37175,37182 ----
  160b9d3b4135ae1cabc2c2562502ca2f  gcc/testsuite/g++.dg/reflect/expr7.C
  1cd7741d2f6f90710374d1931630135d  gcc/testsuite/g++.dg/reflect/expr8.C
  8fe2397dfdbd64875570160305cc0f58  gcc/testsuite/g++.dg/reflect/expr9.C
! fc8eb9caec31ed43b28a325abfd37d2c  gcc/testsuite/g++.dg/reflect/extract1.C
! 44596b8acd054952983a5a4fb33bd17a  gcc/testsuite/g++.dg/reflect/extract2.C
  515a58bb25a97ee5979dc2cc0a4acce9  gcc/testsuite/g++.dg/reflect/extract3.C
  31ce562c358fd306cdee178e270282ea  gcc/testsuite/g++.dg/reflect/extract4.C
  a6e387dcf0ed9a031e5cfe55cef693b1  gcc/testsuite/g++.dg/reflect/extract5.C
*************** ad9d237ed8234f3163d2b9a8acbde932  gcc/te
*** 37191,37196 ****
--- 37195,37201 ----
  28080947cbe6438236a470a7c524eb31  gcc/testsuite/g++.dg/reflect/has_external_linkage2.C
  0bac0e8ea55a7df3bc484a9d849e94b3  gcc/testsuite/g++.dg/reflect/has_identifier1.C
  f3106ee1db11e843e05f71450e20d8b8  gcc/testsuite/g++.dg/reflect/has_identifier2.C
+ 3a5b659b19871056077a9193dce7574b  gcc/testsuite/g++.dg/reflect/has_identifier3.C
  67a1dc2d6d970a18e4b9fdf8a8fb6435  gcc/testsuite/g++.dg/reflect/has_internal_linkage1.C
  c9c2fafb4e508a2604bd0e8375351d8b  gcc/testsuite/g++.dg/reflect/has_internal_linkage2.C
  579f5f3a28946b54f432a9aaf6ac1bd1  gcc/testsuite/g++.dg/reflect/has_linkage1.C
*************** de0f55ef9b96c27bd58bd2fbbc36e8cb  gcc/te
*** 37203,37208 ****
--- 37208,37214 ----
  ab1db2b0eb404ff32ef9a7071d76c8fd  gcc/testsuite/g++.dg/reflect/has_template_arguments4.C
  c06bd497360c05fbf80ffb2ffdbffe27  gcc/testsuite/g++.dg/reflect/identifier_of1.C
  4e38907428d25d2a0cf80b5f56cf6f64  gcc/testsuite/g++.dg/reflect/identifier_of2.C
+ 1c9e03241b17bfeb65c31a850c4486d8  gcc/testsuite/g++.dg/reflect/identifier_of3.C
  53caf8eb30ca80aa7c7b51f0275d8aae  gcc/testsuite/g++.dg/reflect/init1.C
  68f6f989d998918c473f8d79f1db76ef  gcc/testsuite/g++.dg/reflect/init10.C
  8dc0d0d0fae9dfaf4da9774c4db397c3  gcc/testsuite/g++.dg/reflect/init11.C
*************** b1714ceceb7e0124f79215552325258d  gcc/te
*** 37363,37369 ****
  922ffbde1e1334493256d8bd37992afa  gcc/testsuite/g++.dg/reflect/p2996-19.C
  abe6014fb8c7f438570842d11c32af7d  gcc/testsuite/g++.dg/reflect/p2996-2.C
  4baf88fa735613b6429392065c80f061  gcc/testsuite/g++.dg/reflect/p2996-20.C
! 008dc3191c443d76df953807d5a306ac  gcc/testsuite/g++.dg/reflect/p2996-21.C
  380a351dd42d378245189d701e554ac4  gcc/testsuite/g++.dg/reflect/p2996-3.C
  eec5e622402895b1825771f818559221  gcc/testsuite/g++.dg/reflect/p2996-4.C
  7660dc545dd65b782812f90cd7e599f0  gcc/testsuite/g++.dg/reflect/p2996-5.C
--- 37369,37375 ----
  922ffbde1e1334493256d8bd37992afa  gcc/testsuite/g++.dg/reflect/p2996-19.C
  abe6014fb8c7f438570842d11c32af7d  gcc/testsuite/g++.dg/reflect/p2996-2.C
  4baf88fa735613b6429392065c80f061  gcc/testsuite/g++.dg/reflect/p2996-20.C
! c6b9ef51e65252b828273284fddd3be9  gcc/testsuite/g++.dg/reflect/p2996-21.C
  380a351dd42d378245189d701e554ac4  gcc/testsuite/g++.dg/reflect/p2996-3.C
  eec5e622402895b1825771f818559221  gcc/testsuite/g++.dg/reflect/p2996-4.C
  7660dc545dd65b782812f90cd7e599f0  gcc/testsuite/g++.dg/reflect/p2996-5.C
*************** a50a28893edab692cde4895922fbf011  gcc/te
*** 37373,37379 ****
  7aa636eff74b58a4aab107bd1ff7b138  gcc/testsuite/g++.dg/reflect/p2996-9.C
  23678e784540231c2d9d8f8b014c26aa  gcc/testsuite/g++.dg/reflect/p3394-1.C
  f634f671906a4dd818a3550429747fcf  gcc/testsuite/g++.dg/reflect/p3491-1.C
! f12cfe43e8784d36383e098c848e4b46  gcc/testsuite/g++.dg/reflect/p3491-2.C
  2113071ef107b79c5882a0afe32e9a9b  gcc/testsuite/g++.dg/reflect/p3491-3.C
  9534bbaaa9101abab94bc5ffa3a293f6  gcc/testsuite/g++.dg/reflect/pack-index1.C
  d769c20d76953f9e88aaec8b648608d2  gcc/testsuite/g++.dg/reflect/parameters_of1.C
--- 37379,37385 ----
  7aa636eff74b58a4aab107bd1ff7b138  gcc/testsuite/g++.dg/reflect/p2996-9.C
  23678e784540231c2d9d8f8b014c26aa  gcc/testsuite/g++.dg/reflect/p3394-1.C
  f634f671906a4dd818a3550429747fcf  gcc/testsuite/g++.dg/reflect/p3491-1.C
! 4b19aace4fcf0826ec6564807f25c8ea  gcc/testsuite/g++.dg/reflect/p3491-2.C
  2113071ef107b79c5882a0afe32e9a9b  gcc/testsuite/g++.dg/reflect/p3491-3.C
  9534bbaaa9101abab94bc5ffa3a293f6  gcc/testsuite/g++.dg/reflect/pack-index1.C
  d769c20d76953f9e88aaec8b648608d2  gcc/testsuite/g++.dg/reflect/parameters_of1.C
*************** ee2a5065f194d0c1d1360c2d2a8f5d8b  gcc/te
*** 37389,37394 ****
--- 37395,37401 ----
  94dc78db487e798fab48a81afe367971  gcc/testsuite/g++.dg/reflect/parm4.C
  306b4ad2098e8b750ed54e51a41def85  gcc/testsuite/g++.dg/reflect/pr122634-1.C
  e32f838494e975d3bff555da160e533b  gcc/testsuite/g++.dg/reflect/pr122634-2.C
+ bcea9ee60707a95dc9fe1a749981578a  gcc/testsuite/g++.dg/reflect/pr123404.C
  e6404856d4cc9cc02aa5ebec3e5ecb82  gcc/testsuite/g++.dg/reflect/qrn1.C
  4ef5fc49aed920d8bfc3bc57a9ddef71  gcc/testsuite/g++.dg/reflect/qrn2.C
  82cc9bd702b6c4899eb3441b0289bca6  gcc/testsuite/g++.dg/reflect/range_args.C
*************** ef83de902dee2f6fe942c29156f8503f  gcc/te
*** 37437,37442 ****
--- 37444,37450 ----
  deddb1584f584cf686cd42b793483827  gcc/testsuite/g++.dg/reflect/subobjects_of1.C
  61f47186bb7769959e6cbcf0b286ddbe  gcc/testsuite/g++.dg/reflect/substitute1.C
  7412640ef90c2fa539ef91699f15ed14  gcc/testsuite/g++.dg/reflect/substitute2.C
+ fb988bd3ed4b676491a6a1bc94c867aa  gcc/testsuite/g++.dg/reflect/substitute3.C
  41d388bcacebad49d2c3fd3646f62c3e  gcc/testsuite/g++.dg/reflect/symbol_of1.C
  50aad9cdb1b735a5db8189b077851c47  gcc/testsuite/g++.dg/reflect/symbol_of2.C
  3c4a6b28fbbc43055df381d76f413b2f  gcc/testsuite/g++.dg/reflect/template_arguments_of1.C
*************** eb665dfa7b7ea47842e7a0ca1a4046e2  gcc/te
*** 38643,38648 ****
--- 38651,38657 ----
  e4d0b292389630976cca25f6a5808a1e  gcc/testsuite/g++.dg/template/permissive-error3.C
  14967698fd85bf0506454b2df17f8d2a  gcc/testsuite/g++.dg/template/pr108206.C
  47c32753e30b4754695e8eabfcc1e9f5  gcc/testsuite/g++.dg/template/pr119138.C
+ 7ccb75d299fb426ac22efe4f1aa75da1  gcc/testsuite/g++.dg/template/pr123354.C
  1cb28c70209f6da9c6fd5dc25fde1e1a  gcc/testsuite/g++.dg/template/pr16564.C
  ada1f30ea7c959c2a12b240ba308c1bf  gcc/testsuite/g++.dg/template/pr17410.C
  d87951fd4d4a384028f64a2c9e34ee94  gcc/testsuite/g++.dg/template/pr18969-2.C
*************** a7a00125ef903c9e5ba25788e8c60eab  gcc/te
*** 39474,39481 ****
--- 39483,39492 ----
  335f20fd55847f9861ff378b9be0f1bc  gcc/testsuite/g++.dg/torture/pr122589.C
  04115c46931023150cac2508ab43b9ff  gcc/testsuite/g++.dg/torture/pr122663.C
  ca9be1f2aa5374ea9f72ea31bc874ec1  gcc/testsuite/g++.dg/torture/pr123040.C
+ 2fa3f60c4a0ae3a4528024698d6d2c3c  gcc/testsuite/g++.dg/torture/pr123596.C
  fd8e483532e07909315ca8711ef4503b  gcc/testsuite/g++.dg/torture/pr123603.C
  ca7ea9ef86090651fbec9289f32896ab  gcc/testsuite/g++.dg/torture/pr123729.C
+ 6f13a12612ea67402e5ee7928ab2f956  gcc/testsuite/g++.dg/torture/pr123820-1.C
  161154ed9f6193a2a7da119e068c3f3f  gcc/testsuite/g++.dg/torture/pr27218.C
  a84e9fff95df4801f8e582fbc33303b8  gcc/testsuite/g++.dg/torture/pr30252.C
  e980bf95890544d46879b89f7aa98df6  gcc/testsuite/g++.dg/torture/pr30567.C
*************** c84bc79847f1966edf2b1f4b3b013e19  gcc/te
*** 40799,40813 ****
  f1360330e2c03adfb9e1efd9136d3f31  gcc/testsuite/g++.dg/warn/Winterference.H
  617b1baf48ffae995c6198567500b3c3  gcc/testsuite/g++.dg/warn/Winvalid-memory-model-2.C
  6cb792f5a5a29a4931676fce151db135  gcc/testsuite/g++.dg/warn/Winvalid-memory-model.C
! 34db2f7209b348047fb00924754975af  gcc/testsuite/g++.dg/warn/Wkeyword-macro-1.C
  46a0dc2739da6ef3dec0ccf4a8f1bd5d  gcc/testsuite/g++.dg/warn/Wkeyword-macro-10.C
! 8289c05e61a6e2a62fba79fe5b86504a  gcc/testsuite/g++.dg/warn/Wkeyword-macro-2.C
  31939dacc894b83bf87b967919a9307f  gcc/testsuite/g++.dg/warn/Wkeyword-macro-3.C
! e13ddcf0d17a8dbff902384c94492077  gcc/testsuite/g++.dg/warn/Wkeyword-macro-4.C
! b1b74991577f5555021582344f117413  gcc/testsuite/g++.dg/warn/Wkeyword-macro-5.C
  a3c8283eeafbf13da92766551f2fd977  gcc/testsuite/g++.dg/warn/Wkeyword-macro-6.C
! 9d4e645921de548093f9fc89214da439  gcc/testsuite/g++.dg/warn/Wkeyword-macro-7.C
! 415572e8e5dd27ae5d5045cec3bd1a01  gcc/testsuite/g++.dg/warn/Wkeyword-macro-8.C
  54ec408185e87ed7c6df79dfec246f29  gcc/testsuite/g++.dg/warn/Wkeyword-macro-9.C
  90a871726cae9dea93ce0da4b5bb7b2c  gcc/testsuite/g++.dg/warn/Wlogical-op-1.C
  13ee95f1cd2836b595541e2a9917c06d  gcc/testsuite/g++.dg/warn/Wlogical-op-2.C
--- 40810,40824 ----
  f1360330e2c03adfb9e1efd9136d3f31  gcc/testsuite/g++.dg/warn/Winterference.H
  617b1baf48ffae995c6198567500b3c3  gcc/testsuite/g++.dg/warn/Winvalid-memory-model-2.C
  6cb792f5a5a29a4931676fce151db135  gcc/testsuite/g++.dg/warn/Winvalid-memory-model.C
! dfbfe78280378b98a8f5518da6b9efa2  gcc/testsuite/g++.dg/warn/Wkeyword-macro-1.C
  46a0dc2739da6ef3dec0ccf4a8f1bd5d  gcc/testsuite/g++.dg/warn/Wkeyword-macro-10.C
! 5d1777df16d4987b2e87c9bb868385fa  gcc/testsuite/g++.dg/warn/Wkeyword-macro-2.C
  31939dacc894b83bf87b967919a9307f  gcc/testsuite/g++.dg/warn/Wkeyword-macro-3.C
! 09a84db0f2b2fd3a239eb544d2905ecd  gcc/testsuite/g++.dg/warn/Wkeyword-macro-4.C
! 499b6b42e74c9ed3185d166d9e6ffca2  gcc/testsuite/g++.dg/warn/Wkeyword-macro-5.C
  a3c8283eeafbf13da92766551f2fd977  gcc/testsuite/g++.dg/warn/Wkeyword-macro-6.C
! c44b482b3e5629ae60bc4bb3aba71f0e  gcc/testsuite/g++.dg/warn/Wkeyword-macro-7.C
! c58ddf7b4d6a7e65c36e0a8744324095  gcc/testsuite/g++.dg/warn/Wkeyword-macro-8.C
  54ec408185e87ed7c6df79dfec246f29  gcc/testsuite/g++.dg/warn/Wkeyword-macro-9.C
  90a871726cae9dea93ce0da4b5bb7b2c  gcc/testsuite/g++.dg/warn/Wlogical-op-1.C
  13ee95f1cd2836b595541e2a9917c06d  gcc/testsuite/g++.dg/warn/Wlogical-op-2.C
*************** a5706ac002500d657b5e8cd77cc6c62e  gcc/te
*** 40819,40824 ****
--- 40830,40836 ----
  beb0dbeb6a47cd7fb34d04b431670905  gcc/testsuite/g++.dg/warn/Wmismatched-dealloc-3.C
  d183cd43f2c2caf1b71024ba3762ff44  gcc/testsuite/g++.dg/warn/Wmismatched-dealloc.C
  c64dfbca6c8c86f3fd65230eca021a72  gcc/testsuite/g++.dg/warn/Wmismatched-new-delete-10.C
+ f72bc349aab475639613f4efcb794547  gcc/testsuite/g++.dg/warn/Wmismatched-new-delete-11.C
  42ee652001dccee4183620c0e4744fe5  gcc/testsuite/g++.dg/warn/Wmismatched-new-delete-2.C
  5c4cad449e21fe0fade92c9c0d19fb5f  gcc/testsuite/g++.dg/warn/Wmismatched-new-delete-3.C
  da3dbc8526151b41f4a741a5d5e51eae  gcc/testsuite/g++.dg/warn/Wmismatched-new-delete-4.C
*************** f11e1a6a7c64d32c0698605c42c159c1  gcc/te
*** 41206,41211 ****
--- 41218,41224 ----
  b70117657eaf5edbb95110248d7ee800  gcc/testsuite/g++.dg/warn/Wunused-result-1.C
  fba202d17d94d19c21e05a678c6a5ab1  gcc/testsuite/g++.dg/warn/Wunused-result-2.C
  9f58f786374ace9197727c146cea66dd  gcc/testsuite/g++.dg/warn/Wunused-value-1.C
+ fa65c8a17eb4d8c1f0c9d7ddacd6222e  gcc/testsuite/g++.dg/warn/Wunused-value-2.C
  4f806576508d70a95ed2a3e232685cdb  gcc/testsuite/g++.dg/warn/Wunused-var-1.C
  898eca8edc4214a3f0d47032d1e29a12  gcc/testsuite/g++.dg/warn/Wunused-var-10.C
  16cd18b051568e2b0d1ed53dfcd6fc38  gcc/testsuite/g++.dg/warn/Wunused-var-11.C
*************** a0153f267ad41a4cf2f1dec39837d246  gcc/te
*** 41242,41247 ****
--- 41255,41261 ----
  62e5565091b4ee3f018515196f818bf3  gcc/testsuite/g++.dg/warn/Wunused-var-4.C
  606f86572bc9564c5ed0c9466b934826  gcc/testsuite/g++.dg/warn/Wunused-var-40.C
  839875d50b4cd9e29a5ec7ec6e3caa5c  gcc/testsuite/g++.dg/warn/Wunused-var-41.C
+ 0ff99bf5bf8ae9c044ba947d933dc4fc  gcc/testsuite/g++.dg/warn/Wunused-var-42.C
  d9191ea69f8ac18b1043d3d093b1f0d4  gcc/testsuite/g++.dg/warn/Wunused-var-5.C
  87a6fe8bfeffa1f31aecfb6dc5c8fc8e  gcc/testsuite/g++.dg/warn/Wunused-var-6.C
  b81dd316dd30881afe998cc16667340f  gcc/testsuite/g++.dg/warn/Wunused-var-7.C
*************** fd781106015aa6f32bb0ad12d1e80935  gcc/te
*** 44967,44973 ****
  7b30fde3730816af5ad53763f001bd2f  gcc/testsuite/g++.target/aarch64/sve/acle/general-c++/mangle_2.C
  aa5ae7dedc3137f2bc59209d71b89d2c  gcc/testsuite/g++.target/aarch64/sve/acle/general-c++/mangle_3.C
  aca4d0c6e319097278c90dee3556a543  gcc/testsuite/g++.target/aarch64/sve/acle/general-c++/mangle_4.C
! fe57505c46b08e38df135a955ead2a35  gcc/testsuite/g++.target/aarch64/sve/acle/general-c++/mangle_5.C
  d240ace103b7a81954fe13e097eef13f  gcc/testsuite/g++.target/aarch64/sve/acle/general-c++/mangle_6.C
  907f52337519a36ac48fa5195f4a4a6f  gcc/testsuite/g++.target/aarch64/sve/acle/general-c++/mangle_7.C
  a7eae168d83de853575601b19b0a73a1  gcc/testsuite/g++.target/aarch64/sve/acle/general-c++/mangle_8.C
--- 44981,44987 ----
  7b30fde3730816af5ad53763f001bd2f  gcc/testsuite/g++.target/aarch64/sve/acle/general-c++/mangle_2.C
  aa5ae7dedc3137f2bc59209d71b89d2c  gcc/testsuite/g++.target/aarch64/sve/acle/general-c++/mangle_3.C
  aca4d0c6e319097278c90dee3556a543  gcc/testsuite/g++.target/aarch64/sve/acle/general-c++/mangle_4.C
! 22623a1bf6348258468f423ec5b64867  gcc/testsuite/g++.target/aarch64/sve/acle/general-c++/mangle_5.C
  d240ace103b7a81954fe13e097eef13f  gcc/testsuite/g++.target/aarch64/sve/acle/general-c++/mangle_6.C
  907f52337519a36ac48fa5195f4a4a6f  gcc/testsuite/g++.target/aarch64/sve/acle/general-c++/mangle_7.C
  a7eae168d83de853575601b19b0a73a1  gcc/testsuite/g++.target/aarch64/sve/acle/general-c++/mangle_8.C
*************** d127e2f7300195708178a6cec8648544  gcc/te
*** 45320,45325 ****
--- 45334,45340 ----
  f5a1d06c17cacf90f627c83c8b800a78  gcc/testsuite/g++.target/i386/pr122446-amxtf32.C
  ffbb5e0bd5668625c6d5cef769228118  gcc/testsuite/g++.target/i386/pr122446-amxtile.C
  59940f4c4aa7fabb09c136a75c51dbfc  gcc/testsuite/g++.target/i386/pr122906-1.C
+ fe98d8bd643079ebf7d12496d3189d03  gcc/testsuite/g++.target/i386/pr123779.C
  55fb67abf6517f92b1a0240d2c06b5c5  gcc/testsuite/g++.target/i386/pr35513-1.C
  14dde546e4eefec7aa6d1ac41261cb16  gcc/testsuite/g++.target/i386/pr35513-2.C
  1c706f97b6d93c0124dc4a203c98f6d2  gcc/testsuite/g++.target/i386/pr57362.C
*************** e296551bbee90148974ff78d5066caf7  gcc/te
*** 45599,45604 ****
--- 45614,45622 ----
  a6a5d652323c20e5b2bbc8ea9dc8f4d7  gcc/testsuite/g++.target/riscv/rvv/base/pr114714-1.C
  49cbe2dffc749d3ef1398685b035f4c9  gcc/testsuite/g++.target/riscv/rvv/base/pr114714-2.C
  c358c32e7ca409abcc867a3b5248f5bd  gcc/testsuite/g++.target/riscv/rvv/base/pr116883.C
+ 5278ec1993abdc95652f6d706ddaa862  gcc/testsuite/g++.target/riscv/rvv/base/pr123806.C
+ bb74b6c9495308ab73ce64ff3cfd9543  gcc/testsuite/g++.target/riscv/rvv/base/pr123808-2.C
+ 1079f987e4481f60dedf174de12857cb  gcc/testsuite/g++.target/riscv/rvv/base/pr123808.C
  979e78c5ed1d2ba91a46584480362b26  gcc/testsuite/g++.target/riscv/rvv/base/riscv_vector.h
  874d1adf030c6930443f00e75573b0e8  gcc/testsuite/g++.target/riscv/rvv/rvv.exp
  0f6d3519b642a314a2ed539fd0c405c3  gcc/testsuite/g++.target/riscv/rvv/xtheadvector/pr116593.C
*************** e88a36f4cba0e85d5491d4b566b19508  gcc/te
*** 48922,48927 ****
--- 48940,48946 ----
  eda2af339f8dd266a02b2d61a5444a03  gcc/testsuite/gcc.c-torture/execute/pr120677.c
  529fc2a1e92dc790d3766cd8554fc89c  gcc/testsuite/gcc.c-torture/execute/pr122943.c
  55bc090de1c97a85eaf8103e85c7cb36  gcc/testsuite/gcc.c-torture/execute/pr123753.c
+ cb4c82184137c0933c1bae60a7df15bc  gcc/testsuite/gcc.c-torture/execute/pr123864.c
  80c02c70a0b6b91b06942e395c34960f  gcc/testsuite/gcc.c-torture/execute/pr15262-1.c
  987c511633ad57d9f08d352eb9512819  gcc/testsuite/gcc.c-torture/execute/pr15262-2.c
  f7f514cfbd791b0c828e0710493b0910  gcc/testsuite/gcc.c-torture/execute/pr15262.c
*************** ebabbb9693ff5ff6e0081d269f719eeb  gcc/te
*** 50676,50681 ****
--- 50695,50702 ----
  0fec3e8bbcc3a193f4e6d57c5f2d57b5  gcc/testsuite/gcc.dg/analyzer/fdump-analyzer-1.c
  1761d210a631bde55c4d4207134fd68c  gcc/testsuite/gcc.dg/analyzer/feasibility-pr107582-1.c
  e3febbf18f1dc3e8c6dbca7b8d1ca64a  gcc/testsuite/gcc.dg/analyzer/feasibility-pr107582-2.c
+ a66c078d5308a5d866c8a896a395850c  gcc/testsuite/gcc.dg/analyzer/fexceptions-1.c
+ e22f76937985c3910da40f56f9d7126a  gcc/testsuite/gcc.dg/analyzer/fexceptions-2.c
  b29483f2758f47b95759473be5a64ba6  gcc/testsuite/gcc.dg/analyzer/file-2.c
  74551d8bd5683960b9795e840ed3cad4  gcc/testsuite/gcc.dg/analyzer/file-CWE-1341-example.c
  60112ba55cc527ed2f374a5469b8bb21  gcc/testsuite/gcc.dg/analyzer/file-paths-1.c
*************** a633f425b4fdde0a7b6f0aa6aa2f2754  gcc/te
*** 55191,55196 ****
--- 55212,55218 ----
  e3e4142185603ce8e378d6382feeb5b4  gcc/testsuite/gcc.dg/gomp/pr110485.c
  7d1b62adb42c340855e993cf480a19ec  gcc/testsuite/gcc.dg/gomp/pr114075.c
  ec1d4016ba60492b723014b99d2804e6  gcc/testsuite/gcc.dg/gomp/pr121453.c
+ c80489ac8415077c5335cf251371d6e9  gcc/testsuite/gcc.dg/gomp/pr123876.c
  7a163e65fe52b23fc85f2daa18c442ee  gcc/testsuite/gcc.dg/gomp/pr25874.c
  597de3ed24e1bc1c650af918589d83c3  gcc/testsuite/gcc.dg/gomp/pr25989.c
  0bd3e8dc860de61dd8e09229c090e1f5  gcc/testsuite/gcc.dg/gomp/pr25990.c
*************** b9aafcde73d659e8a8f12aec94a7cb09  gcc/te
*** 55707,55713 ****
  46fe10dc7c2a1b21f0d7af66c601ad44  gcc/testsuite/gcc.dg/guality/drap.c
  35524176317603e370c0e34f6d8bd9ae  gcc/testsuite/gcc.dg/guality/example.c
  163a14c7ee9331fc07d3026f1cde9d39  gcc/testsuite/gcc.dg/guality/guality.c
! df6217502c4d9846c2c75fb9c35c7c66  gcc/testsuite/gcc.dg/guality/guality.exp
  bba006bb14e8c87a0c0ad605f571cf68  gcc/testsuite/gcc.dg/guality/guality.h
  2d9c26760bf9d33b3f102b5e17c22c93  gcc/testsuite/gcc.dg/guality/inline-params-2.c
  3e4b160c43920e148f7c88f96f5b4f0d  gcc/testsuite/gcc.dg/guality/inline-params.c
--- 55729,55735 ----
  46fe10dc7c2a1b21f0d7af66c601ad44  gcc/testsuite/gcc.dg/guality/drap.c
  35524176317603e370c0e34f6d8bd9ae  gcc/testsuite/gcc.dg/guality/example.c
  163a14c7ee9331fc07d3026f1cde9d39  gcc/testsuite/gcc.dg/guality/guality.c
! 9d932888c53d0861ed741956748848d4  gcc/testsuite/gcc.dg/guality/guality.exp
  bba006bb14e8c87a0c0ad605f571cf68  gcc/testsuite/gcc.dg/guality/guality.h
  2d9c26760bf9d33b3f102b5e17c22c93  gcc/testsuite/gcc.dg/guality/inline-params-2.c
  3e4b160c43920e148f7c88f96f5b4f0d  gcc/testsuite/gcc.dg/guality/inline-params.c
*************** cb2a225c4939c4a047c2574e784b9149  gcc/te
*** 57412,57417 ****
--- 57434,57440 ----
  bf966c5170e7d5a196dbbed9b62c61d6  gcc/testsuite/gcc.dg/pointer-counted-by-8.c
  60dd9bdbbdf292a0cb9bf8d4a0cadb6a  gcc/testsuite/gcc.dg/pointer-counted-by-9.c
  d181d80816e4d3b133dc856fe8132a79  gcc/testsuite/gcc.dg/pointer-counted-by-pr122982.c
+ 3cff3609a2ae388c53d9c12d872e8647  gcc/testsuite/gcc.dg/pointer-counted-by-pr123500.c
  fab3b399e4fdba4426e862fa979f170a  gcc/testsuite/gcc.dg/pointer-counted-by.c
  098a9eb0b304a107d7e16d34e57694dd  gcc/testsuite/gcc.dg/pointer-range-check-1.c
  f5883b8a2323e7318237e3750e037d52  gcc/testsuite/gcc.dg/pointer-range-check-2.c
*************** b4bb8ae97fc12f1c66b22b9149ca7a2b  gcc/te
*** 57754,57759 ****
--- 57777,57783 ----
  45f9003776530da05643fd2fcd9640b8  gcc/testsuite/gcc.dg/pr109392.c
  bfcc628fc6999e234d82894274b24215  gcc/testsuite/gcc.dg/pr109393.c
  c84c4385dc7b913c1ab044bf620d7696  gcc/testsuite/gcc.dg/pr109409.c
+ e3305bd5445d5fff018b1f9ab0c905d3  gcc/testsuite/gcc.dg/pr109410-2.c
  8c5ddd68de1ed874eb52f91b7136909e  gcc/testsuite/gcc.dg/pr109410.c
  3399ef12e5625e30f72a928ee7afca74  gcc/testsuite/gcc.dg/pr109412.c
  86a351ab8a6255c1c7e39f673dcac916  gcc/testsuite/gcc.dg/pr109417.c
*************** afeafc726f9068066b4e782197455056  gcc/te
*** 58079,58086 ****
--- 58103,58112 ----
  3e218010f127737b8ec6efbf8cb00273  gcc/testsuite/gcc.dg/pr123431.c
  4288ef3d117ee2b6aabf0d6303eeb663  gcc/testsuite/gcc.dg/pr123435-1.c
  4e3fe4e93ab76bd43ab7833b477c70e9  gcc/testsuite/gcc.dg/pr123435-2.c
+ b2e314205231dfc3005d83207407379b  gcc/testsuite/gcc.dg/pr123447.c
  0da2c71eea90fdad386d74777acfa661  gcc/testsuite/gcc.dg/pr123463.c
  e43dcd43531182c1839bc3842972ef9a  gcc/testsuite/gcc.dg/pr123475.c
+ 2e58c4d553f61913c629f0f4e16cef6c  gcc/testsuite/gcc.dg/pr123537.c
  40c720d493fdf466beac8d906dcdb821  gcc/testsuite/gcc.dg/pr123544.c
  b64bff50aa325d3cdf648a6b7fec2e46  gcc/testsuite/gcc.dg/pr123656.c
  01c4bfafe1ef8627df22f4a8e2581122  gcc/testsuite/gcc.dg/pr123803-1.c
*************** bcd4b5d9c82e28d29459255dca15732c  gcc/te
*** 59852,59858 ****
  007da9cc3379de76a6986f6c8d62f1aa  gcc/testsuite/gcc.dg/pr90733.c
  afa570e1edc03a94c45eb741b09cab0a  gcc/testsuite/gcc.dg/pr90756.c
  a5cf54d159902a526ee7923257cf4b92  gcc/testsuite/gcc.dg/pr90760.c
! 1c5d999cbda5348ede38dd1e44c25c67  gcc/testsuite/gcc.dg/pr90838-2.c
  beae814e6dc914f051a52e4cc97fc212  gcc/testsuite/gcc.dg/pr90838.c
  e25de604fa47d4cbf21b04eb8d96eedc  gcc/testsuite/gcc.dg/pr90866-2.c
  1e31e24165ead8e639abcd53299950b0  gcc/testsuite/gcc.dg/pr90866.c
--- 59878,59884 ----
  007da9cc3379de76a6986f6c8d62f1aa  gcc/testsuite/gcc.dg/pr90733.c
  afa570e1edc03a94c45eb741b09cab0a  gcc/testsuite/gcc.dg/pr90756.c
  a5cf54d159902a526ee7923257cf4b92  gcc/testsuite/gcc.dg/pr90760.c
! 5886ac77855adf1bbbf2e48e7c67e8a3  gcc/testsuite/gcc.dg/pr90838-2.c
  beae814e6dc914f051a52e4cc97fc212  gcc/testsuite/gcc.dg/pr90838.c
  e25de604fa47d4cbf21b04eb8d96eedc  gcc/testsuite/gcc.dg/pr90866-2.c
  1e31e24165ead8e639abcd53299950b0  gcc/testsuite/gcc.dg/pr90866.c
*************** f5aad1409cbbb9e3039cb7da55080bc6  gcc/te
*** 61642,61647 ****
--- 61668,61674 ----
  14f1b7a5c96c7b0b8a599f2567caf3e0  gcc/testsuite/gcc.dg/torture/pr109652.c
  2187f595796e8269bf267180b56e18a8  gcc/testsuite/gcc.dg/torture/pr109689.c
  c1a87948bd38764af99342569982d720  gcc/testsuite/gcc.dg/torture/pr109940.c
+ cfb24796cf777565d6ee8e3cc9faa0c1  gcc/testsuite/gcc.dg/torture/pr110043.c
  c68e0fca588779377278aa9e84380d07  gcc/testsuite/gcc.dg/torture/pr110176.c
  0c0edd5cb473e3baec880eabda166963  gcc/testsuite/gcc.dg/torture/pr110228.c
  37a4a130bd302ce957ac9e65b5949c60  gcc/testsuite/gcc.dg/torture/pr110243.c
*************** fd4292c0fcabd728ea0a1a6dbef87843  gcc/te
*** 61662,61667 ****
--- 61689,61695 ----
  b6cc54f5d02a9045680d8ba8b767f7b8  gcc/testsuite/gcc.dg/torture/pr110924.c
  4dd66a9e59fc17c29835a93cd50deb03  gcc/testsuite/gcc.dg/torture/pr110979.c
  fa1cc5eb743efae6b534499912897d96  gcc/testsuite/gcc.dg/torture/pr111000.c
+ 7423e38f878a6e56fb7be82847619a5b  gcc/testsuite/gcc.dg/torture/pr111036.c
  1dd35b4e28b7f72f0b12fbe3e5efb60a  gcc/testsuite/gcc.dg/torture/pr111048.c
  b3155d2832f93397879a73cc5d6f43b5  gcc/testsuite/gcc.dg/torture/pr111128.c
  a5aabe56aa9f2db146fb1185eabbfacb  gcc/testsuite/gcc.dg/torture/pr111137.c
*************** a416af0125bad612c0cf46a5d6401e54  gcc/te
*** 61760,61766 ****
--- 61788,61796 ----
  cbf3e9074438c0fc59d7ba99a6377906  gcc/testsuite/gcc.dg/torture/pr116199.c
  781d8c238ddfb27c94a693a296ccb610  gcc/testsuite/gcc.dg/torture/pr116278-run-1.c
  164e88d40fc4ae642a6d4b4c04eb1f53  gcc/testsuite/gcc.dg/torture/pr116278-run-2.c
+ d55420193b502affe4f12bc50e33bc30  gcc/testsuite/gcc.dg/torture/pr116296.c
  2681c6cd00e71033ee5e58d3d2e24776  gcc/testsuite/gcc.dg/torture/pr116343.c
+ fbebe679c0053fe0dbd10a5567a4afc8  gcc/testsuite/gcc.dg/torture/pr116353.c
  99a6c1e6285db8d08064cd8aaa300ddd  gcc/testsuite/gcc.dg/torture/pr116380.c
  b0e70276ca1233459713c4c0637f5c31  gcc/testsuite/gcc.dg/torture/pr116409-1.c
  f27636f881a25ebf0106fc22010ddea9  gcc/testsuite/gcc.dg/torture/pr116409-2.c
*************** a0d2174875961d5bb3004aad3d93d7d7  gcc/te
*** 61844,61850 ****
  353122537d1fab324ea4a55eef804498  gcc/testsuite/gcc.dg/torture/pr120322.c
  e9469d38b4234580f9b2284233404b3c  gcc/testsuite/gcc.dg/torture/pr120341-1.c
  aef01c040da8abd2a1e547ed6a07eb5a  gcc/testsuite/gcc.dg/torture/pr120341-2.c
! 12e839fd30c3a301bab4708aee3c9815  gcc/testsuite/gcc.dg/torture/pr120347.c
  590593d14c26e1d9ed776d01fc734a3c  gcc/testsuite/gcc.dg/torture/pr120369-1.c
  437bb98a945fa9a075fd7999043aea48  gcc/testsuite/gcc.dg/torture/pr120627.c
  15a8688591ba36e20af2698689b7985d  gcc/testsuite/gcc.dg/torture/pr120654.c
--- 61874,61880 ----
  353122537d1fab324ea4a55eef804498  gcc/testsuite/gcc.dg/torture/pr120322.c
  e9469d38b4234580f9b2284233404b3c  gcc/testsuite/gcc.dg/torture/pr120341-1.c
  aef01c040da8abd2a1e547ed6a07eb5a  gcc/testsuite/gcc.dg/torture/pr120341-2.c
! 4a4948f29f25c101f9c54f3a82dbd2f2  gcc/testsuite/gcc.dg/torture/pr120347.c
  590593d14c26e1d9ed776d01fc734a3c  gcc/testsuite/gcc.dg/torture/pr120369-1.c
  437bb98a945fa9a075fd7999043aea48  gcc/testsuite/gcc.dg/torture/pr120627.c
  15a8688591ba36e20af2698689b7985d  gcc/testsuite/gcc.dg/torture/pr120654.c
*************** fcc3a6f68a967a257f515d11f06532c2  gcc/te
*** 61879,61884 ****
--- 61909,61915 ----
  86ec8497180b8c6845f5efb789a8d30e  gcc/testsuite/gcc.dg/torture/pr122497-1.c
  9c3c67f35d37e9bc1f80a29aa6076d40  gcc/testsuite/gcc.dg/torture/pr122502-2.c
  d9ab318bf88df260c040cad6b5bc8c90  gcc/testsuite/gcc.dg/torture/pr122502.c
+ 98c07926a433421f3c019c7e8bf58ed7  gcc/testsuite/gcc.dg/torture/pr122537.c
  71ac92084dafbcb1599ceaab894a55dd  gcc/testsuite/gcc.dg/torture/pr122599-1.c
  a9aaac3c1ee96431c6d95bd2eb3c3f27  gcc/testsuite/gcc.dg/torture/pr122608.c
  92cb155ee587c0fd7ecfd8db4495488b  gcc/testsuite/gcc.dg/torture/pr122615.c
*************** ea90221ab80b5c3561ffc7665d2a343a  gcc/te
*** 61908,61913 ****
--- 61939,61948 ----
  c6c07c813f67e0f94f1352f2810dfcff  gcc/testsuite/gcc.dg/torture/pr123645-2.c
  0264a38a252a9bd05d889f4ee2e9545e  gcc/testsuite/gcc.dg/torture/pr123745-1.c
  2b277b12c644f4c0f67813086cbd7ef8  gcc/testsuite/gcc.dg/torture/pr123778-1.c
+ 053ce33a7901c282d6579ebfeeb644e7  gcc/testsuite/gcc.dg/torture/pr123799.c
+ 50838f4736657229a26dc1b011faf8d3  gcc/testsuite/gcc.dg/torture/pr123864.c
+ 846de4745dc42cf6d9abe36308df2301  gcc/testsuite/gcc.dg/torture/pr123887-2.c
+ 45e84720260c50c6a2acdec6f8eec9ca  gcc/testsuite/gcc.dg/torture/pr123887.c
  ded4330fd1cd52783bd9b1761db038ef  gcc/testsuite/gcc.dg/torture/pr16104-1.c
  fc265ee05da2f29f0e92804661cd1f28  gcc/testsuite/gcc.dg/torture/pr17526.c
  01c583edb41b632b835aa892b9c1cb14  gcc/testsuite/gcc.dg/torture/pr17933-1.c
*************** ab9071615cb96e67306f62799834192d  gcc/te
*** 63584,63589 ****
--- 63619,63625 ----
  59586da5802c2692704af77142f2cdc1  gcc/testsuite/gcc.dg/tree-ssa/cselim-1.c
  51c7fe6b74c96edaad81a1100523cefb  gcc/testsuite/gcc.dg/tree-ssa/cselim-2.c
  a526cdc2d8e4bdccc12e3c268f05167b  gcc/testsuite/gcc.dg/tree-ssa/cselim-3.c
+ 87cfb5f2ac7de7373e23d0716af3b247  gcc/testsuite/gcc.dg/tree-ssa/cselim-4.c
  cb85a2159e6429ded025be9506d3d3ec  gcc/testsuite/gcc.dg/tree-ssa/cswtch-2.c
  eff8f806b1a91fc87bafb5aaff55fd32  gcc/testsuite/gcc.dg/tree-ssa/cswtch-3.c
  b51831242139a92b34dbcd60cebb1cd5  gcc/testsuite/gcc.dg/tree-ssa/cswtch-4.c
*************** dbb3bd52ee698a572581470fc02636bb  gcc/te
*** 64684,64691 ****
  6b2bacdf2b2223684a18611dbdc1db7f  gcc/testsuite/gcc.dg/tree-ssa/pr83141.c
  54094f112bf7286fa8dbc811329e939e  gcc/testsuite/gcc.dg/tree-ssa/pr83198.c
  8477b237f09dca3e7328e74d93078e60  gcc/testsuite/gcc.dg/tree-ssa/pr83329.c
! b748edd5e869748f3b23d39b8ae877ce  gcc/testsuite/gcc.dg/tree-ssa/pr83403-1.c
! 20996473f72513c3694d0eb8ee4560ea  gcc/testsuite/gcc.dg/tree-ssa/pr83403-2.c
  5b03cd4f2ede1565fa5509924793e88f  gcc/testsuite/gcc.dg/tree-ssa/pr83403.h
  47d8a98b2d47b4961be0d43f9a0310fb  gcc/testsuite/gcc.dg/tree-ssa/pr83501.c
  c95f9346fdf91a2af21b609136ce6e2b  gcc/testsuite/gcc.dg/tree-ssa/pr83648-2.c
--- 64720,64727 ----
  6b2bacdf2b2223684a18611dbdc1db7f  gcc/testsuite/gcc.dg/tree-ssa/pr83141.c
  54094f112bf7286fa8dbc811329e939e  gcc/testsuite/gcc.dg/tree-ssa/pr83198.c
  8477b237f09dca3e7328e74d93078e60  gcc/testsuite/gcc.dg/tree-ssa/pr83329.c
! 8b4548fb7722915239769aa2af9d9cf1  gcc/testsuite/gcc.dg/tree-ssa/pr83403-1.c
! 9a60233719cf698371c3633026032d9c  gcc/testsuite/gcc.dg/tree-ssa/pr83403-2.c
  5b03cd4f2ede1565fa5509924793e88f  gcc/testsuite/gcc.dg/tree-ssa/pr83403.h
  47d8a98b2d47b4961be0d43f9a0310fb  gcc/testsuite/gcc.dg/tree-ssa/pr83501.c
  c95f9346fdf91a2af21b609136ce6e2b  gcc/testsuite/gcc.dg/tree-ssa/pr83648-2.c
*************** b663bc81b4270defc2534ee4b697c313  gcc/te
*** 66300,66333 ****
  b63209d5f0331da4f3a28d32c2d7ae4a  gcc/testsuite/gcc.dg/vect/complex/complex.exp
  fc8c785166c2bf723856a358abae638a  gcc/testsuite/gcc.dg/vect/complex/fast-math-bb-slp-complex-add-double.c
  f3f8f88ffc2fdbd76104d8c2df9d5a2c  gcc/testsuite/gcc.dg/vect/complex/fast-math-bb-slp-complex-add-float.c
! 67e10a7d396d94c3684244a305965659  gcc/testsuite/gcc.dg/vect/complex/fast-math-bb-slp-complex-add-half-float.c
  10728fb4a6950c82cb6bc9d0eb53db56  gcc/testsuite/gcc.dg/vect/complex/fast-math-bb-slp-complex-add-pattern-double.c
  9c1bae87de05b1d234e79606fac9e2ed  gcc/testsuite/gcc.dg/vect/complex/fast-math-bb-slp-complex-add-pattern-float.c
! e4a9224267bcd732b52903a40ed990b8  gcc/testsuite/gcc.dg/vect/complex/fast-math-bb-slp-complex-add-pattern-half-float.c
  be69beba870ab0e8027df3a96e1e3a99  gcc/testsuite/gcc.dg/vect/complex/fast-math-bb-slp-complex-mla-double.c
  a2b6574b490bdeae547c7c3d79c95eed  gcc/testsuite/gcc.dg/vect/complex/fast-math-bb-slp-complex-mla-float.c
! e6ed633ce5b9dd865e9fc962d22da102  gcc/testsuite/gcc.dg/vect/complex/fast-math-bb-slp-complex-mla-half-float.c
  fa9e975179c7549630562771c7beb477  gcc/testsuite/gcc.dg/vect/complex/fast-math-bb-slp-complex-mls-double.c
  696fb756ddff68598ae74b6574bf930a  gcc/testsuite/gcc.dg/vect/complex/fast-math-bb-slp-complex-mls-float.c
! 050920b1fc9581d8cd9ddee0f4158b74  gcc/testsuite/gcc.dg/vect/complex/fast-math-bb-slp-complex-mls-half-float.c
  63d0650eadca149641643cc10372f0dc  gcc/testsuite/gcc.dg/vect/complex/fast-math-bb-slp-complex-mul-double.c
  7872d9eb2f30f8baf7e42f5ccc6980ad  gcc/testsuite/gcc.dg/vect/complex/fast-math-bb-slp-complex-mul-float.c
! 64f3ca28664252739fcd4fa9136596a2  gcc/testsuite/gcc.dg/vect/complex/fast-math-bb-slp-complex-mul-half-float.c
  25c417974becda51f30b458c8bd136e6  gcc/testsuite/gcc.dg/vect/complex/fast-math-complex-add-double.c
  8024221a9e17bb7c493d008d00d70fa7  gcc/testsuite/gcc.dg/vect/complex/fast-math-complex-add-float.c
! de00fb4aff553329050052615257129b  gcc/testsuite/gcc.dg/vect/complex/fast-math-complex-add-half-float.c
  93b8b2dbb2616c94964b483223d953e4  gcc/testsuite/gcc.dg/vect/complex/fast-math-complex-add-pattern-double.c
  f665de684a4402a83ad5818e28d6e5a9  gcc/testsuite/gcc.dg/vect/complex/fast-math-complex-add-pattern-float.c
! e0b26cf11b4bd81ecf4e82e5bbac313e  gcc/testsuite/gcc.dg/vect/complex/fast-math-complex-add-pattern-half-float.c
  df707465bb7e4b000207abad1e61b5e2  gcc/testsuite/gcc.dg/vect/complex/fast-math-complex-mla-double.c
  8b50a783b711fe688d16139298fd6541  gcc/testsuite/gcc.dg/vect/complex/fast-math-complex-mla-float.c
! 00ebbce7dff85c1103b133cb02ef7fc7  gcc/testsuite/gcc.dg/vect/complex/fast-math-complex-mla-half-float.c
  005c2fcc6a33e2f2e3160f2d41f80ea9  gcc/testsuite/gcc.dg/vect/complex/fast-math-complex-mls-double.c
  59528ce01adb89a3254370b6e4775877  gcc/testsuite/gcc.dg/vect/complex/fast-math-complex-mls-float.c
! 27913b4773f2c29692c33dfc232be411  gcc/testsuite/gcc.dg/vect/complex/fast-math-complex-mls-half-float.c
  be8d0bd6699017c7caaca7b550b1ffbe  gcc/testsuite/gcc.dg/vect/complex/fast-math-complex-mul-double.c
  12056b4bb025a055ab0b31784ca370c7  gcc/testsuite/gcc.dg/vect/complex/fast-math-complex-mul-float.c
! 4f0b37f5423ec8aff3036781000b82e0  gcc/testsuite/gcc.dg/vect/complex/fast-math-complex-mul-half-float.c
  4e1876202a0dc92b35499bdd138583d4  gcc/testsuite/gcc.dg/vect/complex/pr102819-1.c
  ccf39ed31245c0fb65f9c01c6e5d3b84  gcc/testsuite/gcc.dg/vect/complex/pr102819-2.c
  225c29797a1db0d4d58b8bd12cfee997  gcc/testsuite/gcc.dg/vect/complex/pr102819-3.c
--- 66336,66369 ----
  b63209d5f0331da4f3a28d32c2d7ae4a  gcc/testsuite/gcc.dg/vect/complex/complex.exp
  fc8c785166c2bf723856a358abae638a  gcc/testsuite/gcc.dg/vect/complex/fast-math-bb-slp-complex-add-double.c
  f3f8f88ffc2fdbd76104d8c2df9d5a2c  gcc/testsuite/gcc.dg/vect/complex/fast-math-bb-slp-complex-add-float.c
! 95726074b91226ec9408baaf51f6fc5f  gcc/testsuite/gcc.dg/vect/complex/fast-math-bb-slp-complex-add-half-float.c
  10728fb4a6950c82cb6bc9d0eb53db56  gcc/testsuite/gcc.dg/vect/complex/fast-math-bb-slp-complex-add-pattern-double.c
  9c1bae87de05b1d234e79606fac9e2ed  gcc/testsuite/gcc.dg/vect/complex/fast-math-bb-slp-complex-add-pattern-float.c
! fe3215787c8e8f2ed17a1b9c757b5bcb  gcc/testsuite/gcc.dg/vect/complex/fast-math-bb-slp-complex-add-pattern-half-float.c
  be69beba870ab0e8027df3a96e1e3a99  gcc/testsuite/gcc.dg/vect/complex/fast-math-bb-slp-complex-mla-double.c
  a2b6574b490bdeae547c7c3d79c95eed  gcc/testsuite/gcc.dg/vect/complex/fast-math-bb-slp-complex-mla-float.c
! ebaebc19e7f2353f823de1f12e1687af  gcc/testsuite/gcc.dg/vect/complex/fast-math-bb-slp-complex-mla-half-float.c
  fa9e975179c7549630562771c7beb477  gcc/testsuite/gcc.dg/vect/complex/fast-math-bb-slp-complex-mls-double.c
  696fb756ddff68598ae74b6574bf930a  gcc/testsuite/gcc.dg/vect/complex/fast-math-bb-slp-complex-mls-float.c
! 8bf53e580f4f0838c8bb08429abb3cc6  gcc/testsuite/gcc.dg/vect/complex/fast-math-bb-slp-complex-mls-half-float.c
  63d0650eadca149641643cc10372f0dc  gcc/testsuite/gcc.dg/vect/complex/fast-math-bb-slp-complex-mul-double.c
  7872d9eb2f30f8baf7e42f5ccc6980ad  gcc/testsuite/gcc.dg/vect/complex/fast-math-bb-slp-complex-mul-float.c
! d039718def2f3937914a518ee3bf2343  gcc/testsuite/gcc.dg/vect/complex/fast-math-bb-slp-complex-mul-half-float.c
  25c417974becda51f30b458c8bd136e6  gcc/testsuite/gcc.dg/vect/complex/fast-math-complex-add-double.c
  8024221a9e17bb7c493d008d00d70fa7  gcc/testsuite/gcc.dg/vect/complex/fast-math-complex-add-float.c
! 54eb093dbdffbcd90c078ffda3d3000a  gcc/testsuite/gcc.dg/vect/complex/fast-math-complex-add-half-float.c
  93b8b2dbb2616c94964b483223d953e4  gcc/testsuite/gcc.dg/vect/complex/fast-math-complex-add-pattern-double.c
  f665de684a4402a83ad5818e28d6e5a9  gcc/testsuite/gcc.dg/vect/complex/fast-math-complex-add-pattern-float.c
! b0e762a990e73a1498f505307af782d6  gcc/testsuite/gcc.dg/vect/complex/fast-math-complex-add-pattern-half-float.c
  df707465bb7e4b000207abad1e61b5e2  gcc/testsuite/gcc.dg/vect/complex/fast-math-complex-mla-double.c
  8b50a783b711fe688d16139298fd6541  gcc/testsuite/gcc.dg/vect/complex/fast-math-complex-mla-float.c
! 57e15b7ef9d601bd655447090b2bb7d3  gcc/testsuite/gcc.dg/vect/complex/fast-math-complex-mla-half-float.c
  005c2fcc6a33e2f2e3160f2d41f80ea9  gcc/testsuite/gcc.dg/vect/complex/fast-math-complex-mls-double.c
  59528ce01adb89a3254370b6e4775877  gcc/testsuite/gcc.dg/vect/complex/fast-math-complex-mls-float.c
! 2768b51e3bf269abcd2b7ab0b65916db  gcc/testsuite/gcc.dg/vect/complex/fast-math-complex-mls-half-float.c
  be8d0bd6699017c7caaca7b550b1ffbe  gcc/testsuite/gcc.dg/vect/complex/fast-math-complex-mul-double.c
  12056b4bb025a055ab0b31784ca370c7  gcc/testsuite/gcc.dg/vect/complex/fast-math-complex-mul-float.c
! 28d905e18264d0f2bad4f29f19e792ad  gcc/testsuite/gcc.dg/vect/complex/fast-math-complex-mul-half-float.c
  4e1876202a0dc92b35499bdd138583d4  gcc/testsuite/gcc.dg/vect/complex/pr102819-1.c
  ccf39ed31245c0fb65f9c01c6e5d3b84  gcc/testsuite/gcc.dg/vect/complex/pr102819-2.c
  225c29797a1db0d4d58b8bd12cfee997  gcc/testsuite/gcc.dg/vect/complex/pr102819-3.c
*************** ae492c945415066b7a6a35db28cdd97c  gcc/te
*** 66401,66416 ****
  f2317f19938996a698ef438051827fa8  gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-11.c
  6ce36d21bab8c8f0d1ec0445949787e6  gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-12.c
  9142a47e0d92eb815a6ab62fb813409b  gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-2.c
! 4b272a050ae924c04f515cdd65c4da9c  gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-3.c
! f90613eca1398e841f666ecb38eb4e66  gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-5.c
! a538aa2c6d6d5fe669b39929cfc50b18  gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-6.c
! 6c4cb21484bc65e227288f39312dc57b  gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-7.c
! e5ce45ad08253ab1421aa37cc580e7cc  gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-8.c
  337c7b64a5d457f02c8492fd2fa1aafd  gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-9.c
  e5fb34ed6bac60fc3bd747c1f7d59d62  gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-1.c
! c77e3227751bb9a8c7a7cf75ddc22830  gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-10.c
  26123072fa512c52055c97c7c76b8ce5  gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-11.c
! f798ac51e1550c7537bbd99e35e62d16  gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-12.c
  19081e29f1e62a6af5f2b3541e3347d3  gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-13.c
  045f71cd9dc60802f1b1538cff78a188  gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-14.c
  33cd89200cb4fcc1b82602b00dc1b812  gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-2.c
--- 66437,66452 ----
  f2317f19938996a698ef438051827fa8  gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-11.c
  6ce36d21bab8c8f0d1ec0445949787e6  gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-12.c
  9142a47e0d92eb815a6ab62fb813409b  gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-2.c
! 64ebc5c00b3b93cf3fba373248930a4a  gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-3.c
! 8d1751a18b2a65b1ef2d2d4a7f5d40cb  gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-5.c
! 941b601c33bccfd497e7110163f12d9e  gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-6.c
! ea4da70468b59ce0d4ef8aeec203ad02  gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-7.c
! 19c65d4b3358f2c9e99bcfc5745f3e1c  gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-8.c
  337c7b64a5d457f02c8492fd2fa1aafd  gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-9.c
  e5fb34ed6bac60fc3bd747c1f7d59d62  gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-1.c
! c29a43edcdf9ea39fcd2785676a73227  gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-10.c
  26123072fa512c52055c97c7c76b8ce5  gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-11.c
! 6f4bf2c4a507528f38d259981fb499fc  gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-12.c
  19081e29f1e62a6af5f2b3541e3347d3  gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-13.c
  045f71cd9dc60802f1b1538cff78a188  gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-14.c
  33cd89200cb4fcc1b82602b00dc1b812  gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-2.c
*************** bfbef312c1eb167e9b377420da07c0dd  gcc/te
*** 66430,66437 ****
  9be8169d72cecf51be42dac4d682221a  gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/pr112387-2.c
  cafa8dfe3e91d7693561c1b355e97072  gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/pr113112-1.c
  696cb400499d38d8d660ac378dfec2f9  gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/pr113112-2.c
! f137e80651e8e42bfbe055bff1c24502  gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/pr113112-3.c
! b4a82bee7946626ab43f07f1fd4e29f7  gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/pr113112-4.c
  e223c985c0278fae6e62daae83a5fa3f  gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/pr113112-5.c
  28b94cd084f6b9f35c7224575431dd87  gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/pr113247-1.c
  9a7e40b18e0358ca4f962a6a4b56f189  gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/pr113247-2.c
--- 66466,66473 ----
  9be8169d72cecf51be42dac4d682221a  gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/pr112387-2.c
  cafa8dfe3e91d7693561c1b355e97072  gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/pr113112-1.c
  696cb400499d38d8d660ac378dfec2f9  gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/pr113112-2.c
! f06ecddcdacee3220d70892b6f26ae1e  gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/pr113112-3.c
! 091864f8a0ff9d4054520080b51148b9  gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/pr113112-4.c
  e223c985c0278fae6e62daae83a5fa3f  gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/pr113112-5.c
  28b94cd084f6b9f35c7224575431dd87  gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/pr113247-1.c
  9a7e40b18e0358ca4f962a6a4b56f189  gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/pr113247-2.c
*************** e094ee1a12f158fa8be372b1974af637  gcc/te
*** 66479,66485 ****
  f69c055c238cc0217c98e86380f16061  gcc/testsuite/gcc.dg/vect/costmodel/x86_64/costmodel-vect-31.c
  396130749e6b4f9ec773821041143ba0  gcc/testsuite/gcc.dg/vect/costmodel/x86_64/costmodel-vect-33.c
  d13254c5eb24a8e02c724470d3f22c66  gcc/testsuite/gcc.dg/vect/costmodel/x86_64/costmodel-vect-68.c
! b691212b6ae14b41e0fe2ed1fe60680b  gcc/testsuite/gcc.dg/vect/costmodel/x86_64/costmodel-vect-epil-1.c
  460815bb26ae1f6c220e23de56a2d3fd  gcc/testsuite/gcc.dg/vect/costmodel/x86_64/costmodel-vect-reduc-1char.c
  f6fdadd0ea9395aed541bf9b57b73780  gcc/testsuite/gcc.dg/vect/costmodel/x86_64/costmodel-vect-slp-2.c
  8fa1df6d327c2eef9e16ea686cbebd42  gcc/testsuite/gcc.dg/vect/costmodel/x86_64/costmodel-vect-slp.c
--- 66515,66521 ----
  f69c055c238cc0217c98e86380f16061  gcc/testsuite/gcc.dg/vect/costmodel/x86_64/costmodel-vect-31.c
  396130749e6b4f9ec773821041143ba0  gcc/testsuite/gcc.dg/vect/costmodel/x86_64/costmodel-vect-33.c
  d13254c5eb24a8e02c724470d3f22c66  gcc/testsuite/gcc.dg/vect/costmodel/x86_64/costmodel-vect-68.c
! f2976042c525e5f95f95c9e6a6567575  gcc/testsuite/gcc.dg/vect/costmodel/x86_64/costmodel-vect-epil-1.c
  460815bb26ae1f6c220e23de56a2d3fd  gcc/testsuite/gcc.dg/vect/costmodel/x86_64/costmodel-vect-reduc-1char.c
  f6fdadd0ea9395aed541bf9b57b73780  gcc/testsuite/gcc.dg/vect/costmodel/x86_64/costmodel-vect-slp-2.c
  8fa1df6d327c2eef9e16ea686cbebd42  gcc/testsuite/gcc.dg/vect/costmodel/x86_64/costmodel-vect-slp.c
*************** efc5db1b97ea06d470c57048d8966ea1  gcc/te
*** 68152,68157 ****
--- 68188,68194 ----
  745e1ec106fc11cf54190bfa02bb194e  gcc/testsuite/gcc.dg/vect/vect-pr123316.c
  8392d6836424887c8615331c1ad6592d  gcc/testsuite/gcc.dg/vect/vect-pr12358.c
  3a218a9e901cfc31c777e22723a03123  gcc/testsuite/gcc.dg/vect/vect-pr123697.c
+ 1e6309f79486c269225382b2ee7a0a41  gcc/testsuite/gcc.dg/vect/vect-pr123755-2.c
  8d72fe60d77b174c40a9709fbc10c86b  gcc/testsuite/gcc.dg/vect/vect-pr123755.c
  71a5a3f0c2e34ed3e033a36a47f5cf20  gcc/testsuite/gcc.dg/vect/vect-pr123756.c
  464c872c62ad2fc5d241ed918e0cf5de  gcc/testsuite/gcc.dg/vect/vect-pr61247.c
*************** bc0f68b226839ed569e371de527479fe  gcc/te
*** 68356,68361 ****
--- 68393,68399 ----
  e0f38a9b3ec0f742abed22cd672aa982  gcc/testsuite/gcc.dg/vect/vect-simd-clone-7.c
  c3250637f281a41b33f82d785f31ae71  gcc/testsuite/gcc.dg/vect/vect-simd-clone-8.c
  068515d98cb76263014fe2d1f01ac267  gcc/testsuite/gcc.dg/vect/vect-simd-clone-9.c
+ ac505120490b0eacba4e6c11d4f832b8  gcc/testsuite/gcc.dg/vect/vect-simd-clone-pr123794.c
  881d4e505bcbd60c6207348fb3385c98  gcc/testsuite/gcc.dg/vect/vect-simd-pr121130.c
  6e90abcda205699fc9e9fbcaeb293a8e  gcc/testsuite/gcc.dg/vect/vect-singleton_1.c
  c007274fcf98c292ac6a9827d7cc665e  gcc/testsuite/gcc.dg/vect/vect-strided-a-mult.c
*************** db073e8e46c5bf7927a443b0eee7bbbf  gcc/te
*** 68405,68410 ****
--- 68443,68449 ----
  b0e70e0f2ffd2196553b00c59f02bed8  gcc/testsuite/gcc.dg/vect/vect-uncounted-run_1.c
  21d2a8bb2b8e06944ff1ead18bb38991  gcc/testsuite/gcc.dg/vect/vect-uncounted-run_2.c
  75296732077eb3f522d929ebfeab87f1  gcc/testsuite/gcc.dg/vect/vect-uncounted-run_3.c
+ 2d214c1f716376dc795b6e89c7d34e2b  gcc/testsuite/gcc.dg/vect/vect-uncounted-run_4.c
  e272c1df119c914b1c664282d40591b6  gcc/testsuite/gcc.dg/vect/vect-uncounted_1.c
  99b9cb6bbf68684a1596f785900aafae  gcc/testsuite/gcc.dg/vect/vect-uncounted_2.c
  23ed0940ec35af12b6c3324bf81398ff  gcc/testsuite/gcc.dg/vect/vect-uncounted_3.c
*************** cbf6bf065ad255a035c8a4ecfef0b332  gcc/te
*** 68772,68778 ****
  c7e8979eb7e4f7fb8c2e008a087966cd  gcc/testsuite/gcc.misc-tests/gcov-16.c
  40a4ab93d915ef5160ce00fc07f5df4c  gcc/testsuite/gcc.misc-tests/gcov-17.c
  edb762bd836db8f67c45c7c8ce884c3e  gcc/testsuite/gcc.misc-tests/gcov-18.c
! 88e1d5f8c529250a87a6ba8c1dddd700  gcc/testsuite/gcc.misc-tests/gcov-19.c
  dc772b7fae7491c9aa2f65ee68d607a7  gcc/testsuite/gcc.misc-tests/gcov-1a.c
  9f80d59aaaa2f2622f9b6a71fdef446e  gcc/testsuite/gcc.misc-tests/gcov-2.c
  d7f04c06f30a806d546036145b21e45b  gcc/testsuite/gcc.misc-tests/gcov-20.c
--- 68811,68817 ----
  c7e8979eb7e4f7fb8c2e008a087966cd  gcc/testsuite/gcc.misc-tests/gcov-16.c
  40a4ab93d915ef5160ce00fc07f5df4c  gcc/testsuite/gcc.misc-tests/gcov-17.c
  edb762bd836db8f67c45c7c8ce884c3e  gcc/testsuite/gcc.misc-tests/gcov-18.c
! 5190fab0b34ee07f94ad2e9d06ebbdfb  gcc/testsuite/gcc.misc-tests/gcov-19.c
  dc772b7fae7491c9aa2f65ee68d607a7  gcc/testsuite/gcc.misc-tests/gcov-1a.c
  9f80d59aaaa2f2622f9b6a71fdef446e  gcc/testsuite/gcc.misc-tests/gcov-2.c
  d7f04c06f30a806d546036145b21e45b  gcc/testsuite/gcc.misc-tests/gcov-20.c
*************** ee0ba269917a420abcca395ad38b524a  gcc/te
*** 68784,68792 ****
  32d56f3c339953d0c4cfadc72fb51dfd  gcc/testsuite/gcc.misc-tests/gcov-26.c
  b968fcc4d85aae78066422161712adf6  gcc/testsuite/gcc.misc-tests/gcov-27.c
  e849b1f9c287a448bf8c2017ed97f8af  gcc/testsuite/gcc.misc-tests/gcov-28.c
! f5d36ca44b5a53a3006ddec1d49b6abb  gcc/testsuite/gcc.misc-tests/gcov-29.c
  bfde4845f4a814d2ee6c2745349086cc  gcc/testsuite/gcc.misc-tests/gcov-3.c
! 549e50fcaa25fa2d1b269383a0b23ca1  gcc/testsuite/gcc.misc-tests/gcov-30.c
  13e63323e5ef1451f30fd4147d4fe687  gcc/testsuite/gcc.misc-tests/gcov-31.c
  5167fb7d00d3ad6eb4b44556fcd02729  gcc/testsuite/gcc.misc-tests/gcov-32.c
  36e6bfa6f1fa471f408919b16be06d89  gcc/testsuite/gcc.misc-tests/gcov-33.c
--- 68823,68831 ----
  32d56f3c339953d0c4cfadc72fb51dfd  gcc/testsuite/gcc.misc-tests/gcov-26.c
  b968fcc4d85aae78066422161712adf6  gcc/testsuite/gcc.misc-tests/gcov-27.c
  e849b1f9c287a448bf8c2017ed97f8af  gcc/testsuite/gcc.misc-tests/gcov-28.c
! 298b7a4aa97865c16d5df3d22765e4ad  gcc/testsuite/gcc.misc-tests/gcov-29.c
  bfde4845f4a814d2ee6c2745349086cc  gcc/testsuite/gcc.misc-tests/gcov-3.c
! db84bdb59baf6710656536c6ee8439dc  gcc/testsuite/gcc.misc-tests/gcov-30.c
  13e63323e5ef1451f30fd4147d4fe687  gcc/testsuite/gcc.misc-tests/gcov-31.c
  5167fb7d00d3ad6eb4b44556fcd02729  gcc/testsuite/gcc.misc-tests/gcov-32.c
  36e6bfa6f1fa471f408919b16be06d89  gcc/testsuite/gcc.misc-tests/gcov-33.c
*************** b76086dacb74bfaa16182713e3441f38  gcc/te
*** 68801,68806 ****
--- 68840,68846 ----
  2e9ddc8005d8dbaf76953e1c6efcc168  gcc/testsuite/gcc.misc-tests/gcov-pr114599.c
  532090f95d4315be0d583fcdf9aa2328  gcc/testsuite/gcc.misc-tests/gcov-pr114601.c
  8114252892791c2c861a0b816aa62dbe  gcc/testsuite/gcc.misc-tests/gcov-pr114681.c
+ 27ac6bc3ed41bc9f32417703220d72fe  gcc/testsuite/gcc.misc-tests/gcov-pr123855.c
  a946bc93f49605b83cfdb2bc72accd8e  gcc/testsuite/gcc.misc-tests/gcov-pr83813.c
  ab12d088013c689404c40977ae636e6b  gcc/testsuite/gcc.misc-tests/gcov-pr84758.c
  988d6df927366ba7aa9c2a859fd9326f  gcc/testsuite/gcc.misc-tests/gcov-pr85217.c
*************** b30f56c46834b427133c97c6f19cda62  gcc/te
*** 69304,69310 ****
  c420faac5ffe22b014c1eebc369a2dd9  gcc/testsuite/gcc.target/aarch64/advsimd-intrinsics/vect-dot-s8.c
  a665238fa8ed1e3294809774f0d8ad6f  gcc/testsuite/gcc.target/aarch64/advsimd-intrinsics/vect-dot-u8.c
  d8bbb0a61a727d0c2cf23f02f96f2050  gcc/testsuite/gcc.target/aarch64/advsimd-intrinsics/vector-complex.c
! 5d1247c7bd2cccfa228147e5bc7c8d73  gcc/testsuite/gcc.target/aarch64/advsimd-intrinsics/vector-complex_f16.c
  8e5488aacd9e2173213588e82d8f4cc5  gcc/testsuite/gcc.target/aarch64/advsimd-intrinsics/veor.c
  16a8abaf0677453e7c53d80af0a1fbfa  gcc/testsuite/gcc.target/aarch64/advsimd-intrinsics/vext.c
  aa5b72cf9598620463c83cd108d502de  gcc/testsuite/gcc.target/aarch64/advsimd-intrinsics/vfma.c
--- 69344,69350 ----
  c420faac5ffe22b014c1eebc369a2dd9  gcc/testsuite/gcc.target/aarch64/advsimd-intrinsics/vect-dot-s8.c
  a665238fa8ed1e3294809774f0d8ad6f  gcc/testsuite/gcc.target/aarch64/advsimd-intrinsics/vect-dot-u8.c
  d8bbb0a61a727d0c2cf23f02f96f2050  gcc/testsuite/gcc.target/aarch64/advsimd-intrinsics/vector-complex.c
! 21a3de75df7671f3a8a4fcb600d4b5aa  gcc/testsuite/gcc.target/aarch64/advsimd-intrinsics/vector-complex_f16.c
  8e5488aacd9e2173213588e82d8f4cc5  gcc/testsuite/gcc.target/aarch64/advsimd-intrinsics/veor.c
  16a8abaf0677453e7c53d80af0a1fbfa  gcc/testsuite/gcc.target/aarch64/advsimd-intrinsics/vext.c
  aa5b72cf9598620463c83cd108d502de  gcc/testsuite/gcc.target/aarch64/advsimd-intrinsics/vfma.c
*************** fd8128a2ace2daef0e57c5d400699061  gcc/te
*** 70720,70725 ****
--- 70760,70773 ----
  660be217a5e8446a50ffef18eb8fa6e0  gcc/testsuite/gcc.target/aarch64/pr122069_4.c
  00a887e152d5697873b564b81bde2621  gcc/testsuite/gcc.target/aarch64/pr122190.c
  79403b7eced8101bc36bd5d2168fe88b  gcc/testsuite/gcc.target/aarch64/pr122675-1.c
+ a3eced7f24ee79ab13a4e8a7aeabda86  gcc/testsuite/gcc.target/aarch64/pr122749_1.c
+ f8e5b1d256eff000dbd7c9ef8dda38f6  gcc/testsuite/gcc.target/aarch64/pr122749_2.c
+ 299e436e943dfdf2fdb89a262f7ad938  gcc/testsuite/gcc.target/aarch64/pr122749_3.c
+ d1f63d3874ca9b62a6ab0001bcda491c  gcc/testsuite/gcc.target/aarch64/pr122749_4.c
+ a46470f241246648914de81c0eb539de  gcc/testsuite/gcc.target/aarch64/pr122749_5.c
+ d40c57c94476edba36e4d35196e3cc09  gcc/testsuite/gcc.target/aarch64/pr122749_6.c
+ 1d285741d4c5d8b352a0c7dc87f62573  gcc/testsuite/gcc.target/aarch64/pr122749_8.c
+ cc264892d43515aac20ba8afaaf15d29  gcc/testsuite/gcc.target/aarch64/pr122749_9.c
  43f64e2ecaed3e7e114e33394cdb9066  gcc/testsuite/gcc.target/aarch64/pr122763.c
  891d4e0624727f3778442b4412904fe3  gcc/testsuite/gcc.target/aarch64/pr123017_1.c
  b19750d7ad94a45a0676b41ee667dab7  gcc/testsuite/gcc.target/aarch64/pr123017_2.c
*************** f79aeeb83d4a0d143dccfa2cb843cc52  gcc/te
*** 70729,70734 ****
--- 70777,70785 ----
  ec79fa3be7327c757d4abcecfe6afb40  gcc/testsuite/gcc.target/aarch64/pr123017_6.c
  3c99f5bd7556f75f513af4ccabe65c85  gcc/testsuite/gcc.target/aarch64/pr123017_7.c
  b15614b849a2403ba76800ef1356aab5  gcc/testsuite/gcc.target/aarch64/pr123026.c
+ 98a4eb67a4078cb117ea1c80d44fee14  gcc/testsuite/gcc.target/aarch64/pr123206.c
+ d5b3fbe2571cb9f95ff3b80e54a79a15  gcc/testsuite/gcc.target/aarch64/pr123791.c
+ 0fb432038c1a084913bbbe8d8d8b8bd8  gcc/testsuite/gcc.target/aarch64/pr123792.c
  9adb42733d9f5e2b1f2dbb364b62100d  gcc/testsuite/gcc.target/aarch64/pr37780_1.c
  e668fb9e0d32efadd671247467dc90db  gcc/testsuite/gcc.target/aarch64/pr58460.c
  9023f817c07ddec673c5b546525fc184  gcc/testsuite/gcc.target/aarch64/pr60034.c
*************** ae5cf71ae02c3cde7a67cfb54ec03bbe  gcc/te
*** 70832,70838 ****
  cc4f69997a3864b3299f1b4809507883  gcc/testsuite/gcc.target/aarch64/pragma_cpp_predefs_1b.c
  be30d927e2df67d4fe2786d0d026bbaa  gcc/testsuite/gcc.target/aarch64/pragma_cpp_predefs_2.c
  38af83405c4b19363e539e8f2589d817  gcc/testsuite/gcc.target/aarch64/pragma_cpp_predefs_3.c
! 6c9e890f2c32a71e12e23b09497b8909  gcc/testsuite/gcc.target/aarch64/pragma_cpp_predefs_4.c
  b5ff836b5a987f9feaf35c5f8ec9f4db  gcc/testsuite/gcc.target/aarch64/pragma_cpp_predefs_5.c
  1f95766b4ed5bfb5f2cf1f168a607a8d  gcc/testsuite/gcc.target/aarch64/predefine_large.c
  d38e476730748c653068e7cb2d8d6ca6  gcc/testsuite/gcc.target/aarch64/predefine_small.c
--- 70883,70889 ----
  cc4f69997a3864b3299f1b4809507883  gcc/testsuite/gcc.target/aarch64/pragma_cpp_predefs_1b.c
  be30d927e2df67d4fe2786d0d026bbaa  gcc/testsuite/gcc.target/aarch64/pragma_cpp_predefs_2.c
  38af83405c4b19363e539e8f2589d817  gcc/testsuite/gcc.target/aarch64/pragma_cpp_predefs_3.c
! 8395486ca4a111ebbfd1fcb17151a734  gcc/testsuite/gcc.target/aarch64/pragma_cpp_predefs_4.c
  b5ff836b5a987f9feaf35c5f8ec9f4db  gcc/testsuite/gcc.target/aarch64/pragma_cpp_predefs_5.c
  1f95766b4ed5bfb5f2cf1f168a607a8d  gcc/testsuite/gcc.target/aarch64/predefine_large.c
  d38e476730748c653068e7cb2d8d6ca6  gcc/testsuite/gcc.target/aarch64/predefine_small.c
*************** a6b0a3d46a5a5170f93dc87f2d7171b5  gcc/te
*** 70865,70871 ****
  de3baab34a4f59a99dc737c4063eb91d  gcc/testsuite/gcc.target/aarch64/ror_2.c
  6a7b4c2858dc4092dd8e5eead61374c3  gcc/testsuite/gcc.target/aarch64/ror_3.c
  d67c6012aab7b0d167366ecd8d9c9f29  gcc/testsuite/gcc.target/aarch64/rot_to_bswap.c
! 6aafdb77d40b133b0cfc4ba802e3088b  gcc/testsuite/gcc.target/aarch64/rotate_xar_1.c
  fd2b51934a9f3b3f1041deacbd4c5429  gcc/testsuite/gcc.target/aarch64/saddw-1.c
  06fac2f51e492eb91f6fdcb6f6baea2f  gcc/testsuite/gcc.target/aarch64/saddw-2.c
  e1cf0d479bffab78f82341c69892e846  gcc/testsuite/gcc.target/aarch64/saturating-arithmetic-signed.c
--- 70916,70922 ----
  de3baab34a4f59a99dc737c4063eb91d  gcc/testsuite/gcc.target/aarch64/ror_2.c
  6a7b4c2858dc4092dd8e5eead61374c3  gcc/testsuite/gcc.target/aarch64/ror_3.c
  d67c6012aab7b0d167366ecd8d9c9f29  gcc/testsuite/gcc.target/aarch64/rot_to_bswap.c
! 84df7bd8d598e8ef1bbd0fad51087fcc  gcc/testsuite/gcc.target/aarch64/rotate_xar_1.c
  fd2b51934a9f3b3f1041deacbd4c5429  gcc/testsuite/gcc.target/aarch64/saddw-1.c
  06fac2f51e492eb91f6fdcb6f6baea2f  gcc/testsuite/gcc.target/aarch64/saddw-2.c
  e1cf0d479bffab78f82341c69892e846  gcc/testsuite/gcc.target/aarch64/saturating-arithmetic-signed.c
*************** b44e92a535087a99a3ac716388f1c979  gcc/te
*** 70889,70897 ****
  19f17e7dd89f8110e5c9f67f57238f8a  gcc/testsuite/gcc.target/aarch64/sha2_2.c
  ce1f8e207a7a24660c494ecf8dd545c2  gcc/testsuite/gcc.target/aarch64/sha2_3.c
  b6aa615b85ae40b63a22dbc7071fd902  gcc/testsuite/gcc.target/aarch64/sha3.h
! 32f4f51563b0d7be120e5d5009ab1e3e  gcc/testsuite/gcc.target/aarch64/sha3_1.c
! b452d4c86751bd11bf03b8ca21d25bf4  gcc/testsuite/gcc.target/aarch64/sha3_2.c
! 7bbc7a27b67681b713096a7ab9ed18a3  gcc/testsuite/gcc.target/aarch64/sha3_3.c
  8290b001857e70f2bb00f9e9980ea2f1  gcc/testsuite/gcc.target/aarch64/shadow_call_stack_1.c
  d1691b06335c7599e23fe146c1e9bf0d  gcc/testsuite/gcc.target/aarch64/shadow_call_stack_2.c
  2b4c1d692aa2c1f603c926f7a2622b73  gcc/testsuite/gcc.target/aarch64/shadow_call_stack_3.c
--- 70940,70948 ----
  19f17e7dd89f8110e5c9f67f57238f8a  gcc/testsuite/gcc.target/aarch64/sha2_2.c
  ce1f8e207a7a24660c494ecf8dd545c2  gcc/testsuite/gcc.target/aarch64/sha2_3.c
  b6aa615b85ae40b63a22dbc7071fd902  gcc/testsuite/gcc.target/aarch64/sha3.h
! 0e1d7a62f7703b3f36fc44bcf4596484  gcc/testsuite/gcc.target/aarch64/sha3_1.c
! 14eadc9c0aa9df2274e0d27fdd199be8  gcc/testsuite/gcc.target/aarch64/sha3_2.c
! 7cd7f2ba7ac06db85b53e098824fe6c9  gcc/testsuite/gcc.target/aarch64/sha3_3.c
  8290b001857e70f2bb00f9e9980ea2f1  gcc/testsuite/gcc.target/aarch64/shadow_call_stack_1.c
  d1691b06335c7599e23fe146c1e9bf0d  gcc/testsuite/gcc.target/aarch64/shadow_call_stack_2.c
  2b4c1d692aa2c1f603c926f7a2622b73  gcc/testsuite/gcc.target/aarch64/shadow_call_stack_3.c
*************** c091c392e56d14660855417449ab33e2  gcc/te
*** 72124,72129 ****
--- 72175,72182 ----
  b6770baead4ef6d2ad8473d82e4b2e81  gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mops_za16_bf16.c
  981b29c5834eb757a99c1c7f0c4f227b  gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mops_za16_f16.c
  676a036c6c3b39dc99d832f1dcf5d10a  gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mops_za32.c
+ 780e8095f57566123b3586c781c8536d  gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mul_bf16_x2.c
+ cd54535dc5d72aa10e588e1ec2d9adf3  gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mul_bf16_x4.c
  1bd058819a98a2bb24793b63bef8055a  gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/pext_lane_c16.c
  3dd427493b752d8f7e1b1194a95082e9  gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/pext_lane_c16_x2.c
  0af095bf34c3ea37bc43a6a2ad37f2c7  gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/pext_lane_c32.c
*************** d22a3bd90868146ac9eae1229a4aba9c  gcc/te
*** 72263,72268 ****
--- 72316,72323 ----
  e7e3a27c2a468ff586b8fd1d17f67a3c  gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/rshl_u64_x4.c
  0f56106e7a5b42675422b40b315e4035  gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/rshl_u8_x2.c
  5786b6152b5ef772386c1c2fb329421e  gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/rshl_u8_x4.c
+ 2ccee7f91a0281fc51b99741bf62bd86  gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/scale_bf16_x2.c
+ 6707c18a834df6c3481c9d531f137086  gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/scale_bf16_x4.c
  96e801545b46e198cafd5bf78e8186bc  gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/scale_f16_x2.c
  1660ab2e87730b2b1942ae0a9f403e9a  gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/scale_f16_x4.c
  2659aca53ba2437b47e8c73e49d301cd  gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/scale_f32_x2.c
*************** fcaf02aa6e3f5dd268b404a8bca92a89  gcc/te
*** 73905,73910 ****
--- 73960,73966 ----
  70ed6caad6bebfbd14964ddc6501850d  gcc/testsuite/gcc.target/aarch64/sve/acle/asm/rsqrts_f16.c
  f59ab9c85fd6537f7058c727584ef917  gcc/testsuite/gcc.target/aarch64/sve/acle/asm/rsqrts_f32.c
  1149f1a40c9e53498525ec14c42c596b  gcc/testsuite/gcc.target/aarch64/sve/acle/asm/rsqrts_f64.c
+ ba73ed42f34ceff6f3c5313107e07538  gcc/testsuite/gcc.target/aarch64/sve/acle/asm/scale_bf16.c
  d0c344e021b53ed378987fc003c6ebe3  gcc/testsuite/gcc.target/aarch64/sve/acle/asm/scale_f16.c
  15480ccc211ec663b27b52c1242a64d2  gcc/testsuite/gcc.target/aarch64/sve/acle/asm/scale_f32.c
  8a83c9b2bbf3519308df61aaa9649795  gcc/testsuite/gcc.target/aarch64/sve/acle/asm/scale_f64.c
*************** ab754b624c1f73a03d94c9a531641505  gcc/te
*** 74349,74354 ****
--- 74405,74411 ----
  9f6828f48532cd530b2e0cd8c4262219  gcc/testsuite/gcc.target/aarch64/sve/acle/asm/zip2q_u8.c
  b261313e5da1689d5eac7d27948a935b  gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/adr_index_1.c
  f439e0960e8177b476453cb45e7ab2cc  gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/adr_offset_1.c
+ e0eb712bd056761f180dd27d1d859d13  gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/bfscale.c
  b6224acd5d609473a3f91ca13ff23eef  gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/binary_1.c
  1510b83a0b1baf70601985c85f019762  gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/binary_int_opt_n.c
  46fea8fe01ddf17f515efe0bd36669dc  gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/binary_int_opt_single_n_1.c
*************** c1006feea3c9b78bab24f56562463c2b  gcc/te
*** 75455,75463 ****
  95b39f5e70575f426a47e83d7975f948  gcc/testsuite/gcc.target/aarch64/sve/pcs/args_7.c
  67f30b172f3a75ebd579c8c1533513d1  gcc/testsuite/gcc.target/aarch64/sve/pcs/args_8.c
  13d714787495af941d7e4d798bb6c2b4  gcc/testsuite/gcc.target/aarch64/sve/pcs/args_9.c
! f18202de4dff9630d08a3ca727a71cc6  gcc/testsuite/gcc.target/aarch64/sve/pcs/asm_1.c
  8ce7d348db223538fc712dc7bc5b77bb  gcc/testsuite/gcc.target/aarch64/sve/pcs/asm_2.c
! 213f62d24f3c2c17933c8ff0fd0b260c  gcc/testsuite/gcc.target/aarch64/sve/pcs/asm_3.c
  1632c6cc7d8e3cfefd87a553331210d7  gcc/testsuite/gcc.target/aarch64/sve/pcs/asm_4.c
  44f16f9ea3b783c7bee54be492ee8581  gcc/testsuite/gcc.target/aarch64/sve/pcs/gnu_vectors_1.c
  b51a2d0d049e696529fd33b9ffae61f9  gcc/testsuite/gcc.target/aarch64/sve/pcs/gnu_vectors_2.c
--- 75512,75520 ----
  95b39f5e70575f426a47e83d7975f948  gcc/testsuite/gcc.target/aarch64/sve/pcs/args_7.c
  67f30b172f3a75ebd579c8c1533513d1  gcc/testsuite/gcc.target/aarch64/sve/pcs/args_8.c
  13d714787495af941d7e4d798bb6c2b4  gcc/testsuite/gcc.target/aarch64/sve/pcs/args_9.c
! 885a126a4eccdeaefa0435d427a3b548  gcc/testsuite/gcc.target/aarch64/sve/pcs/asm_1.c
  8ce7d348db223538fc712dc7bc5b77bb  gcc/testsuite/gcc.target/aarch64/sve/pcs/asm_2.c
! 30a8009979400181e5674c5358351fb7  gcc/testsuite/gcc.target/aarch64/sve/pcs/asm_3.c
  1632c6cc7d8e3cfefd87a553331210d7  gcc/testsuite/gcc.target/aarch64/sve/pcs/asm_4.c
  44f16f9ea3b783c7bee54be492ee8581  gcc/testsuite/gcc.target/aarch64/sve/pcs/gnu_vectors_1.c
  b51a2d0d049e696529fd33b9ffae61f9  gcc/testsuite/gcc.target/aarch64/sve/pcs/gnu_vectors_2.c
*************** d6acea087a556597ab3449954e06312f  gcc/te
*** 75675,75680 ****
--- 75732,75749 ----
  a0596bc98ced318afc176ba91f279b2f  gcc/testsuite/gcc.target/aarch64/sve/pr122103_4.c
  c61eb748774c3997f4f52d2a5d4132a2  gcc/testsuite/gcc.target/aarch64/sve/pr122103_5.c
  bcf63cd298e561e95388f76d4fa49d65  gcc/testsuite/gcc.target/aarch64/sve/pr122103_6.c
+ 787f78e68b3a0cfcc289602c07c04347  gcc/testsuite/gcc.target/aarch64/sve/pr122749_1.c
+ 67062eaec9ae3224c36751ccaefbce3c  gcc/testsuite/gcc.target/aarch64/sve/pr122749_11.c
+ af03b22c378349ae57e38d7657eaaf8b  gcc/testsuite/gcc.target/aarch64/sve/pr122749_12.c
+ 17d8890d0565405194a5f2ece2074a3f  gcc/testsuite/gcc.target/aarch64/sve/pr122749_13.c
+ 93cb300faa8c50ec6bd23f8afdcc9f65  gcc/testsuite/gcc.target/aarch64/sve/pr122749_14.c
+ d42dd1ea70f8104be50f2b828342ef9a  gcc/testsuite/gcc.target/aarch64/sve/pr122749_2.c
+ 06187abc9003f2d1adb2e02157405091  gcc/testsuite/gcc.target/aarch64/sve/pr122749_3.c
+ 7146345d7bbba48a49c1bf4ab9a84ed3  gcc/testsuite/gcc.target/aarch64/sve/pr122749_4.c
+ 0f6b741c106e1ed50c39671efe5cf753  gcc/testsuite/gcc.target/aarch64/sve/pr122749_5.c
+ b88eab54dea3d3e5a60ff794d3268d8e  gcc/testsuite/gcc.target/aarch64/sve/pr122749_6.c
+ d4ac7a84edd49408935038ba429c4a6d  gcc/testsuite/gcc.target/aarch64/sve/pr122749_8.c
+ aab87b2d9daa75eaf07f2f4e47d63c11  gcc/testsuite/gcc.target/aarch64/sve/pr122749_9.c
  806909efa49b7a7a797b079996626314  gcc/testsuite/gcc.target/aarch64/sve/pr123697.c
  8d516514d55b6987b8c79e9e3ce2bdb1  gcc/testsuite/gcc.target/aarch64/sve/pr123767.c
  7e2aaf0806edd37415079b5c2e48b66c  gcc/testsuite/gcc.target/aarch64/sve/pr81003.c
*************** b2d92d06e51698908b628bbf67a8336b  gcc/te
*** 77634,77639 ****
--- 77703,77709 ----
  cf400ce94034485f8a16a1cbd287c372  gcc/testsuite/gcc.target/aarch64/sve2/pr122069_2.c
  0585c8051a613504bc26d003f880104b  gcc/testsuite/gcc.target/aarch64/sve2/pr122069_3.c
  fd41242b07a3e957c67e6fe4c4c2bc33  gcc/testsuite/gcc.target/aarch64/sve2/pr122069_4.c
+ 0cf6f58c25a80144f7412d79b9d48d66  gcc/testsuite/gcc.target/aarch64/sve2/pr123053.c
  f4dd1b504179e0c5f1bcbff8fbfad589  gcc/testsuite/gcc.target/aarch64/sve2/pr123775.c
  3ddfd16fcbf89890fd9785fec8f0c081  gcc/testsuite/gcc.target/aarch64/sve2/shracc_1.c
  8cd4d6e010de57b57d5d8fb325fa79bb  gcc/testsuite/gcc.target/aarch64/sve2/unpred_mul_1.c
*************** e916fcf0c3130fc5102d03f2d729ff64  gcc/te
*** 78002,78008 ****
  244ffe859281a44df2fa3ac62341bd75  gcc/testsuite/gcc.target/aarch64/with-tune-mcpu.c
  73648276a5cd96f9c11169ae4e70ef9c  gcc/testsuite/gcc.target/aarch64/with-tune-mtune.c
  a5784e5c868ce916e0684493e789ed30  gcc/testsuite/gcc.target/aarch64/xar_neon_modes.c
! ffef2c1734dfa074b538fd983a938858  gcc/testsuite/gcc.target/aarch64/xar_v2di_nonsve.c
  fd934708c3543d8703170d5494395bf0  gcc/testsuite/gcc.target/aarch64/xorsign.c
  69c2e660fb11d6895b17cde723e07c66  gcc/testsuite/gcc.target/aarch64/xorsign_exec.c
  4103f6313846ad5d7e1139c35722cc6c  gcc/testsuite/gcc.target/aarch64/xreg-vec-modes_1.c
--- 78072,78078 ----
  244ffe859281a44df2fa3ac62341bd75  gcc/testsuite/gcc.target/aarch64/with-tune-mcpu.c
  73648276a5cd96f9c11169ae4e70ef9c  gcc/testsuite/gcc.target/aarch64/with-tune-mtune.c
  a5784e5c868ce916e0684493e789ed30  gcc/testsuite/gcc.target/aarch64/xar_neon_modes.c
! 941eafc659fb2e3ecf4eac67350b6d5f  gcc/testsuite/gcc.target/aarch64/xar_v2di_nonsve.c
  fd934708c3543d8703170d5494395bf0  gcc/testsuite/gcc.target/aarch64/xorsign.c
  69c2e660fb11d6895b17cde723e07c66  gcc/testsuite/gcc.target/aarch64/xorsign_exec.c
  4103f6313846ad5d7e1139c35722cc6c  gcc/testsuite/gcc.target/aarch64/xreg-vec-modes_1.c
*************** bd5ec5e2db0882814e63c4239cc0bf29  gcc/te
*** 78535,78545 ****
  ebd9a7e3125d7b51692987388532dfb3  gcc/testsuite/gcc.target/arm/bfloat16_scalar_4.c
  7f6fca1944d2c355117b62adc96d2e90  gcc/testsuite/gcc.target/arm/bfloat16_scalar_typecheck.c
  9d566a8c25c9173357e8d1701a9c9181  gcc/testsuite/gcc.target/arm/bfloat16_simd_1_1.c
! e82342fa684459ff8667e9b61d0a7224  gcc/testsuite/gcc.target/arm/bfloat16_simd_1_2.c
  3d1619ca156d9442f835868012752a98  gcc/testsuite/gcc.target/arm/bfloat16_simd_2_1.c
! 713be387902863185c43e0479009cf62  gcc/testsuite/gcc.target/arm/bfloat16_simd_2_2.c
  a30e0a4d7a48b01ccc07bd5be4a0d065  gcc/testsuite/gcc.target/arm/bfloat16_simd_3_1.c
! 9083033564e6fc8e449d986191be65da  gcc/testsuite/gcc.target/arm/bfloat16_simd_3_2.c
  fd023d3635562de2ff5e0ed5260d21d5  gcc/testsuite/gcc.target/arm/bfloat16_vector_typecheck_1.c
  3a97f76c1b98b4d2244bb1a213d2e4b5  gcc/testsuite/gcc.target/arm/bfloat16_vector_typecheck_2.c
  6fd7f87aeac118d347a74f2afe95ddc0  gcc/testsuite/gcc.target/arm/bics_1.c
--- 78605,78615 ----
  ebd9a7e3125d7b51692987388532dfb3  gcc/testsuite/gcc.target/arm/bfloat16_scalar_4.c
  7f6fca1944d2c355117b62adc96d2e90  gcc/testsuite/gcc.target/arm/bfloat16_scalar_typecheck.c
  9d566a8c25c9173357e8d1701a9c9181  gcc/testsuite/gcc.target/arm/bfloat16_simd_1_1.c
! 6ff2d55b28e457c01e5f57c33217acd1  gcc/testsuite/gcc.target/arm/bfloat16_simd_1_2.c
  3d1619ca156d9442f835868012752a98  gcc/testsuite/gcc.target/arm/bfloat16_simd_2_1.c
! d477d122096a7671049840e4df85c931  gcc/testsuite/gcc.target/arm/bfloat16_simd_2_2.c
  a30e0a4d7a48b01ccc07bd5be4a0d065  gcc/testsuite/gcc.target/arm/bfloat16_simd_3_1.c
! 66a3582813f242f6acb7952136e2b12f  gcc/testsuite/gcc.target/arm/bfloat16_simd_3_2.c
  fd023d3635562de2ff5e0ed5260d21d5  gcc/testsuite/gcc.target/arm/bfloat16_vector_typecheck_1.c
  3a97f76c1b98b4d2244bb1a213d2e4b5  gcc/testsuite/gcc.target/arm/bfloat16_vector_typecheck_2.c
  6fd7f87aeac118d347a74f2afe95ddc0  gcc/testsuite/gcc.target/arm/bics_1.c
*************** abba2731624485a0118e2059f5e1c67a  gcc/te
*** 78720,78729 ****
  529ee033072e89caff1af64c606c76f1  gcc/testsuite/gcc.target/arm/crypto-vldrq_p128.c
  bb083e005abbb16dbe033e2482207d43  gcc/testsuite/gcc.target/arm/crypto-vmull_high_p64.c
  37e2ee21032f90da762fb5f45f40f238  gcc/testsuite/gcc.target/arm/crypto-vmullp64.c
! 29b9196639857b0146df64c3ba42355e  gcc/testsuite/gcc.target/arm/crypto-vsha1cq_u32.c
! a9b3df72353269bd050c7b85d3ed348a  gcc/testsuite/gcc.target/arm/crypto-vsha1h_u32.c
! 92a25df2b230221aed44f25c1a57ca78  gcc/testsuite/gcc.target/arm/crypto-vsha1mq_u32.c
! b89aeea2c461c8f8163664d31e5b8962  gcc/testsuite/gcc.target/arm/crypto-vsha1pq_u32.c
  6c1bc826969319ba979de980b58983ea  gcc/testsuite/gcc.target/arm/crypto-vsha1su0q_u32.c
  9e6b3d146a41dd65032d0bb51b482b3a  gcc/testsuite/gcc.target/arm/crypto-vsha1su1q_u32.c
  c0785176ffe81b127778365b94d2f068  gcc/testsuite/gcc.target/arm/crypto-vsha256h2q_u32.c
--- 78790,78799 ----
  529ee033072e89caff1af64c606c76f1  gcc/testsuite/gcc.target/arm/crypto-vldrq_p128.c
  bb083e005abbb16dbe033e2482207d43  gcc/testsuite/gcc.target/arm/crypto-vmull_high_p64.c
  37e2ee21032f90da762fb5f45f40f238  gcc/testsuite/gcc.target/arm/crypto-vmullp64.c
! 446104562e55decf3a31caee093b6597  gcc/testsuite/gcc.target/arm/crypto-vsha1cq_u32.c
! b091a6d42efd78a5ea2b738a41f7db5e  gcc/testsuite/gcc.target/arm/crypto-vsha1h_u32.c
! a699e2f1b04ecea5e52a5634738c3e4c  gcc/testsuite/gcc.target/arm/crypto-vsha1mq_u32.c
! cb350e0285bdad99b40c339b8e999776  gcc/testsuite/gcc.target/arm/crypto-vsha1pq_u32.c
  6c1bc826969319ba979de980b58983ea  gcc/testsuite/gcc.target/arm/crypto-vsha1su0q_u32.c
  9e6b3d146a41dd65032d0bb51b482b3a  gcc/testsuite/gcc.target/arm/crypto-vsha1su1q_u32.c
  c0785176ffe81b127778365b94d2f068  gcc/testsuite/gcc.target/arm/crypto-vsha256h2q_u32.c
*************** dc3bbe82f0ada40b2478603578aa8315  gcc/te
*** 79653,79659 ****
  e123ffb87aa6243074119f950a80a899  gcc/testsuite/gcc.target/arm/mve/intrinsics/vdupq_m_n_u8.c
  c67d1624422c90a483512738cb7e5386  gcc/testsuite/gcc.target/arm/mve/intrinsics/vdupq_n_f16.c
  bb3ddaab68b136b0fffee0ed8de22aaf  gcc/testsuite/gcc.target/arm/mve/intrinsics/vdupq_n_f32-2.c
! 4363e688c8b151d8e61922d8ebb64dad  gcc/testsuite/gcc.target/arm/mve/intrinsics/vdupq_n_f32.c
  b5ee178478af57b2b6bd0b390ad47d7a  gcc/testsuite/gcc.target/arm/mve/intrinsics/vdupq_n_s16-2.c
  7abd1ae5e2a71754ba681212841beda8  gcc/testsuite/gcc.target/arm/mve/intrinsics/vdupq_n_s16.c
  01f971558d30f21c72d7d0323ef5e0d1  gcc/testsuite/gcc.target/arm/mve/intrinsics/vdupq_n_s32-2.c
--- 79723,79729 ----
  e123ffb87aa6243074119f950a80a899  gcc/testsuite/gcc.target/arm/mve/intrinsics/vdupq_m_n_u8.c
  c67d1624422c90a483512738cb7e5386  gcc/testsuite/gcc.target/arm/mve/intrinsics/vdupq_n_f16.c
  bb3ddaab68b136b0fffee0ed8de22aaf  gcc/testsuite/gcc.target/arm/mve/intrinsics/vdupq_n_f32-2.c
! d391bc93ef31500f2f133b8090c2b1d7  gcc/testsuite/gcc.target/arm/mve/intrinsics/vdupq_n_f32.c
  b5ee178478af57b2b6bd0b390ad47d7a  gcc/testsuite/gcc.target/arm/mve/intrinsics/vdupq_n_s16-2.c
  7abd1ae5e2a71754ba681212841beda8  gcc/testsuite/gcc.target/arm/mve/intrinsics/vdupq_n_s16.c
  01f971558d30f21c72d7d0323ef5e0d1  gcc/testsuite/gcc.target/arm/mve/intrinsics/vdupq_n_s32-2.c
*************** c2b556510a6d5c54101374760111a06e  gcc/te
*** 82043,82049 ****
  e13154393d19a49196906480b6d2d4bc  gcc/testsuite/gcc.target/arm/stack-protector-4.c
  70342bcaa3f6107c83106c2d684152ed  gcc/testsuite/gcc.target/arm/stack-protector-5.c
  fe2f9ebabcf72015dcbdb73c0c9e2338  gcc/testsuite/gcc.target/arm/stack-protector-6.c
! 8ffe969f8b78ebbb52cd35f301ac111c  gcc/testsuite/gcc.target/arm/stack-protector-7.c
  714c8ead52c9923b0b17e61dfc6bdd10  gcc/testsuite/gcc.target/arm/stack-protector-8.c
  011b467632d678d04108bd1dc27d26b7  gcc/testsuite/gcc.target/arm/stack-red-zone.c
  152321b1bfa07e69c572a0ca8573c015  gcc/testsuite/gcc.target/arm/symbian1.c
--- 82113,82119 ----
  e13154393d19a49196906480b6d2d4bc  gcc/testsuite/gcc.target/arm/stack-protector-4.c
  70342bcaa3f6107c83106c2d684152ed  gcc/testsuite/gcc.target/arm/stack-protector-5.c
  fe2f9ebabcf72015dcbdb73c0c9e2338  gcc/testsuite/gcc.target/arm/stack-protector-6.c
! e9768573f09ed99f388842ad2465bd1d  gcc/testsuite/gcc.target/arm/stack-protector-7.c
  714c8ead52c9923b0b17e61dfc6bdd10  gcc/testsuite/gcc.target/arm/stack-protector-8.c
  011b467632d678d04108bd1dc27d26b7  gcc/testsuite/gcc.target/arm/stack-red-zone.c
  152321b1bfa07e69c572a0ca8573c015  gcc/testsuite/gcc.target/arm/symbian1.c
*************** a221ce1cf8f087e1b841edfdc50cf1d1  gcc/te
*** 82258,82263 ****
--- 82328,82334 ----
  b4c1968ee63a61f92dc6808c44852bd9  gcc/testsuite/gcc.target/avr/pr121198.c
  c8dee67a2567af17cd08c345a4ef3aea  gcc/testsuite/gcc.target/avr/pr122220.c
  abbae4b0f7390ccdb0c5394f5172173a  gcc/testsuite/gcc.target/avr/pr122222-sitod.c
+ 3bab20e720a24864ff16abcddb328b14  gcc/testsuite/gcc.target/avr/pr123583.c
  8d351de18b6ca99f76c43eaa14213d53  gcc/testsuite/gcc.target/avr/pr46779-1.c
  2887bd8c777e4696616590f0d60653b6  gcc/testsuite/gcc.target/avr/pr46779-2.c
  d92831f37e30237d1dc568f585e4c2c9  gcc/testsuite/gcc.target/avr/pr50739.c
*************** f465b493ef4cd8fedb8eb45d4397bdf2  gcc/te
*** 89418,89424 ****
  53b4f9f435b0daa700fd5937cf27f349  gcc/testsuite/gcc.target/i386/pr116258.c
  6909f87518edc9432bf3b69c22d01d5f  gcc/testsuite/gcc.target/i386/pr116274-2.c
  68dcc6e225835bd404fac33fbc2ba3c1  gcc/testsuite/gcc.target/i386/pr116274.c
- 48aac08804f50952099264ab24d48c37  gcc/testsuite/gcc.target/i386/pr116353.c
  5d7ed648796e3bb1badb99e986fd299a  gcc/testsuite/gcc.target/i386/pr116512.c
  a006d0528b5396c949ad41d70bbe59d3  gcc/testsuite/gcc.target/i386/pr116587.c
  b032673fbd5ea0fa71ec43f67e37cd44  gcc/testsuite/gcc.target/i386/pr116621.c
--- 89489,89494 ----
*************** e6b30d1b12ce6371b1496537f813409b  gcc/te
*** 89592,89597 ****
--- 89662,89668 ----
  2dc3b7effccafde04f6a1a6979dfda02  gcc/testsuite/gcc.target/i386/pr121541-4.c
  49453a7f94bae8710b481412068b8c3a  gcc/testsuite/gcc.target/i386/pr121541-5a.c
  49647fa6eb097d991a160b581c3ad123  gcc/testsuite/gcc.target/i386/pr121541-5b.c
+ acecf2f1dc8cd91c8c8b1bdd86ee2f01  gcc/testsuite/gcc.target/i386/pr121571.c
  01537400901755ab7517f93176f78533  gcc/testsuite/gcc.target/i386/pr121572-1a.c
  68b576a781e6a2dc5f79397f2956beaf  gcc/testsuite/gcc.target/i386/pr121572-1b.c
  7fe4d8dc41303448e9d4b3659eb12e8e  gcc/testsuite/gcc.target/i386/pr121572-2a.c
*************** f99f88a6e994ad6e55e065e41bc58f8f  gcc/te
*** 89657,89662 ****
--- 89728,89734 ----
  fd0c95fcad577a49c3553f21604c3b61  gcc/testsuite/gcc.target/i386/pr123484.c
  5263cb01b17b6df3496a998c2a8e70d8  gcc/testsuite/gcc.target/i386/pr123489.c
  0c572aee98b871b5098fcc5a78b5d069  gcc/testsuite/gcc.target/i386/pr123523.c
+ 22075af1d8889b20a319ee5c1ddae745  gcc/testsuite/gcc.target/i386/pr123583.c
  9949ec20bd5dbd25bf3dad6832f9205f  gcc/testsuite/gcc.target/i386/pr123585.c
  8951a1fa31f2d45ef9eacfff6a733f77  gcc/testsuite/gcc.target/i386/pr13366.c
  9a752a4b3b77930d91d3c8b0c8897b90  gcc/testsuite/gcc.target/i386/pr13685.c
*************** a15920d2bd39af2c6ba3dd59c538061f  gcc/te
*** 89811,89816 ****
--- 89883,89890 ----
  34cc8870bfb7e47801158a468a92ef55  gcc/testsuite/gcc.target/i386/pr36503-2.c
  f8e729e4cba21d4549fca283100064d7  gcc/testsuite/gcc.target/i386/pr36503-3.c
  59ea01d571864c94f133b60e3fe89bc5  gcc/testsuite/gcc.target/i386/pr36503-4.c
+ 2029a045ea358abec88da8d5729dd7aa  gcc/testsuite/gcc.target/i386/pr36503-5.c
+ 6ee0e6d2d365d186637ddd09db598d0a  gcc/testsuite/gcc.target/i386/pr36503-6.c
  3786920028431ee2bbb88e6cd16d4a1e  gcc/testsuite/gcc.target/i386/pr36533.c
  0b87c77e85a24ff1698d032433722192  gcc/testsuite/gcc.target/i386/pr36578-1.c
  f795279a6fc6ad5bbd419253da875a10  gcc/testsuite/gcc.target/i386/pr36578-2.c
*************** f8e85c0fabedb15da4e203ea4c1d6792  gcc/te
*** 93048,93053 ****
--- 93122,93128 ----
  e26420568eb59260ac109ca747ecbf46  gcc/testsuite/gcc.target/loongarch/la64/mov-zero-2.c
  4931eef8fe508d14b75d3631fe8bbafc  gcc/testsuite/gcc.target/loongarch/la64/movcf2gr-via-fr.c
  bb6ea01b244f2c3e617730a44580a7bc  gcc/testsuite/gcc.target/loongarch/la64/movcf2gr.c
+ 24d980eb7e8265126262771e4989fbd5  gcc/testsuite/gcc.target/loongarch/la64/movsf.c
  d23b33973d13d263ab78b5b4e0b94ef3  gcc/testsuite/gcc.target/loongarch/la64/mul-const-reduction.c
  a81bb88e2af3a8501ccdfe54556bf467  gcc/testsuite/gcc.target/loongarch/la64/mulh_wu.c
  ab8d85a261f0846c278e2d6db2c6ab77  gcc/testsuite/gcc.target/loongarch/la64/mulw_d_w.c
*************** de83bbcbb03e37b7d3c3619033b6882e  gcc/te
*** 93379,93384 ****
--- 93454,93460 ----
  178cabcb86491ff3ad0921dced4838d3  gcc/testsuite/gcc.target/loongarch/vector/lasx/pr112476-4.c
  9b9319e8de39dcffbe873584b20d35a5  gcc/testsuite/gcc.target/loongarch/vector/lasx/pr113033.c
  970835a22a2eef8dad1be6ea6edc6402  gcc/testsuite/gcc.target/loongarch/vector/lasx/pr123521.c
+ 91b4f4f5d2c5b786b45fad8edab6e2a3  gcc/testsuite/gcc.target/loongarch/vector/lasx/pr123766.c
  1eac553341d725c6e59615b593aedb0d  gcc/testsuite/gcc.target/loongarch/vector/lasx/pragma-push-pop.c
  7c1d85beb3eaf3489d693d57eb51dcd2  gcc/testsuite/gcc.target/loongarch/vector/lasx/rotl-with-xvrotr-b.c
  e3b0049caf475cc1fdd98f6d52e6c7ae  gcc/testsuite/gcc.target/loongarch/vector/lasx/rotl-with-xvrotr-d.c
*************** dbfbd76701c5c3e6c8ed37ced1ba9cc7  gcc/te
*** 93640,93645 ****
--- 93716,93723 ----
  359760e5160f4b52d2fa349806589a0d  gcc/testsuite/gcc.target/loongarch/vector/lsx/pr121064.c
  4fb67de6ceaa4d3d0dfff318541b470b  gcc/testsuite/gcc.target/loongarch/vector/lsx/pr122097.c
  76be8fbd02020c0b574be8ba3ce9b597  gcc/testsuite/gcc.target/loongarch/vector/lsx/pr123117.c
+ 559fe74ad49c6f3f986d68a4822b9041  gcc/testsuite/gcc.target/loongarch/vector/lsx/pr123766.c
+ c09c273ba4acff5a9b6ac824b23ab663  gcc/testsuite/gcc.target/loongarch/vector/lsx/pr123807.c
  2ddebd413eaa67833fbe9045727d296a  gcc/testsuite/gcc.target/loongarch/vector/lsx/rotl-with-vrotr-b.c
  b4792704ae2560835ce2844ab052bd96  gcc/testsuite/gcc.target/loongarch/vector/lsx/rotl-with-vrotr-d.c
  0f0929ffb430681fa30b2b435c3a1aea  gcc/testsuite/gcc.target/loongarch/vector/lsx/rotl-with-vrotr-h.c
*************** e98f2d19ed80ab018f96ccb526890413  gcc/te
*** 97559,97564 ****
--- 97637,97656 ----
  721df8213c987d55dc1efd55bfbafae1  gcc/testsuite/gcc.target/riscv/abi/empty-union-2.c
  7d48ff4649bb5427ff973053ef53e5d2  gcc/testsuite/gcc.target/riscv/abi/empty-union-3.c
  53023d2cb0d32036037f60841e0d7247  gcc/testsuite/gcc.target/riscv/abi/empty-union-4.c
+ 4e8d927a6877a7cb244569dd880971cf  gcc/testsuite/gcc.target/riscv/abi/vls-gpr-1.c
+ 6c871301aec7f045c94bb6e785aabfbf  gcc/testsuite/gcc.target/riscv/abi/vls-gpr-10.c
+ d7ad132ef53c423fc6dbd37e7fb5cfa4  gcc/testsuite/gcc.target/riscv/abi/vls-gpr-11.c
+ d791463cbf4d81912f179b794757cf70  gcc/testsuite/gcc.target/riscv/abi/vls-gpr-12.c
+ 157732bfc87d1bf9e29119ec02a3d83e  gcc/testsuite/gcc.target/riscv/abi/vls-gpr-13.c
+ e109a39229586538415a1482ff6c201c  gcc/testsuite/gcc.target/riscv/abi/vls-gpr-14.c
+ a8ee97882c0e8e2f12765b3ad84e253e  gcc/testsuite/gcc.target/riscv/abi/vls-gpr-2.c
+ 0c017a08132c882b0c6806ad87eac0be  gcc/testsuite/gcc.target/riscv/abi/vls-gpr-3.c
+ 39e4387a147a77a5cffabd57cde0a4d9  gcc/testsuite/gcc.target/riscv/abi/vls-gpr-4.c
+ 092533039313c2e2b9dcd79b592661c9  gcc/testsuite/gcc.target/riscv/abi/vls-gpr-5.c
+ 73eee15ee0ad0408a0858b581ed29b97  gcc/testsuite/gcc.target/riscv/abi/vls-gpr-6.c
+ 4979d12265209e12d2875767b4d8aafc  gcc/testsuite/gcc.target/riscv/abi/vls-gpr-7.c
+ e2370c38a87d4cc60085fb7a8e611db5  gcc/testsuite/gcc.target/riscv/abi/vls-gpr-8.c
+ b6c3a11e4c9bd3883b232d9dc584ebf4  gcc/testsuite/gcc.target/riscv/abi/vls-gpr-9.c
  e576467327b6885418c9d8748492593a  gcc/testsuite/gcc.target/riscv/add-synthesis-1.c
  615a0e0c970edc01fb1779359e6d4069  gcc/testsuite/gcc.target/riscv/add-synthesis-2.c
  d93c3e1c3636a89154ff39eafab30b70  gcc/testsuite/gcc.target/riscv/adddibeq.c
*************** b656a9e0d73427727bb0cc6df44334ab  gcc/te
*** 98199,98206 ****
  9ae56141fab814505fcf7366ef12db85  gcc/testsuite/gcc.target/riscv/li.c
  6308e09d3e5133433b97e26dcb02daba  gcc/testsuite/gcc.target/riscv/load-immediate.c
  7530069d23aa7990ff78ecce4ac40cae  gcc/testsuite/gcc.target/riscv/losum-overflow.c
! ce3b187939b87fc213b6c10c98975fc0  gcc/testsuite/gcc.target/riscv/lto/pr110812_0.c
! cbd4eeb25a9dd3d6d0da83efc1b0bcfb  gcc/testsuite/gcc.target/riscv/lto/pr110812_1.c
  f7b7f525bf208a2c94029f5066e420ac  gcc/testsuite/gcc.target/riscv/lto/riscv-lto.exp
  979e78c5ed1d2ba91a46584480362b26  gcc/testsuite/gcc.target/riscv/lto/riscv_vector.h
  7a85a9d76321b19b1c9a5242b0715dd4  gcc/testsuite/gcc.target/riscv/matrix_add_const.c
--- 98291,98298 ----
  9ae56141fab814505fcf7366ef12db85  gcc/testsuite/gcc.target/riscv/li.c
  6308e09d3e5133433b97e26dcb02daba  gcc/testsuite/gcc.target/riscv/load-immediate.c
  7530069d23aa7990ff78ecce4ac40cae  gcc/testsuite/gcc.target/riscv/losum-overflow.c
! a9f24eff74b34541ebef24d8965f1336  gcc/testsuite/gcc.target/riscv/lto/pr110812_0.c
! b5b03b4580c0a785c21ea9454eef6421  gcc/testsuite/gcc.target/riscv/lto/pr110812_1.c
  f7b7f525bf208a2c94029f5066e420ac  gcc/testsuite/gcc.target/riscv/lto/riscv-lto.exp
  979e78c5ed1d2ba91a46584480362b26  gcc/testsuite/gcc.target/riscv/lto/riscv_vector.h
  7a85a9d76321b19b1c9a5242b0715dd4  gcc/testsuite/gcc.target/riscv/matrix_add_const.c
*************** f69135840e05c772e53aa1bd017926c5  gcc/te
*** 98559,98565 ****
  9d70c1379c63763252909de831509855  gcc/testsuite/gcc.target/riscv/pr113715.c
  9bb9353191b107cdeaf920a4e0796e31  gcc/testsuite/gcc.target/riscv/pr113742.c
  bba0977f2acac23e269d463cd1b7ba52  gcc/testsuite/gcc.target/riscv/pr114087-1.c
! 0be9cd6857f2505997bc83cad628e9aa  gcc/testsuite/gcc.target/riscv/pr114139.c
  a7b01bd6393c053eb2052773c0ca4b69  gcc/testsuite/gcc.target/riscv/pr114277.c
  55a41664e9844961c91357e97dc9ba27  gcc/testsuite/gcc.target/riscv/pr114442.c
  5bbe0709a8dfddcf22a4bc65aa5e494e  gcc/testsuite/gcc.target/riscv/pr114512.c
--- 98651,98657 ----
  9d70c1379c63763252909de831509855  gcc/testsuite/gcc.target/riscv/pr113715.c
  9bb9353191b107cdeaf920a4e0796e31  gcc/testsuite/gcc.target/riscv/pr113742.c
  bba0977f2acac23e269d463cd1b7ba52  gcc/testsuite/gcc.target/riscv/pr114087-1.c
! 3a13abdacb2f605296c9cdde148a27b7  gcc/testsuite/gcc.target/riscv/pr114139.c
  a7b01bd6393c053eb2052773c0ca4b69  gcc/testsuite/gcc.target/riscv/pr114277.c
  55a41664e9844961c91357e97dc9ba27  gcc/testsuite/gcc.target/riscv/pr114442.c
  5bbe0709a8dfddcf22a4bc65aa5e494e  gcc/testsuite/gcc.target/riscv/pr114512.c
*************** c89116d62c198e5c6cfee06b2eab1fe4  gcc/te
*** 98611,98617 ****
  a7cdfe664ef8616a70af588b3a79aa27  gcc/testsuite/gcc.target/riscv/pr118122.c
  8c4f6b44c5539860ac14e0e52ee563cd  gcc/testsuite/gcc.target/riscv/pr118146-1.c
  b22a15e86fb70037feb383a055b6e153  gcc/testsuite/gcc.target/riscv/pr118146-2.c
! 1fa594621b25166287d6d30b0daf189b  gcc/testsuite/gcc.target/riscv/pr118170.c
  2bc8f4e965541e4fc96271a069a25fb6  gcc/testsuite/gcc.target/riscv/pr118241-b.cc
  a0414657daa6221b34457b2d257d1cf3  gcc/testsuite/gcc.target/riscv/pr118241.c
  8c91cf2796ff0e2ea816e9d35b520e8d  gcc/testsuite/gcc.target/riscv/pr118248.c
--- 98703,98709 ----
  a7cdfe664ef8616a70af588b3a79aa27  gcc/testsuite/gcc.target/riscv/pr118122.c
  8c4f6b44c5539860ac14e0e52ee563cd  gcc/testsuite/gcc.target/riscv/pr118146-1.c
  b22a15e86fb70037feb383a055b6e153  gcc/testsuite/gcc.target/riscv/pr118146-2.c
! a04df1bb92934d34ced7a6c04371bd15  gcc/testsuite/gcc.target/riscv/pr118170.c
  2bc8f4e965541e4fc96271a069a25fb6  gcc/testsuite/gcc.target/riscv/pr118241-b.cc
  a0414657daa6221b34457b2d257d1cf3  gcc/testsuite/gcc.target/riscv/pr118241.c
  8c91cf2796ff0e2ea816e9d35b520e8d  gcc/testsuite/gcc.target/riscv/pr118248.c
*************** ea89beffad7d3445e7faf4e7b1b31944  gcc/te
*** 98654,98660 ****
  bc59de83765bb844925a1922677b3910  gcc/testsuite/gcc.target/riscv/pr122106.c
  0f5f042a5df3f42e8e3634b538a557e9  gcc/testsuite/gcc.target/riscv/pr122114.c
  cddeabddc47c1e2e434be321884dbb80  gcc/testsuite/gcc.target/riscv/pr122147.c
! 517cee01d883f2604f8317ec8307ae44  gcc/testsuite/gcc.target/riscv/pr122215.c
  5e651c455514b3ec306f584a9708ee34  gcc/testsuite/gcc.target/riscv/pr122675-1.c
  6068a5f2303e752be2ee748be0491832  gcc/testsuite/gcc.target/riscv/pr122769.c
  7bb06177e50b345e5b51df54446f5561  gcc/testsuite/gcc.target/riscv/pr123010.c
--- 98746,98752 ----
  bc59de83765bb844925a1922677b3910  gcc/testsuite/gcc.target/riscv/pr122106.c
  0f5f042a5df3f42e8e3634b538a557e9  gcc/testsuite/gcc.target/riscv/pr122114.c
  cddeabddc47c1e2e434be321884dbb80  gcc/testsuite/gcc.target/riscv/pr122147.c
! bf010688ceeadb1d6c96536579c3ddd5  gcc/testsuite/gcc.target/riscv/pr122215.c
  5e651c455514b3ec306f584a9708ee34  gcc/testsuite/gcc.target/riscv/pr122675-1.c
  6068a5f2303e752be2ee748be0491832  gcc/testsuite/gcc.target/riscv/pr122769.c
  7bb06177e50b345e5b51df54446f5561  gcc/testsuite/gcc.target/riscv/pr123010.c
*************** de2cab5a8e2da69a8db8d226339e52a8  gcc/te
*** 98818,98826 ****
  22ac7a0e40ee0d73ee3acf39c4790345  gcc/testsuite/gcc.target/riscv/rvv/autovec/binop/shift-template.h
  f7bcb68e3023c1e5612ce4e7cb17f707  gcc/testsuite/gcc.target/riscv/rvv/autovec/binop/vadd-run-nofm.c
  5a96ce3f4fa167a0c456da1d5f773730  gcc/testsuite/gcc.target/riscv/rvv/autovec/binop/vadd-run.c
! db78ea8524cecf8f2b0af0b694eac74f  gcc/testsuite/gcc.target/riscv/rvv/autovec/binop/vadd-rv32gcv-nofm.c
  fa28d1b860b1fc6524ba539f3efa0e8b  gcc/testsuite/gcc.target/riscv/rvv/autovec/binop/vadd-rv32gcv.c
! d4196ebc173f3a137412a606999e8062  gcc/testsuite/gcc.target/riscv/rvv/autovec/binop/vadd-rv64gcv-nofm.c
  7cc257aa83a272fbc0eb2b67af1a72ab  gcc/testsuite/gcc.target/riscv/rvv/autovec/binop/vadd-rv64gcv.c
  93a18051bf5b024c977fe02509c4f2b7  gcc/testsuite/gcc.target/riscv/rvv/autovec/binop/vadd-template.h
  83b9da5b3175cdf12887b104bf702389  gcc/testsuite/gcc.target/riscv/rvv/autovec/binop/vadd-zvfh-run.c
--- 98910,98918 ----
  22ac7a0e40ee0d73ee3acf39c4790345  gcc/testsuite/gcc.target/riscv/rvv/autovec/binop/shift-template.h
  f7bcb68e3023c1e5612ce4e7cb17f707  gcc/testsuite/gcc.target/riscv/rvv/autovec/binop/vadd-run-nofm.c
  5a96ce3f4fa167a0c456da1d5f773730  gcc/testsuite/gcc.target/riscv/rvv/autovec/binop/vadd-run.c
! 9a253dcb392103fee0bf5a2149fcd9ab  gcc/testsuite/gcc.target/riscv/rvv/autovec/binop/vadd-rv32gcv-nofm.c
  fa28d1b860b1fc6524ba539f3efa0e8b  gcc/testsuite/gcc.target/riscv/rvv/autovec/binop/vadd-rv32gcv.c
! 2041b4dfd703ca1ea5db77e1aa3b2416  gcc/testsuite/gcc.target/riscv/rvv/autovec/binop/vadd-rv64gcv-nofm.c
  7cc257aa83a272fbc0eb2b67af1a72ab  gcc/testsuite/gcc.target/riscv/rvv/autovec/binop/vadd-rv64gcv.c
  93a18051bf5b024c977fe02509c4f2b7  gcc/testsuite/gcc.target/riscv/rvv/autovec/binop/vadd-template.h
  83b9da5b3175cdf12887b104bf702389  gcc/testsuite/gcc.target/riscv/rvv/autovec/binop/vadd-zvfh-run.c
*************** a5498854044a7005fc430d9e85db21b8  gcc/te
*** 98871,98879 ****
  a3b980bdfbd34def55cb4d3c391fabed  gcc/testsuite/gcc.target/riscv/rvv/autovec/binop/vrolr-template.h
  8b5ad895beab4f44d6c437c5e895a3ab  gcc/testsuite/gcc.target/riscv/rvv/autovec/binop/vsub-run-nofm.c
  399b2f2863e8796c55f743e8c3ff0927  gcc/testsuite/gcc.target/riscv/rvv/autovec/binop/vsub-run.c
! 0fb257f173031efbdf0edb7ec25178f2  gcc/testsuite/gcc.target/riscv/rvv/autovec/binop/vsub-rv32gcv-nofm.c
  a8fa812d905b55ae57ce821d94f1ffb2  gcc/testsuite/gcc.target/riscv/rvv/autovec/binop/vsub-rv32gcv.c
! 47dae8242b41d6cbae457827f43d6449  gcc/testsuite/gcc.target/riscv/rvv/autovec/binop/vsub-rv64gcv-nofm.c
  ab2de916b7b2498d0032349388d147eb  gcc/testsuite/gcc.target/riscv/rvv/autovec/binop/vsub-rv64gcv.c
  3bf21f1fa4bc8a29aba5f4776b4e0db3  gcc/testsuite/gcc.target/riscv/rvv/autovec/binop/vsub-template.h
  9c0ccbf675e6663254fb7e4b50d269c5  gcc/testsuite/gcc.target/riscv/rvv/autovec/binop/vsub-zvfh-run.c
--- 98963,98971 ----
  a3b980bdfbd34def55cb4d3c391fabed  gcc/testsuite/gcc.target/riscv/rvv/autovec/binop/vrolr-template.h
  8b5ad895beab4f44d6c437c5e895a3ab  gcc/testsuite/gcc.target/riscv/rvv/autovec/binop/vsub-run-nofm.c
  399b2f2863e8796c55f743e8c3ff0927  gcc/testsuite/gcc.target/riscv/rvv/autovec/binop/vsub-run.c
! 28146197954c46e489a3b32902f0483d  gcc/testsuite/gcc.target/riscv/rvv/autovec/binop/vsub-rv32gcv-nofm.c
  a8fa812d905b55ae57ce821d94f1ffb2  gcc/testsuite/gcc.target/riscv/rvv/autovec/binop/vsub-rv32gcv.c
! 9250115d4e79c202a387c4f32f09876e  gcc/testsuite/gcc.target/riscv/rvv/autovec/binop/vsub-rv64gcv-nofm.c
  ab2de916b7b2498d0032349388d147eb  gcc/testsuite/gcc.target/riscv/rvv/autovec/binop/vsub-rv64gcv.c
  3bf21f1fa4bc8a29aba5f4776b4e0db3  gcc/testsuite/gcc.target/riscv/rvv/autovec/binop/vsub-template.h
  9c0ccbf675e6663254fb7e4b50d269c5  gcc/testsuite/gcc.target/riscv/rvv/autovec/binop/vsub-zvfh-run.c
*************** f9ae179d5dd3e09d82fde9d15aab3ade  gcc/te
*** 98886,98892 ****
  1486eccef90fee0e3ab0675cf8f88a10  gcc/testsuite/gcc.target/riscv/rvv/autovec/binop/vxor-template.h
  61abba01f6ae91593ba7705d6d8445c4  gcc/testsuite/gcc.target/riscv/rvv/autovec/bug-1.c
  c310dc52e5832d1d153b40b045b49220  gcc/testsuite/gcc.target/riscv/rvv/autovec/bug-2.c
! a2348ec3e8310e981a3c6c2ebc30a29d  gcc/testsuite/gcc.target/riscv/rvv/autovec/bug-3.c
  2a7fc9f39222bcceb856efe167362892  gcc/testsuite/gcc.target/riscv/rvv/autovec/bug-4.c
  ce8ba61eb8ad2e8581e8c277baeb7866  gcc/testsuite/gcc.target/riscv/rvv/autovec/bug-5.c
  787d022135b121c639ad6f918c124190  gcc/testsuite/gcc.target/riscv/rvv/autovec/bug-6.c
--- 98978,98984 ----
  1486eccef90fee0e3ab0675cf8f88a10  gcc/testsuite/gcc.target/riscv/rvv/autovec/binop/vxor-template.h
  61abba01f6ae91593ba7705d6d8445c4  gcc/testsuite/gcc.target/riscv/rvv/autovec/bug-1.c
  c310dc52e5832d1d153b40b045b49220  gcc/testsuite/gcc.target/riscv/rvv/autovec/bug-2.c
! 40027ec872b06e4bc32b9b4da88d6d1d  gcc/testsuite/gcc.target/riscv/rvv/autovec/bug-3.c
  2a7fc9f39222bcceb856efe167362892  gcc/testsuite/gcc.target/riscv/rvv/autovec/bug-4.c
  ce8ba61eb8ad2e8581e8c277baeb7866  gcc/testsuite/gcc.target/riscv/rvv/autovec/bug-5.c
  787d022135b121c639ad6f918c124190  gcc/testsuite/gcc.target/riscv/rvv/autovec/bug-6.c
*************** ea1a52d4d4520c9759f08c40d864ed64  gcc/te
*** 99460,99466 ****
  f30693b200f336b7d96f5c6c869848ff  gcc/testsuite/gcc.target/riscv/rvv/autovec/pr113087-1.c
  c2d70a58e506274256f65d7f6cb17f6d  gcc/testsuite/gcc.target/riscv/rvv/autovec/pr113087-2.c
  cc397788c7fa081c3f6af9b0e48683a3  gcc/testsuite/gcc.target/riscv/rvv/autovec/pr113206-1.c
! 80f03a6256b442866c29ae038b4a1dff  gcc/testsuite/gcc.target/riscv/rvv/autovec/pr113206-2.c
  2c4e25a7be198b668bc9e0c734d22df6  gcc/testsuite/gcc.target/riscv/rvv/autovec/pr113209.c
  690d60fb5e8422e5e4384fa519eafe88  gcc/testsuite/gcc.target/riscv/rvv/autovec/pr113393-1.c
  d805ab13b2bc9ddb0fbb9155fc11d33e  gcc/testsuite/gcc.target/riscv/rvv/autovec/pr113393-2.c
--- 99552,99558 ----
  f30693b200f336b7d96f5c6c869848ff  gcc/testsuite/gcc.target/riscv/rvv/autovec/pr113087-1.c
  c2d70a58e506274256f65d7f6cb17f6d  gcc/testsuite/gcc.target/riscv/rvv/autovec/pr113087-2.c
  cc397788c7fa081c3f6af9b0e48683a3  gcc/testsuite/gcc.target/riscv/rvv/autovec/pr113206-1.c
! 8ecb9c61d54e68de697979addcdb22cb  gcc/testsuite/gcc.target/riscv/rvv/autovec/pr113206-2.c
  2c4e25a7be198b668bc9e0c734d22df6  gcc/testsuite/gcc.target/riscv/rvv/autovec/pr113209.c
  690d60fb5e8422e5e4384fa519eafe88  gcc/testsuite/gcc.target/riscv/rvv/autovec/pr113393-1.c
  d805ab13b2bc9ddb0fbb9155fc11d33e  gcc/testsuite/gcc.target/riscv/rvv/autovec/pr113393-2.c
*************** a57153c5795f4e1a6d4cfb4702343803  gcc/te
*** 100608,100614 ****
  c765369ff3aff0333c4a2ac3d0a39e25  gcc/testsuite/gcc.target/riscv/rvv/autovec/vls-vlmax/shuffle-interleave-run.c
  7e89f3a7d2465bd1017f2024f03337c2  gcc/testsuite/gcc.target/riscv/rvv/autovec/vls-vlmax/shuffle-interleave.c
  00c36fd5ca0136a6f17b4071dcb8af38  gcc/testsuite/gcc.target/riscv/rvv/autovec/vls-vlmax/shuffle-slide-run.c
! 1b4d0463f44d14c19f4d02259d509a9e  gcc/testsuite/gcc.target/riscv/rvv/autovec/vls-vlmax/shuffle-slide.c
  2761f3f732e71421249a98794cd7c82a  gcc/testsuite/gcc.target/riscv/rvv/autovec/vls-vlmax/shuffle-slide.h
  427a7a5ff256a6261e7cac5bfc63bdd2  gcc/testsuite/gcc.target/riscv/rvv/autovec/vls-vlmax/shuffle-slidedown-1.c
  7037d0b7f314378828748d3cb621f1d9  gcc/testsuite/gcc.target/riscv/rvv/autovec/vls-vlmax/shuffle-slidedown-2.c
--- 100700,100706 ----
  c765369ff3aff0333c4a2ac3d0a39e25  gcc/testsuite/gcc.target/riscv/rvv/autovec/vls-vlmax/shuffle-interleave-run.c
  7e89f3a7d2465bd1017f2024f03337c2  gcc/testsuite/gcc.target/riscv/rvv/autovec/vls-vlmax/shuffle-interleave.c
  00c36fd5ca0136a6f17b4071dcb8af38  gcc/testsuite/gcc.target/riscv/rvv/autovec/vls-vlmax/shuffle-slide-run.c
! f7e247eb8bdf16a4868f4fff31a14923  gcc/testsuite/gcc.target/riscv/rvv/autovec/vls-vlmax/shuffle-slide.c
  2761f3f732e71421249a98794cd7c82a  gcc/testsuite/gcc.target/riscv/rvv/autovec/vls-vlmax/shuffle-slide.h
  427a7a5ff256a6261e7cac5bfc63bdd2  gcc/testsuite/gcc.target/riscv/rvv/autovec/vls-vlmax/shuffle-slidedown-1.c
  7037d0b7f314378828748d3cb621f1d9  gcc/testsuite/gcc.target/riscv/rvv/autovec/vls-vlmax/shuffle-slidedown-2.c
*************** b0032fffb6e1860da7ca94cd7252c411  gcc/te
*** 102180,102186 ****
  1fb93600882c294d9641935b1aacb938  gcc/testsuite/gcc.target/riscv/rvv/base/pr122656-1.c
  64bada55e64f1bf5909df579653ca6f5  gcc/testsuite/gcc.target/riscv/rvv/base/pr122656-2.c
  2fb442e926debbe3c4b2f0853b8339dd  gcc/testsuite/gcc.target/riscv/rvv/base/pr122869.c
! afe5c0f90dcda5a4d7dab1f71d0e9ae2  gcc/testsuite/gcc.target/riscv/rvv/base/pr123626.c
  15b1508bb10427fc88af9cfc478fb814  gcc/testsuite/gcc.target/riscv/rvv/base/pr123780.c
  c05efbdfaafc64ad34b3d1c4b60a38eb  gcc/testsuite/gcc.target/riscv/rvv/base/pr90263.c
  be75fd39ea9b3d01e3e22294359fb482  gcc/testsuite/gcc.target/riscv/rvv/base/pragma-2.c
--- 102272,102278 ----
  1fb93600882c294d9641935b1aacb938  gcc/testsuite/gcc.target/riscv/rvv/base/pr122656-1.c
  64bada55e64f1bf5909df579653ca6f5  gcc/testsuite/gcc.target/riscv/rvv/base/pr122656-2.c
  2fb442e926debbe3c4b2f0853b8339dd  gcc/testsuite/gcc.target/riscv/rvv/base/pr122869.c
! 2b4a47169174b6b026d7e3f6b2462760  gcc/testsuite/gcc.target/riscv/rvv/base/pr123626.c
  15b1508bb10427fc88af9cfc478fb814  gcc/testsuite/gcc.target/riscv/rvv/base/pr123780.c
  c05efbdfaafc64ad34b3d1c4b60a38eb  gcc/testsuite/gcc.target/riscv/rvv/base/pr90263.c
  be75fd39ea9b3d01e3e22294359fb482  gcc/testsuite/gcc.target/riscv/rvv/base/pragma-2.c
*************** c408b1a7f84e4b815e85476963221ae9  gcc/te
*** 102415,102420 ****
--- 102507,102513 ----
  527003a16d82851a0dd57a93c29bcab7  gcc/testsuite/gcc.target/riscv/rvv/base/zvl-unimplemented-2.c
  2865ee85ce614d77ff279bf2235dfe51  gcc/testsuite/gcc.target/riscv/rvv/pr120297.c
  999cc44bdd25aaa38b1dfd62ba9b84ab  gcc/testsuite/gcc.target/riscv/rvv/pr121073.c
+ 86731b52476b518fce91bf0158bbd223  gcc/testsuite/gcc.target/riscv/rvv/pr122474.c
  6fea082cc5d5719bf16939b0f1ec6357  gcc/testsuite/gcc.target/riscv/rvv/rvv.exp
  5478c0c8327ff5286acd21adf7801a3b  gcc/testsuite/gcc.target/riscv/rvv/vls-cc/abi-vlen-128-xlen-32/test_128bit_vector.c
  7474e3b118ab01afd89adaf5d29c7e26  gcc/testsuite/gcc.target/riscv/rvv/vls-cc/abi-vlen-128-xlen-32/test_256bit_vector.c
*************** ba3ec121536606fdf9d34aff37b9da35  gcc/te
*** 106475,106485 ****
  ce9fa7ecd334cd6b160190a2cfe6e745  gcc/testsuite/gdc.dg/asan/asan.exp
  b128e4398f4a7480b25915e786aa46ef  gcc/testsuite/gdc.dg/asan/attr_no_sanitize1.d
  10180752a9d53fac31ca576e678cdd06  gcc/testsuite/gdc.dg/asan/gdc272.d
! 16e7d438ab084a84acb9128057384ba3  gcc/testsuite/gdc.dg/asm1.d
  fe26b7411075062b4f74f94131f6ff12  gcc/testsuite/gdc.dg/asm2.d
  9dc0e4e3cbd13b908542ee62c8b9062b  gcc/testsuite/gdc.dg/asm3.d
  e39f454e2c507490f50066c0f92ffc2b  gcc/testsuite/gdc.dg/asm4.d
! 81924dd147fbe2024048ac4b5b397435  gcc/testsuite/gdc.dg/asm5.d
  31a8b77972532af3d4c1e4b565ffd968  gcc/testsuite/gdc.dg/attr_allocsize1.d
  f270d380aa68ee40ee568c5490d0f454  gcc/testsuite/gdc.dg/attr_allocsize2.d
  0e6f8fa8bca677dfe2539d1eb9471abc  gcc/testsuite/gdc.dg/attr_alwaysinline1.d
--- 106568,106578 ----
  ce9fa7ecd334cd6b160190a2cfe6e745  gcc/testsuite/gdc.dg/asan/asan.exp
  b128e4398f4a7480b25915e786aa46ef  gcc/testsuite/gdc.dg/asan/attr_no_sanitize1.d
  10180752a9d53fac31ca576e678cdd06  gcc/testsuite/gdc.dg/asan/gdc272.d
! d7dc412aa2eda93fd8b5c2550b912c07  gcc/testsuite/gdc.dg/asm1.d
  fe26b7411075062b4f74f94131f6ff12  gcc/testsuite/gdc.dg/asm2.d
  9dc0e4e3cbd13b908542ee62c8b9062b  gcc/testsuite/gdc.dg/asm3.d
  e39f454e2c507490f50066c0f92ffc2b  gcc/testsuite/gdc.dg/asm4.d
! a493ed4dc4884bc5886b19e89ee6cfbf  gcc/testsuite/gdc.dg/asm5.d
  31a8b77972532af3d4c1e4b565ffd968  gcc/testsuite/gdc.dg/attr_allocsize1.d
  f270d380aa68ee40ee568c5490d0f454  gcc/testsuite/gdc.dg/attr_allocsize2.d
  0e6f8fa8bca677dfe2539d1eb9471abc  gcc/testsuite/gdc.dg/attr_alwaysinline1.d
*************** bcf389e3992a960c831b1dafe53a539c  gcc/te
*** 106543,106550 ****
--- 106636,106646 ----
  21f5f82749fd628b3d9ef87a60d160be  gcc/testsuite/gdc.dg/debug/imports/pr119826b.d
  41181964abaddf5de8dddab390e60a4f  gcc/testsuite/gdc.dg/debug/pr119817.d
  511a4b96302498f658f208676182a550  gcc/testsuite/gdc.dg/debug/pr119826.d
+ 1edf2de8f02edbe977e4455229af5ba4  gcc/testsuite/gdc.dg/debug/pr123263.d
  0121ae6408f107a6bf6f915c24102bd3  gcc/testsuite/gdc.dg/debug/trivial.d
  af22045a959ddc0c2cc8b9216e2ec4aa  gcc/testsuite/gdc.dg/dg.exp
+ 1f25f7140ea236c33498050fa3d25fc3  gcc/testsuite/gdc.dg/driver_debuglib.d
+ bfb9dc003b6110d37dc4b62c222afe7d  gcc/testsuite/gdc.dg/driver_defaultlib.d
  738cb13f46975c2c4e05fd4d2864afda  gcc/testsuite/gdc.dg/driver_fonly1.d
  3ab866f47c35938e530f75c1a359e7d2  gcc/testsuite/gdc.dg/driver_fonly2.d
  3e3e4464fc963f4f4a57434be63c992f  gcc/testsuite/gdc.dg/driver_fonly3.d
*************** bcf14abbb66e47644086ee0018354420  gcc/te
*** 106635,106641 ****
  7d27bb4ae013be8b6cb21a42a730353d  gcc/testsuite/gdc.dg/pr100882a.d
  167004b1d3ea4a1c36668f029fbe4290  gcc/testsuite/gdc.dg/pr100882b.d
  c0f2db1fcb83cbb41fda8295889368ff  gcc/testsuite/gdc.dg/pr100882c.d
! 3c42e4978f9eb2a4b5586103b770e870  gcc/testsuite/gdc.dg/pr100967.d
  740e20f8b4aa9d31c7412fbd3b58d4fb  gcc/testsuite/gdc.dg/pr101127a.d
  1913e638608dc57b978438a45ade3c4f  gcc/testsuite/gdc.dg/pr101127b.d
  874906b0c6afe60dafbbc739053ac4eb  gcc/testsuite/gdc.dg/pr101490.d
--- 106731,106737 ----
  7d27bb4ae013be8b6cb21a42a730353d  gcc/testsuite/gdc.dg/pr100882a.d
  167004b1d3ea4a1c36668f029fbe4290  gcc/testsuite/gdc.dg/pr100882b.d
  c0f2db1fcb83cbb41fda8295889368ff  gcc/testsuite/gdc.dg/pr100882c.d
! dba89f8dc08d0b9a58b7d258ff38559b  gcc/testsuite/gdc.dg/pr100967.d
  740e20f8b4aa9d31c7412fbd3b58d4fb  gcc/testsuite/gdc.dg/pr101127a.d
  1913e638608dc57b978438a45ade3c4f  gcc/testsuite/gdc.dg/pr101127b.d
  874906b0c6afe60dafbbc739053ac4eb  gcc/testsuite/gdc.dg/pr101490.d
*************** a2d402e0596a4abb1dc6e25b11e9aa9c  gcc/te
*** 106677,106682 ****
--- 106773,106786 ----
  72d81c5bd5b1ad40ec304fe72a725695  gcc/testsuite/gdc.dg/pr117115.d
  a81f29fc44be5cd208351e9e8b4a742b  gcc/testsuite/gdc.dg/pr117621.d
  0b4ca5d336606fc94e656b8731b0a78e  gcc/testsuite/gdc.dg/pr119139.d
+ ad51c6065b49988f50a3f799a0e5f9a3  gcc/testsuite/gdc.dg/pr121477.d
+ d9ff6161866e2870e0df96f834797f71  gcc/testsuite/gdc.dg/pr122817.d
+ e4d8064a02951cfe69cf639a94128dd0  gcc/testsuite/gdc.dg/pr123046.d
+ 9ce0fee5b0fbb84c1de9a43ef50b9462  gcc/testsuite/gdc.dg/pr123264.d
+ e89ebd75d9b162289c929675222e8501  gcc/testsuite/gdc.dg/pr123407a.d
+ a45efe7a1d6f8b7f15f7befa3e7b1768  gcc/testsuite/gdc.dg/pr123407b.d
+ 4e7020df6ad139d4b43104ca5b97d142  gcc/testsuite/gdc.dg/pr123419.d
+ 56c2a0939424aafd465f15ffdd08847b  gcc/testsuite/gdc.dg/pr123798.d
  d32aa8ed5ea10931be4ddb5bb9e863d8  gcc/testsuite/gdc.dg/pr89017.d
  53fa8db94d4ca3fc9ba83769733dc0e7  gcc/testsuite/gdc.dg/pr89041.d
  6c316b13f71ea31fcada56b58a41ebd1  gcc/testsuite/gdc.dg/pr89042a.d
*************** dc97b4112b134cae3d15aab92424d97a  gcc/te
*** 106715,106721 ****
  a55903f9c72658c02ea18841f80bff0c  gcc/testsuite/gdc.dg/pr98427.d
  2ff2dd55acd20dffe2b5e58febe66c8b  gcc/testsuite/gdc.dg/pr98457.d
  3b746393a80b865ba51671750bc32bb9  gcc/testsuite/gdc.dg/pr99914.d
! a236812cd6f3973a12c60a0d7ee4701c  gcc/testsuite/gdc.dg/rtti1.d
  2586587f34ed7ef788014cd87436908f  gcc/testsuite/gdc.dg/simd1.d
  a182c1f547b3b5d1ac97048fc88292b8  gcc/testsuite/gdc.dg/simd10447.d
  391b914cb5a7ad86f4f5b923fd3ef898  gcc/testsuite/gdc.dg/simd12776.d
--- 106819,106826 ----
  a55903f9c72658c02ea18841f80bff0c  gcc/testsuite/gdc.dg/pr98427.d
  2ff2dd55acd20dffe2b5e58febe66c8b  gcc/testsuite/gdc.dg/pr98457.d
  3b746393a80b865ba51671750bc32bb9  gcc/testsuite/gdc.dg/pr99914.d
! dd16ff549f4be13eb8b00f7f25f299af  gcc/testsuite/gdc.dg/rtti1.d
! 86607b0cce3bd6a2c15b254af6f615fb  gcc/testsuite/gdc.dg/rtti2.d
  2586587f34ed7ef788014cd87436908f  gcc/testsuite/gdc.dg/simd1.d
  a182c1f547b3b5d1ac97048fc88292b8  gcc/testsuite/gdc.dg/simd10447.d
  391b914cb5a7ad86f4f5b923fd3ef898  gcc/testsuite/gdc.dg/simd12776.d
*************** de9193ce38f7ef3ee1cc3a94fc8a92dc  gcc/te
*** 106811,106816 ****
--- 106916,106923 ----
  ad67c2aef0ecf01677e58695b0cc5d36  gcc/testsuite/gdc.dg/torture/pr113758.d
  c3a3fcac804266bf984aad50e1f84157  gcc/testsuite/gdc.dg/torture/pr114171.d
  a1ef8a304026fe097c3f6356f2dd2b2a  gcc/testsuite/gdc.dg/torture/pr117002.d
+ 07b590affdb88374b53601052d66c8a8  gcc/testsuite/gdc.dg/torture/pr120096.d
+ 18190856d5dece191ecd40c185c2b684  gcc/testsuite/gdc.dg/torture/pr123422.d
  580aadb24b666799e25f1f02ef3b7bbb  gcc/testsuite/gdc.dg/torture/pr92309.d
  d5626e21f8cdc22799175cb6adfddfd6  gcc/testsuite/gdc.dg/torture/pr94424.d
  ae5b279461655f243d767b80a6d0bc1b  gcc/testsuite/gdc.dg/torture/pr94777b.d
*************** c830eb21b0dd96c9b8d314d8bbdf13b3  gcc/te
*** 106879,106885 ****
  73a6a9e5ff1b7cf90baa3106b082bbe2  gcc/testsuite/gdc.test/compilable/atomic_loadstore_shared_classes.d
  42ddfcff51dacb470df4e5adfdbfd451  gcc/testsuite/gdc.test/compilable/b11118.d
  abab396c9a34d7ffac07eefc356bf0dd  gcc/testsuite/gdc.test/compilable/b12001.d
! 306b045142ce891e1de322f68319170a  gcc/testsuite/gdc.test/compilable/b1215.d
  ab71c99c2e31e96bdb735e5c870e7ed3  gcc/testsuite/gdc.test/compilable/b12504.d
  24947d925dcac5d1e172b8d8425fee4e  gcc/testsuite/gdc.test/compilable/b15206.d
  c6f64fcc66716ad719d6a22796d0fbec  gcc/testsuite/gdc.test/compilable/b15428.d
--- 106986,106992 ----
  73a6a9e5ff1b7cf90baa3106b082bbe2  gcc/testsuite/gdc.test/compilable/atomic_loadstore_shared_classes.d
  42ddfcff51dacb470df4e5adfdbfd451  gcc/testsuite/gdc.test/compilable/b11118.d
  abab396c9a34d7ffac07eefc356bf0dd  gcc/testsuite/gdc.test/compilable/b12001.d
! 788020e690d5a1dd58a8b1f8cc224a0b  gcc/testsuite/gdc.test/compilable/b1215.d
  ab71c99c2e31e96bdb735e5c870e7ed3  gcc/testsuite/gdc.test/compilable/b12504.d
  24947d925dcac5d1e172b8d8425fee4e  gcc/testsuite/gdc.test/compilable/b15206.d
  c6f64fcc66716ad719d6a22796d0fbec  gcc/testsuite/gdc.test/compilable/b15428.d
*************** ae1f4203bf550794e707ed5be806367b  gcc/te
*** 107090,107096 ****
  4d51435416bc87fac50176e2b6f228d5  gcc/testsuite/gdc.test/compilable/extra-files/emptymain.d
  30cc1bf240439d09b47fb6549193de3d  gcc/testsuite/gdc.test/compilable/extra-files/example7190/controllers/HomeController.d
  cf2cb48cde6a5cacaab45cf9daa47dd1  gcc/testsuite/gdc.test/compilable/extra-files/example7190/models/HomeModel.d
! 829e0774372054274dea210ea3cd88bc  gcc/testsuite/gdc.test/compilable/extra-files/header1.d
  ad8d83a34b5a26e396d29ee59edb35d8  gcc/testsuite/gdc.test/compilable/extra-files/header17125.d
  84e275b184b9aa10c41ec3002d651f5f  gcc/testsuite/gdc.test/compilable/extra-files/header18365.d
  885030e1fb5b2651af1a87f0d82062ca  gcc/testsuite/gdc.test/compilable/extra-files/header2.d
--- 107197,107203 ----
  4d51435416bc87fac50176e2b6f228d5  gcc/testsuite/gdc.test/compilable/extra-files/emptymain.d
  30cc1bf240439d09b47fb6549193de3d  gcc/testsuite/gdc.test/compilable/extra-files/example7190/controllers/HomeController.d
  cf2cb48cde6a5cacaab45cf9daa47dd1  gcc/testsuite/gdc.test/compilable/extra-files/example7190/models/HomeModel.d
! a0fe9723b29083805d3e9936dfcd579d  gcc/testsuite/gdc.test/compilable/extra-files/header1.d
  ad8d83a34b5a26e396d29ee59edb35d8  gcc/testsuite/gdc.test/compilable/extra-files/header17125.d
  84e275b184b9aa10c41ec3002d651f5f  gcc/testsuite/gdc.test/compilable/extra-files/header18365.d
  885030e1fb5b2651af1a87f0d82062ca  gcc/testsuite/gdc.test/compilable/extra-files/header2.d
*************** cb6818365b29b41ad47f5424c409e99c  gcc/te
*** 107116,107121 ****
--- 107223,107231 ----
  ef173d2cdbc0bc5a02f0c5d0cbd51949  gcc/testsuite/gdc.test/compilable/extra-files/serenity7190/core/Model.d
  9f668d225fea83eafca80d0c1f8e96b8  gcc/testsuite/gdc.test/compilable/extra-files/test16080b.d
  1eb726ec1e3b3c09d563bfeba4931136  gcc/testsuite/gdc.test/compilable/extra-files/test20280a.d
+ 99d80ccd7867c7259503fd44c26fe0d6  gcc/testsuite/gdc.test/compilable/extra-files/test21331.d
+ 718c3f34332e4cfe777a85adad9af785  gcc/testsuite/gdc.test/compilable/extra-files/test21359a.d
+ 6abe6aaad8522f898caca71202655bb2  gcc/testsuite/gdc.test/compilable/extra-files/test21359b.d
  fb236a7127b6d48fe9a40a7cf59bdd47  gcc/testsuite/gdc.test/compilable/extra-files/test23626a.d
  2ce64eff388d8039e70e7c45b5f951a7  gcc/testsuite/gdc.test/compilable/extra-files/test23626b.d
  52dedd0bc0265044807934e4f228636d  gcc/testsuite/gdc.test/compilable/fail137.d
*************** f6dc0b6e038af5071ee1975e134b72f2  gcc/te
*** 107210,107216 ****
  f42b040cc735f147de9e381788dcc63b  gcc/testsuite/gdc.test/compilable/imports/checkimports3c.d
  692529dfdfa147098a56106a9b118e36  gcc/testsuite/gdc.test/compilable/imports/cimports2a.i
  6274b24fdb136ad0547252b1bd73b757  gcc/testsuite/gdc.test/compilable/imports/cimports2b.i
! 181e788a386ac8cb359ed9cd7b9eeffd  gcc/testsuite/gdc.test/compilable/imports/cstuff3.c
  957c95be0044c62b0a6c57145ffd62c8  gcc/testsuite/gdc.test/compilable/imports/defaa.d
  d6c15f746a2feba66db905f13d4368c5  gcc/testsuite/gdc.test/compilable/imports/defab.d
  51c4cc09ad07993ac2f4044028515968  gcc/testsuite/gdc.test/compilable/imports/defac.d
--- 107320,107326 ----
  f42b040cc735f147de9e381788dcc63b  gcc/testsuite/gdc.test/compilable/imports/checkimports3c.d
  692529dfdfa147098a56106a9b118e36  gcc/testsuite/gdc.test/compilable/imports/cimports2a.i
  6274b24fdb136ad0547252b1bd73b757  gcc/testsuite/gdc.test/compilable/imports/cimports2b.i
! fd7759c67a46d908c24bc7178a2e1989  gcc/testsuite/gdc.test/compilable/imports/cstuff3.c
  957c95be0044c62b0a6c57145ffd62c8  gcc/testsuite/gdc.test/compilable/imports/defaa.d
  d6c15f746a2feba66db905f13d4368c5  gcc/testsuite/gdc.test/compilable/imports/defab.d
  51c4cc09ad07993ac2f4044028515968  gcc/testsuite/gdc.test/compilable/imports/defac.d
*************** a3ec949c029ba8d789fb2062d3d42b03  gcc/te
*** 107232,107237 ****
--- 107342,107348 ----
  9168068939f17dfd1fe8311083b1b8ae  gcc/testsuite/gdc.test/compilable/imports/g313staticif.d
  9168068939f17dfd1fe8311083b1b8ae  gcc/testsuite/gdc.test/compilable/imports/g313stringmixin.d
  9168068939f17dfd1fe8311083b1b8ae  gcc/testsuite/gdc.test/compilable/imports/g313templatemixin.d
+ 1fede6e392dceebdba3a1cb310fc91b6  gcc/testsuite/gdc.test/compilable/imports/h20184.h
  1d15877df5e20c5ffc6c757bf0dcf02b  gcc/testsuite/gdc.test/compilable/imports/ice11054a.d
  c1ca533d08e73bc66136050ee7b7c9e8  gcc/testsuite/gdc.test/compilable/imports/ice11300a.d
  2056faa392dbead9570c704db50b8806  gcc/testsuite/gdc.test/compilable/imports/ice13403a.d
*************** c2a53211d7370f7da0d508d30c736f20  gcc/te
*** 107252,107257 ****
--- 107363,107372 ----
  d827eb3984b4481ec333627e31ee09fa  gcc/testsuite/gdc.test/compilable/imports/imp16798.d
  b30b6080ecb6542eb56edd90c23c9b30  gcc/testsuite/gdc.test/compilable/imports/imp17434a.d
  ea65566139853a79da85531efc2f6d87  gcc/testsuite/gdc.test/compilable/imports/imp17434b.d
+ ac28cd8cd40e77f929a988767feb260b  gcc/testsuite/gdc.test/compilable/imports/imp18127a.c
+ ac28cd8cd40e77f929a988767feb260b  gcc/testsuite/gdc.test/compilable/imports/imp18127b.c
+ 4460ef1084fdf08073ce3e470a812dae  gcc/testsuite/gdc.test/compilable/imports/imp20344.c
+ d09af707f3fc351f810a8c42d09cda6a  gcc/testsuite/gdc.test/compilable/imports/imp20499.c
  c1d1d74046f5a2e29b3546ad753f2ff9  gcc/testsuite/gdc.test/compilable/imports/imp21832.d
  1c35e431433b3fb94161638f9c282174  gcc/testsuite/gdc.test/compilable/imports/imp22122.d
  a667727c02ccc971d7c05c508de4ada9  gcc/testsuite/gdc.test/compilable/imports/imp22625.c
*************** e1b2201bb7bef13edd5b1dd62a016069  gcc/te
*** 107432,107438 ****
  13a308ac0197720d622c5e96c15af2f1  gcc/testsuite/gdc.test/compilable/inliner.d
  a2c2b21595b3ee690554e1ff236b06d9  gcc/testsuite/gdc.test/compilable/inliner2.d
  57536b137580aa96501e0f145ed436bc  gcc/testsuite/gdc.test/compilable/interpret3.d
! 4e6e008425b8e270dc3a1df0495d9ce3  gcc/testsuite/gdc.test/compilable/interpret4.d
  06030303622e394ed8c4697f73259c9e  gcc/testsuite/gdc.test/compilable/interpret5.d
  58b640075e1e59a0faed6f1c742d7d03  gcc/testsuite/gdc.test/compilable/isZeroInit.d
  6700886aefd0190b552136b7c1d6df03  gcc/testsuite/gdc.test/compilable/isexpalias.d
--- 107547,107553 ----
  13a308ac0197720d622c5e96c15af2f1  gcc/testsuite/gdc.test/compilable/inliner.d
  a2c2b21595b3ee690554e1ff236b06d9  gcc/testsuite/gdc.test/compilable/inliner2.d
  57536b137580aa96501e0f145ed436bc  gcc/testsuite/gdc.test/compilable/interpret3.d
! 63a9df5abde3831737853ccf2362b3fc  gcc/testsuite/gdc.test/compilable/interpret4.d
  06030303622e394ed8c4697f73259c9e  gcc/testsuite/gdc.test/compilable/interpret5.d
  58b640075e1e59a0faed6f1c742d7d03  gcc/testsuite/gdc.test/compilable/isZeroInit.d
  6700886aefd0190b552136b7c1d6df03  gcc/testsuite/gdc.test/compilable/isexpalias.d
*************** ef508e45d854adfd4d46622db5b51b8a  gcc/te
*** 107490,107496 ****
  81b29659c83d32c1150fdcbfb8ebc393  gcc/testsuite/gdc.test/compilable/mixin.d
  c0a34931ae605eeb3d2920a2ea74eb71  gcc/testsuite/gdc.test/compilable/mixinTemplateMangling.d
  4d64b8d079b2551742ff35ba2d23cb22  gcc/testsuite/gdc.test/compilable/mixintempl.d
! b6a5dd6f5f5e40ec69f5d95cff610577  gcc/testsuite/gdc.test/compilable/mixintype.d
  7f66ba09b458afa472d31fc5f9015147  gcc/testsuite/gdc.test/compilable/mixintype2.d
  12cc7909584b66e9017a50fdd8e9ca50  gcc/testsuite/gdc.test/compilable/must_use_assign.d
  4609d14d7f0e432204e446fc10286d5b  gcc/testsuite/gdc.test/compilable/must_use_initialize.d
--- 107605,107611 ----
  81b29659c83d32c1150fdcbfb8ebc393  gcc/testsuite/gdc.test/compilable/mixin.d
  c0a34931ae605eeb3d2920a2ea74eb71  gcc/testsuite/gdc.test/compilable/mixinTemplateMangling.d
  4d64b8d079b2551742ff35ba2d23cb22  gcc/testsuite/gdc.test/compilable/mixintempl.d
! 7bf5f2854c88f47cfa167672828d5d78  gcc/testsuite/gdc.test/compilable/mixintype.d
  7f66ba09b458afa472d31fc5f9015147  gcc/testsuite/gdc.test/compilable/mixintype2.d
  12cc7909584b66e9017a50fdd8e9ca50  gcc/testsuite/gdc.test/compilable/must_use_assign.d
  4609d14d7f0e432204e446fc10286d5b  gcc/testsuite/gdc.test/compilable/must_use_initialize.d
*************** f859dcbe43b2ea45bd30863270045f12  gcc/te
*** 107511,107517 ****
  cc7133e68a96f54337a9fe590fa46c69  gcc/testsuite/gdc.test/compilable/noreturn3.d
  43ac2b94a822e7a4e5143ff31cf77b06  gcc/testsuite/gdc.test/compilable/ob1.d
  9e18a48ff3fe0c40c6e17b74f7beffed  gcc/testsuite/gdc.test/compilable/obsolete_body.d
! 726b3282c1790708cda23e2c6b1664d7  gcc/testsuite/gdc.test/compilable/parens_inc.d
  c4083243a17bd2e4109cb8ffdd21aadf  gcc/testsuite/gdc.test/compilable/placementnew.d
  97cf4856aa8990a0fe28a6aabadd9a23  gcc/testsuite/gdc.test/compilable/pr9374.d
  7d64317f6d15dac75cff6ccb494e7ef9  gcc/testsuite/gdc.test/compilable/pr9383.d
--- 107626,107632 ----
  cc7133e68a96f54337a9fe590fa46c69  gcc/testsuite/gdc.test/compilable/noreturn3.d
  43ac2b94a822e7a4e5143ff31cf77b06  gcc/testsuite/gdc.test/compilable/ob1.d
  9e18a48ff3fe0c40c6e17b74f7beffed  gcc/testsuite/gdc.test/compilable/obsolete_body.d
! 5c932b51d7bcf76be75074ceae5b3559  gcc/testsuite/gdc.test/compilable/parens_inc.d
  c4083243a17bd2e4109cb8ffdd21aadf  gcc/testsuite/gdc.test/compilable/placementnew.d
  97cf4856aa8990a0fe28a6aabadd9a23  gcc/testsuite/gdc.test/compilable/pr9374.d
  7d64317f6d15dac75cff6ccb494e7ef9  gcc/testsuite/gdc.test/compilable/pr9383.d
*************** cb69cd9c07c4efaaa81841b22628a64e  gcc/te
*** 107544,107550 ****
  d1bae8a7d648de90882dfe330925715c  gcc/testsuite/gdc.test/compilable/scope_tuple_expansion.d
  882b736d1262f755a317ddc6156a5b43  gcc/testsuite/gdc.test/compilable/scopeinfer.d
  b58883b15934c7e71a25e7843fcbd199  gcc/testsuite/gdc.test/compilable/segfaultgolf.d
! f4f4b337f02ca72024ce34c690f70386  gcc/testsuite/gdc.test/compilable/shared.d
  fd1eeff8f6c846eeb29e20921f5da298  gcc/testsuite/gdc.test/compilable/shared_destructor.d
  badf98b7c4bd98928b7900f50021dd58  gcc/testsuite/gdc.test/compilable/sharedopt.d
  3230850b473df8f6707fd0a9542e8286  gcc/testsuite/gdc.test/compilable/shortened_methods.d
--- 107659,107665 ----
  d1bae8a7d648de90882dfe330925715c  gcc/testsuite/gdc.test/compilable/scope_tuple_expansion.d
  882b736d1262f755a317ddc6156a5b43  gcc/testsuite/gdc.test/compilable/scopeinfer.d
  b58883b15934c7e71a25e7843fcbd199  gcc/testsuite/gdc.test/compilable/segfaultgolf.d
! 0998e2c567b544e66b07348098329963  gcc/testsuite/gdc.test/compilable/shared.d
  fd1eeff8f6c846eeb29e20921f5da298  gcc/testsuite/gdc.test/compilable/shared_destructor.d
  badf98b7c4bd98928b7900f50021dd58  gcc/testsuite/gdc.test/compilable/sharedopt.d
  3230850b473df8f6707fd0a9542e8286  gcc/testsuite/gdc.test/compilable/shortened_methods.d
*************** bbcda40bdaf31c69195f2b752d783ab7  gcc/te
*** 107625,107631 ****
  d08eb915c0915356c5a6a6cfb65fc12c  gcc/testsuite/gdc.test/compilable/test14747.d
  2715a539d70e535ba7ff6e6c97ef43da  gcc/testsuite/gdc.test/compilable/test14781.d
  afc327b884abbf80232d16e085c874da  gcc/testsuite/gdc.test/compilable/test14831.d
! ce3583d666a02f9aeb875d1e3214809a  gcc/testsuite/gdc.test/compilable/test14838.d
  9006649e9e8c8f1a23086a5ced20b516  gcc/testsuite/gdc.test/compilable/test14929.d
  fd79d2256c9f3b641f6858510f031dec  gcc/testsuite/gdc.test/compilable/test14962.d
  1413a891a6e34f5017ae82469f21b4d5  gcc/testsuite/gdc.test/compilable/test14973.d
--- 107740,107746 ----
  d08eb915c0915356c5a6a6cfb65fc12c  gcc/testsuite/gdc.test/compilable/test14747.d
  2715a539d70e535ba7ff6e6c97ef43da  gcc/testsuite/gdc.test/compilable/test14781.d
  afc327b884abbf80232d16e085c874da  gcc/testsuite/gdc.test/compilable/test14831.d
! 7358a77abf4a68743e5daa53db7ec92c  gcc/testsuite/gdc.test/compilable/test14838.d
  9006649e9e8c8f1a23086a5ced20b516  gcc/testsuite/gdc.test/compilable/test14929.d
  fd79d2256c9f3b641f6858510f031dec  gcc/testsuite/gdc.test/compilable/test14962.d
  1413a891a6e34f5017ae82469f21b4d5  gcc/testsuite/gdc.test/compilable/test14973.d
*************** f939195a756583414ca62eca1c507ae4  gcc/te
*** 107702,107708 ****
  b7bee84af0ad6009095814d5a080d445  gcc/testsuite/gdc.test/compilable/test17059.d
  e87f48da66ddb31559c11628da10640e  gcc/testsuite/gdc.test/compilable/test17130.d
  16dce14bbec02c568631b0ba49045080  gcc/testsuite/gdc.test/compilable/test17143.d
! 463575820b4e2a41b812f728846774a7  gcc/testsuite/gdc.test/compilable/test17146.d
  603435cff972cf545cbfd4cbaf7675c6  gcc/testsuite/gdc.test/compilable/test17168.d
  9f322d85f59db5aacfceee570828f699  gcc/testsuite/gdc.test/compilable/test17215.d
  34a4f761ce44732e8d98f2154d655148  gcc/testsuite/gdc.test/compilable/test17339.d
--- 107817,107823 ----
  b7bee84af0ad6009095814d5a080d445  gcc/testsuite/gdc.test/compilable/test17059.d
  e87f48da66ddb31559c11628da10640e  gcc/testsuite/gdc.test/compilable/test17130.d
  16dce14bbec02c568631b0ba49045080  gcc/testsuite/gdc.test/compilable/test17143.d
! 0aab03a2c2b660262e0aab4898de4d75  gcc/testsuite/gdc.test/compilable/test17146.d
  603435cff972cf545cbfd4cbaf7675c6  gcc/testsuite/gdc.test/compilable/test17168.d
  9f322d85f59db5aacfceee570828f699  gcc/testsuite/gdc.test/compilable/test17215.d
  34a4f761ce44732e8d98f2154d655148  gcc/testsuite/gdc.test/compilable/test17339.d
*************** fef3ccf128a702c92d1bb16b7150d66d  gcc/te
*** 107741,107746 ****
--- 107856,107862 ----
  d6dac6c332c8fa1b92e2550a20ceba4b  gcc/testsuite/gdc.test/compilable/test18030.d
  19884833b956eb2a61eb0e50846fbbe0  gcc/testsuite/gdc.test/compilable/test18099.d
  8c96dcf6167f002cfbba1551b126f451  gcc/testsuite/gdc.test/compilable/test18115.d
+ d291fcf302db5ca4a091411d5118997b  gcc/testsuite/gdc.test/compilable/test18127.d
  c983c55e7d4bad138553fa05aba16c85  gcc/testsuite/gdc.test/compilable/test18199.d
  b4c81e9573b790a45cd69a6adbc14b5d  gcc/testsuite/gdc.test/compilable/test18216.d
  ef2ed248a84e6cc602afeafacee55114  gcc/testsuite/gdc.test/compilable/test18251.d
*************** cf29d6236afe9b9f4de2703982b9cd04  gcc/te
*** 107822,107838 ****
  f057bd33146438b011d455ce44cb5173  gcc/testsuite/gdc.test/compilable/test20039.d
  6345092bc04eb33a1b3873e1b6c0b770  gcc/testsuite/gdc.test/compilable/test20051.d
  b41606c2bc70ec2ddd69b8a97364d10e  gcc/testsuite/gdc.test/compilable/test20065.d
! 195ec41a9aadb6a762eeffa3fa1af74c  gcc/testsuite/gdc.test/compilable/test20100.d
  9482701b9e381297b6f37a1d0ce10792  gcc/testsuite/gdc.test/compilable/test20136.d
  779521e06838c0618e724ed04abf939b  gcc/testsuite/gdc.test/compilable/test20138.d
  acf65fea78fda931df435e170b4ff10e  gcc/testsuite/gdc.test/compilable/test20151a.d
  38f8f7828f75ee6da7c68edadee72d84  gcc/testsuite/gdc.test/compilable/test20181.d
  adacdca47b1782c409a13f7cae679385  gcc/testsuite/gdc.test/compilable/test20201.d
  7e7e889dc8289b4e1c60ca28fa97e657  gcc/testsuite/gdc.test/compilable/test20236.d
  9c9235445cfb7a0250eb9c627c45a97d  gcc/testsuite/gdc.test/compilable/test20280.d
  f770c7a5fb39b162b577f96d2ed51ab6  gcc/testsuite/gdc.test/compilable/test20296.d
  70311f9c04e984a9ba6a30958f3f246f  gcc/testsuite/gdc.test/compilable/test20318.d
  ec0561bd53dbd289f5e8f522895490cd  gcc/testsuite/gdc.test/compilable/test20326.d
  ee95259c574b365a1a30e980b06cd328  gcc/testsuite/gdc.test/compilable/test20367.d
  539d6f16bf63038504e9260d0363dbab  gcc/testsuite/gdc.test/compilable/test20388.d
  bfa3b260bba42f69ddab55c994c20dbc  gcc/testsuite/gdc.test/compilable/test20406.d
--- 107938,107957 ----
  f057bd33146438b011d455ce44cb5173  gcc/testsuite/gdc.test/compilable/test20039.d
  6345092bc04eb33a1b3873e1b6c0b770  gcc/testsuite/gdc.test/compilable/test20051.d
  b41606c2bc70ec2ddd69b8a97364d10e  gcc/testsuite/gdc.test/compilable/test20065.d
! 540d4efd741e61e13f804855ce945a91  gcc/testsuite/gdc.test/compilable/test20100.d
  9482701b9e381297b6f37a1d0ce10792  gcc/testsuite/gdc.test/compilable/test20136.d
  779521e06838c0618e724ed04abf939b  gcc/testsuite/gdc.test/compilable/test20138.d
  acf65fea78fda931df435e170b4ff10e  gcc/testsuite/gdc.test/compilable/test20151a.d
  38f8f7828f75ee6da7c68edadee72d84  gcc/testsuite/gdc.test/compilable/test20181.d
+ 847a49b5336cca902c29eba0b99aace0  gcc/testsuite/gdc.test/compilable/test20184.d
  adacdca47b1782c409a13f7cae679385  gcc/testsuite/gdc.test/compilable/test20201.d
  7e7e889dc8289b4e1c60ca28fa97e657  gcc/testsuite/gdc.test/compilable/test20236.d
  9c9235445cfb7a0250eb9c627c45a97d  gcc/testsuite/gdc.test/compilable/test20280.d
  f770c7a5fb39b162b577f96d2ed51ab6  gcc/testsuite/gdc.test/compilable/test20296.d
  70311f9c04e984a9ba6a30958f3f246f  gcc/testsuite/gdc.test/compilable/test20318.d
  ec0561bd53dbd289f5e8f522895490cd  gcc/testsuite/gdc.test/compilable/test20326.d
+ 4202582713ebca18c0d2231decf771ef  gcc/testsuite/gdc.test/compilable/test20344.d
+ b02fc3b30c6e783f47defd4ce8e142b1  gcc/testsuite/gdc.test/compilable/test20365.d
  ee95259c574b365a1a30e980b06cd328  gcc/testsuite/gdc.test/compilable/test20367.d
  539d6f16bf63038504e9260d0363dbab  gcc/testsuite/gdc.test/compilable/test20388.d
  bfa3b260bba42f69ddab55c994c20dbc  gcc/testsuite/gdc.test/compilable/test20406.d
*************** bfa3b260bba42f69ddab55c994c20dbc  gcc/te
*** 107841,107846 ****
--- 107960,107966 ----
  8d0f1a5a1e86cb9fd37c885bfe11dc84  gcc/testsuite/gdc.test/compilable/test20420.d
  a9bd99abed44befe910f7cb0409c337b  gcc/testsuite/gdc.test/compilable/test20427.d
  56c36e1b133f904122f59921311ead7a  gcc/testsuite/gdc.test/compilable/test20488.d
+ d45d2ff8a4ee7f100bb900a0ad0bfbe2  gcc/testsuite/gdc.test/compilable/test20499.d
  5d7a8d265f4f29667ecde34793879f65  gcc/testsuite/gdc.test/compilable/test20530.d
  06b732fa6a39c017318cbc16939f52fa  gcc/testsuite/gdc.test/compilable/test20537.d
  ce9651e5787ae3d47ac7f573ab68bdfd  gcc/testsuite/gdc.test/compilable/test20596.d
*************** c2783ee4a416f517c72d376739cda631  gcc/te
*** 107882,107893 ****
--- 108002,108017 ----
  f7ebbab88f0a4f86e71b06e130f593ee  gcc/testsuite/gdc.test/compilable/test21299c.d
  effd503ab143f07a377f69a6abd2e2ab  gcc/testsuite/gdc.test/compilable/test21299d.d
  35ca710712a0eaa3d821e4f0342671d7  gcc/testsuite/gdc.test/compilable/test21330.d
+ fb73df52386a4853f612838bce8363f3  gcc/testsuite/gdc.test/compilable/test21331.sh
+ 559d7ce3f7f50529f0cf75779d7c9c3f  gcc/testsuite/gdc.test/compilable/test21359.sh
  1798a08bb6bc5d4d9cfb0e43f52c0214  gcc/testsuite/gdc.test/compilable/test21372.d
  98a7dd18d329068251146d297fab72d7  gcc/testsuite/gdc.test/compilable/test21398.d
  c6744c3207244c878cf6f0574302e3f2  gcc/testsuite/gdc.test/compilable/test21414.d
+ 2727942e4553437e85ff13dc61609b30  gcc/testsuite/gdc.test/compilable/test21416.d
  f7b07a5a3e3bfac17af47439bb8ec413  gcc/testsuite/gdc.test/compilable/test21432.d
  ba9fd4b88ca0267441472f1febace9ae  gcc/testsuite/gdc.test/compilable/test21438.d
  3f1b768c6d2a4190f6a0e7e142cea814  gcc/testsuite/gdc.test/compilable/test21464.d
+ b131c6442aea98d1e588db16b27a37b5  gcc/testsuite/gdc.test/compilable/test21476.d
  6aae9ab24e30cc1449c46abe03e9439e  gcc/testsuite/gdc.test/compilable/test21501a.d
  efef74ea28668cfb5bd423850b20fc1c  gcc/testsuite/gdc.test/compilable/test21514.d
  9c28314750a684e306e8009cc05f2c6d  gcc/testsuite/gdc.test/compilable/test21591.d
*************** ebf5b789d4a31be2e939321d6490d585  gcc/te
*** 107968,107974 ****
  ef94e36ea4b149caeaa44951f0d8aa68  gcc/testsuite/gdc.test/compilable/test23145.d
  f8b8b1e13145441d1c69d68cde48b4c4  gcc/testsuite/gdc.test/compilable/test23166.d
  4f765e28fd4c1a48432ad744c956c3f9  gcc/testsuite/gdc.test/compilable/test23168.d
! 4fa99fe8979b3c75eac8f3e18f9f4ae4  gcc/testsuite/gdc.test/compilable/test23169.d
  e839f70004c90a7a3783e0b05662a616  gcc/testsuite/gdc.test/compilable/test23172.d
  b699d40488d1619d331aa57ab786b0e4  gcc/testsuite/gdc.test/compilable/test23173.d
  88e0f7dab62fcddda2de75f0d13d6b08  gcc/testsuite/gdc.test/compilable/test23174.d
--- 108092,108098 ----
  ef94e36ea4b149caeaa44951f0d8aa68  gcc/testsuite/gdc.test/compilable/test23145.d
  f8b8b1e13145441d1c69d68cde48b4c4  gcc/testsuite/gdc.test/compilable/test23166.d
  4f765e28fd4c1a48432ad744c956c3f9  gcc/testsuite/gdc.test/compilable/test23168.d
! bbf126ae9fbf872b4c94a2d0b9b197d0  gcc/testsuite/gdc.test/compilable/test23169.d
  e839f70004c90a7a3783e0b05662a616  gcc/testsuite/gdc.test/compilable/test23172.d
  b699d40488d1619d331aa57ab786b0e4  gcc/testsuite/gdc.test/compilable/test23173.d
  88e0f7dab62fcddda2de75f0d13d6b08  gcc/testsuite/gdc.test/compilable/test23174.d
*************** f8b0ae6368c0ee13f2e4e71e66c90b9a  gcc/te
*** 108034,108040 ****
  2f2e2bcd75caf71f208f6b63b17e5a58  gcc/testsuite/gdc.test/compilable/test24762.d
  330c2acf4539ef672ad9c8cf0faa0c5e  gcc/testsuite/gdc.test/compilable/test25.d
  912661e1615a2dd8fe14dbd20528f7ba  gcc/testsuite/gdc.test/compilable/test2991.d
! b0234808764370745e6dbf7744465cff  gcc/testsuite/gdc.test/compilable/test3004.d
  65b2f8459513797e86e01bd50b1bb608  gcc/testsuite/gdc.test/compilable/test313a.d
  8b0a688ad726eb9d76224ef39e11e0f3  gcc/testsuite/gdc.test/compilable/test313b.d
  84d3cbf662e0b76bf448874c485eedb3  gcc/testsuite/gdc.test/compilable/test313c.d
--- 108158,108164 ----
  2f2e2bcd75caf71f208f6b63b17e5a58  gcc/testsuite/gdc.test/compilable/test24762.d
  330c2acf4539ef672ad9c8cf0faa0c5e  gcc/testsuite/gdc.test/compilable/test25.d
  912661e1615a2dd8fe14dbd20528f7ba  gcc/testsuite/gdc.test/compilable/test2991.d
! bd3858765f0732d50648f2a89ed532ed  gcc/testsuite/gdc.test/compilable/test3004.d
  65b2f8459513797e86e01bd50b1bb608  gcc/testsuite/gdc.test/compilable/test313a.d
  8b0a688ad726eb9d76224ef39e11e0f3  gcc/testsuite/gdc.test/compilable/test313b.d
  84d3cbf662e0b76bf448874c485eedb3  gcc/testsuite/gdc.test/compilable/test313c.d
*************** a8aff1c75bc0695071a90cb5aa15971e  gcc/te
*** 108146,108158 ****
  4f38613138feda91b158dbc10e9dcaf8  gcc/testsuite/gdc.test/compilable/testcheckimports.d
  dbddcfe494cc3c61d9b82e969af2c8ea  gcc/testsuite/gdc.test/compilable/testcontracts.d
  e4998c6896a3ce1b4036155ac0ec1abc  gcc/testsuite/gdc.test/compilable/testcorrectthis.d
! 939371c9d34a5af76ab78baebe16d363  gcc/testsuite/gdc.test/compilable/testcstuff3.d
  73df461aee89586871ed2daebd1dd80f  gcc/testsuite/gdc.test/compilable/testdefines.d
  035c837c9828677c99e64cf928df76e6  gcc/testsuite/gdc.test/compilable/testdip1008.d
  a45fff07259b904bd2e0780eb2b4b920  gcc/testsuite/gdc.test/compilable/testexpression.d
  165adaaca3d4cb680db8e8f7bef830af  gcc/testsuite/gdc.test/compilable/testfptr.d
  f8d3fd67e69cbc3faa127c9ea1a7ee45  gcc/testsuite/gdc.test/compilable/testfwdref.d
! 301628c09e0db2d57d3f84616f1c098c  gcc/testsuite/gdc.test/compilable/testgotoskips.d
  acdc78c2e0880e10d12d0ba711e9c3a2  gcc/testsuite/gdc.test/compilable/testheader1.d
  b6a425aea90992550c5b5f5b1b61165d  gcc/testsuite/gdc.test/compilable/testheader12567a.d
  1e2747d468b376e4d3a04f38f0813ea8  gcc/testsuite/gdc.test/compilable/testheader12567b.d
--- 108270,108282 ----
  4f38613138feda91b158dbc10e9dcaf8  gcc/testsuite/gdc.test/compilable/testcheckimports.d
  dbddcfe494cc3c61d9b82e969af2c8ea  gcc/testsuite/gdc.test/compilable/testcontracts.d
  e4998c6896a3ce1b4036155ac0ec1abc  gcc/testsuite/gdc.test/compilable/testcorrectthis.d
! 7d2819928630a8c04d34107f84d2fe76  gcc/testsuite/gdc.test/compilable/testcstuff3.d
  73df461aee89586871ed2daebd1dd80f  gcc/testsuite/gdc.test/compilable/testdefines.d
  035c837c9828677c99e64cf928df76e6  gcc/testsuite/gdc.test/compilable/testdip1008.d
  a45fff07259b904bd2e0780eb2b4b920  gcc/testsuite/gdc.test/compilable/testexpression.d
  165adaaca3d4cb680db8e8f7bef830af  gcc/testsuite/gdc.test/compilable/testfptr.d
  f8d3fd67e69cbc3faa127c9ea1a7ee45  gcc/testsuite/gdc.test/compilable/testfwdref.d
! 6958a8bc2ada5ab898827480fcd22cb0  gcc/testsuite/gdc.test/compilable/testgotoskips.d
  acdc78c2e0880e10d12d0ba711e9c3a2  gcc/testsuite/gdc.test/compilable/testheader1.d
  b6a425aea90992550c5b5f5b1b61165d  gcc/testsuite/gdc.test/compilable/testheader12567a.d
  1e2747d468b376e4d3a04f38f0813ea8  gcc/testsuite/gdc.test/compilable/testheader12567b.d
*************** c5edf683ca0bd30ac0d1d5b44a632f2d  gcc/te
*** 108169,108187 ****
  04f186437495743a1bb1ca150d9b1c9c  gcc/testsuite/gdc.test/compilable/testpostblit.d
  b4b221ef317b956132f4d2d2b4addb1d  gcc/testsuite/gdc.test/compilable/testprofile.d
  96e4dccded26d5a2f5c94a77a811bf2a  gcc/testsuite/gdc.test/compilable/testpull1810.d
! 06d53bd527300beec01412a18aacbb8b  gcc/testsuite/gdc.test/compilable/testsctreturn.d
  2b0d22bb4f0da744c1a7d324b1673eb7  gcc/testsuite/gdc.test/compilable/testtempl2.d
  3c1fefcbc4a687c71ec41c49e899b170  gcc/testsuite/gdc.test/compilable/traits.d
! 850c921b1056bbd4c8ac2b72d8f27871  gcc/testsuite/gdc.test/compilable/traits_getFunctionAttributes.d
  0da951db343407cecaa9f85317fb649d  gcc/testsuite/gdc.test/compilable/transition_in.d
  2a5c3303f2fc00fbaf51ab7e1a392eee  gcc/testsuite/gdc.test/compilable/typeid_name.d
  ac9e751e20c95911b8e0c1bc570c6124  gcc/testsuite/gdc.test/compilable/uda.d
  aafbda4aa90d5d90bdd9da02d53073f3  gcc/testsuite/gdc.test/compilable/udamodule1.d
  fddab229d4f220f7768aa32bff4eb235  gcc/testsuite/gdc.test/compilable/udamodule2.d
  05d2b62ab46fd89af248af1c2e5be2c1  gcc/testsuite/gdc.test/compilable/union_initialization.d
  1753f2fe39db70816ce04ce3434fe21e  gcc/testsuite/gdc.test/compilable/user_defined_attributes.d
  b13edd5ae1b061369112622cadbdc3da  gcc/testsuite/gdc.test/compilable/vararg.d
! 2b5ec5aa69ef9f9237cad8031cd36653  gcc/testsuite/gdc.test/compilable/vcg-ast.d
  3bf5604deccd98b27e2a9b82949bcee4  gcc/testsuite/gdc.test/compilable/vcg_ast_compilable.d
  97f5ddda04deb7f2b8bf64fd30dfdbd5  gcc/testsuite/gdc.test/compilable/verrors_spec.d
  7c3dc0b69abaf4feb7674c4ea5304c4d  gcc/testsuite/gdc.test/compilable/version.d
--- 108293,108312 ----
  04f186437495743a1bb1ca150d9b1c9c  gcc/testsuite/gdc.test/compilable/testpostblit.d
  b4b221ef317b956132f4d2d2b4addb1d  gcc/testsuite/gdc.test/compilable/testprofile.d
  96e4dccded26d5a2f5c94a77a811bf2a  gcc/testsuite/gdc.test/compilable/testpull1810.d
! da494213f007c40bec310d7bd2671704  gcc/testsuite/gdc.test/compilable/testsctreturn.d
  2b0d22bb4f0da744c1a7d324b1673eb7  gcc/testsuite/gdc.test/compilable/testtempl2.d
  3c1fefcbc4a687c71ec41c49e899b170  gcc/testsuite/gdc.test/compilable/traits.d
! 1b2750dc3092c04117822067f5a9ff94  gcc/testsuite/gdc.test/compilable/traits_getFunctionAttributes.d
  0da951db343407cecaa9f85317fb649d  gcc/testsuite/gdc.test/compilable/transition_in.d
  2a5c3303f2fc00fbaf51ab7e1a392eee  gcc/testsuite/gdc.test/compilable/typeid_name.d
  ac9e751e20c95911b8e0c1bc570c6124  gcc/testsuite/gdc.test/compilable/uda.d
+ b506100d6c4c03665c3acdb43bf8f992  gcc/testsuite/gdc.test/compilable/uda_lambda.d
  aafbda4aa90d5d90bdd9da02d53073f3  gcc/testsuite/gdc.test/compilable/udamodule1.d
  fddab229d4f220f7768aa32bff4eb235  gcc/testsuite/gdc.test/compilable/udamodule2.d
  05d2b62ab46fd89af248af1c2e5be2c1  gcc/testsuite/gdc.test/compilable/union_initialization.d
  1753f2fe39db70816ce04ce3434fe21e  gcc/testsuite/gdc.test/compilable/user_defined_attributes.d
  b13edd5ae1b061369112622cadbdc3da  gcc/testsuite/gdc.test/compilable/vararg.d
! fe9e048bbb7b3d5de97c4d791647288e  gcc/testsuite/gdc.test/compilable/vcg-ast.d
  3bf5604deccd98b27e2a9b82949bcee4  gcc/testsuite/gdc.test/compilable/vcg_ast_compilable.d
  97f5ddda04deb7f2b8bf64fd30dfdbd5  gcc/testsuite/gdc.test/compilable/verrors_spec.d
  7c3dc0b69abaf4feb7674c4ea5304c4d  gcc/testsuite/gdc.test/compilable/version.d
*************** b13edd5ae1b061369112622cadbdc3da  gcc/te
*** 108191,108200 ****
  1f7b74cc98b46eee4066e8614f446c78  gcc/testsuite/gdc.test/compilable/vtemplates.d
  fe3fe69f3ba0159a4ec76976ea3bf053  gcc/testsuite/gdc.test/compilable/vtemplates_list.d
  6abb1560fbe9e7a13c92048cd6f7cc17  gcc/testsuite/gdc.test/compilable/warn12809.d
! 3f10c16cee535253ce680482a86cefd8  gcc/testsuite/gdc.test/compilable/warn3882.d
  3619290d2eaa470d906ed2d6f8b6c204  gcc/testsuite/gdc.test/compilable/zerosize.d
  0c74ef80707c77da3fffdc3a03c5ab16  gcc/testsuite/gdc.test/fail_compilation/aa_init.d
  18907c6d791bf506f12bb09b49c6a960  gcc/testsuite/gdc.test/fail_compilation/aacmp10381.d
  a5a20f75e5142d9aad7441377e68d4d7  gcc/testsuite/gdc.test/fail_compilation/alias_instance_member.d
  af5050908274f8744817cc75b813df45  gcc/testsuite/gdc.test/fail_compilation/alias_instance_member2.d
  e0066ba6846a84c27c5813f1eae1f740  gcc/testsuite/gdc.test/fail_compilation/aliasassign.d
--- 108316,108327 ----
  1f7b74cc98b46eee4066e8614f446c78  gcc/testsuite/gdc.test/compilable/vtemplates.d
  fe3fe69f3ba0159a4ec76976ea3bf053  gcc/testsuite/gdc.test/compilable/vtemplates_list.d
  6abb1560fbe9e7a13c92048cd6f7cc17  gcc/testsuite/gdc.test/compilable/warn12809.d
! c690715b588439b2cda295c69dac5e65  gcc/testsuite/gdc.test/compilable/warn3882.d
  3619290d2eaa470d906ed2d6f8b6c204  gcc/testsuite/gdc.test/compilable/zerosize.d
+ 5dcea90226c0713269c1f867b68c0d33  gcc/testsuite/gdc.test/fail_compilation/aa_assign.d
  0c74ef80707c77da3fffdc3a03c5ab16  gcc/testsuite/gdc.test/fail_compilation/aa_init.d
  18907c6d791bf506f12bb09b49c6a960  gcc/testsuite/gdc.test/fail_compilation/aacmp10381.d
+ d86cc74edb93235b703e193357798d8b  gcc/testsuite/gdc.test/fail_compilation/aaerrors.d
  a5a20f75e5142d9aad7441377e68d4d7  gcc/testsuite/gdc.test/fail_compilation/alias_instance_member.d
  af5050908274f8744817cc75b813df45  gcc/testsuite/gdc.test/fail_compilation/alias_instance_member2.d
  e0066ba6846a84c27c5813f1eae1f740  gcc/testsuite/gdc.test/fail_compilation/aliasassign.d
*************** b19c540895e68030d7f79aea6ba21213  gcc/te
*** 108224,108239 ****
  9f5fddb69316e96061459681be8eacf1  gcc/testsuite/gdc.test/fail_compilation/b20011.d
  365ab715a73fe9c494170233e038c30b  gcc/testsuite/gdc.test/fail_compilation/b20780.d
  82cdbb62978f6d1599220b6ee9f9a92b  gcc/testsuite/gdc.test/fail_compilation/b20875.d
! a146d0446299030be7023391776dc61c  gcc/testsuite/gdc.test/fail_compilation/b23686.d
  47c41c40dd4bf706c7dd71dc9350a9c1  gcc/testsuite/gdc.test/fail_compilation/b3841.d
  4f14c24ff5b09173d0eaac42b8afff9e  gcc/testsuite/gdc.test/fail_compilation/b6227.d
  1803dad8fd943fe1b5364f410f4667b8  gcc/testsuite/gdc.test/fail_compilation/betterc.d
  6c9e7c3fa8a5746db70b4f4968c65b2f  gcc/testsuite/gdc.test/fail_compilation/binexperr.d
! d48231d61948a296c522365cd0c81005  gcc/testsuite/gdc.test/fail_compilation/biterrors.d
! f745eda1a6614a93d1b62cc2fd57698e  gcc/testsuite/gdc.test/fail_compilation/biterrors2.d
! 1afbd403b0cee5367ebd00dd6c1ae937  gcc/testsuite/gdc.test/fail_compilation/biterrors3.d
! bff631f408d6b1d6f1c1b401e3b1fade  gcc/testsuite/gdc.test/fail_compilation/biterrors4.d
! 9a02f81c4fd08ba07ae080719ba3eeb1  gcc/testsuite/gdc.test/fail_compilation/biterrors5.d
  a086a16419dbf6f3d63957383364a1b2  gcc/testsuite/gdc.test/fail_compilation/bitintro.d
  b78609eaae9e87219c94c7141e00c79d  gcc/testsuite/gdc.test/fail_compilation/bool_cast.d
  27e3b2b10b6a02aca843ef22bde6fff0  gcc/testsuite/gdc.test/fail_compilation/bug15613.d
--- 108351,108366 ----
  9f5fddb69316e96061459681be8eacf1  gcc/testsuite/gdc.test/fail_compilation/b20011.d
  365ab715a73fe9c494170233e038c30b  gcc/testsuite/gdc.test/fail_compilation/b20780.d
  82cdbb62978f6d1599220b6ee9f9a92b  gcc/testsuite/gdc.test/fail_compilation/b20875.d
! 4379d4e30682494b2969726cbdecc7fb  gcc/testsuite/gdc.test/fail_compilation/b23686.d
  47c41c40dd4bf706c7dd71dc9350a9c1  gcc/testsuite/gdc.test/fail_compilation/b3841.d
  4f14c24ff5b09173d0eaac42b8afff9e  gcc/testsuite/gdc.test/fail_compilation/b6227.d
  1803dad8fd943fe1b5364f410f4667b8  gcc/testsuite/gdc.test/fail_compilation/betterc.d
  6c9e7c3fa8a5746db70b4f4968c65b2f  gcc/testsuite/gdc.test/fail_compilation/binexperr.d
! 060a96e4666a8d9b6f850c6d6a06ad46  gcc/testsuite/gdc.test/fail_compilation/biterrors.d
! b3e8a75396df9880ab0e8bc58d7819e0  gcc/testsuite/gdc.test/fail_compilation/biterrors2.d
! 628663847189d9e213df57a88ffdd0ec  gcc/testsuite/gdc.test/fail_compilation/biterrors3.d
! 00b67b941ae50ae57ec98d820dc8a4a7  gcc/testsuite/gdc.test/fail_compilation/biterrors4.d
! 7cebb32914609d8813bf566f3c5a7944  gcc/testsuite/gdc.test/fail_compilation/biterrors5.d
  a086a16419dbf6f3d63957383364a1b2  gcc/testsuite/gdc.test/fail_compilation/bitintro.d
  b78609eaae9e87219c94c7141e00c79d  gcc/testsuite/gdc.test/fail_compilation/bool_cast.d
  27e3b2b10b6a02aca843ef22bde6fff0  gcc/testsuite/gdc.test/fail_compilation/bug15613.d
*************** f6fadfb0a65bc332d4cfb40d9311d7fe  gcc/te
*** 108254,108260 ****
  67ff13286b3d3bb060099d604721b4db  gcc/testsuite/gdc.test/fail_compilation/casttuple.d
  26e889aceafb8429694f3505035b149e  gcc/testsuite/gdc.test/fail_compilation/ccast.d
  c6f4e1c23c3f30e355ae3bf161924cdc  gcc/testsuite/gdc.test/fail_compilation/cerrors.d
! 4e83f64920318dc56ac80f35d4b3915f  gcc/testsuite/gdc.test/fail_compilation/checkimports2.d
  8a6171185d2dd87f03987ee20a936db9  gcc/testsuite/gdc.test/fail_compilation/chkformat.d
  9797e02f098d52d0de89e8253f84b6c3  gcc/testsuite/gdc.test/fail_compilation/circ10280.d
  6a293d0ed6519f3f6657000a879d53c2  gcc/testsuite/gdc.test/fail_compilation/class1.d
--- 108381,108387 ----
  67ff13286b3d3bb060099d604721b4db  gcc/testsuite/gdc.test/fail_compilation/casttuple.d
  26e889aceafb8429694f3505035b149e  gcc/testsuite/gdc.test/fail_compilation/ccast.d
  c6f4e1c23c3f30e355ae3bf161924cdc  gcc/testsuite/gdc.test/fail_compilation/cerrors.d
! c42e646fa86ea361649c0ba1c40b48bc  gcc/testsuite/gdc.test/fail_compilation/checkimports2.d
  8a6171185d2dd87f03987ee20a936db9  gcc/testsuite/gdc.test/fail_compilation/chkformat.d
  9797e02f098d52d0de89e8253f84b6c3  gcc/testsuite/gdc.test/fail_compilation/circ10280.d
  6a293d0ed6519f3f6657000a879d53c2  gcc/testsuite/gdc.test/fail_compilation/class1.d
*************** c8b81e8d799716ffe482b951a7a5784c  gcc/te
*** 108314,108320 ****
  b3ebff7152b0f06071ba88e3656e95e4  gcc/testsuite/gdc.test/fail_compilation/diag10319.d
  3ac9c2c67c7cc5aacc8d31f1d8cad8de  gcc/testsuite/gdc.test/fail_compilation/diag10327.d
  3ec70637f09bdf76809831af493306ba  gcc/testsuite/gdc.test/fail_compilation/diag10359.d
- 97f43a15ee0e3ae55ecb8ee2d5a4ef88  gcc/testsuite/gdc.test/fail_compilation/diag10405.d
  dd45182458a38798c019f84bfd252373  gcc/testsuite/gdc.test/fail_compilation/diag10415.d
  1b5e8da546ae6c6b10920988d411edb2  gcc/testsuite/gdc.test/fail_compilation/diag10688.d
  3325c9050495bdf5823b3250f244d278  gcc/testsuite/gdc.test/fail_compilation/diag10768.d
--- 108441,108446 ----
*************** c55c37667c762888dabdff8ce9120e49  gcc/te
*** 108353,108359 ****
  d4bdce5da010bdb608d7a34a8a7f5740  gcc/testsuite/gdc.test/fail_compilation/diag13142.d
  2e73e39ef5c6b079fc9213c4cbc6b7f7  gcc/testsuite/gdc.test/fail_compilation/diag13215.d
  85dab21ff2de797ebee17a2ddc1fb394  gcc/testsuite/gdc.test/fail_compilation/diag13281.d
! a427b8c28c148a7f7f138b8ae0465e39  gcc/testsuite/gdc.test/fail_compilation/diag13320.d
  dd421ed0f9abe1a714c279007e2a5592  gcc/testsuite/gdc.test/fail_compilation/diag13333.d
  dab78f06d70c642d12537815a7c1109a  gcc/testsuite/gdc.test/fail_compilation/diag13528.d
  6b9b5faf045c28f8636a0b372a3ab241  gcc/testsuite/gdc.test/fail_compilation/diag13609a.d
--- 108479,108485 ----
  d4bdce5da010bdb608d7a34a8a7f5740  gcc/testsuite/gdc.test/fail_compilation/diag13142.d
  2e73e39ef5c6b079fc9213c4cbc6b7f7  gcc/testsuite/gdc.test/fail_compilation/diag13215.d
  85dab21ff2de797ebee17a2ddc1fb394  gcc/testsuite/gdc.test/fail_compilation/diag13281.d
! f09345090c6be5aba5a2dd99d2a100be  gcc/testsuite/gdc.test/fail_compilation/diag13320.d
  dd421ed0f9abe1a714c279007e2a5592  gcc/testsuite/gdc.test/fail_compilation/diag13333.d
  dab78f06d70c642d12537815a7c1109a  gcc/testsuite/gdc.test/fail_compilation/diag13528.d
  6b9b5faf045c28f8636a0b372a3ab241  gcc/testsuite/gdc.test/fail_compilation/diag13609a.d
*************** f28f753c50d24ae45fd4aacf60d88ef4  gcc/te
*** 108379,108385 ****
  88da152ad7463583e00c228e6531a782  gcc/testsuite/gdc.test/fail_compilation/diag15974.d
  53f97b18fcd9150362cfa32203d1ce90  gcc/testsuite/gdc.test/fail_compilation/diag16271.d
  06506efaedac46ce7a8c8ef28423c1fa  gcc/testsuite/gdc.test/fail_compilation/diag16499.d
! ca21748c3c8002f58049b5f03aa8eb8b  gcc/testsuite/gdc.test/fail_compilation/diag16976.d
  92d3bc16f328d2eb63d1979063743fc2  gcc/testsuite/gdc.test/fail_compilation/diag16977.d
  74b4ddb2d570b5b689c757647aca8d12  gcc/testsuite/gdc.test/fail_compilation/diag1730.d
  2f18d41b0a3ab8f0ee83bcce80a39e84  gcc/testsuite/gdc.test/fail_compilation/diag18460.d
--- 108505,108511 ----
  88da152ad7463583e00c228e6531a782  gcc/testsuite/gdc.test/fail_compilation/diag15974.d
  53f97b18fcd9150362cfa32203d1ce90  gcc/testsuite/gdc.test/fail_compilation/diag16271.d
  06506efaedac46ce7a8c8ef28423c1fa  gcc/testsuite/gdc.test/fail_compilation/diag16499.d
! a5c20f6d522d7a7b50a359fe0aef1751  gcc/testsuite/gdc.test/fail_compilation/diag16976.d
  92d3bc16f328d2eb63d1979063743fc2  gcc/testsuite/gdc.test/fail_compilation/diag16977.d
  74b4ddb2d570b5b689c757647aca8d12  gcc/testsuite/gdc.test/fail_compilation/diag1730.d
  2f18d41b0a3ab8f0ee83bcce80a39e84  gcc/testsuite/gdc.test/fail_compilation/diag18460.d
*************** ef13cff5613132d38394dfcda321198a  gcc/te
*** 108390,108400 ****
  e382e1fe742ff323d95980a7b3337beb  gcc/testsuite/gdc.test/fail_compilation/diag20059.d
  4198e7803be0c3f2149c71cd593a93f8  gcc/testsuite/gdc.test/fail_compilation/diag20268.d
  c3638a460a108e562e095fa04d0d60be  gcc/testsuite/gdc.test/fail_compilation/diag20518.d
! 457aa617fd69d674f1c727ab40e3f57a  gcc/testsuite/gdc.test/fail_compilation/diag20888.d
  b233b20e604b69dca9939988d5ecf22f  gcc/testsuite/gdc.test/fail_compilation/diag21883.d
  a8a51a979aa2bf112cbe9f389a7f7800  gcc/testsuite/gdc.test/fail_compilation/diag23295.d
  f66e20c29e1a7326b2bb6f3603ba6ec5  gcc/testsuite/gdc.test/fail_compilation/diag23355.d
! 224a2021912a4ad8ba087865fa352232  gcc/testsuite/gdc.test/fail_compilation/diag23384.d
  9b6cfcbc4b79fcd4610ac7bcb72ffb67  gcc/testsuite/gdc.test/fail_compilation/diag2452.d
  d4ef3a44b3580a7a2140547743a8fa5f  gcc/testsuite/gdc.test/fail_compilation/diag24812.d
  6f951b34310a15382960e9f406c8484e  gcc/testsuite/gdc.test/fail_compilation/diag3013.d
--- 108516,108526 ----
  e382e1fe742ff323d95980a7b3337beb  gcc/testsuite/gdc.test/fail_compilation/diag20059.d
  4198e7803be0c3f2149c71cd593a93f8  gcc/testsuite/gdc.test/fail_compilation/diag20268.d
  c3638a460a108e562e095fa04d0d60be  gcc/testsuite/gdc.test/fail_compilation/diag20518.d
! 28f95cec52787b47b97fe2e541d7b19f  gcc/testsuite/gdc.test/fail_compilation/diag20888.d
  b233b20e604b69dca9939988d5ecf22f  gcc/testsuite/gdc.test/fail_compilation/diag21883.d
  a8a51a979aa2bf112cbe9f389a7f7800  gcc/testsuite/gdc.test/fail_compilation/diag23295.d
  f66e20c29e1a7326b2bb6f3603ba6ec5  gcc/testsuite/gdc.test/fail_compilation/diag23355.d
! 62cfcbe2b4669975008759933d624932  gcc/testsuite/gdc.test/fail_compilation/diag23384.d
  9b6cfcbc4b79fcd4610ac7bcb72ffb67  gcc/testsuite/gdc.test/fail_compilation/diag2452.d
  d4ef3a44b3580a7a2140547743a8fa5f  gcc/testsuite/gdc.test/fail_compilation/diag24812.d
  6f951b34310a15382960e9f406c8484e  gcc/testsuite/gdc.test/fail_compilation/diag3013.d
*************** df337ef4561ea1d5044bc4478536d6e3  gcc/te
*** 108419,108425 ****
  3bcb67ff32795e5bf90bde0f3b4d6ac3  gcc/testsuite/gdc.test/fail_compilation/diag7050a.d
  07ff7f8f2a13bf0921970d7c3d1c2e01  gcc/testsuite/gdc.test/fail_compilation/diag7050b.d
  3a23c3ed3923fa49618d35afdd940b4b  gcc/testsuite/gdc.test/fail_compilation/diag7050c.d
! 7c885eec1871684720d3024f0856053f  gcc/testsuite/gdc.test/fail_compilation/diag7420.d
  252a223cd20470f5209e7ee4bcf254ac  gcc/testsuite/gdc.test/fail_compilation/diag7477.d
  b0bb0a7eed29aa54814135d9d2b2a25a  gcc/testsuite/gdc.test/fail_compilation/diag7747.d
  c054c437713978aaa4afae9d1d969336  gcc/testsuite/gdc.test/fail_compilation/diag7998.d
--- 108545,108551 ----
  3bcb67ff32795e5bf90bde0f3b4d6ac3  gcc/testsuite/gdc.test/fail_compilation/diag7050a.d
  07ff7f8f2a13bf0921970d7c3d1c2e01  gcc/testsuite/gdc.test/fail_compilation/diag7050b.d
  3a23c3ed3923fa49618d35afdd940b4b  gcc/testsuite/gdc.test/fail_compilation/diag7050c.d
! 980f357a6dbcd88adec60e6b334aee20  gcc/testsuite/gdc.test/fail_compilation/diag7420.d
  252a223cd20470f5209e7ee4bcf254ac  gcc/testsuite/gdc.test/fail_compilation/diag7477.d
  b0bb0a7eed29aa54814135d9d2b2a25a  gcc/testsuite/gdc.test/fail_compilation/diag7747.d
  c054c437713978aaa4afae9d1d969336  gcc/testsuite/gdc.test/fail_compilation/diag7998.d
*************** f4fc4015b440555b99731b7d356b9507  gcc/te
*** 108456,108462 ****
  c71eae763fc17f4bb9c9edc5c73097ab  gcc/testsuite/gdc.test/fail_compilation/diag9479.d
  50388db42fe0c7e11e7dcf2c6ffe6e87  gcc/testsuite/gdc.test/fail_compilation/diag9620.d
  246e59218a53b00f8b5f145a8a108ecb  gcc/testsuite/gdc.test/fail_compilation/diag9635.d
! 69e3fa3880278b590033f61e252e48c6  gcc/testsuite/gdc.test/fail_compilation/diag9679.d
  e6846c6e7f24e0dbf859ddb4ee3797da  gcc/testsuite/gdc.test/fail_compilation/diag9765.d
  00a08977dce97b9d1eddce3580d9df17  gcc/testsuite/gdc.test/fail_compilation/diag9831.d
  0a1ea1d064f1b004feea83c95bdd98d3  gcc/testsuite/gdc.test/fail_compilation/diag9861.d
--- 108582,108588 ----
  c71eae763fc17f4bb9c9edc5c73097ab  gcc/testsuite/gdc.test/fail_compilation/diag9479.d
  50388db42fe0c7e11e7dcf2c6ffe6e87  gcc/testsuite/gdc.test/fail_compilation/diag9620.d
  246e59218a53b00f8b5f145a8a108ecb  gcc/testsuite/gdc.test/fail_compilation/diag9635.d
! 7dfdbb3239622cdfc4b82137cdaa139d  gcc/testsuite/gdc.test/fail_compilation/diag9679.d
  e6846c6e7f24e0dbf859ddb4ee3797da  gcc/testsuite/gdc.test/fail_compilation/diag9765.d
  00a08977dce97b9d1eddce3580d9df17  gcc/testsuite/gdc.test/fail_compilation/diag9831.d
  0a1ea1d064f1b004feea83c95bdd98d3  gcc/testsuite/gdc.test/fail_compilation/diag9861.d
*************** b2151ee28b841591b0cdb081270a98ef  gcc/te
*** 108467,108472 ****
--- 108593,108599 ----
  a80d9b7356faf786d0cfbbc683dd384b  gcc/testsuite/gdc.test/fail_compilation/diag_err1.d
  75e065435ac4bb3dcfc7439f8fab4859  gcc/testsuite/gdc.test/fail_compilation/diag_funclit.d
  6dcb531b3e3bdd493826c6b9e087ce54  gcc/testsuite/gdc.test/fail_compilation/diag_in_array.d
+ 7fc7c1f4ef3abd685ceae5cbf89e5938  gcc/testsuite/gdc.test/fail_compilation/diag_ptr_conversion.d
  78e9286966275fbbe0e028c16725b6da  gcc/testsuite/gdc.test/fail_compilation/diag_template_alias.d
  17d2359f77b1f709861c7e73d9d85abd  gcc/testsuite/gdc.test/fail_compilation/diag_template_this.d
  93111526c56d63a0584e54a0e3b61351  gcc/testsuite/gdc.test/fail_compilation/diagin.d
*************** e1334bfa3c8929594ff2e598c2ee7a92  gcc/te
*** 108478,108484 ****
  9feee5abd1332de813bbab90f35c3bf2  gcc/testsuite/gdc.test/fail_compilation/dip25flag.d
  342f6526dab7f6966b6f04965f84d2cc  gcc/testsuite/gdc.test/fail_compilation/disable.d
  3c2f76ba05acd80893f8b5c379e55865  gcc/testsuite/gdc.test/fail_compilation/disable_new.d
! bf2e3014e67e7bf4960b6bdb913f9523  gcc/testsuite/gdc.test/fail_compilation/discard_value.d
  478da6239f3c9f3d950a69101379fd84  gcc/testsuite/gdc.test/fail_compilation/dtor_attributes.d
  c6868dc189d18c29ad586141986dc0aa  gcc/testsuite/gdc.test/fail_compilation/dtorfields_attributes.d
  26dfb38aebb722f022ede99dc83c51f6  gcc/testsuite/gdc.test/fail_compilation/e15876_1.d
--- 108605,108611 ----
  9feee5abd1332de813bbab90f35c3bf2  gcc/testsuite/gdc.test/fail_compilation/dip25flag.d
  342f6526dab7f6966b6f04965f84d2cc  gcc/testsuite/gdc.test/fail_compilation/disable.d
  3c2f76ba05acd80893f8b5c379e55865  gcc/testsuite/gdc.test/fail_compilation/disable_new.d
! e90212cb0cb91f01a193b66df9bafe53  gcc/testsuite/gdc.test/fail_compilation/discard_value.d
  478da6239f3c9f3d950a69101379fd84  gcc/testsuite/gdc.test/fail_compilation/dtor_attributes.d
  c6868dc189d18c29ad586141986dc0aa  gcc/testsuite/gdc.test/fail_compilation/dtorfields_attributes.d
  26dfb38aebb722f022ede99dc83c51f6  gcc/testsuite/gdc.test/fail_compilation/e15876_1.d
*************** ebd624415ce51467f6282d2f66d82e6b  gcc/te
*** 108492,108497 ****
--- 108619,108625 ----
  fdedd24d4e12ed3639529b3e2f51fd8d  gcc/testsuite/gdc.test/fail_compilation/editions.d
  f14af71cec48d47183b3e19b5de6cf58  gcc/testsuite/gdc.test/fail_compilation/empty_statement.d
  bec96d18023efd76c6a9a3f99ff127b5  gcc/testsuite/gdc.test/fail_compilation/enum9921.d
+ c0b0c4a1af0bf94185945c9f590198b9  gcc/testsuite/gdc.test/fail_compilation/enum_auto_increment.d
  7a7a1aaeb4fc6b303510c71e5a9a9dd1  gcc/testsuite/gdc.test/fail_compilation/enum_function.d
  0b0991fe537454dbe30a83326f834f7a  gcc/testsuite/gdc.test/fail_compilation/enum_init.d
  f76cf9db0833afa5687645d4c74a9897  gcc/testsuite/gdc.test/fail_compilation/extra-files/bar11453.d
*************** d847ec9b26b5bec6dbd9d1e1d981d2e5  gcc/te
*** 108519,108525 ****
  71288e2e511948061477a0747fecb40e  gcc/testsuite/gdc.test/fail_compilation/fail10630.d
  cb53acf48a2b67325d7f8241e9c9ab8b  gcc/testsuite/gdc.test/fail_compilation/fail10666.d
  132cc39e1c28cccfc1029171f7c406d8  gcc/testsuite/gdc.test/fail_compilation/fail10806.d
! c52e5f9b1281cd06b68144e27329f0a5  gcc/testsuite/gdc.test/fail_compilation/fail109.d
  84cb1acfd9c573c41c1b83dac83a9c8f  gcc/testsuite/gdc.test/fail_compilation/fail10947.d
  71f20d17cb2b274d8981125da18a59af  gcc/testsuite/gdc.test/fail_compilation/fail10964.d
  2842ed3c2dfc99d0dbaedf219515d433  gcc/testsuite/gdc.test/fail_compilation/fail10968.d
--- 108647,108653 ----
  71288e2e511948061477a0747fecb40e  gcc/testsuite/gdc.test/fail_compilation/fail10630.d
  cb53acf48a2b67325d7f8241e9c9ab8b  gcc/testsuite/gdc.test/fail_compilation/fail10666.d
  132cc39e1c28cccfc1029171f7c406d8  gcc/testsuite/gdc.test/fail_compilation/fail10806.d
! 4f673eeae1c96c5b5b89f62b05d1da79  gcc/testsuite/gdc.test/fail_compilation/fail109.d
  84cb1acfd9c573c41c1b83dac83a9c8f  gcc/testsuite/gdc.test/fail_compilation/fail10947.d
  71f20d17cb2b274d8981125da18a59af  gcc/testsuite/gdc.test/fail_compilation/fail10964.d
  2842ed3c2dfc99d0dbaedf219515d433  gcc/testsuite/gdc.test/fail_compilation/fail10968.d
*************** c940487a344f7c48e40c0e52ecfc7865  gcc/te
*** 108555,108561 ****
  e61a25e9a145b638b51ee393ba8be266  gcc/testsuite/gdc.test/fail_compilation/fail116.d
  5470e381d7d2d19227a5eadb16ca60d3  gcc/testsuite/gdc.test/fail_compilation/fail11653.d
  69ab8ed3f88851b5475064234341fb33  gcc/testsuite/gdc.test/fail_compilation/fail117.d
! fdaa763060909e97acdcb129ab83f2a7  gcc/testsuite/gdc.test/fail_compilation/fail11714.d
  a691b7855ffa66fe0d4d016977d36507  gcc/testsuite/gdc.test/fail_compilation/fail11746.d
  e40c97caf3db9f4880aff09011b1daf4  gcc/testsuite/gdc.test/fail_compilation/fail11748.d
  ed6e772866dc816994208aa3da76f14f  gcc/testsuite/gdc.test/fail_compilation/fail11751.d
--- 108683,108689 ----
  e61a25e9a145b638b51ee393ba8be266  gcc/testsuite/gdc.test/fail_compilation/fail116.d
  5470e381d7d2d19227a5eadb16ca60d3  gcc/testsuite/gdc.test/fail_compilation/fail11653.d
  69ab8ed3f88851b5475064234341fb33  gcc/testsuite/gdc.test/fail_compilation/fail117.d
! 730096645cd253f2bb959732df06f1fb  gcc/testsuite/gdc.test/fail_compilation/fail11714.d
  a691b7855ffa66fe0d4d016977d36507  gcc/testsuite/gdc.test/fail_compilation/fail11746.d
  e40c97caf3db9f4880aff09011b1daf4  gcc/testsuite/gdc.test/fail_compilation/fail11748.d
  ed6e772866dc816994208aa3da76f14f  gcc/testsuite/gdc.test/fail_compilation/fail11751.d
*************** a8d7867a148f15ddcee565f5f6e59fd6  gcc/te
*** 108607,108613 ****
  d2025e9f82b3b83cd9dcd335567c795c  gcc/testsuite/gdc.test/fail_compilation/fail136.d
  563c333787d513efd8f8c3af9c634b0d  gcc/testsuite/gdc.test/fail_compilation/fail13601.d
  62bc66bcec853e01a1d64e03dbf1f731  gcc/testsuite/gdc.test/fail_compilation/fail13701.d
! ffcc92538fea18e1edc848b035d2da56  gcc/testsuite/gdc.test/fail_compilation/fail13756.d
  7f637277f7409ea6e5315946be618ca9  gcc/testsuite/gdc.test/fail_compilation/fail13775.d
  a580d1b37336e7005f2011c16123a2f8  gcc/testsuite/gdc.test/fail_compilation/fail139.d
  4a99d4ebdb4d2f7bbbe803d624dba62b  gcc/testsuite/gdc.test/fail_compilation/fail13902.d
--- 108735,108741 ----
  d2025e9f82b3b83cd9dcd335567c795c  gcc/testsuite/gdc.test/fail_compilation/fail136.d
  563c333787d513efd8f8c3af9c634b0d  gcc/testsuite/gdc.test/fail_compilation/fail13601.d
  62bc66bcec853e01a1d64e03dbf1f731  gcc/testsuite/gdc.test/fail_compilation/fail13701.d
! 5c1336f7e50089437ee24a29155e00f6  gcc/testsuite/gdc.test/fail_compilation/fail13756.d
  7f637277f7409ea6e5315946be618ca9  gcc/testsuite/gdc.test/fail_compilation/fail13775.d
  a580d1b37336e7005f2011c16123a2f8  gcc/testsuite/gdc.test/fail_compilation/fail139.d
  4a99d4ebdb4d2f7bbbe803d624dba62b  gcc/testsuite/gdc.test/fail_compilation/fail13902.d
*************** e3e5a1338c4fb6fa1b922916d383f3ea  gcc/te
*** 108633,108639 ****
  08062d15f112cde31d64eca7adc16b43  gcc/testsuite/gdc.test/fail_compilation/fail15068.d
  89068db75229e01f201f1fd7999c5049  gcc/testsuite/gdc.test/fail_compilation/fail15089.d
  855ab11f0bd62621b99dfea1cb130c26  gcc/testsuite/gdc.test/fail_compilation/fail153.d
! 8ffd2e63fb125b33d3573d667ed80e1f  gcc/testsuite/gdc.test/fail_compilation/fail15361.d
  9d037c59d1e7a468338f3f3f381d91c4  gcc/testsuite/gdc.test/fail_compilation/fail154.d
  fa3efd5f1dac35e6525caf67700e7ec2  gcc/testsuite/gdc.test/fail_compilation/fail15414.d
  05f7a47faed85447c3c860dd46f9ce69  gcc/testsuite/gdc.test/fail_compilation/fail155.d
--- 108761,108767 ----
  08062d15f112cde31d64eca7adc16b43  gcc/testsuite/gdc.test/fail_compilation/fail15068.d
  89068db75229e01f201f1fd7999c5049  gcc/testsuite/gdc.test/fail_compilation/fail15089.d
  855ab11f0bd62621b99dfea1cb130c26  gcc/testsuite/gdc.test/fail_compilation/fail153.d
! 65d0c0b15d03aac34782e50e52161ce0  gcc/testsuite/gdc.test/fail_compilation/fail15361.d
  9d037c59d1e7a468338f3f3f381d91c4  gcc/testsuite/gdc.test/fail_compilation/fail154.d
  fa3efd5f1dac35e6525caf67700e7ec2  gcc/testsuite/gdc.test/fail_compilation/fail15414.d
  05f7a47faed85447c3c860dd46f9ce69  gcc/testsuite/gdc.test/fail_compilation/fail155.d
*************** b8e5e7c3a81b656da38456cb46d2e9b4  gcc/te
*** 108641,108647 ****
  8d6777061a04969663e28b186960951b  gcc/testsuite/gdc.test/fail_compilation/fail15550.d
  6bb28b4e2ee304c5c47507988ed9e0ee  gcc/testsuite/gdc.test/fail_compilation/fail156.d
  c239fcb718b674ffcd8dc38c08d3fbbe  gcc/testsuite/gdc.test/fail_compilation/fail15616a.d
! 98490d66059e3ce1ce70608f18f04aec  gcc/testsuite/gdc.test/fail_compilation/fail15616b.d
  7d7ffd0ff905b470836f6184abd71ad4  gcc/testsuite/gdc.test/fail_compilation/fail15616c.d
  eb25ca31055afa86912f9701e7994607  gcc/testsuite/gdc.test/fail_compilation/fail15616d.d
  3be4ce307a92d11b64cfa9d4f03f4445  gcc/testsuite/gdc.test/fail_compilation/fail15626.d
--- 108769,108775 ----
  8d6777061a04969663e28b186960951b  gcc/testsuite/gdc.test/fail_compilation/fail15550.d
  6bb28b4e2ee304c5c47507988ed9e0ee  gcc/testsuite/gdc.test/fail_compilation/fail156.d
  c239fcb718b674ffcd8dc38c08d3fbbe  gcc/testsuite/gdc.test/fail_compilation/fail15616a.d
! e331452e3069192dc14336b5d29efdf4  gcc/testsuite/gdc.test/fail_compilation/fail15616b.d
  7d7ffd0ff905b470836f6184abd71ad4  gcc/testsuite/gdc.test/fail_compilation/fail15616c.d
  eb25ca31055afa86912f9701e7994607  gcc/testsuite/gdc.test/fail_compilation/fail15616d.d
  3be4ce307a92d11b64cfa9d4f03f4445  gcc/testsuite/gdc.test/fail_compilation/fail15626.d
*************** c684ab29bcabeefed5b53fffe9d3f70e  gcc/te
*** 108651,108664 ****
  2b6be87bab9c944e4449b89cccc18e26  gcc/testsuite/gdc.test/fail_compilation/fail158.d
  4456fcb05c32e734192f28b051d44ade  gcc/testsuite/gdc.test/fail_compilation/fail15896.d
  0e7efcd6e123a7faef05ce3ae6f59ce9  gcc/testsuite/gdc.test/fail_compilation/fail159.d
! 1c3ddcb08e544c68f3963c9adb05b2ec  gcc/testsuite/gdc.test/fail_compilation/fail16.d
  b1a3c7961f99b91306dbd64d284c746a  gcc/testsuite/gdc.test/fail_compilation/fail160.d
  45aa62a7c4b2fe3afda147252be922f8  gcc/testsuite/gdc.test/fail_compilation/fail16001.d
  1c72cecc096b7d2d4e31dd6f47fb8895  gcc/testsuite/gdc.test/fail_compilation/fail161.d
  2694b11905d32c2ad0acc36f3e854623  gcc/testsuite/gdc.test/fail_compilation/fail162.d
  99c094fe5a883a7d9a9adcbd82f194c1  gcc/testsuite/gdc.test/fail_compilation/fail16206a.d
  7e34a6b4dd39ae5c562fa3e43ae5b267  gcc/testsuite/gdc.test/fail_compilation/fail16206b.d
! 65570fad8408c994cb62f7bb4e38bc7f  gcc/testsuite/gdc.test/fail_compilation/fail163.d
  b12de9832e05ce82363b2aa2f1b3fbf8  gcc/testsuite/gdc.test/fail_compilation/fail16575.d
  e6ed90d1540db0da0103c48194f9752a  gcc/testsuite/gdc.test/fail_compilation/fail16600.d
  c5ee157d0579c4d068cd3947df8553ea  gcc/testsuite/gdc.test/fail_compilation/fail16689.d
--- 108779,108792 ----
  2b6be87bab9c944e4449b89cccc18e26  gcc/testsuite/gdc.test/fail_compilation/fail158.d
  4456fcb05c32e734192f28b051d44ade  gcc/testsuite/gdc.test/fail_compilation/fail15896.d
  0e7efcd6e123a7faef05ce3ae6f59ce9  gcc/testsuite/gdc.test/fail_compilation/fail159.d
! 4ee7290dab1ea06941a458f6d3ab7b50  gcc/testsuite/gdc.test/fail_compilation/fail16.d
  b1a3c7961f99b91306dbd64d284c746a  gcc/testsuite/gdc.test/fail_compilation/fail160.d
  45aa62a7c4b2fe3afda147252be922f8  gcc/testsuite/gdc.test/fail_compilation/fail16001.d
  1c72cecc096b7d2d4e31dd6f47fb8895  gcc/testsuite/gdc.test/fail_compilation/fail161.d
  2694b11905d32c2ad0acc36f3e854623  gcc/testsuite/gdc.test/fail_compilation/fail162.d
  99c094fe5a883a7d9a9adcbd82f194c1  gcc/testsuite/gdc.test/fail_compilation/fail16206a.d
  7e34a6b4dd39ae5c562fa3e43ae5b267  gcc/testsuite/gdc.test/fail_compilation/fail16206b.d
! c0180a04ebb11a1d25801509b68aba93  gcc/testsuite/gdc.test/fail_compilation/fail163.d
  b12de9832e05ce82363b2aa2f1b3fbf8  gcc/testsuite/gdc.test/fail_compilation/fail16575.d
  e6ed90d1540db0da0103c48194f9752a  gcc/testsuite/gdc.test/fail_compilation/fail16600.d
  c5ee157d0579c4d068cd3947df8553ea  gcc/testsuite/gdc.test/fail_compilation/fail16689.d
*************** f8d46bb7603384631c0a6f26126398b0  gcc/te
*** 108699,108705 ****
  e3408518b8b4c811d02328352ef87de6  gcc/testsuite/gdc.test/fail_compilation/fail18057b.d
  1bdea03690c85119a465149cfbe90431  gcc/testsuite/gdc.test/fail_compilation/fail18093.d
  56cadbe6e1c6957cb43ae7179c59a572  gcc/testsuite/gdc.test/fail_compilation/fail18143.d
! a31bbdcf7ab236e30a584d27c2714862  gcc/testsuite/gdc.test/fail_compilation/fail18219.d
  b85a8861594c77116c2c1d80342d314b  gcc/testsuite/gdc.test/fail_compilation/fail18228.d
  b33052116ca6853320ab7e38f77facc9  gcc/testsuite/gdc.test/fail_compilation/fail18236.d
  9c5dcc54138aa1fb16a58323cb026944  gcc/testsuite/gdc.test/fail_compilation/fail18243.d
--- 108827,108833 ----
  e3408518b8b4c811d02328352ef87de6  gcc/testsuite/gdc.test/fail_compilation/fail18057b.d
  1bdea03690c85119a465149cfbe90431  gcc/testsuite/gdc.test/fail_compilation/fail18093.d
  56cadbe6e1c6957cb43ae7179c59a572  gcc/testsuite/gdc.test/fail_compilation/fail18143.d
! 1b77e14a5215ba3c2c8ee9353abad6a9  gcc/testsuite/gdc.test/fail_compilation/fail18219.d
  b85a8861594c77116c2c1d80342d314b  gcc/testsuite/gdc.test/fail_compilation/fail18228.d
  b33052116ca6853320ab7e38f77facc9  gcc/testsuite/gdc.test/fail_compilation/fail18236.d
  9c5dcc54138aa1fb16a58323cb026944  gcc/testsuite/gdc.test/fail_compilation/fail18243.d
*************** c6069fa300de28f36ced064a9fb2c11c  gcc/te
*** 108724,108730 ****
  2fdc35b53dda4e331869a58020543b2d  gcc/testsuite/gdc.test/fail_compilation/fail19076.d
  8265e9a9f4a973f41fa5ceaf867da9f3  gcc/testsuite/gdc.test/fail_compilation/fail19098.d
  38e2cba6bcb50a692990ffe7b96fb049  gcc/testsuite/gdc.test/fail_compilation/fail19099.d
! 4b7c2eb3deabee996dfef13d144e38b1  gcc/testsuite/gdc.test/fail_compilation/fail19103.d
  90c7cdd15ee714303e1566bc4af7044c  gcc/testsuite/gdc.test/fail_compilation/fail19181.d
  2658559b7e065a4d9a88423a76b0a1f8  gcc/testsuite/gdc.test/fail_compilation/fail19182.d
  8c7b72f8d54d7f8f256985e65bb7a17b  gcc/testsuite/gdc.test/fail_compilation/fail192.d
--- 108852,108858 ----
  2fdc35b53dda4e331869a58020543b2d  gcc/testsuite/gdc.test/fail_compilation/fail19076.d
  8265e9a9f4a973f41fa5ceaf867da9f3  gcc/testsuite/gdc.test/fail_compilation/fail19098.d
  38e2cba6bcb50a692990ffe7b96fb049  gcc/testsuite/gdc.test/fail_compilation/fail19099.d
! e21c5224842922c537ecd7c8c05cb897  gcc/testsuite/gdc.test/fail_compilation/fail19103.d
  90c7cdd15ee714303e1566bc4af7044c  gcc/testsuite/gdc.test/fail_compilation/fail19181.d
  2658559b7e065a4d9a88423a76b0a1f8  gcc/testsuite/gdc.test/fail_compilation/fail19182.d
  8c7b72f8d54d7f8f256985e65bb7a17b  gcc/testsuite/gdc.test/fail_compilation/fail192.d
*************** a96c3ad1d04fa66b706308dc41b66044  gcc/te
*** 108739,108745 ****
  255cbdd802a2bc528e235738c17ed595  gcc/testsuite/gdc.test/fail_compilation/fail19447.d
  7594dbc07383fa13599d213acea6e03a  gcc/testsuite/gdc.test/fail_compilation/fail195.d
  676dfacf37090247608e1eabe58d4327  gcc/testsuite/gdc.test/fail_compilation/fail19520.d
! 584438be3278ad1da4a689a8a9ff564b  gcc/testsuite/gdc.test/fail_compilation/fail196.d
  a09e1208955504bd9a765b08ef650b11  gcc/testsuite/gdc.test/fail_compilation/fail19609.d
  3f5bd68363cca36c32206c67b500f342  gcc/testsuite/gdc.test/fail_compilation/fail19687.d
  72c1506969b93dba2e665d8b3c969161  gcc/testsuite/gdc.test/fail_compilation/fail19729.d
--- 108867,108873 ----
  255cbdd802a2bc528e235738c17ed595  gcc/testsuite/gdc.test/fail_compilation/fail19447.d
  7594dbc07383fa13599d213acea6e03a  gcc/testsuite/gdc.test/fail_compilation/fail195.d
  676dfacf37090247608e1eabe58d4327  gcc/testsuite/gdc.test/fail_compilation/fail19520.d
! 5aee39f5c518333f81ee7ec7555755d7  gcc/testsuite/gdc.test/fail_compilation/fail196.d
  a09e1208955504bd9a765b08ef650b11  gcc/testsuite/gdc.test/fail_compilation/fail19609.d
  3f5bd68363cca36c32206c67b500f342  gcc/testsuite/gdc.test/fail_compilation/fail19687.d
  72c1506969b93dba2e665d8b3c969161  gcc/testsuite/gdc.test/fail_compilation/fail19729.d
*************** a2b43f0facf5529e22c33f9b5f6e0f3e  gcc/te
*** 108789,108794 ****
--- 108917,108923 ----
  770ca3292722de07d3fd067834c731a3  gcc/testsuite/gdc.test/fail_compilation/fail20183.d
  c5e98fdfa8a88945c29e0e5d6f31af2f  gcc/testsuite/gdc.test/fail_compilation/fail202.d
  d60ada634a46d2b65a2dacb147c221df  gcc/testsuite/gdc.test/fail_compilation/fail203.d
+ f3b8d54a0e7783bfac8fceac473c34de  gcc/testsuite/gdc.test/fail_compilation/fail20365.d
  ab75eb61c7f810487e956abdef81f241  gcc/testsuite/gdc.test/fail_compilation/fail20376.d
  13edbbb78345e2f4e1743050e6c058cb  gcc/testsuite/gdc.test/fail_compilation/fail204.d
  030997d8da65b77e58c45f817936e5ef  gcc/testsuite/gdc.test/fail_compilation/fail20448.d
*************** b0b9a19ac01ca365168a5af1f8cd3c34  gcc/te
*** 108826,108836 ****
  a09e8da91153ed93d9aaeab41ad454e5  gcc/testsuite/gdc.test/fail_compilation/fail21275.d
  2d9df3ff3291444912ae26c1928ab756  gcc/testsuite/gdc.test/fail_compilation/fail213.d
  11c327ae74ea5071c0ad376800875d7b  gcc/testsuite/gdc.test/fail_compilation/fail21314.d
  13ad9b137c1b6f7e351e545d9935bdd4  gcc/testsuite/gdc.test/fail_compilation/fail215.d
  71a09b4bf6b48720fcf973edfe6c3e01  gcc/testsuite/gdc.test/fail_compilation/fail21508.d
  fa51ba78aed7e51b5bea920cbb76cf2c  gcc/testsuite/gdc.test/fail_compilation/fail21508_2.d
! b609044adbbd843d6cf44718cec2033d  gcc/testsuite/gdc.test/fail_compilation/fail21547.d
  a83d55be79bbfec18976ece3917ef4c3  gcc/testsuite/gdc.test/fail_compilation/fail216.d
  44dfb54c7dfa91e3e045066a94d75e10  gcc/testsuite/gdc.test/fail_compilation/fail217.d
  850fcf15e46bcdbe4eb0284e6f555af5  gcc/testsuite/gdc.test/fail_compilation/fail218.d
  7025d32dc6c65dc11dae3b5ef7be57d5  gcc/testsuite/gdc.test/fail_compilation/fail21830.d
--- 108955,108968 ----
  a09e8da91153ed93d9aaeab41ad454e5  gcc/testsuite/gdc.test/fail_compilation/fail21275.d
  2d9df3ff3291444912ae26c1928ab756  gcc/testsuite/gdc.test/fail_compilation/fail213.d
  11c327ae74ea5071c0ad376800875d7b  gcc/testsuite/gdc.test/fail_compilation/fail21314.d
+ c2c66b29db884a5de0335a912e088d0a  gcc/testsuite/gdc.test/fail_compilation/fail21414.d
  13ad9b137c1b6f7e351e545d9935bdd4  gcc/testsuite/gdc.test/fail_compilation/fail215.d
  71a09b4bf6b48720fcf973edfe6c3e01  gcc/testsuite/gdc.test/fail_compilation/fail21508.d
  fa51ba78aed7e51b5bea920cbb76cf2c  gcc/testsuite/gdc.test/fail_compilation/fail21508_2.d
! 80f95c47d3889857b2f348f667752131  gcc/testsuite/gdc.test/fail_compilation/fail21547.d
  a83d55be79bbfec18976ece3917ef4c3  gcc/testsuite/gdc.test/fail_compilation/fail216.d
+ 9016d3c58d5a828a3d8ee0e094aae17c  gcc/testsuite/gdc.test/fail_compilation/fail21660.d
+ e1932faf29a519adcbb8d7148afdda6c  gcc/testsuite/gdc.test/fail_compilation/fail21693.d
  44dfb54c7dfa91e3e045066a94d75e10  gcc/testsuite/gdc.test/fail_compilation/fail217.d
  850fcf15e46bcdbe4eb0284e6f555af5  gcc/testsuite/gdc.test/fail_compilation/fail218.d
  7025d32dc6c65dc11dae3b5ef7be57d5  gcc/testsuite/gdc.test/fail_compilation/fail21830.d
*************** c70d7463bfe55bd7cd11bbab0f8523bd  gcc/te
*** 108871,108877 ****
  656e03bd856eb6e5af678c49d60888ad  gcc/testsuite/gdc.test/fail_compilation/fail22570.d
  31fb74dd9708f5d3461a97b5c69b8b7b  gcc/testsuite/gdc.test/fail_compilation/fail22634.d
  dfc179a746f3347228c84002d6454d7f  gcc/testsuite/gdc.test/fail_compilation/fail22729.d
! 524d3aa06d43f7dc07b54abd5885156c  gcc/testsuite/gdc.test/fail_compilation/fail22749.d
  1ea5d3c5ce687f6d852e58c95382d8e4  gcc/testsuite/gdc.test/fail_compilation/fail22780.d
  c24efc95b4a07d93082131c006e2dd80  gcc/testsuite/gdc.test/fail_compilation/fail228.d
  a3b880eeeee3718d39ad9eea41a126bd  gcc/testsuite/gdc.test/fail_compilation/fail22825a.d
--- 109003,109009 ----
  656e03bd856eb6e5af678c49d60888ad  gcc/testsuite/gdc.test/fail_compilation/fail22570.d
  31fb74dd9708f5d3461a97b5c69b8b7b  gcc/testsuite/gdc.test/fail_compilation/fail22634.d
  dfc179a746f3347228c84002d6454d7f  gcc/testsuite/gdc.test/fail_compilation/fail22729.d
! b3cf59df3a322cc9b9fc6bed0875d069  gcc/testsuite/gdc.test/fail_compilation/fail22749.d
  1ea5d3c5ce687f6d852e58c95382d8e4  gcc/testsuite/gdc.test/fail_compilation/fail22780.d
  c24efc95b4a07d93082131c006e2dd80  gcc/testsuite/gdc.test/fail_compilation/fail228.d
  a3b880eeeee3718d39ad9eea41a126bd  gcc/testsuite/gdc.test/fail_compilation/fail22825a.d
*************** ed8c100dddbce2063a566b89b2a95a90  gcc/te
*** 108890,108896 ****
  e670a6f21877da59644ba71444695a18  gcc/testsuite/gdc.test/fail_compilation/fail23181.d
  2549171f6c1309bbbd88a2c8d62fdd92  gcc/testsuite/gdc.test/fail_compilation/fail232.d
  75e8bd002cad820145fda155dc230d5e  gcc/testsuite/gdc.test/fail_compilation/fail23406.d
! 25ca171756a24d6a546fee80980ae236  gcc/testsuite/gdc.test/fail_compilation/fail23439.d
  7ee3ebb5d13dbddf32d93e977302a4b1  gcc/testsuite/gdc.test/fail_compilation/fail235.d
  bce999b9720203f9099ef1b72855dfcc  gcc/testsuite/gdc.test/fail_compilation/fail23574.d
  32e3bda98a0a6039d7cd102fc87c52fa  gcc/testsuite/gdc.test/fail_compilation/fail23591.d
--- 109022,109028 ----
  e670a6f21877da59644ba71444695a18  gcc/testsuite/gdc.test/fail_compilation/fail23181.d
  2549171f6c1309bbbd88a2c8d62fdd92  gcc/testsuite/gdc.test/fail_compilation/fail232.d
  75e8bd002cad820145fda155dc230d5e  gcc/testsuite/gdc.test/fail_compilation/fail23406.d
! 649bdb4d303d85ff1da77d592bdcd58c  gcc/testsuite/gdc.test/fail_compilation/fail23439.d
  7ee3ebb5d13dbddf32d93e977302a4b1  gcc/testsuite/gdc.test/fail_compilation/fail235.d
  bce999b9720203f9099ef1b72855dfcc  gcc/testsuite/gdc.test/fail_compilation/fail23574.d
  32e3bda98a0a6039d7cd102fc87c52fa  gcc/testsuite/gdc.test/fail_compilation/fail23591.d
*************** b206f94fcd91613bf06fad61e79f3c3d  gcc/te
*** 108973,108979 ****
  ccf07a8d9da2e18e2df9789595f228b8  gcc/testsuite/gdc.test/fail_compilation/fail302.d
  83cbeb4a4f4e877683998a5dc8350383  gcc/testsuite/gdc.test/fail_compilation/fail303.d
  55c689bdd0e95596a127ae06b8d223da  gcc/testsuite/gdc.test/fail_compilation/fail304.d
- a4476518c57fe9ca01a6fe8b42385325  gcc/testsuite/gdc.test/fail_compilation/fail305.d
  ef026933cf422af0367257bfe21bd10a  gcc/testsuite/gdc.test/fail_compilation/fail306.d
  c6bb6e98c1536367c7fff657247aeddc  gcc/testsuite/gdc.test/fail_compilation/fail307.d
  fcac9ad4babc1ce01a89dae4b91d6e7d  gcc/testsuite/gdc.test/fail_compilation/fail308.d
--- 109105,109110 ----
*************** db25d22f16a253b8379657cc5e4d9fc8  gcc/te
*** 109001,109007 ****
  78b83d0a6dd2d5ee5974ca3a4f7224d4  gcc/testsuite/gdc.test/fail_compilation/fail333.d
  4404e9f66c6ddceb6eebdb6fedd1978a  gcc/testsuite/gdc.test/fail_compilation/fail334.d
  efff0f2ea1051cc3f03bca692e4cdd58  gcc/testsuite/gdc.test/fail_compilation/fail335.d
! 4c3dd0c6267aacd55f117739256d6166  gcc/testsuite/gdc.test/fail_compilation/fail336.d
  ca1565a5e3c6d530f6ac211c98dbb3c9  gcc/testsuite/gdc.test/fail_compilation/fail337.d
  1cc9295ba07308631d8c59cdc8721d82  gcc/testsuite/gdc.test/fail_compilation/fail34.d
  6582ef9395b3a7c9090f7a2f29d70e43  gcc/testsuite/gdc.test/fail_compilation/fail340.d
--- 109132,109138 ----
  78b83d0a6dd2d5ee5974ca3a4f7224d4  gcc/testsuite/gdc.test/fail_compilation/fail333.d
  4404e9f66c6ddceb6eebdb6fedd1978a  gcc/testsuite/gdc.test/fail_compilation/fail334.d
  efff0f2ea1051cc3f03bca692e4cdd58  gcc/testsuite/gdc.test/fail_compilation/fail335.d
! 6032215d28b304a4678d29f7b47a8aed  gcc/testsuite/gdc.test/fail_compilation/fail336.d
  ca1565a5e3c6d530f6ac211c98dbb3c9  gcc/testsuite/gdc.test/fail_compilation/fail337.d
  1cc9295ba07308631d8c59cdc8721d82  gcc/testsuite/gdc.test/fail_compilation/fail34.d
  6582ef9395b3a7c9090f7a2f29d70e43  gcc/testsuite/gdc.test/fail_compilation/fail340.d
*************** ca1565a5e3c6d530f6ac211c98dbb3c9  gcc/te
*** 109009,109015 ****
  d90da0a412ace4972eb22626cc976f94  gcc/testsuite/gdc.test/fail_compilation/fail343.d
  f332a94ead175c47a5de77a06e6410b4  gcc/testsuite/gdc.test/fail_compilation/fail344.d
  4a746c443d2dbe861d85e6889c4bf53f  gcc/testsuite/gdc.test/fail_compilation/fail346.d
! 3abd9167c0c17376878ea9f95f5b8977  gcc/testsuite/gdc.test/fail_compilation/fail347.d
  ccd8ce4ed9822b5a21bb35bdb22746b4  gcc/testsuite/gdc.test/fail_compilation/fail349.d
  bede71f4316d3fc557a5414cd713fc15  gcc/testsuite/gdc.test/fail_compilation/fail35.d
  d8f935e976db90cddbe98d81b99278a0  gcc/testsuite/gdc.test/fail_compilation/fail351.d
--- 109140,109146 ----
  d90da0a412ace4972eb22626cc976f94  gcc/testsuite/gdc.test/fail_compilation/fail343.d
  f332a94ead175c47a5de77a06e6410b4  gcc/testsuite/gdc.test/fail_compilation/fail344.d
  4a746c443d2dbe861d85e6889c4bf53f  gcc/testsuite/gdc.test/fail_compilation/fail346.d
! 56f43d062f72b58f6d4194dcf9543316  gcc/testsuite/gdc.test/fail_compilation/fail347.d
  ccd8ce4ed9822b5a21bb35bdb22746b4  gcc/testsuite/gdc.test/fail_compilation/fail349.d
  bede71f4316d3fc557a5414cd713fc15  gcc/testsuite/gdc.test/fail_compilation/fail35.d
  d8f935e976db90cddbe98d81b99278a0  gcc/testsuite/gdc.test/fail_compilation/fail351.d
*************** b199f60d67e76de7b69aae541852e953  gcc/te
*** 109037,109043 ****
  a3c52c49abd68bb9774eff98e08689bb  gcc/testsuite/gdc.test/fail_compilation/fail3990.d
  5072a326fa375a1588e84f415ae73a2a  gcc/testsuite/gdc.test/fail_compilation/fail40.d
  6997b0f6d45a6ceccc225d28063629cb  gcc/testsuite/gdc.test/fail_compilation/fail4082.d
- 2dd6f8c6cb1ecf6625d1650733ce0145  gcc/testsuite/gdc.test/fail_compilation/fail41.d
  9a5300a416e69f83924621c9653cffd1  gcc/testsuite/gdc.test/fail_compilation/fail42.d
  6df76bbb49a6a24e29515a2adaf498cd  gcc/testsuite/gdc.test/fail_compilation/fail4206.d
  1c898e536a38e8e36a14c0f6dbef6fb5  gcc/testsuite/gdc.test/fail_compilation/fail4269a.d
--- 109168,109173 ----
*************** c04bb3b9d9f2c77e67d846ea284d05c6  gcc/te
*** 109112,109124 ****
  f29d15ce0f4c155a9996ad11ee7691bf  gcc/testsuite/gdc.test/fail_compilation/fail6334.d
  0f27e8326540f5faa28936d621dc867b  gcc/testsuite/gdc.test/fail_compilation/fail6453.d
  f6ad81f6c854268ec6aa1653a1d0a713  gcc/testsuite/gdc.test/fail_compilation/fail6458.d
! f06525c46ef47c01d70b5c6dfd79ceb4  gcc/testsuite/gdc.test/fail_compilation/fail6497.d
  611d6b962d4185ffdab95c02bc8df4e4  gcc/testsuite/gdc.test/fail_compilation/fail6561.d
  e572a3337ac147afe10e7c1be4ef0061  gcc/testsuite/gdc.test/fail_compilation/fail66.d
  9e7996a6ce93324b738d224ae2c4c197  gcc/testsuite/gdc.test/fail_compilation/fail6611.d
  df0020fd18ec31bed68de41c63d76fe2  gcc/testsuite/gdc.test/fail_compilation/fail6652.d
  ccfea15dc14dfc824be1ec62b8a31852  gcc/testsuite/gdc.test/fail_compilation/fail6781.d
! fd2d9062f2acfd44f22ffe08d0dd39a2  gcc/testsuite/gdc.test/fail_compilation/fail6795.d
  91f52bce26014ee21eba507bba017f17  gcc/testsuite/gdc.test/fail_compilation/fail6889.d
  5ec830d5c53fc5f8a83fb99cea8c3c5a  gcc/testsuite/gdc.test/fail_compilation/fail6968.d
  4f5e9643c98ab73f981a090b5ede3c6b  gcc/testsuite/gdc.test/fail_compilation/fail7077.d
--- 109242,109254 ----
  f29d15ce0f4c155a9996ad11ee7691bf  gcc/testsuite/gdc.test/fail_compilation/fail6334.d
  0f27e8326540f5faa28936d621dc867b  gcc/testsuite/gdc.test/fail_compilation/fail6453.d
  f6ad81f6c854268ec6aa1653a1d0a713  gcc/testsuite/gdc.test/fail_compilation/fail6458.d
! 46a2608f5e1df13a86ad2188b8102307  gcc/testsuite/gdc.test/fail_compilation/fail6497.d
  611d6b962d4185ffdab95c02bc8df4e4  gcc/testsuite/gdc.test/fail_compilation/fail6561.d
  e572a3337ac147afe10e7c1be4ef0061  gcc/testsuite/gdc.test/fail_compilation/fail66.d
  9e7996a6ce93324b738d224ae2c4c197  gcc/testsuite/gdc.test/fail_compilation/fail6611.d
  df0020fd18ec31bed68de41c63d76fe2  gcc/testsuite/gdc.test/fail_compilation/fail6652.d
  ccfea15dc14dfc824be1ec62b8a31852  gcc/testsuite/gdc.test/fail_compilation/fail6781.d
! 7c8e79bbfd309470c15b137331e4e77b  gcc/testsuite/gdc.test/fail_compilation/fail6795.d
  91f52bce26014ee21eba507bba017f17  gcc/testsuite/gdc.test/fail_compilation/fail6889.d
  5ec830d5c53fc5f8a83fb99cea8c3c5a  gcc/testsuite/gdc.test/fail_compilation/fail6968.d
  4f5e9643c98ab73f981a090b5ede3c6b  gcc/testsuite/gdc.test/fail_compilation/fail7077.d
*************** a8fe53493be780e3cc67f316ab517f81  gcc/te
*** 109202,109208 ****
  d7723e17b36d09ef6c3adb1b595d1521  gcc/testsuite/gdc.test/fail_compilation/fail9766.d
  9544d69dd512570f57eb0e3f1c5d6b94  gcc/testsuite/gdc.test/fail_compilation/fail9773.d
  007549037b1dc58b235123d494310c31  gcc/testsuite/gdc.test/fail_compilation/fail9790.d
! 4cc716e7729c65300b3c37f4297755e9  gcc/testsuite/gdc.test/fail_compilation/fail98.d
  1eb7d70c5bc3244e5e4ea3b6f5d798bd  gcc/testsuite/gdc.test/fail_compilation/fail9891.d
  5f89108928a4b83bf03ae31c848575f0  gcc/testsuite/gdc.test/fail_compilation/fail9892.d
  456bcfedd0986449389fccbd17f7cfab  gcc/testsuite/gdc.test/fail_compilation/fail99.d
--- 109332,109338 ----
  d7723e17b36d09ef6c3adb1b595d1521  gcc/testsuite/gdc.test/fail_compilation/fail9766.d
  9544d69dd512570f57eb0e3f1c5d6b94  gcc/testsuite/gdc.test/fail_compilation/fail9773.d
  007549037b1dc58b235123d494310c31  gcc/testsuite/gdc.test/fail_compilation/fail9790.d
! ce451f97cc5cf4aeec378394710dc8d9  gcc/testsuite/gdc.test/fail_compilation/fail98.d
  1eb7d70c5bc3244e5e4ea3b6f5d798bd  gcc/testsuite/gdc.test/fail_compilation/fail9891.d
  5f89108928a4b83bf03ae31c848575f0  gcc/testsuite/gdc.test/fail_compilation/fail9892.d
  456bcfedd0986449389fccbd17f7cfab  gcc/testsuite/gdc.test/fail_compilation/fail99.d
*************** f0f98a24874397d29f4f6e59def95d45  gcc/te
*** 109225,109235 ****
  2ba3f1515a3ee5a14f9c4466fc8caef3  gcc/testsuite/gdc.test/fail_compilation/fail_contracts4.d
  695faa3012289c1132b755b3a4e17c6b  gcc/testsuite/gdc.test/fail_compilation/fail_isZeroInit.d
  355efac6c9e5d4cfab4abe0ea13e91b5  gcc/testsuite/gdc.test/fail_compilation/fail_opover.d
! 24ea6fc5fe8ac4e5400e848081335c55  gcc/testsuite/gdc.test/fail_compilation/fail_pretty_errors.d
  2283d23cdf2b6ba522578c516a9457eb  gcc/testsuite/gdc.test/fail_compilation/fail_scope.d
  60c11097cde97ed1a0d56db913d545cd  gcc/testsuite/gdc.test/fail_compilation/fail_typeof.d
  1c155fc73fa20eef8b42028af054656e  gcc/testsuite/gdc.test/fail_compilation/failattr.d
! ab9734d035ce0d3f3899a47944a7565b  gcc/testsuite/gdc.test/fail_compilation/failcontracts.d
  ed790d31dcec49050e526f717b7525f2  gcc/testsuite/gdc.test/fail_compilation/faildottypeinfo.d
  acd4dc01e2f625f440ffb85c36b0bdd8  gcc/testsuite/gdc.test/fail_compilation/failescape.d
  572be48d5a0a5235990cd885758cfa21  gcc/testsuite/gdc.test/fail_compilation/failinout1.d
--- 109355,109365 ----
  2ba3f1515a3ee5a14f9c4466fc8caef3  gcc/testsuite/gdc.test/fail_compilation/fail_contracts4.d
  695faa3012289c1132b755b3a4e17c6b  gcc/testsuite/gdc.test/fail_compilation/fail_isZeroInit.d
  355efac6c9e5d4cfab4abe0ea13e91b5  gcc/testsuite/gdc.test/fail_compilation/fail_opover.d
! e9dc5511da50b00888d9bd3b1b1ee69e  gcc/testsuite/gdc.test/fail_compilation/fail_pretty_errors.d
  2283d23cdf2b6ba522578c516a9457eb  gcc/testsuite/gdc.test/fail_compilation/fail_scope.d
  60c11097cde97ed1a0d56db913d545cd  gcc/testsuite/gdc.test/fail_compilation/fail_typeof.d
  1c155fc73fa20eef8b42028af054656e  gcc/testsuite/gdc.test/fail_compilation/failattr.d
! ace42ed977e08959eda339a9ad9e9397  gcc/testsuite/gdc.test/fail_compilation/failcontracts.d
  ed790d31dcec49050e526f717b7525f2  gcc/testsuite/gdc.test/fail_compilation/faildottypeinfo.d
  acd4dc01e2f625f440ffb85c36b0bdd8  gcc/testsuite/gdc.test/fail_compilation/failescape.d
  572be48d5a0a5235990cd885758cfa21  gcc/testsuite/gdc.test/fail_compilation/failinout1.d
*************** b1fa83e7e767b866edc1118f9d0f686f  gcc/te
*** 109245,109252 ****
  24f0a089eaaac69432f496cae56e5343  gcc/testsuite/gdc.test/fail_compilation/fix19018.d
  beb8c8bfc3f0f76ee64efc3806c61af0  gcc/testsuite/gdc.test/fail_compilation/fix19059.d
  70b0c808cb74e8359925dbd5e0749db7  gcc/testsuite/gdc.test/fail_compilation/fix19246.d
  0274ff4a725fd57aeec4d55356e37e66  gcc/testsuite/gdc.test/fail_compilation/fix21585.d
! 4dcca90501b57cb7711612faa5af83ce  gcc/testsuite/gdc.test/fail_compilation/fix22108.d
  2ff267e1d3a9eba9b6a3dbdefbb8e0c4  gcc/testsuite/gdc.test/fail_compilation/fix23138.d
  93690a25ed6e19eb304f316a96d26179  gcc/testsuite/gdc.test/fail_compilation/fix350a.d
  d70aafa6b9062aa0a03de1dadb2afa0e  gcc/testsuite/gdc.test/fail_compilation/fix350b.d
--- 109375,109389 ----
  24f0a089eaaac69432f496cae56e5343  gcc/testsuite/gdc.test/fail_compilation/fix19018.d
  beb8c8bfc3f0f76ee64efc3806c61af0  gcc/testsuite/gdc.test/fail_compilation/fix19059.d
  70b0c808cb74e8359925dbd5e0749db7  gcc/testsuite/gdc.test/fail_compilation/fix19246.d
+ 5a4da095f1b7243987c41e4de614302b  gcc/testsuite/gdc.test/fail_compilation/fix19613.d
+ 03c1cd3afb7e773dcbd4bfeaf9b7c129  gcc/testsuite/gdc.test/fail_compilation/fix20075.d
+ ed3d9e6fec5cb7ccd6fd7ba3e7c8e053  gcc/testsuite/gdc.test/fail_compilation/fix20318.d
+ da8beb3b2c7b19c6afea39a0890f8c09  gcc/testsuite/gdc.test/fail_compilation/fix20867.d
+ 7e144e4f6d68f658a479304e5ba43959  gcc/testsuite/gdc.test/fail_compilation/fix21042.d
+ 149684b466b205310aa2b032695417a9  gcc/testsuite/gdc.test/fail_compilation/fix21165.d
+ fa388f3b1e2bd7d7b0754d8a22a1c2fd  gcc/testsuite/gdc.test/fail_compilation/fix21166.d
  0274ff4a725fd57aeec4d55356e37e66  gcc/testsuite/gdc.test/fail_compilation/fix21585.d
! 77b384203491f1bdc2961636077b7482  gcc/testsuite/gdc.test/fail_compilation/fix22108.d
  2ff267e1d3a9eba9b6a3dbdefbb8e0c4  gcc/testsuite/gdc.test/fail_compilation/fix23138.d
  93690a25ed6e19eb304f316a96d26179  gcc/testsuite/gdc.test/fail_compilation/fix350a.d
  d70aafa6b9062aa0a03de1dadb2afa0e  gcc/testsuite/gdc.test/fail_compilation/fix350b.d
*************** d70aafa6b9062aa0a03de1dadb2afa0e  gcc/te
*** 109257,109262 ****
--- 109394,109400 ----
  3b6b4690c46663771a12fac16287d948  gcc/testsuite/gdc.test/fail_compilation/foreach.d
  0f17ffd1ebe50b304fd0960b12313bb2  gcc/testsuite/gdc.test/fail_compilation/foreach2.d
  79763e23ff82b9488a3fddb758c48cd9  gcc/testsuite/gdc.test/fail_compilation/foreach_index_overflow.d
+ 9fad192966267a43c8f4ef01176b9a60  gcc/testsuite/gdc.test/fail_compilation/foreach_seq.d
  bccf894411d541cd221e4207649b4c46  gcc/testsuite/gdc.test/fail_compilation/format.d
  15e1ee41289e7d1ef8a596511f5652b2  gcc/testsuite/gdc.test/fail_compilation/funcpostattr.d
  b94cf7c5d997c21f8f03c57183a54d79  gcc/testsuite/gdc.test/fail_compilation/gag4269a.d
*************** de5626af47ff3ba9b6515b76feb685f5  gcc/te
*** 109271,109276 ****
--- 109409,109415 ----
  cd533a563214ceee8ca1768f9838d59d  gcc/testsuite/gdc.test/fail_compilation/goto3.d
  70816e7050681b8d76afd0b57b732505  gcc/testsuite/gdc.test/fail_compilation/goto_skip.d
  f51b59630bfe61458d67bac9ed91328b  gcc/testsuite/gdc.test/fail_compilation/hexstring.d
+ b5036ed161ad22cd7c182e930e3f5f21  gcc/testsuite/gdc.test/fail_compilation/hidden_ctor.d
  99c89b8c0a428df9da4c26b6f3529275  gcc/testsuite/gdc.test/fail_compilation/ice10016.d
  025fc1e9a5dc79cd22aa2bf5b5dc7daf  gcc/testsuite/gdc.test/fail_compilation/ice10076.d
  b79d3bf3f306725e17ff9746eeef5b56  gcc/testsuite/gdc.test/fail_compilation/ice10212.d
*************** e62ed8964d5af64c7355c7ae27059665  gcc/te
*** 109290,109300 ****
  fc16fdde5984845cc69e52c7635d131e  gcc/testsuite/gdc.test/fail_compilation/ice10727a.d
  c1586096d1dcd6449a85c6c28ab95b55  gcc/testsuite/gdc.test/fail_compilation/ice10727b.d
  5778c4b0e7fc17beb61b2440fda8fe97  gcc/testsuite/gdc.test/fail_compilation/ice10922.d
! 863326d3b57a025fbb09684882d893e8  gcc/testsuite/gdc.test/fail_compilation/ice10938.d
  1461e66fd88ac9dc85648dc49a551864  gcc/testsuite/gdc.test/fail_compilation/ice10949.d
  34d3870c0caaf04c607e50cf1a928eec  gcc/testsuite/gdc.test/fail_compilation/ice11086.d
  648c23d8d77c00d2e35dccf65fe72418  gcc/testsuite/gdc.test/fail_compilation/ice11136.d
! 574435e31af0c1ea3ec4f88da6e7d7bd  gcc/testsuite/gdc.test/fail_compilation/ice11153.d
  1b37da2086604e2f8f8e86caa35f37ea  gcc/testsuite/gdc.test/fail_compilation/ice11404.d
  9a31146748fd7dba9ac030ce8305bc75  gcc/testsuite/gdc.test/fail_compilation/ice1144.d
  99dfb4f4adee9d67ecacda92dc77d8f9  gcc/testsuite/gdc.test/fail_compilation/ice11472.d
--- 109429,109439 ----
  fc16fdde5984845cc69e52c7635d131e  gcc/testsuite/gdc.test/fail_compilation/ice10727a.d
  c1586096d1dcd6449a85c6c28ab95b55  gcc/testsuite/gdc.test/fail_compilation/ice10727b.d
  5778c4b0e7fc17beb61b2440fda8fe97  gcc/testsuite/gdc.test/fail_compilation/ice10922.d
! acc3e07852df7a95bb9c9072a6b81d30  gcc/testsuite/gdc.test/fail_compilation/ice10938.d
  1461e66fd88ac9dc85648dc49a551864  gcc/testsuite/gdc.test/fail_compilation/ice10949.d
  34d3870c0caaf04c607e50cf1a928eec  gcc/testsuite/gdc.test/fail_compilation/ice11086.d
  648c23d8d77c00d2e35dccf65fe72418  gcc/testsuite/gdc.test/fail_compilation/ice11136.d
! 896f8e32a65daf99eca19b9b7a42f5cd  gcc/testsuite/gdc.test/fail_compilation/ice11153.d
  1b37da2086604e2f8f8e86caa35f37ea  gcc/testsuite/gdc.test/fail_compilation/ice11404.d
  9a31146748fd7dba9ac030ce8305bc75  gcc/testsuite/gdc.test/fail_compilation/ice1144.d
  99dfb4f4adee9d67ecacda92dc77d8f9  gcc/testsuite/gdc.test/fail_compilation/ice11472.d
*************** c1cd5c3fda15a812481eeb4a54119f47  gcc/te
*** 109358,109364 ****
  f4410cf62c66bd36b26cfd923568793c  gcc/testsuite/gdc.test/fail_compilation/ice13465b.d
  2758dd2a496a5538d3b0f220c968d7c2  gcc/testsuite/gdc.test/fail_compilation/ice13563.d
  e119a3d6ce481c2065b18f9d8e145b75  gcc/testsuite/gdc.test/fail_compilation/ice1358.d
! a2859dc4361a77e0eb5ace8ca45bc965  gcc/testsuite/gdc.test/fail_compilation/ice13644.d
  0d9c63a4372887fa2c9ddfabef18be5e  gcc/testsuite/gdc.test/fail_compilation/ice13788.d
  1d17aa4e231fc30eec7c34f0c354d3cc  gcc/testsuite/gdc.test/fail_compilation/ice13816.d
  92a72287950ae5199eac2b586d1aab4a  gcc/testsuite/gdc.test/fail_compilation/ice13835.d
--- 109497,109503 ----
  f4410cf62c66bd36b26cfd923568793c  gcc/testsuite/gdc.test/fail_compilation/ice13465b.d
  2758dd2a496a5538d3b0f220c968d7c2  gcc/testsuite/gdc.test/fail_compilation/ice13563.d
  e119a3d6ce481c2065b18f9d8e145b75  gcc/testsuite/gdc.test/fail_compilation/ice1358.d
! b473d2ba80b6e6fbd7c11a673e4c822d  gcc/testsuite/gdc.test/fail_compilation/ice13644.d
  0d9c63a4372887fa2c9ddfabef18be5e  gcc/testsuite/gdc.test/fail_compilation/ice13788.d
  1d17aa4e231fc30eec7c34f0c354d3cc  gcc/testsuite/gdc.test/fail_compilation/ice13816.d
  92a72287950ae5199eac2b586d1aab4a  gcc/testsuite/gdc.test/fail_compilation/ice13835.d
*************** cb3699bbacaa54f2e5ba747855d5ce6a  gcc/te
*** 109399,109405 ****
  83a94d1761f590591624eebfdaa39a1a  gcc/testsuite/gdc.test/fail_compilation/ice18753.d
  175f446c561c5cfe4761f731f185264d  gcc/testsuite/gdc.test/fail_compilation/ice18803a.d
  6a97098a32d555be1373c768d9a16d4d  gcc/testsuite/gdc.test/fail_compilation/ice18803b.d
! a4b0b8ec30a45276b6adabbc1fdef687  gcc/testsuite/gdc.test/fail_compilation/ice19755.d
  4a1f725170cfdbaecfe3396d4266c7f7  gcc/testsuite/gdc.test/fail_compilation/ice19762.d
  71aea9f843fbfe456c9a87e3a042ac0d  gcc/testsuite/gdc.test/fail_compilation/ice19887.d
  6bf925a0b5b868454c89afbac8b00888  gcc/testsuite/gdc.test/fail_compilation/ice19950.d
--- 109538,109544 ----
  83a94d1761f590591624eebfdaa39a1a  gcc/testsuite/gdc.test/fail_compilation/ice18753.d
  175f446c561c5cfe4761f731f185264d  gcc/testsuite/gdc.test/fail_compilation/ice18803a.d
  6a97098a32d555be1373c768d9a16d4d  gcc/testsuite/gdc.test/fail_compilation/ice18803b.d
! 0036835b1e566dc158f32892ae1d7872  gcc/testsuite/gdc.test/fail_compilation/ice19755.d
  4a1f725170cfdbaecfe3396d4266c7f7  gcc/testsuite/gdc.test/fail_compilation/ice19762.d
  71aea9f843fbfe456c9a87e3a042ac0d  gcc/testsuite/gdc.test/fail_compilation/ice19887.d
  6bf925a0b5b868454c89afbac8b00888  gcc/testsuite/gdc.test/fail_compilation/ice19950.d
*************** c655742868f7c302fb02d9f969f29129  gcc/te
*** 109549,109554 ****
--- 109688,109695 ----
  2a466412f1524eb0743d62122e94a64e  gcc/testsuite/gdc.test/fail_compilation/imports/imp15896.d
  d0e4233fc485fb20385bfdc07f1ec961  gcc/testsuite/gdc.test/fail_compilation/imports/imp15925.d
  ac7b1cc16acca22cc2139c936ecd68b2  gcc/testsuite/gdc.test/fail_compilation/imports/imp17602.d
+ 762841f918b42c46cbcd7eff89b2088e  gcc/testsuite/gdc.test/fail_compilation/imports/imp18127a.c
+ eedabf079163bf48794b055c0f4e6359  gcc/testsuite/gdc.test/fail_compilation/imports/imp18127b.c
  2481ba7d85a43004094571ea9b36a7ea  gcc/testsuite/gdc.test/fail_compilation/imports/imp18979.d
  0a545f6bc6b90f0d5f3fc0ab10e15ee3  gcc/testsuite/gdc.test/fail_compilation/imports/imp19661.d
  bcb928821f462337afe2f7bcc3727525  gcc/testsuite/gdc.test/fail_compilation/imports/imp2.d
*************** d2875d10c258a543f59d109b93dab083  gcc/te
*** 109637,109642 ****
--- 109778,109784 ----
  228c0e856fef257f01690c217369e065  gcc/testsuite/gdc.test/fail_compilation/issue21203.d
  e5a789aee346b0176c7893f97233f1f3  gcc/testsuite/gdc.test/fail_compilation/issue21295.d
  aaacbe0abd96d4ce739e14a25d356bbd  gcc/testsuite/gdc.test/fail_compilation/issue21378.d
+ 854df194f5d491deff843077eca6f69b  gcc/testsuite/gdc.test/fail_compilation/issue21630.d
  5e735bf467996700e9f93b3e9a3cc62a  gcc/testsuite/gdc.test/fail_compilation/issue21685_main.d
  d49468106948994ead5dcae315f26258  gcc/testsuite/gdc.test/fail_compilation/issue22682.d
  05250fe726a80770dd7390818c7b0e6d  gcc/testsuite/gdc.test/fail_compilation/issue22820.d
*************** a75e40834d3b5aa675ddd5a60e5cd8dc  gcc/te
*** 109650,109656 ****
  55cef34e2e7728b6687fabe1c1a151c6  gcc/testsuite/gdc.test/fail_compilation/lexer23465.d
  1b0ba9e5ad50d6b299ef210908b26e3e  gcc/testsuite/gdc.test/fail_compilation/lexer3.d
  557d677b95a4a0b4e3e7b77d346fa2ff  gcc/testsuite/gdc.test/fail_compilation/lexer4.d
! 33f5d6db48c660b840a5a69a56079500  gcc/testsuite/gdc.test/fail_compilation/lookup.d
  7ea7a0f4d8242cca72bdd431719ef39c  gcc/testsuite/gdc.test/fail_compilation/main.d
  338c9d9e082bb433d33a8ce50efb3e33  gcc/testsuite/gdc.test/fail_compilation/mangle1.d
  be5e933601ad80e3e77222d915fcb11b  gcc/testsuite/gdc.test/fail_compilation/mangle2.d
--- 109792,109798 ----
  55cef34e2e7728b6687fabe1c1a151c6  gcc/testsuite/gdc.test/fail_compilation/lexer23465.d
  1b0ba9e5ad50d6b299ef210908b26e3e  gcc/testsuite/gdc.test/fail_compilation/lexer3.d
  557d677b95a4a0b4e3e7b77d346fa2ff  gcc/testsuite/gdc.test/fail_compilation/lexer4.d
! 7584ac4b37f6c87f445085c8ea8c741a  gcc/testsuite/gdc.test/fail_compilation/lookup.d
  7ea7a0f4d8242cca72bdd431719ef39c  gcc/testsuite/gdc.test/fail_compilation/main.d
  338c9d9e082bb433d33a8ce50efb3e33  gcc/testsuite/gdc.test/fail_compilation/mangle1.d
  be5e933601ad80e3e77222d915fcb11b  gcc/testsuite/gdc.test/fail_compilation/mangle2.d
*************** d64010f18f6634e656c6c13ff79b90bb  gcc/te
*** 109661,109667 ****
  ecd7a73e2fa554a62e68917642aafebd  gcc/testsuite/gdc.test/fail_compilation/mixin.d
  f96c464b4446946a260985b08542d13f  gcc/testsuite/gdc.test/fail_compilation/mixin_gc.d
  e989bc20ccc902b7b13e1fb834ef6d37  gcc/testsuite/gdc.test/fail_compilation/mixin_template.d
! d50551164659b796b1cc9810a3144d7b  gcc/testsuite/gdc.test/fail_compilation/mixinprop.d
  87fa674a666ec47bd44c4cf89c1dbe9a  gcc/testsuite/gdc.test/fail_compilation/mixintype2.d
  fe4d6368a23906f4ace80748ad73d9aa  gcc/testsuite/gdc.test/fail_compilation/moduleundefuda.d
  cd5b0a21b5a36cf880301591ac049c46  gcc/testsuite/gdc.test/fail_compilation/must_use.d
--- 109803,109809 ----
  ecd7a73e2fa554a62e68917642aafebd  gcc/testsuite/gdc.test/fail_compilation/mixin.d
  f96c464b4446946a260985b08542d13f  gcc/testsuite/gdc.test/fail_compilation/mixin_gc.d
  e989bc20ccc902b7b13e1fb834ef6d37  gcc/testsuite/gdc.test/fail_compilation/mixin_template.d
! ebbd6df1965c4589c1b631dbfc31123f  gcc/testsuite/gdc.test/fail_compilation/mixinprop.d
  87fa674a666ec47bd44c4cf89c1dbe9a  gcc/testsuite/gdc.test/fail_compilation/mixintype2.d
  fe4d6368a23906f4ace80748ad73d9aa  gcc/testsuite/gdc.test/fail_compilation/moduleundefuda.d
  cd5b0a21b5a36cf880301591ac049c46  gcc/testsuite/gdc.test/fail_compilation/must_use.d
*************** cd5b0a21b5a36cf880301591ac049c46  gcc/te
*** 109670,109677 ****
  15d90fcac6117dd6570d4a46b94403c8  gcc/testsuite/gdc.test/fail_compilation/must_use_reserved.d
  3b5523de4749c7d852011ec85e276c84  gcc/testsuite/gdc.test/fail_compilation/must_use_template.d
  58c5aee0e2a980b40b64d7c83f667cb6  gcc/testsuite/gdc.test/fail_compilation/must_use_union.d
! bf04ef87b8027acb8f50581fb4915490  gcc/testsuite/gdc.test/fail_compilation/named_arguments_error.d
! c1997d7252348d935e028a0dc482eb28  gcc/testsuite/gdc.test/fail_compilation/named_arguments_ifti_error.d
  c838c987c987f34e4e0dc7100239fe88  gcc/testsuite/gdc.test/fail_compilation/named_arguments_overload.d
  baaed2045919c182fcb97270c6e46028  gcc/testsuite/gdc.test/fail_compilation/named_arguments_parse.d
  d58f1e1daba0514ea669e052022dd293  gcc/testsuite/gdc.test/fail_compilation/nested_template_constraint.d
--- 109812,109819 ----
  15d90fcac6117dd6570d4a46b94403c8  gcc/testsuite/gdc.test/fail_compilation/must_use_reserved.d
  3b5523de4749c7d852011ec85e276c84  gcc/testsuite/gdc.test/fail_compilation/must_use_template.d
  58c5aee0e2a980b40b64d7c83f667cb6  gcc/testsuite/gdc.test/fail_compilation/must_use_union.d
! 4e275a9b7cafb3e870d3000d1b60d4d4  gcc/testsuite/gdc.test/fail_compilation/named_arguments_error.d
! cccf9556475cd3ea0662164e17623086  gcc/testsuite/gdc.test/fail_compilation/named_arguments_ifti_error.d
  c838c987c987f34e4e0dc7100239fe88  gcc/testsuite/gdc.test/fail_compilation/named_arguments_overload.d
  baaed2045919c182fcb97270c6e46028  gcc/testsuite/gdc.test/fail_compilation/named_arguments_parse.d
  d58f1e1daba0514ea669e052022dd293  gcc/testsuite/gdc.test/fail_compilation/nested_template_constraint.d
*************** ab6d443dc3b56b7483fbf6f157f18a25  gcc/te
*** 109684,109692 ****
  03d3eb72cf3b9da1f6f78b59f1503820  gcc/testsuite/gdc.test/fail_compilation/no_TypeInfo.d
  0d38d8ab717822d9fe4054beda16fe7b  gcc/testsuite/gdc.test/fail_compilation/nogc1.d
  1d36b5c1768feafc83d39e6dc665f4a3  gcc/testsuite/gdc.test/fail_compilation/nogc2.d
! bd8c6e8d6f51b7d041612f44df525eba  gcc/testsuite/gdc.test/fail_compilation/nogc3.d
  c8b4217102e777fe4800029d365d5c18  gcc/testsuite/gdc.test/fail_compilation/noreturn.d
! 6badcf6978408a9dc177d8c80f445eef  gcc/testsuite/gdc.test/fail_compilation/noreturn2.d
  238e54042ec784d3fd84e6fffecd6916  gcc/testsuite/gdc.test/fail_compilation/noreturn_expr.d
  e6f22eab255ad6a3bc7b96076d62384d  gcc/testsuite/gdc.test/fail_compilation/noreturn_expr2.d
  5f0e133c486a33c48c252858bcdd4604  gcc/testsuite/gdc.test/fail_compilation/notype.d
--- 109826,109835 ----
  03d3eb72cf3b9da1f6f78b59f1503820  gcc/testsuite/gdc.test/fail_compilation/no_TypeInfo.d
  0d38d8ab717822d9fe4054beda16fe7b  gcc/testsuite/gdc.test/fail_compilation/nogc1.d
  1d36b5c1768feafc83d39e6dc665f4a3  gcc/testsuite/gdc.test/fail_compilation/nogc2.d
! 004825171b66cef007f2b57c74ada98c  gcc/testsuite/gdc.test/fail_compilation/nogc3.d
! 6d4641097841c4c893aaac8bbf3b23b8  gcc/testsuite/gdc.test/fail_compilation/nonvoid_return.d
  c8b4217102e777fe4800029d365d5c18  gcc/testsuite/gdc.test/fail_compilation/noreturn.d
! 7618f7795cdff02d191df612e0ca090e  gcc/testsuite/gdc.test/fail_compilation/noreturn2.d
  238e54042ec784d3fd84e6fffecd6916  gcc/testsuite/gdc.test/fail_compilation/noreturn_expr.d
  e6f22eab255ad6a3bc7b96076d62384d  gcc/testsuite/gdc.test/fail_compilation/noreturn_expr2.d
  5f0e133c486a33c48c252858bcdd4604  gcc/testsuite/gdc.test/fail_compilation/notype.d
*************** a24e5adcec9c683ee389ab4bc66da146  gcc/te
*** 109711,109734 ****
  4585f217a5b7f8b8a09b84af0dbe2331  gcc/testsuite/gdc.test/fail_compilation/parseStc4.d
  d5b5218a5830b17dea35dac53b8ca8eb  gcc/testsuite/gdc.test/fail_compilation/parseStc5.d
  733b6a81eb3284b65aec3404ccf70c49  gcc/testsuite/gdc.test/fail_compilation/placenew.d
  43ab37c4d5efd97e06d285a38b720f23  gcc/testsuite/gdc.test/fail_compilation/pragmainline.d
  09d77fef387a40a2dc7be60ba6549cd4  gcc/testsuite/gdc.test/fail_compilation/pragmas.d
  7489e6908bbee6fd810934fc7b240c17  gcc/testsuite/gdc.test/fail_compilation/previewin.d
  e9591afbb23d08ca6fcc7528a818e61e  gcc/testsuite/gdc.test/fail_compilation/previewin2.d
  93e29273b61b90ecaf1f9b852538f7ca  gcc/testsuite/gdc.test/fail_compilation/protattr1.d
  39580b47e16e03fa696b3ed195381f0f  gcc/testsuite/gdc.test/fail_compilation/protattr2.d
  4807590bdc410e8cbce87fc3a1702bf7  gcc/testsuite/gdc.test/fail_compilation/protattr3.d
  f94f5f9027598b10a0c7aa36cd12574d  gcc/testsuite/gdc.test/fail_compilation/protection/subpkg/test1.d
  0bf06d541fe7a39c966d076eb92cda03  gcc/testsuite/gdc.test/fail_compilation/protection/subpkg/test2.d
  9d01f4975a479fc715251f6173ce5c4c  gcc/testsuite/gdc.test/fail_compilation/protection/subpkg/test3.d
! 5245f6f880aefcc6db083bf1ea5e70e9  gcc/testsuite/gdc.test/fail_compilation/pull12941.d
  3fd870b41855f158c759eee9a2348829  gcc/testsuite/gdc.test/fail_compilation/reg6769.d
  7b56679ad0770046341daf04b879dc88  gcc/testsuite/gdc.test/fail_compilation/reserved_version.d
  d19555913a2a7f695f98431f21e7a6d4  gcc/testsuite/gdc.test/fail_compilation/reserved_version_switch.d
  d5062e115ef69ab22915d0a248e0cb6d  gcc/testsuite/gdc.test/fail_compilation/retref2.d
  d5ed426f484b4fbc678be7d4de91a7ef  gcc/testsuite/gdc.test/fail_compilation/retscope.d
! afd10d7df854420252c76f35aec47cf4  gcc/testsuite/gdc.test/fail_compilation/retscope2.d
! 81986d4219df799861da3145de55e83b  gcc/testsuite/gdc.test/fail_compilation/retscope3.d
  c6c07f896e1602e3555f770e5cb6de5e  gcc/testsuite/gdc.test/fail_compilation/retscope4.d
  e55a97e747a3f09f3c5eb297c5565a5d  gcc/testsuite/gdc.test/fail_compilation/retscope5.d
  7cfac0c66c1c0d8243c0a9f4d5efff94  gcc/testsuite/gdc.test/fail_compilation/retscope6.d
--- 109854,109879 ----
  4585f217a5b7f8b8a09b84af0dbe2331  gcc/testsuite/gdc.test/fail_compilation/parseStc4.d
  d5b5218a5830b17dea35dac53b8ca8eb  gcc/testsuite/gdc.test/fail_compilation/parseStc5.d
  733b6a81eb3284b65aec3404ccf70c49  gcc/testsuite/gdc.test/fail_compilation/placenew.d
+ 5d8dd901e9476cc938a20da432cdbf5a  gcc/testsuite/gdc.test/fail_compilation/powinline.d
  43ab37c4d5efd97e06d285a38b720f23  gcc/testsuite/gdc.test/fail_compilation/pragmainline.d
  09d77fef387a40a2dc7be60ba6549cd4  gcc/testsuite/gdc.test/fail_compilation/pragmas.d
  7489e6908bbee6fd810934fc7b240c17  gcc/testsuite/gdc.test/fail_compilation/previewin.d
  e9591afbb23d08ca6fcc7528a818e61e  gcc/testsuite/gdc.test/fail_compilation/previewin2.d
+ ebb4c8cde85aacefd73d916601e41f66  gcc/testsuite/gdc.test/fail_compilation/previewin3.d
  93e29273b61b90ecaf1f9b852538f7ca  gcc/testsuite/gdc.test/fail_compilation/protattr1.d
  39580b47e16e03fa696b3ed195381f0f  gcc/testsuite/gdc.test/fail_compilation/protattr2.d
  4807590bdc410e8cbce87fc3a1702bf7  gcc/testsuite/gdc.test/fail_compilation/protattr3.d
  f94f5f9027598b10a0c7aa36cd12574d  gcc/testsuite/gdc.test/fail_compilation/protection/subpkg/test1.d
  0bf06d541fe7a39c966d076eb92cda03  gcc/testsuite/gdc.test/fail_compilation/protection/subpkg/test2.d
  9d01f4975a479fc715251f6173ce5c4c  gcc/testsuite/gdc.test/fail_compilation/protection/subpkg/test3.d
! 01e7ae9e272c37e8cd162f3bc68ffc81  gcc/testsuite/gdc.test/fail_compilation/pull12941.d
  3fd870b41855f158c759eee9a2348829  gcc/testsuite/gdc.test/fail_compilation/reg6769.d
  7b56679ad0770046341daf04b879dc88  gcc/testsuite/gdc.test/fail_compilation/reserved_version.d
  d19555913a2a7f695f98431f21e7a6d4  gcc/testsuite/gdc.test/fail_compilation/reserved_version_switch.d
  d5062e115ef69ab22915d0a248e0cb6d  gcc/testsuite/gdc.test/fail_compilation/retref2.d
  d5ed426f484b4fbc678be7d4de91a7ef  gcc/testsuite/gdc.test/fail_compilation/retscope.d
! 3505419d9912209a0e57c90d2ef39f2b  gcc/testsuite/gdc.test/fail_compilation/retscope2.d
! 89e875679059aff5312602341e8390de  gcc/testsuite/gdc.test/fail_compilation/retscope3.d
  c6c07f896e1602e3555f770e5cb6de5e  gcc/testsuite/gdc.test/fail_compilation/retscope4.d
  e55a97e747a3f09f3c5eb297c5565a5d  gcc/testsuite/gdc.test/fail_compilation/retscope5.d
  7cfac0c66c1c0d8243c0a9f4d5efff94  gcc/testsuite/gdc.test/fail_compilation/retscope6.d
*************** e55a97e747a3f09f3c5eb297c5565a5d  gcc/te
*** 109736,109742 ****
  09cb1c43f1595719bb2f2f59047c6969  gcc/testsuite/gdc.test/fail_compilation/safe_pointer_index.d
  2b37237676e0fa2ce594762f8609768c  gcc/testsuite/gdc.test/fail_compilation/safer.d
  b1afbd31bbf1526499dfe85a03975c14  gcc/testsuite/gdc.test/fail_compilation/scope_class.d
! 75dbc7ca532e4d8a4929f719cf4fbe14  gcc/testsuite/gdc.test/fail_compilation/shared.d
  2527ab167212803bc195b044a6399540  gcc/testsuite/gdc.test/fail_compilation/short_fn.d
  2fb8cf150b59639669fb11f7cf10f8d6  gcc/testsuite/gdc.test/fail_compilation/skip.d
  36bf4eec7f81985125965343eaf2ecfb  gcc/testsuite/gdc.test/fail_compilation/spell23908.d
--- 109881,109888 ----
  09cb1c43f1595719bb2f2f59047c6969  gcc/testsuite/gdc.test/fail_compilation/safe_pointer_index.d
  2b37237676e0fa2ce594762f8609768c  gcc/testsuite/gdc.test/fail_compilation/safer.d
  b1afbd31bbf1526499dfe85a03975c14  gcc/testsuite/gdc.test/fail_compilation/scope_class.d
! da54a1d44613ea21dc18df6ca44291ca  gcc/testsuite/gdc.test/fail_compilation/seq_assign.d
! 1eaa4eb758f73274cdce250861ba6504  gcc/testsuite/gdc.test/fail_compilation/shared.d
  2527ab167212803bc195b044a6399540  gcc/testsuite/gdc.test/fail_compilation/short_fn.d
  2fb8cf150b59639669fb11f7cf10f8d6  gcc/testsuite/gdc.test/fail_compilation/skip.d
  36bf4eec7f81985125965343eaf2ecfb  gcc/testsuite/gdc.test/fail_compilation/spell23908.d
*************** dc5f6694b899c5b4017bfc9931164527  gcc/te
*** 109785,109791 ****
  e4cc07c05fae27121dca473cac2c675e  gcc/testsuite/gdc.test/fail_compilation/test14496.d
  7a4ef7516579d5d5dff624e6da80a082  gcc/testsuite/gdc.test/fail_compilation/test14538.d
  0811c0a4dbd9bffec8230d6e2a5a6c01  gcc/testsuite/gdc.test/fail_compilation/test15177.d
! d25731eaaf5e4826e03fa6b921b1d93f  gcc/testsuite/gdc.test/fail_compilation/test15191.d
  0200cdabc11b62ac95049c2625a7fa69  gcc/testsuite/gdc.test/fail_compilation/test15306.d
  869648d421cf5208b57506e313ad99f3  gcc/testsuite/gdc.test/fail_compilation/test15368.d
  abba9160e3348512b9cfbe906f164025  gcc/testsuite/gdc.test/fail_compilation/test15373.d
--- 109931,109937 ----
  e4cc07c05fae27121dca473cac2c675e  gcc/testsuite/gdc.test/fail_compilation/test14496.d
  7a4ef7516579d5d5dff624e6da80a082  gcc/testsuite/gdc.test/fail_compilation/test14538.d
  0811c0a4dbd9bffec8230d6e2a5a6c01  gcc/testsuite/gdc.test/fail_compilation/test15177.d
! bccf59c6f516cbdfa377142e4e65e9f5  gcc/testsuite/gdc.test/fail_compilation/test15191.d
  0200cdabc11b62ac95049c2625a7fa69  gcc/testsuite/gdc.test/fail_compilation/test15306.d
  869648d421cf5208b57506e313ad99f3  gcc/testsuite/gdc.test/fail_compilation/test15368.d
  abba9160e3348512b9cfbe906f164025  gcc/testsuite/gdc.test/fail_compilation/test15373.d
*************** aa82f45d91443c219c645e006f38768c  gcc/te
*** 109795,109806 ****
  d29ba05307c56139477cb5cc0a0fa146  gcc/testsuite/gdc.test/fail_compilation/test15660.d
  3e5dcecf2382817b6ecd665668c34e20  gcc/testsuite/gdc.test/fail_compilation/test15672.d
  6357f4545bc38ffe4a0dd29f2aea7fa8  gcc/testsuite/gdc.test/fail_compilation/test15703.d
! 7055a34d3eaddf11d947a7ccf66ed4f1  gcc/testsuite/gdc.test/fail_compilation/test15704.d
  2a49e51e373b65eaa0cf8fcd840dd95c  gcc/testsuite/gdc.test/fail_compilation/test15785.d
  d1333de570b9babff543dfaf034537b6  gcc/testsuite/gdc.test/fail_compilation/test15785b.d
  6361ba506061bf5fe0b331e317df312a  gcc/testsuite/gdc.test/fail_compilation/test15897.d
  9abfc5bd4dee2b4e29f7125683c4cc06  gcc/testsuite/gdc.test/fail_compilation/test15925.d
! 34f69908ea5a0909d9fb282d88f4e272  gcc/testsuite/gdc.test/fail_compilation/test15989.d
  d1adfc9174aa950f68215afdfe2e8b10  gcc/testsuite/gdc.test/fail_compilation/test16095.d
  66fc24a8ca5e79401240720959999b8a  gcc/testsuite/gdc.test/fail_compilation/test16116.d
  9408875bf389e4228e497737f7f45723  gcc/testsuite/gdc.test/fail_compilation/test16188.d
--- 109941,109952 ----
  d29ba05307c56139477cb5cc0a0fa146  gcc/testsuite/gdc.test/fail_compilation/test15660.d
  3e5dcecf2382817b6ecd665668c34e20  gcc/testsuite/gdc.test/fail_compilation/test15672.d
  6357f4545bc38ffe4a0dd29f2aea7fa8  gcc/testsuite/gdc.test/fail_compilation/test15703.d
! 00e31f6f5cf412c69090d58e7b05fe2f  gcc/testsuite/gdc.test/fail_compilation/test15704.d
  2a49e51e373b65eaa0cf8fcd840dd95c  gcc/testsuite/gdc.test/fail_compilation/test15785.d
  d1333de570b9babff543dfaf034537b6  gcc/testsuite/gdc.test/fail_compilation/test15785b.d
  6361ba506061bf5fe0b331e317df312a  gcc/testsuite/gdc.test/fail_compilation/test15897.d
  9abfc5bd4dee2b4e29f7125683c4cc06  gcc/testsuite/gdc.test/fail_compilation/test15925.d
! 354253f1e66ec1fe548eccab81bc5f8a  gcc/testsuite/gdc.test/fail_compilation/test15989.d
  d1adfc9174aa950f68215afdfe2e8b10  gcc/testsuite/gdc.test/fail_compilation/test16095.d
  66fc24a8ca5e79401240720959999b8a  gcc/testsuite/gdc.test/fail_compilation/test16116.d
  9408875bf389e4228e497737f7f45723  gcc/testsuite/gdc.test/fail_compilation/test16188.d
*************** c393b650cec6437b218d580e31495c49  gcc/te
*** 109833,109840 ****
  f79ff08f6a4f8c6756261d3e8abd2c0b  gcc/testsuite/gdc.test/fail_compilation/test17908b.d
  312dbd0dc1b0dc01792cb3bb22886161  gcc/testsuite/gdc.test/fail_compilation/test17959.d
  e5254335118841d78547e28e44099554  gcc/testsuite/gdc.test/fail_compilation/test17977.d
  3dedce972ccebf636e59731359e082a2  gcc/testsuite/gdc.test/fail_compilation/test18130.d
! d3d274ea3583ecda9ddf1cacfd01c9d0  gcc/testsuite/gdc.test/fail_compilation/test18282.d
  a7a660644aa3a898b18641bb0128e405  gcc/testsuite/gdc.test/fail_compilation/test18312.d
  3f884432d6887eb6dd7b14e20d0d58a1  gcc/testsuite/gdc.test/fail_compilation/test18385.d
  2ab2cb94449809dd764a0f41a3c8b378  gcc/testsuite/gdc.test/fail_compilation/test18385b.d
--- 109979,109987 ----
  f79ff08f6a4f8c6756261d3e8abd2c0b  gcc/testsuite/gdc.test/fail_compilation/test17908b.d
  312dbd0dc1b0dc01792cb3bb22886161  gcc/testsuite/gdc.test/fail_compilation/test17959.d
  e5254335118841d78547e28e44099554  gcc/testsuite/gdc.test/fail_compilation/test17977.d
+ b2935056546224cf8dc2e78a225995a1  gcc/testsuite/gdc.test/fail_compilation/test18127.d
  3dedce972ccebf636e59731359e082a2  gcc/testsuite/gdc.test/fail_compilation/test18130.d
! ed09fce8bd0785289cb6018ddf23a593  gcc/testsuite/gdc.test/fail_compilation/test18282.d
  a7a660644aa3a898b18641bb0128e405  gcc/testsuite/gdc.test/fail_compilation/test18312.d
  3f884432d6887eb6dd7b14e20d0d58a1  gcc/testsuite/gdc.test/fail_compilation/test18385.d
  2ab2cb94449809dd764a0f41a3c8b378  gcc/testsuite/gdc.test/fail_compilation/test18385b.d
*************** f97e2d15a019a647e1e8ce539445f818  gcc/te
*** 109853,109859 ****
  057c9785379892bfd2b7434d11c16790  gcc/testsuite/gdc.test/fail_compilation/test19473.d
  67abd3b15509154f2ad168138e069892  gcc/testsuite/gdc.test/fail_compilation/test19608.d
  6a08ebc6bfe0211fdd2073fd10f6d18b  gcc/testsuite/gdc.test/fail_compilation/test19646.d
! 606379c092762843ab10257254f91d9b  gcc/testsuite/gdc.test/fail_compilation/test19661.d
  bfb3fe397b78a8c3397961db5e383877  gcc/testsuite/gdc.test/fail_compilation/test19971.d
  6cac69b0d7ff56f0fe785a14b5030313  gcc/testsuite/gdc.test/fail_compilation/test20023.d
  bdc93bd17024fd4d46de7909ff405a11  gcc/testsuite/gdc.test/fail_compilation/test20096.d
--- 110000,110006 ----
  057c9785379892bfd2b7434d11c16790  gcc/testsuite/gdc.test/fail_compilation/test19473.d
  67abd3b15509154f2ad168138e069892  gcc/testsuite/gdc.test/fail_compilation/test19608.d
  6a08ebc6bfe0211fdd2073fd10f6d18b  gcc/testsuite/gdc.test/fail_compilation/test19646.d
! 3cf998ffa0d432fb7113a8825e909a8d  gcc/testsuite/gdc.test/fail_compilation/test19661.d
  bfb3fe397b78a8c3397961db5e383877  gcc/testsuite/gdc.test/fail_compilation/test19971.d
  6cac69b0d7ff56f0fe785a14b5030313  gcc/testsuite/gdc.test/fail_compilation/test20023.d
  bdc93bd17024fd4d46de7909ff405a11  gcc/testsuite/gdc.test/fail_compilation/test20096.d
*************** bdc93bd17024fd4d46de7909ff405a11  gcc/te
*** 109862,109867 ****
--- 110009,110015 ----
  710c352c31a4baca536f7bfad2a41d05  gcc/testsuite/gdc.test/fail_compilation/test20267.d
  d5c3623a103182544da82c93b4634f62  gcc/testsuite/gdc.test/fail_compilation/test20324.d
  67055ecd3df8ca389c004a12d2eb7d68  gcc/testsuite/gdc.test/fail_compilation/test20383.d
+ 9dafa06fbb1d969d87cd7ce3343b1942  gcc/testsuite/gdc.test/fail_compilation/test20489.d
  384652f7c502f0235624ad7b7ea50a47  gcc/testsuite/gdc.test/fail_compilation/test20515.d
  1a3b469b9f542cf3d9173ca77bd3777a  gcc/testsuite/gdc.test/fail_compilation/test20522.d
  48bcc8fd7476f9cac9ceb53d9556bc32  gcc/testsuite/gdc.test/fail_compilation/test20549.d
*************** c7993efeed291ea587d7d83fec1d1d87  gcc/te
*** 109875,109881 ****
  b7fbc6ef2d8827fa89321f6b49cda686  gcc/testsuite/gdc.test/fail_compilation/test20763.d
  4046e5eb92175bd9041603d05dbb66c5  gcc/testsuite/gdc.test/fail_compilation/test20809.d
  4ce648303e8201e6ae69b7fd48320f74  gcc/testsuite/gdc.test/fail_compilation/test20859.d
! 5122dbb834f392793c561bcc026a19fa  gcc/testsuite/gdc.test/fail_compilation/test20881.d
  b63d81d149ced101cc0047fccfbfbff2  gcc/testsuite/gdc.test/fail_compilation/test20919.d
  ef8589871353bddefe144fc63561412a  gcc/testsuite/gdc.test/fail_compilation/test20998.d
  a90917d34352a06426f399bae530c5b1  gcc/testsuite/gdc.test/fail_compilation/test21008.d
--- 110023,110029 ----
  b7fbc6ef2d8827fa89321f6b49cda686  gcc/testsuite/gdc.test/fail_compilation/test20763.d
  4046e5eb92175bd9041603d05dbb66c5  gcc/testsuite/gdc.test/fail_compilation/test20809.d
  4ce648303e8201e6ae69b7fd48320f74  gcc/testsuite/gdc.test/fail_compilation/test20859.d
! db1c38f05e35f891f0f6d09468a2d678  gcc/testsuite/gdc.test/fail_compilation/test20881.d
  b63d81d149ced101cc0047fccfbfbff2  gcc/testsuite/gdc.test/fail_compilation/test20919.d
  ef8589871353bddefe144fc63561412a  gcc/testsuite/gdc.test/fail_compilation/test20998.d
  a90917d34352a06426f399bae530c5b1  gcc/testsuite/gdc.test/fail_compilation/test21008.d
*************** a90917d34352a06426f399bae530c5b1  gcc/te
*** 109886,109902 ****
  8423fe6adfb22defe2dacb59e379275b  gcc/testsuite/gdc.test/fail_compilation/test21164.d
  1bf038cf6f1ae7975e11d8f3ed7be20b  gcc/testsuite/gdc.test/fail_compilation/test21198.d
  719ac706ce81cfaaa50815be2ec3e7c8  gcc/testsuite/gdc.test/fail_compilation/test21204.d
  f0d66ee58e1deca85dd1a5c6be72e0fe  gcc/testsuite/gdc.test/fail_compilation/test21246.d
  33c0c2a0698c5dcdf37e6b3ee829811f  gcc/testsuite/gdc.test/fail_compilation/test21247.d
  bf2fa4b7e9ee0853b263755f0bce0ea6  gcc/testsuite/gdc.test/fail_compilation/test21247b.d
  2fce247ddc6adc1e84f449d7761cc302  gcc/testsuite/gdc.test/fail_compilation/test21259.d
  0eab8d2a17e3211f93dc6c87bf3f5d8c  gcc/testsuite/gdc.test/fail_compilation/test21319.d
  ad28f1ade07eee78214d73c592d30316  gcc/testsuite/gdc.test/fail_compilation/test21353.d
  a3522f54348a3c5f14028c34c44f5884  gcc/testsuite/gdc.test/fail_compilation/test21380.d
  ec3a327e60b99c4b5c8c64c7ec034e09  gcc/testsuite/gdc.test/fail_compilation/test21443.d
! 6dabe8de5e4bd17a89063b4c1c944ca1  gcc/testsuite/gdc.test/fail_compilation/test21477.d
  d89c86b00de50c0eff1176ba2eac046a  gcc/testsuite/gdc.test/fail_compilation/test21518.d
! 32963db1864d8e88864b2bc3b4a00399  gcc/testsuite/gdc.test/fail_compilation/test21546.d
  71e1aa25aaa777c4eef2e9d4c47f72c0  gcc/testsuite/gdc.test/fail_compilation/test21651.d
  e186de90e8fb487e22d379566570a689  gcc/testsuite/gdc.test/fail_compilation/test21665.d
  134c62157e30891fb9a43a58e55cf004  gcc/testsuite/gdc.test/fail_compilation/test21807.d
--- 110034,110055 ----
  8423fe6adfb22defe2dacb59e379275b  gcc/testsuite/gdc.test/fail_compilation/test21164.d
  1bf038cf6f1ae7975e11d8f3ed7be20b  gcc/testsuite/gdc.test/fail_compilation/test21198.d
  719ac706ce81cfaaa50815be2ec3e7c8  gcc/testsuite/gdc.test/fail_compilation/test21204.d
+ c6c3ac32c41e4803c7d5f93bc2ea61d9  gcc/testsuite/gdc.test/fail_compilation/test21215.d
  f0d66ee58e1deca85dd1a5c6be72e0fe  gcc/testsuite/gdc.test/fail_compilation/test21246.d
  33c0c2a0698c5dcdf37e6b3ee829811f  gcc/testsuite/gdc.test/fail_compilation/test21247.d
  bf2fa4b7e9ee0853b263755f0bce0ea6  gcc/testsuite/gdc.test/fail_compilation/test21247b.d
  2fce247ddc6adc1e84f449d7761cc302  gcc/testsuite/gdc.test/fail_compilation/test21259.d
+ cc164e8a770721c00699a6c88a4bf7bb  gcc/testsuite/gdc.test/fail_compilation/test21304.d
+ 5aa4572983f63ff6267d8f11778b19c4  gcc/testsuite/gdc.test/fail_compilation/test21317.d
  0eab8d2a17e3211f93dc6c87bf3f5d8c  gcc/testsuite/gdc.test/fail_compilation/test21319.d
  ad28f1ade07eee78214d73c592d30316  gcc/testsuite/gdc.test/fail_compilation/test21353.d
  a3522f54348a3c5f14028c34c44f5884  gcc/testsuite/gdc.test/fail_compilation/test21380.d
+ af63c0fab5328661d05768310ef644d5  gcc/testsuite/gdc.test/fail_compilation/test21408.d
+ ed7dc3e9a66e7ca675b3061c9bd660a3  gcc/testsuite/gdc.test/fail_compilation/test21429.d
  ec3a327e60b99c4b5c8c64c7ec034e09  gcc/testsuite/gdc.test/fail_compilation/test21443.d
! 03e8bf379a729a626e8bd0ed32364c99  gcc/testsuite/gdc.test/fail_compilation/test21477.d
  d89c86b00de50c0eff1176ba2eac046a  gcc/testsuite/gdc.test/fail_compilation/test21518.d
! d48e82ef6f2dbb5339beb2f0ecf80e3b  gcc/testsuite/gdc.test/fail_compilation/test21546.d
  71e1aa25aaa777c4eef2e9d4c47f72c0  gcc/testsuite/gdc.test/fail_compilation/test21651.d
  e186de90e8fb487e22d379566570a689  gcc/testsuite/gdc.test/fail_compilation/test21665.d
  134c62157e30891fb9a43a58e55cf004  gcc/testsuite/gdc.test/fail_compilation/test21807.d
*************** e010725215b2db70af4d945e37f73a50  gcc/te
*** 109935,109941 ****
  7fca868961c1d88268606a371d908245  gcc/testsuite/gdc.test/fail_compilation/test23552.d
  804d31f68030f5ac99db7e8484050952  gcc/testsuite/gdc.test/fail_compilation/test23607.d
  ca88c6d83d577719b18fb9894af05c0a  gcc/testsuite/gdc.test/fail_compilation/test23674.d
! e894966fad5273a970aa51420ce2b993  gcc/testsuite/gdc.test/fail_compilation/test23710.d
  f4e89a6307cbf7326a8ff6901235b1ec  gcc/testsuite/gdc.test/fail_compilation/test23786.d
  4f660662299a8dd73beca7ec8878676e  gcc/testsuite/gdc.test/fail_compilation/test23873.d
  38e2108be478c073ae00746d9a169568  gcc/testsuite/gdc.test/fail_compilation/test23882.d
--- 110088,110094 ----
  7fca868961c1d88268606a371d908245  gcc/testsuite/gdc.test/fail_compilation/test23552.d
  804d31f68030f5ac99db7e8484050952  gcc/testsuite/gdc.test/fail_compilation/test23607.d
  ca88c6d83d577719b18fb9894af05c0a  gcc/testsuite/gdc.test/fail_compilation/test23674.d
! bd3211cf17e71359ac0f6590b1667105  gcc/testsuite/gdc.test/fail_compilation/test23710.d
  f4e89a6307cbf7326a8ff6901235b1ec  gcc/testsuite/gdc.test/fail_compilation/test23786.d
  4f660662299a8dd73beca7ec8878676e  gcc/testsuite/gdc.test/fail_compilation/test23873.d
  38e2108be478c073ae00746d9a169568  gcc/testsuite/gdc.test/fail_compilation/test23882.d
*************** ec4dab98798d55fe2c57ec7dd6dca969  gcc/te
*** 109978,109984 ****
  bcac533ebb44ae410d3412ec01289528  gcc/testsuite/gdc.test/fail_compilation/testInference.d
  ffb3215e9a258cfd3f1a5da05897df96  gcc/testsuite/gdc.test/fail_compilation/testOpApply.d
  585cd3369b1d02b241f3a50fd0738734  gcc/testsuite/gdc.test/fail_compilation/test_switch_error.d
! e3a49e0f83829ecf8f9f7d5da876f8fe  gcc/testsuite/gdc.test/fail_compilation/testrvaluecpctor.d
  9f45e8c9c9f3a0129841f68bfdab000d  gcc/testsuite/gdc.test/fail_compilation/testscopestatic.d
  a19751c69fd3a108ac390db97edce978  gcc/testsuite/gdc.test/fail_compilation/testsemi.d
  816faf898559acd08b5d122dfc17dd89  gcc/testsuite/gdc.test/fail_compilation/throwexp.d
--- 110131,110137 ----
  bcac533ebb44ae410d3412ec01289528  gcc/testsuite/gdc.test/fail_compilation/testInference.d
  ffb3215e9a258cfd3f1a5da05897df96  gcc/testsuite/gdc.test/fail_compilation/testOpApply.d
  585cd3369b1d02b241f3a50fd0738734  gcc/testsuite/gdc.test/fail_compilation/test_switch_error.d
! 0cf1a5a203282514e36995c784aec2b7  gcc/testsuite/gdc.test/fail_compilation/testrvaluecpctor.d
  9f45e8c9c9f3a0129841f68bfdab000d  gcc/testsuite/gdc.test/fail_compilation/testscopestatic.d
  a19751c69fd3a108ac390db97edce978  gcc/testsuite/gdc.test/fail_compilation/testsemi.d
  816faf898559acd08b5d122dfc17dd89  gcc/testsuite/gdc.test/fail_compilation/throwexp.d
*************** f03859c9cd24a3002ec74d5d1b89b641  gcc/te
*** 109991,110007 ****
  f4314476b27b3e9b55a576b20be59974  gcc/testsuite/gdc.test/fail_compilation/traits_initSymbol.d
  1c9eecd3fd98dda6bd34752b508a13f9  gcc/testsuite/gdc.test/fail_compilation/traits_parameters.d
  5f18f0800b788f0e7bd364090a8dae34  gcc/testsuite/gdc.test/fail_compilation/typeerrors.d
  504ee32fc074e0cb1187a8e878866ad7  gcc/testsuite/gdc.test/fail_compilation/udaparams.d
  de7caecb66362ee03a66fee21b75bcb7  gcc/testsuite/gdc.test/fail_compilation/udatypes.d
  e2b1146035c65276c8dcc678f47fd8c9  gcc/testsuite/gdc.test/fail_compilation/ufcs.d
! 673fe4ae9154dfb5590036c49f9e6882  gcc/testsuite/gdc.test/fail_compilation/union_conv.d
  e9735fb65c1f5f28a4494e97ba23dcfd  gcc/testsuite/gdc.test/fail_compilation/union_initialization.d
  8c86803da224d87ddaa0fa1a75bf5bcc  gcc/testsuite/gdc.test/fail_compilation/unmatchedbrace.d
  49c03c900574848f0f55e67bd5a3c34d  gcc/testsuite/gdc.test/fail_compilation/var_func_attr.d
  a2fa270bd63d37be3604092ee063abdb  gcc/testsuite/gdc.test/fail_compilation/vararg2.d
! bc9c3b61f65ea745aefa0dd19cd61867  gcc/testsuite/gdc.test/fail_compilation/varargsstc.d
  8437920cfdf5995ccf08a1ad910b2bc8  gcc/testsuite/gdc.test/fail_compilation/vector_cast.d
! d073fa782699e4eb73e51cbd5828d23f  gcc/testsuite/gdc.test/fail_compilation/verifyhookexist.d
  e9b76ed9d6ac70bc2a0374b247c4d24b  gcc/testsuite/gdc.test/fail_compilation/verrors0.d
  3a4618a15e744d0566742cbff4a18159  gcc/testsuite/gdc.test/fail_compilation/verrors5.d
  75868cd037e55b98739d09ab1ce96467  gcc/testsuite/gdc.test/fail_compilation/void_cat.d
--- 110144,110161 ----
  f4314476b27b3e9b55a576b20be59974  gcc/testsuite/gdc.test/fail_compilation/traits_initSymbol.d
  1c9eecd3fd98dda6bd34752b508a13f9  gcc/testsuite/gdc.test/fail_compilation/traits_parameters.d
  5f18f0800b788f0e7bd364090a8dae34  gcc/testsuite/gdc.test/fail_compilation/typeerrors.d
+ e182c4a1bce941c4039d48cb27f8a20c  gcc/testsuite/gdc.test/fail_compilation/uda_lambda.d
  504ee32fc074e0cb1187a8e878866ad7  gcc/testsuite/gdc.test/fail_compilation/udaparams.d
  de7caecb66362ee03a66fee21b75bcb7  gcc/testsuite/gdc.test/fail_compilation/udatypes.d
  e2b1146035c65276c8dcc678f47fd8c9  gcc/testsuite/gdc.test/fail_compilation/ufcs.d
! 451cbbd62139afdded65f502cfa02205  gcc/testsuite/gdc.test/fail_compilation/union_conv.d
  e9735fb65c1f5f28a4494e97ba23dcfd  gcc/testsuite/gdc.test/fail_compilation/union_initialization.d
  8c86803da224d87ddaa0fa1a75bf5bcc  gcc/testsuite/gdc.test/fail_compilation/unmatchedbrace.d
  49c03c900574848f0f55e67bd5a3c34d  gcc/testsuite/gdc.test/fail_compilation/var_func_attr.d
  a2fa270bd63d37be3604092ee063abdb  gcc/testsuite/gdc.test/fail_compilation/vararg2.d
! 1b00cb631a01907a2bd76767c939c61b  gcc/testsuite/gdc.test/fail_compilation/varargsstc.d
  8437920cfdf5995ccf08a1ad910b2bc8  gcc/testsuite/gdc.test/fail_compilation/vector_cast.d
! a08da8104579ee7ecb9da52e4a9afa12  gcc/testsuite/gdc.test/fail_compilation/verifyhookexist.d
  e9b76ed9d6ac70bc2a0374b247c4d24b  gcc/testsuite/gdc.test/fail_compilation/verrors0.d
  3a4618a15e744d0566742cbff4a18159  gcc/testsuite/gdc.test/fail_compilation/verrors5.d
  75868cd037e55b98739d09ab1ce96467  gcc/testsuite/gdc.test/fail_compilation/void_cat.d
*************** a420878da7fa335abc9583e4499d0666  gcc/te
*** 110033,110044 ****
  81eae29e5dcdce2710e97b024a39e9d5  gcc/testsuite/gdc.test/runnable/bench1.d
  c619f23869eb2baf6ff686c8cf48f2d4  gcc/testsuite/gdc.test/runnable/betterc.d
  3d3cfce1b32d3c3367406afbb4f3a671  gcc/testsuite/gdc.test/runnable/bettercUnittest.d
! 46a1099e38da8d7d5c8b44bda27616c8  gcc/testsuite/gdc.test/runnable/bit.d
  370e709a442934770ca5c055271aba94  gcc/testsuite/gdc.test/runnable/bitops.d
  5e171d0543cb3d1795498b099bcc4509  gcc/testsuite/gdc.test/runnable/bug11155.d
  57c36c5c550ccf929d7ef16b40d40d52  gcc/testsuite/gdc.test/runnable/bug12928.d
  9ff4fc16d2151e151650b90656838c4b  gcc/testsuite/gdc.test/runnable/bug16146.d
! 33630c57e32ef7ea1ea8c8b9e4cbdf7d  gcc/testsuite/gdc.test/runnable/bug19652.d
  546af3fae34682e4fc189d2cda31ed4a  gcc/testsuite/gdc.test/runnable/bug5.d
  d939e36fd09244321c35ddc5937a0203  gcc/testsuite/gdc.test/runnable/bug7068.d
  50fea055820fc103d004302bc63f3c85  gcc/testsuite/gdc.test/runnable/bug846.d
--- 110187,110198 ----
  81eae29e5dcdce2710e97b024a39e9d5  gcc/testsuite/gdc.test/runnable/bench1.d
  c619f23869eb2baf6ff686c8cf48f2d4  gcc/testsuite/gdc.test/runnable/betterc.d
  3d3cfce1b32d3c3367406afbb4f3a671  gcc/testsuite/gdc.test/runnable/bettercUnittest.d
! 8e45523f9840128ea41375c8319e8b33  gcc/testsuite/gdc.test/runnable/bit.d
  370e709a442934770ca5c055271aba94  gcc/testsuite/gdc.test/runnable/bitops.d
  5e171d0543cb3d1795498b099bcc4509  gcc/testsuite/gdc.test/runnable/bug11155.d
  57c36c5c550ccf929d7ef16b40d40d52  gcc/testsuite/gdc.test/runnable/bug12928.d
  9ff4fc16d2151e151650b90656838c4b  gcc/testsuite/gdc.test/runnable/bug16146.d
! bc392985034f7a6b06ce7b89cb260119  gcc/testsuite/gdc.test/runnable/bug19652.d
  546af3fae34682e4fc189d2cda31ed4a  gcc/testsuite/gdc.test/runnable/bug5.d
  d939e36fd09244321c35ddc5937a0203  gcc/testsuite/gdc.test/runnable/bug7068.d
  50fea055820fc103d004302bc63f3c85  gcc/testsuite/gdc.test/runnable/bug846.d
*************** af2f95c5ef65b51539eef86ea15fa531  gcc/te
*** 110050,110056 ****
  e8ff6f3ea6dc635e21038617aaa22d6c  gcc/testsuite/gdc.test/runnable/closure.d
  9856034684b8c1120eedb0ec55938558  gcc/testsuite/gdc.test/runnable/complex.d
  6b5e44de6530379279b7cc0d9eaee155  gcc/testsuite/gdc.test/runnable/complex3.d
! ce7051ac19199f716966b7818a002c9b  gcc/testsuite/gdc.test/runnable/constfold.d
  a080e4860261d16428bca6fb30d66159  gcc/testsuite/gdc.test/runnable/cppdtor.d
  2b92f65e8a84b3091a6b268e98f92815  gcc/testsuite/gdc.test/runnable/ctorpowtests.d
  a522e5527885eb8bdc0f385d8a49384c  gcc/testsuite/gdc.test/runnable/dbitfields.d
--- 110204,110210 ----
  e8ff6f3ea6dc635e21038617aaa22d6c  gcc/testsuite/gdc.test/runnable/closure.d
  9856034684b8c1120eedb0ec55938558  gcc/testsuite/gdc.test/runnable/complex.d
  6b5e44de6530379279b7cc0d9eaee155  gcc/testsuite/gdc.test/runnable/complex3.d
! a10f1fbb2f27f7e942cc0670fb3624e4  gcc/testsuite/gdc.test/runnable/constfold.d
  a080e4860261d16428bca6fb30d66159  gcc/testsuite/gdc.test/runnable/cppdtor.d
  2b92f65e8a84b3091a6b268e98f92815  gcc/testsuite/gdc.test/runnable/ctorpowtests.d
  a522e5527885eb8bdc0f385d8a49384c  gcc/testsuite/gdc.test/runnable/dbitfields.d
*************** d8fb229e4130b79d115c02f142b30900  gcc/te
*** 110085,110091 ****
  9564304c11653927716e970854c4a462  gcc/testsuite/gdc.test/runnable/foreach2.d
  040e4fa767a7fc2e188c99cbc64f3de7  gcc/testsuite/gdc.test/runnable/foreach3.d
  2b8527464d5784704510e2c0b53be4e1  gcc/testsuite/gdc.test/runnable/foreach4.d
! 2eb363b5efaefe90b9b38cb9c89c7b03  gcc/testsuite/gdc.test/runnable/foreach5.d
  990c75a2241b6663eb49b9c8c233dfbc  gcc/testsuite/gdc.test/runnable/funclit.d
  cd3460f4f8ea6492872be4c43912f1fd  gcc/testsuite/gdc.test/runnable/functype.d
  4a6d0505512d18bf34ae0b5baeb7ef62  gcc/testsuite/gdc.test/runnable/future.d
--- 110239,110245 ----
  9564304c11653927716e970854c4a462  gcc/testsuite/gdc.test/runnable/foreach2.d
  040e4fa767a7fc2e188c99cbc64f3de7  gcc/testsuite/gdc.test/runnable/foreach3.d
  2b8527464d5784704510e2c0b53be4e1  gcc/testsuite/gdc.test/runnable/foreach4.d
! 52104270f8bdfca7d950902956f4a165  gcc/testsuite/gdc.test/runnable/foreach5.d
  990c75a2241b6663eb49b9c8c233dfbc  gcc/testsuite/gdc.test/runnable/funclit.d
  cd3460f4f8ea6492872be4c43912f1fd  gcc/testsuite/gdc.test/runnable/functype.d
  4a6d0505512d18bf34ae0b5baeb7ef62  gcc/testsuite/gdc.test/runnable/future.d
*************** e041b1e4a58fab7adb641895e58bfae9  gcc/te
*** 110345,110351 ****
  f937e0b38b1fcd4d891537f30945028b  gcc/testsuite/gdc.test/runnable/m1.d
  e9f9b0b614372eb03b080d1810c3f513  gcc/testsuite/gdc.test/runnable/manboy.d
  d24d09db909070bae7a41375df4c3e2b  gcc/testsuite/gdc.test/runnable/mangle.d
! 0a5fc1669b07bb86728a75d0b19257ca  gcc/testsuite/gdc.test/runnable/mars1.d
  f5a8b23b5d0c5c59024767c78dcf9071  gcc/testsuite/gdc.test/runnable/minimal.d
  c00ebdf5e3409a5e0d41bc91f1bc7c13  gcc/testsuite/gdc.test/runnable/minimal2.d
  15dc2b4cca078287d66d6822d1363981  gcc/testsuite/gdc.test/runnable/mixin1.d
--- 110499,110505 ----
  f937e0b38b1fcd4d891537f30945028b  gcc/testsuite/gdc.test/runnable/m1.d
  e9f9b0b614372eb03b080d1810c3f513  gcc/testsuite/gdc.test/runnable/manboy.d
  d24d09db909070bae7a41375df4c3e2b  gcc/testsuite/gdc.test/runnable/mangle.d
! e52f6487ef675bf00dca8cc86b14c86d  gcc/testsuite/gdc.test/runnable/mars1.d
  f5a8b23b5d0c5c59024767c78dcf9071  gcc/testsuite/gdc.test/runnable/minimal.d
  c00ebdf5e3409a5e0d41bc91f1bc7c13  gcc/testsuite/gdc.test/runnable/minimal2.d
  15dc2b4cca078287d66d6822d1363981  gcc/testsuite/gdc.test/runnable/mixin1.d
*************** ec655df78151c45375a7f8b78ae27bcf  gcc/te
*** 110366,110373 ****
  9cf6d58bb7e64c71cbc72374f1007933  gcc/testsuite/gdc.test/runnable/opover3.d
  3f595d4c7a383a431b3773fec062cab9  gcc/testsuite/gdc.test/runnable/overload.d
  c4e996cd3850a6ed5cd0b4537df85ad3  gcc/testsuite/gdc.test/runnable/pi.d
! 263ddf76df9114f26067d1bdb3ef0490  gcc/testsuite/gdc.test/runnable/placenew.d
  671e921d7ba20a1141f56c07be62b586  gcc/testsuite/gdc.test/runnable/polysemous.d
  6bc5534b2826fefdc2676bb4a74dbef9  gcc/testsuite/gdc.test/runnable/previewin.d
  e43ef772308df8da7da44ca398d5ec99  gcc/testsuite/gdc.test/runnable/printargs.d
  0b3b6c33585693f7d9ec1f1c160c5eee  gcc/testsuite/gdc.test/runnable/property.d
--- 110520,110528 ----
  9cf6d58bb7e64c71cbc72374f1007933  gcc/testsuite/gdc.test/runnable/opover3.d
  3f595d4c7a383a431b3773fec062cab9  gcc/testsuite/gdc.test/runnable/overload.d
  c4e996cd3850a6ed5cd0b4537df85ad3  gcc/testsuite/gdc.test/runnable/pi.d
! 3eef5c673fa1363f30d1b32894007fa8  gcc/testsuite/gdc.test/runnable/placenew.d
  671e921d7ba20a1141f56c07be62b586  gcc/testsuite/gdc.test/runnable/polysemous.d
+ c6a196e97fee14926a01acb9400359e0  gcc/testsuite/gdc.test/runnable/powinline.d
  6bc5534b2826fefdc2676bb4a74dbef9  gcc/testsuite/gdc.test/runnable/previewin.d
  e43ef772308df8da7da44ca398d5ec99  gcc/testsuite/gdc.test/runnable/printargs.d
  0b3b6c33585693f7d9ec1f1c160c5eee  gcc/testsuite/gdc.test/runnable/property.d
*************** e43ef772308df8da7da44ca398d5ec99  gcc/te
*** 110378,110386 ****
  8323b83c1399a259f3d262fb199b2205  gcc/testsuite/gdc.test/runnable/s2ir.d
  96d633524d2f75b8d82fcd0a5331a249  gcc/testsuite/gdc.test/runnable/sctor.d
  89fdd86c8139312e4c554792b0cf02be  gcc/testsuite/gdc.test/runnable/sctor2.d
! 02266f96003005899efff443e0594f2a  gcc/testsuite/gdc.test/runnable/sdtor.d
  493987b1f414fd9708186d61ca59520a  gcc/testsuite/gdc.test/runnable/standalone_modctor.d
! 9cf1be8b8525b8df3fb9860f8ab1e22d  gcc/testsuite/gdc.test/runnable/staticaa.d
  75cf9f0bc1b0762705a8a2b6eb89811e  gcc/testsuite/gdc.test/runnable/staticforeach.d
  f73d5e95eed9a6db4b396ed99ff5b347  gcc/testsuite/gdc.test/runnable/statictor.d
  3b4fa0c8027d36ae9ebdc2e436b4ff04  gcc/testsuite/gdc.test/runnable/stress.d
--- 110533,110541 ----
  8323b83c1399a259f3d262fb199b2205  gcc/testsuite/gdc.test/runnable/s2ir.d
  96d633524d2f75b8d82fcd0a5331a249  gcc/testsuite/gdc.test/runnable/sctor.d
  89fdd86c8139312e4c554792b0cf02be  gcc/testsuite/gdc.test/runnable/sctor2.d
! 56961e49f5e5c47ee438cbc20660cc3a  gcc/testsuite/gdc.test/runnable/sdtor.d
  493987b1f414fd9708186d61ca59520a  gcc/testsuite/gdc.test/runnable/standalone_modctor.d
! fbbd46e945d26c4faf1723a1625f17f4  gcc/testsuite/gdc.test/runnable/staticaa.d
  75cf9f0bc1b0762705a8a2b6eb89811e  gcc/testsuite/gdc.test/runnable/staticforeach.d
  f73d5e95eed9a6db4b396ed99ff5b347  gcc/testsuite/gdc.test/runnable/statictor.d
  3b4fa0c8027d36ae9ebdc2e436b4ff04  gcc/testsuite/gdc.test/runnable/stress.d
*************** d6e1e5269dea90ebb80516ea92c9e793  gcc/te
*** 110445,110450 ****
--- 110600,110606 ----
  04a9fdc94ca9047b806f9859f89879b3  gcc/testsuite/gdc.test/runnable/test17258.d
  72abd9516be307601fc1f3e37554bd23  gcc/testsuite/gdc.test/runnable/test17337.d
  fe612a16687aaab1a8d0ebe237ee0116  gcc/testsuite/gdc.test/runnable/test17338.d
+ f3c50380079dbc6ebc412b2cdeea4ddd  gcc/testsuite/gdc.test/runnable/test17487.d
  48ebd78546a1dbb7ff35f9295d334626  gcc/testsuite/gdc.test/runnable/test17559.d
  e5d2a1faae0312068b5e33dbb985b301  gcc/testsuite/gdc.test/runnable/test17684.d
  9c25e2ca51aa326febdf0d4f36e1c245  gcc/testsuite/gdc.test/runnable/test17868.d
*************** afafe1c6791104a920ce60c8d9b7a1d7  gcc/te
*** 110499,110504 ****
--- 110655,110661 ----
  00bcf9ef4601142dccb9c6258ec13a68  gcc/testsuite/gdc.test/runnable/test20130.d
  a48fbfbafa74fe1264728e81e04e18c5  gcc/testsuite/gdc.test/runnable/test20365.d
  934611688c4128ebda7e15cb6381177e  gcc/testsuite/gdc.test/runnable/test20401.d
+ bf3d19deaed1c8f0fe61a2fd08ba0c3f  gcc/testsuite/gdc.test/runnable/test20473.d
  4d700b55de424e2292361b6931802ab8  gcc/testsuite/gdc.test/runnable/test20520.d
  c018162c45215d0fab46be18b8757454  gcc/testsuite/gdc.test/runnable/test20565.d
  c34a3bb33a8160038fa96df171e91f03  gcc/testsuite/gdc.test/runnable/test20603.d
*************** df5295a7feb17c4c53da844e70aa21e3  gcc/te
*** 110520,110529 ****
--- 110677,110689 ----
  43c17807177bc1eee7ed52b69cffa7e6  gcc/testsuite/gdc.test/runnable/test21403.d
  d65e02fb5c7cae086fa0bf2467a474a6  gcc/testsuite/gdc.test/runnable/test21416.d
  684fb8bd8d224295c0126d6852e6b871  gcc/testsuite/gdc.test/runnable/test21424.d
+ f708ec1820e736ee42baa851e9190c5d  gcc/testsuite/gdc.test/runnable/test21429.d
+ 0f0c53d19e9f033b2f0ae674ae2b2ea3  gcc/testsuite/gdc.test/runnable/test21435.d
  39cc7f7ee06df8b588e510e65fc811d1  gcc/testsuite/gdc.test/runnable/test21479.d
  116b00b8fc3478f501974453de61c5f4  gcc/testsuite/gdc.test/runnable/test21506.d
  3958eb12c59cc6063b2604b011a74128  gcc/testsuite/gdc.test/runnable/test21515.d
  d941ec5e142e2721e810526ac3a6e649  gcc/testsuite/gdc.test/runnable/test21586.d
+ dcf9d4faeb5eff7a1042fe032871a776  gcc/testsuite/gdc.test/runnable/test21660.d
  b294faec8f737c988ebc5c7803e537f6  gcc/testsuite/gdc.test/runnable/test21772.d
  b891c5d6dc21bffa2578a6c34884d103  gcc/testsuite/gdc.test/runnable/test21821.d
  0696ce7be75b98ed274e814bc15abdf9  gcc/testsuite/gdc.test/runnable/test21822.d
*************** fa0fb7940f5997754ddc62b33c7baebd  gcc/te
*** 110579,110585 ****
  dbb7cf02e89580245e392f454e17f2d8  gcc/testsuite/gdc.test/runnable/test4.d
  d445cf99d6bb9f33a8aaaf381e971853  gcc/testsuite/gdc.test/runnable/test40.d
  d506eb18768952fea6d63fd1d70743ce  gcc/testsuite/gdc.test/runnable/test41.d
! 1096ee4b07759d9f312624cc36819e23  gcc/testsuite/gdc.test/runnable/test42.d
  9b2bf264f7de133b083d60a2a96dc8e2  gcc/testsuite/gdc.test/runnable/test42a.d
  b67bb973e1e91f489cd97933211256b9  gcc/testsuite/gdc.test/runnable/test435.d
  851d793586ab17a91e80426908e8a089  gcc/testsuite/gdc.test/runnable/test45.d
--- 110739,110745 ----
  dbb7cf02e89580245e392f454e17f2d8  gcc/testsuite/gdc.test/runnable/test4.d
  d445cf99d6bb9f33a8aaaf381e971853  gcc/testsuite/gdc.test/runnable/test40.d
  d506eb18768952fea6d63fd1d70743ce  gcc/testsuite/gdc.test/runnable/test41.d
! 0d9ea5ad6848b5319b1459165516f3e6  gcc/testsuite/gdc.test/runnable/test42.d
  9b2bf264f7de133b083d60a2a96dc8e2  gcc/testsuite/gdc.test/runnable/test42a.d
  b67bb973e1e91f489cd97933211256b9  gcc/testsuite/gdc.test/runnable/test435.d
  851d793586ab17a91e80426908e8a089  gcc/testsuite/gdc.test/runnable/test45.d
*************** a36fae813a6f89e1190c485e88612051  gcc/te
*** 110618,110625 ****
  260a12227aa14fbfc0f873ac59b4b56e  gcc/testsuite/gdc.test/runnable/test_dip1006.d
  485f2946d7bdaf0ea4b8db7b7d178772  gcc/testsuite/gdc.test/runnable/test_dip1006b.d
  64823d97fc941d462f398d0b7bcbe896  gcc/testsuite/gdc.test/runnable/testaa.d
! e66ed76c60ed957e6703500644062169  gcc/testsuite/gdc.test/runnable/testaa2.d
! ee3edf61584e85f05e7e74c7c7c5a8b3  gcc/testsuite/gdc.test/runnable/testaa3.d
  3f7c65678e5e6729e1c6bc9fe1965999  gcc/testsuite/gdc.test/runnable/testaliascast.d
  eeb45913ea76b2a0c6255a669d3edb7e  gcc/testsuite/gdc.test/runnable/testappend.d
  8d2dd2e88a1daa40f5a0fe6f0bac44a7  gcc/testsuite/gdc.test/runnable/testarray.d
--- 110778,110785 ----
  260a12227aa14fbfc0f873ac59b4b56e  gcc/testsuite/gdc.test/runnable/test_dip1006.d
  485f2946d7bdaf0ea4b8db7b7d178772  gcc/testsuite/gdc.test/runnable/test_dip1006b.d
  64823d97fc941d462f398d0b7bcbe896  gcc/testsuite/gdc.test/runnable/testaa.d
! 54358bdbbb15a5ea623d42ffcc3a97e4  gcc/testsuite/gdc.test/runnable/testaa2.d
! 46a5468351b8ca42ef40fd4e9e3601dd  gcc/testsuite/gdc.test/runnable/testaa3.d
  3f7c65678e5e6729e1c6bc9fe1965999  gcc/testsuite/gdc.test/runnable/testaliascast.d
  eeb45913ea76b2a0c6255a669d3edb7e  gcc/testsuite/gdc.test/runnable/testappend.d
  8d2dd2e88a1daa40f5a0fe6f0bac44a7  gcc/testsuite/gdc.test/runnable/testarray.d
*************** dc17b590e0cb85107a4fde452455b4ec  gcc/te
*** 110643,110649 ****
  d4b8fc507dc0ddd3ca7b3066a52e32e1  gcc/testsuite/gdc.test/runnable/testfloat.d
  75351cd126af64a558dbdd6e40e6a87c  gcc/testsuite/gdc.test/runnable/testgc2.d
  7427aee7adf5bff99ac3a7bcf0cf8b2c  gcc/testsuite/gdc.test/runnable/testgc3.d
! d227de13a72016a1e7c390e520da1fb2  gcc/testsuite/gdc.test/runnable/testinvariant.d
  f4f6caa94cfa832d19c03959b736841b  gcc/testsuite/gdc.test/runnable/testkeyword.d
  8bb97c5ee53391cea0b3260d426b7dd8  gcc/testsuite/gdc.test/runnable/testline.d
  2072a38b7b38372b3243042a8e7d943d  gcc/testsuite/gdc.test/runnable/testmain.d
--- 110803,110809 ----
  d4b8fc507dc0ddd3ca7b3066a52e32e1  gcc/testsuite/gdc.test/runnable/testfloat.d
  75351cd126af64a558dbdd6e40e6a87c  gcc/testsuite/gdc.test/runnable/testgc2.d
  7427aee7adf5bff99ac3a7bcf0cf8b2c  gcc/testsuite/gdc.test/runnable/testgc3.d
! a4854d14642693390a5294ca15c49347  gcc/testsuite/gdc.test/runnable/testinvariant.d
  f4f6caa94cfa832d19c03959b736841b  gcc/testsuite/gdc.test/runnable/testkeyword.d
  8bb97c5ee53391cea0b3260d426b7dd8  gcc/testsuite/gdc.test/runnable/testline.d
  2072a38b7b38372b3243042a8e7d943d  gcc/testsuite/gdc.test/runnable/testmain.d
*************** ea6b138a5a50c9283634631f6784ac67  gcc/te
*** 110659,110665 ****
  ea09d28ca0f7a07d495d48a79486d5c2  gcc/testsuite/gdc.test/runnable/testrightthis.d
  61ae5027a5905f389d3bbaaf074fd1ff  gcc/testsuite/gdc.test/runnable/testsafe.d
  d0dc7f6c1e3a712292d48eb9d40557d0  gcc/testsuite/gdc.test/runnable/testscope.d
! 75e6e340a8e62745d532ce3ebba47749  gcc/testsuite/gdc.test/runnable/testscope2.d
  d9873070c6dd3e7e2cd42fd2301c2f47  gcc/testsuite/gdc.test/runnable/testswitch.d
  83125109b0b6204ad7bf0fba64a70844  gcc/testsuite/gdc.test/runnable/testthread.d
  d97dcf13fd8b64edaa25d1fcc17bc219  gcc/testsuite/gdc.test/runnable/testthread2.d
--- 110819,110825 ----
  ea09d28ca0f7a07d495d48a79486d5c2  gcc/testsuite/gdc.test/runnable/testrightthis.d
  61ae5027a5905f389d3bbaaf074fd1ff  gcc/testsuite/gdc.test/runnable/testsafe.d
  d0dc7f6c1e3a712292d48eb9d40557d0  gcc/testsuite/gdc.test/runnable/testscope.d
! 8c90442973df1f30960c2429cac5db95  gcc/testsuite/gdc.test/runnable/testscope2.d
  d9873070c6dd3e7e2cd42fd2301c2f47  gcc/testsuite/gdc.test/runnable/testswitch.d
  83125109b0b6204ad7bf0fba64a70844  gcc/testsuite/gdc.test/runnable/testthread.d
  d97dcf13fd8b64edaa25d1fcc17bc219  gcc/testsuite/gdc.test/runnable/testthread2.d
*************** cfb56bed1db04d96734deed0393fb2a1  gcc/te
*** 111257,111263 ****
  f3a0a84d4a4a1d1fba1105d21046304c  gcc/testsuite/gfortran.dg/array_initializer_2.f90
  2b4bef0c22c911f907559277d9291ac5  gcc/testsuite/gfortran.dg/array_initializer_3.f90
  021599e65323169090e12174251e8a88  gcc/testsuite/gfortran.dg/array_memcpy_1.f90
! c10f6e3d819439ff21c4c62df821a4fb  gcc/testsuite/gfortran.dg/array_memcpy_2.f90
  8765b47c330e73bab802dd963be5347e  gcc/testsuite/gfortran.dg/array_memcpy_3.f90
  bf6adc4a22ea07b1ef96cd964979323f  gcc/testsuite/gfortran.dg/array_memcpy_4.f90
  b6760654ceec06f2d9d8da1fb2905d41  gcc/testsuite/gfortran.dg/array_memcpy_5.f90
--- 111417,111423 ----
  f3a0a84d4a4a1d1fba1105d21046304c  gcc/testsuite/gfortran.dg/array_initializer_2.f90
  2b4bef0c22c911f907559277d9291ac5  gcc/testsuite/gfortran.dg/array_initializer_3.f90
  021599e65323169090e12174251e8a88  gcc/testsuite/gfortran.dg/array_memcpy_1.f90
! cfed2dbddab4951a7d33f47dfdc5a4f2  gcc/testsuite/gfortran.dg/array_memcpy_2.f90
  8765b47c330e73bab802dd963be5347e  gcc/testsuite/gfortran.dg/array_memcpy_3.f90
  bf6adc4a22ea07b1ef96cd964979323f  gcc/testsuite/gfortran.dg/array_memcpy_4.f90
  b6760654ceec06f2d9d8da1fb2905d41  gcc/testsuite/gfortran.dg/array_memcpy_5.f90
*************** b7bb651884d39c2e5dce7d57d46f40a5  gcc/te
*** 114621,114626 ****
--- 114781,114787 ----
  735d4ebc81a65de8f72c7d9d65d67944  gcc/testsuite/gfortran.dg/gomp/groupprivate-4.f90
  6f39af90d777638e20c319ab947b7236  gcc/testsuite/gfortran.dg/gomp/groupprivate-5.f90
  afb216949e2a1cacdc194412ee75e6f7  gcc/testsuite/gfortran.dg/gomp/groupprivate-6.f90
+ 4e380f3f55c3b2d7f4c085c801be3c15  gcc/testsuite/gfortran.dg/gomp/groupprivate-7.f90
  c81f6e5f96d44ff4d4332116923c4ba7  gcc/testsuite/gfortran.dg/gomp/if-1.f90
  d9e691abc51124a315a9fe8d1bd3a04e  gcc/testsuite/gfortran.dg/gomp/imperfect-gotos.f90
  bab74adf4eb79eb22ea45dc4908e7686  gcc/testsuite/gfortran.dg/gomp/imperfect-invalid-scope.f90
*************** b9c77c8cd78fcd9e57fbfafe732a8c95  gcc/te
*** 117005,117010 ****
--- 117166,117172 ----
  fa053690c35a7cf0e14a876e94c10140  gcc/testsuite/gfortran.dg/pr122957.f90
  ca5d5af755aea457c1fd083af79f190d  gcc/testsuite/gfortran.dg/pr123375.f90
  fb1e8e16263374f736a90ec7790bb21b  gcc/testsuite/gfortran.dg/pr123772.f03
+ f0d9a36dd6cfab9c2393885c55a61dd1  gcc/testsuite/gfortran.dg/pr123868.f90
  984f8307f36d56a0b48b5acce2dd5eb5  gcc/testsuite/gfortran.dg/pr12884.f
  64075248b9d1bffd6f380bb4e2a6eae0  gcc/testsuite/gfortran.dg/pr15129.f90
  2b5f18b773a5db29b0a2ee2d8cce767c  gcc/testsuite/gfortran.dg/pr15140.f90
*************** f880b02e14636db1562c8d548386d1b5  gcc/te
*** 118447,118452 ****
--- 118609,118616 ----
  b018d403c909bd48aff95ffa51504bc5  gcc/testsuite/gfortran.dg/simd-builtins-7.h
  917ca17cb2401da8f1cf3b663d10e88f  gcc/testsuite/gfortran.dg/simd-builtins-8.f90
  d46cd2541777ff44df1246a7347c88ae  gcc/testsuite/gfortran.dg/simd-builtins-8.h
+ 25d59ff54a10bd0ef51ca3c9191a22d9  gcc/testsuite/gfortran.dg/simd-builtins-9.f90
+ 69c3ad8625856804aa22add020ee46ed  gcc/testsuite/gfortran.dg/simd-builtins-9.h
  f4292a6253c083744adc81c628aebb23  gcc/testsuite/gfortran.dg/simpleif_1.f90
  91056d9ca23bef5e1c2753b954256442  gcc/testsuite/gfortran.dg/simpleif_2.f90
  e5b189998f851622a73dfa0f57dc1819  gcc/testsuite/gfortran.dg/simplify_argN_1.f90
*************** ed99007df506ce091870da0cdbff417d  gcc/te
*** 119163,119168 ****
--- 119327,119333 ----
  b6cbc2d7f0f983561ecfb1e889cc9564  gcc/testsuite/gfortran.dg/vect/pr115528.f
  82e3d5f4f3c4f37d7f7c646d31ed6168  gcc/testsuite/gfortran.dg/vect/pr115710.f90
  3392d3d67c1af3233bcb1cb1563137c7  gcc/testsuite/gfortran.dg/vect/pr116956.f90
+ 968b7f70f6ea492d4668938e2d929b2c  gcc/testsuite/gfortran.dg/vect/pr123016.f90
  a17cb1ab891a5af3471298da97331dda  gcc/testsuite/gfortran.dg/vect/pr19049.f90
  fdb4a5f5d5eff2fd75822f14875bd776  gcc/testsuite/gfortran.dg/vect/pr32377.f90
  bbb6998ea100c6c2039976c6446a0c10  gcc/testsuite/gfortran.dg/vect/pr32380.f
*************** ea03fb5ca9bd2d3e425e988e74bfcaa3  gcc/te
*** 119749,119754 ****
--- 119914,119920 ----
  c37460d9fc2ef94382053354df0c3ef3  gcc/testsuite/gfortran.target/aarch64/pr116234.f
  f49a9e5ed9144077a6174c71610d8918  gcc/testsuite/gfortran.target/aarch64/pr122408_1.f90
  6890252516b3245a15477e317869c38e  gcc/testsuite/gfortran.target/aarch64/pr122408_2.f90
+ 4cf281323629b728b4290a96ac918826  gcc/testsuite/gfortran.target/aarch64/pr123628.f90
  ae00a4e2372b755ec611b96aaff6a49b  gcc/testsuite/gfortran.target/riscv/rvv/pr111395.f90
  284fdebd0dafabcd770080ec38c8109a  gcc/testsuite/gfortran.target/riscv/rvv/pr111566.f90
  803fa495544cb97b2d47fa3c10b273ce  gcc/testsuite/gfortran.target/riscv/rvv/pr118182.f
*************** ec09b316f95699b7f12d9bfa709c9e2a  gcc/te
*** 122978,122983 ****
--- 123144,123150 ----
  b4403186d926b98d81bf74273fbdd747  gcc/testsuite/gnat.dg/iter5.adb
  f755b068c4d637453db94629c3c405ed  gcc/testsuite/gnat.dg/iter5_pkg.ads
  7c24008f7846098944f65c4134ed3975  gcc/testsuite/gnat.dg/iter6.adb
+ f81dad5b681759920793751c1a1799f2  gcc/testsuite/gnat.dg/iter7.adb
  52e284e2eb886ee34b0b3277d11c4499  gcc/testsuite/gnat.dg/itype.adb
  a13cf13b784e8e31eb211878f32d8ac3  gcc/testsuite/gnat.dg/itype.ads
  6e6397753611cdca3dfc55e25547deb9  gcc/testsuite/gnat.dg/itypes.adb
*************** ca98602bd726e6e8ddbebb3c4b65f0a8  gcc/te
*** 123646,123651 ****
--- 123813,123820 ----
  fbfc5611002ff9c704db3269f5fcabd2  gcc/testsuite/gnat.dg/prefix3.adb
  add304a2cd2d59821dea899362093069  gcc/testsuite/gnat.dg/prefix3_pkg.adb
  1d9b1884739f5fc32ffdca914ea90992  gcc/testsuite/gnat.dg/prefix3_pkg.ads
+ 3372ba396a449f3b5e1394881b6677d1  gcc/testsuite/gnat.dg/prefix4.adb
+ 7d40b6e578a7602141138b7c83607865  gcc/testsuite/gnat.dg/prefix4_pkg.ads
  1cd7dd16873b27f1e5bc896924554185  gcc/testsuite/gnat.dg/private_overriding.adb
  67fc1f73b2e24628841b19a37424a4dd  gcc/testsuite/gnat.dg/profile_warning.adb
  3be6aedb24cbe63f63ad93e27d8946b1  gcc/testsuite/gnat.dg/profile_warning.ads
*************** dc262de3547bdd707bae595ff3f7bad4  gcc/te
*** 123692,123697 ****
--- 123861,123867 ----
  004d0a4eab7269238d8df3bd245f540d  gcc/testsuite/gnat.dg/pure_subp_body.adb
  2cac0c26d493dcb2a6bc9eb14b048d12  gcc/testsuite/gnat.dg/pure_subp_body_pkg.ads
  90037ebb91d6c21f5fd1a7d637986ed6  gcc/testsuite/gnat.dg/put_image1.adb
+ e1775204b0488ec4f599a1dd54641058  gcc/testsuite/gnat.dg/put_image2.adb
  86264155418d37c3c433352efc4d7216  gcc/testsuite/gnat.dg/quote.adb
  14ca6ec6ac239ab1d151eea57c9f41a0  gcc/testsuite/gnat.dg/raise_ce.adb
  02b35cb51408b925b49e3ad8ff0a7ea4  gcc/testsuite/gnat.dg/raise_expr.adb
*************** c60566bc09d6f157c601d0691f67aa4e  gcc/te
*** 123850,123855 ****
--- 124020,124026 ----
  a3aeba60c0c92acaa70248375acbbdbb  gcc/testsuite/gnat.dg/specs/access_constant_decl.ads
  60ca8801e0e8eccd8fec16ac238b860c  gcc/testsuite/gnat.dg/specs/aggr1.ads
  32d247327e117ebc5575470ee0186869  gcc/testsuite/gnat.dg/specs/aggr10.ads
+ b7160b72842f69638428bd8734f6ed79  gcc/testsuite/gnat.dg/specs/aggr11.ads
  fe82e660f7a4e411f57c2b234839d4c8  gcc/testsuite/gnat.dg/specs/aggr2.ads
  5742258b0ea3fc3e05f71406d1b1322b  gcc/testsuite/gnat.dg/specs/aggr3.ads
  c8246a5026bc2feaf77f0681b54b41ea  gcc/testsuite/gnat.dg/specs/aggr3_pkg.ads
*************** c6a3adc27e1a0ad870d8ad5bc97cca72  gcc/te
*** 123973,123978 ****
--- 124144,124153 ----
  b537fdb6d08e70a4a9d52849869d7769  gcc/testsuite/gnat.dg/specs/limited_with2-child1.ads
  1785a516aed141278b3ae8ff8b2fa746  gcc/testsuite/gnat.dg/specs/limited_with2-child2.ads
  b5db75c3e893265140fda7b901376d2f  gcc/testsuite/gnat.dg/specs/limited_with2.ads
+ fbedcb4ad7f2c4e1005641325af96acb  gcc/testsuite/gnat.dg/specs/limited_with3-child-grandchild-grandgrandchild.ads
+ 4825dd5c9d78470959a4f658e124ed25  gcc/testsuite/gnat.dg/specs/limited_with3-child-grandchild.ads
+ 17aae2f71cf406a1e253530584097a2d  gcc/testsuite/gnat.dg/specs/limited_with3-child.ads
+ 2c85f81ae35fa72b5f14adce251e570b  gcc/testsuite/gnat.dg/specs/limited_with3.ads
  5ca7e9884e00c38a3fcb9117d299b396  gcc/testsuite/gnat.dg/specs/linker_alias.ads
  5a8043c489b5a93e81c2d3ae4b7347c4  gcc/testsuite/gnat.dg/specs/linker_section.ads
  dd066b85e801f4e3550fdee77334f998  gcc/testsuite/gnat.dg/specs/loop_optimization1.ads
*************** f175b16d43d86bada669751e2223586b  gcc/te
*** 124430,124435 ****
--- 124605,124611 ----
  bb65c4fde027a30c686dc94b413d88df  gcc/testsuite/gnat.dg/unchecked_union1.adb
  1394b7d36fa61e7f3417caa6cf755de5  gcc/testsuite/gnat.dg/unchecked_union2.adb
  22691e0b30f29e2232672977844f75c1  gcc/testsuite/gnat.dg/unchecked_union3.adb
+ a5d89ecafbb5dd31c1a79cf5513d61ed  gcc/testsuite/gnat.dg/unchecked_union4.adb
  9bcc7fe177662a52afe92c8e863cb022  gcc/testsuite/gnat.dg/uninit_array.adb
  8e53621d67942b5d53e2c54dd1648dd7  gcc/testsuite/gnat.dg/uninit_array.ads
  be51b72e76043adb990a3e95f4c40554  gcc/testsuite/gnat.dg/uninit_array_pkg.ads
*************** cc0ad95b0f3d6b4ef54e287b438acb10  gcc/te
*** 126853,126859 ****
  327125e0f9770fa0fdc3ed8f820c8fb2  gcc/testsuite/lib/options.exp
  4837951677485b41199b6215388f44c4  gcc/testsuite/lib/plugin-support.exp
  0b47cfd7dff343f4c4e9785998f240c7  gcc/testsuite/lib/print-stack.exp
! 32fee2a86780775ee2a5a233469b5946  gcc/testsuite/lib/profopt.exp
  4ef74e524e3ef5f3dec8824220faea8a  gcc/testsuite/lib/prune.exp
  52ac0ffa39ac607ccf00f72889b6058a  gcc/testsuite/lib/rust-dg.exp
  d84a04f02b348b9b24a659413d60a25b  gcc/testsuite/lib/rust.exp
--- 127029,127035 ----
  327125e0f9770fa0fdc3ed8f820c8fb2  gcc/testsuite/lib/options.exp
  4837951677485b41199b6215388f44c4  gcc/testsuite/lib/plugin-support.exp
  0b47cfd7dff343f4c4e9785998f240c7  gcc/testsuite/lib/print-stack.exp
! a5626bc84fe6d7aff143af465616da95  gcc/testsuite/lib/profopt.exp
  4ef74e524e3ef5f3dec8824220faea8a  gcc/testsuite/lib/prune.exp
  52ac0ffa39ac607ccf00f72889b6058a  gcc/testsuite/lib/rust-dg.exp
  d84a04f02b348b9b24a659413d60a25b  gcc/testsuite/lib/rust.exp
*************** de9eeadec9703aff96169206e31a3a22  gcc/te
*** 126878,126884 ****
  275f7eb9618e6b097a58c1fba25cdb9c  gcc/testsuite/lib/scanwpaipa.exp
  9bc4cbcf0cb4f1aa30a8cf3142d157eb  gcc/testsuite/lib/target-libpath.exp
  ba9ca262f3c7ac3b9717ac474fa255b8  gcc/testsuite/lib/target-supports-dg.exp
! a7e8d5eed7e2a56baba996a3b294af1e  gcc/testsuite/lib/target-supports.exp
  b1eb2edcf4941bfb00c200eb000a0a7b  gcc/testsuite/lib/target-utils.exp
  98b890f6c455deafd6ca241993fc5d67  gcc/testsuite/lib/timeout-dg.exp
  0afb0c69501fa44908d13017be208db3  gcc/testsuite/lib/timeout.exp
--- 127054,127060 ----
  275f7eb9618e6b097a58c1fba25cdb9c  gcc/testsuite/lib/scanwpaipa.exp
  9bc4cbcf0cb4f1aa30a8cf3142d157eb  gcc/testsuite/lib/target-libpath.exp
  ba9ca262f3c7ac3b9717ac474fa255b8  gcc/testsuite/lib/target-supports-dg.exp
! 34ecfe8e8b1fe10f2dc851692cdaa74d  gcc/testsuite/lib/target-supports.exp
  b1eb2edcf4941bfb00c200eb000a0a7b  gcc/testsuite/lib/target-utils.exp
  98b890f6c455deafd6ca241993fc5d67  gcc/testsuite/lib/timeout-dg.exp
  0afb0c69501fa44908d13017be208db3  gcc/testsuite/lib/timeout.exp
*************** a0c02d542dbd50cb44704b2ffce2739c  gcc/tr
*** 129571,129577 ****
  447f46e51936add5de4aaa77a96039ba  gcc/tree-chrec.cc
  1cf760e3e7aab6f94a5e56897486623d  gcc/tree-chrec.h
  2ef5259e28d138d053c8a5df2217ec69  gcc/tree-complex.cc
! 5d300422c733e97cae1a1454049cc0c8  gcc/tree-core.h
  4a0e32c3f4db8d2b600df44d6f3bfb90  gcc/tree-data-ref.cc
  885e741c83d91ee864f9af2a1a079312  gcc/tree-data-ref.h
  89ef786b9c4639015bae3652c90fa60f  gcc/tree-dfa.cc
--- 129747,129753 ----
  447f46e51936add5de4aaa77a96039ba  gcc/tree-chrec.cc
  1cf760e3e7aab6f94a5e56897486623d  gcc/tree-chrec.h
  2ef5259e28d138d053c8a5df2217ec69  gcc/tree-complex.cc
! dea74d5dd62de97a94d9f3e749f5bd06  gcc/tree-core.h
  4a0e32c3f4db8d2b600df44d6f3bfb90  gcc/tree-data-ref.cc
  885e741c83d91ee864f9af2a1a079312  gcc/tree-data-ref.h
  89ef786b9c4639015bae3652c90fa60f  gcc/tree-dfa.cc
*************** e034d1768d04fbcb8aefa0625b256dcd  gcc/tr
*** 129583,129594 ****
  a6a0ac4b89f1e6240c0c94394b10339b  gcc/tree-diagnostic.h
  c3f03b9ec39a5dd9d9d6328f439b796c  gcc/tree-dump.cc
  324fb4c2b4c5efd6cfc188ff13bca7ee  gcc/tree-dump.h
! 385fb42cbb3d2aee8b51c7ade2c20738  gcc/tree-eh.cc
  d7c0da59494a51ae966d29f4618b2f9a  gcc/tree-eh.h
  0cb6286531ef1298c60bd670fe8a1f62  gcc/tree-emutls.cc
  278ef0d1cc8f017ae51affd9a1e110a5  gcc/tree-hash-traits.h
  f8be97e59befb22cc3869e742a095cca  gcc/tree-hasher.h
! d40796d858e83b0ac689fcf4d04957a8  gcc/tree-if-conv.cc
  87f110e202a07bb1d7e6402808531851  gcc/tree-if-conv.h
  4b26ef89948606c3d64ab76630552cdd  gcc/tree-inline.cc
  6bebd695468e1b608400eecde4c37451  gcc/tree-inline.h
--- 129759,129770 ----
  a6a0ac4b89f1e6240c0c94394b10339b  gcc/tree-diagnostic.h
  c3f03b9ec39a5dd9d9d6328f439b796c  gcc/tree-dump.cc
  324fb4c2b4c5efd6cfc188ff13bca7ee  gcc/tree-dump.h
! 15b0d5dea2517e8735029b57cc29208e  gcc/tree-eh.cc
  d7c0da59494a51ae966d29f4618b2f9a  gcc/tree-eh.h
  0cb6286531ef1298c60bd670fe8a1f62  gcc/tree-emutls.cc
  278ef0d1cc8f017ae51affd9a1e110a5  gcc/tree-hash-traits.h
  f8be97e59befb22cc3869e742a095cca  gcc/tree-hasher.h
! 74a1d8bf597d9fcfa84e6ac9f2297cb5  gcc/tree-if-conv.cc
  87f110e202a07bb1d7e6402808531851  gcc/tree-if-conv.h
  4b26ef89948606c3d64ab76630552cdd  gcc/tree-inline.cc
  6bebd695468e1b608400eecde4c37451  gcc/tree-inline.h
*************** c1c4fe85c3abe80948e72eb9950ff189  gcc/tr
*** 129636,129642 ****
  ec31925fe8431d27258939fc79f1f02e  gcc/tree-ssa-dom.h
  2def3c3d20d186b56fd7b598ee0124be  gcc/tree-ssa-dse.cc
  1df01d660e0f98ade0ae7a3152aa33ed  gcc/tree-ssa-dse.h
! 427c42bd235a552072e9b0d2763d882b  gcc/tree-ssa-forwprop.cc
  44658616283db8f7d8bb40eb2c38e605  gcc/tree-ssa-ifcombine.cc
  96b11e029c398aaecd1c642c41c88884  gcc/tree-ssa-live.cc
  7c36b95c9d109be3302936ceed49fb4f  gcc/tree-ssa-live.h
--- 129812,129818 ----
  ec31925fe8431d27258939fc79f1f02e  gcc/tree-ssa-dom.h
  2def3c3d20d186b56fd7b598ee0124be  gcc/tree-ssa-dse.cc
  1df01d660e0f98ade0ae7a3152aa33ed  gcc/tree-ssa-dse.h
! 4e18183d03f996afa6742440588cefbc  gcc/tree-ssa-forwprop.cc
  44658616283db8f7d8bb40eb2c38e605  gcc/tree-ssa-ifcombine.cc
  96b11e029c398aaecd1c642c41c88884  gcc/tree-ssa-live.cc
  7c36b95c9d109be3302936ceed49fb4f  gcc/tree-ssa-live.h
*************** f8b96abb98adf78d9bf9645ec4529541  gcc/tr
*** 129647,129669 ****
  73db7c26eb3c2afa63524b388a9849fd  gcc/tree-ssa-loop-ivopts.h
  3b019867aefd4f962c260256d5bed88e  gcc/tree-ssa-loop-manip.cc
  d6013c7f2ea70d40b0d82c53eacccd45  gcc/tree-ssa-loop-manip.h
! 40309e1479b36779b04e80c749a15ff6  gcc/tree-ssa-loop-niter.cc
  722669ffcd66a5eddeeebe77512a22fa  gcc/tree-ssa-loop-niter.h
  a00381a12f6e0a0c69845030d621d615  gcc/tree-ssa-loop-prefetch.cc
  ad87c41606eb7cb23a85736982ce8b9f  gcc/tree-ssa-loop-split.cc
  7d41277dc2b070fc20de82de11dfe8bc  gcc/tree-ssa-loop-unswitch.cc
  faa18178392bba086edee765e464318c  gcc/tree-ssa-loop.cc
  c1590659dad2b41a69adb7654db65644  gcc/tree-ssa-loop.h
! d746bb26f2340ebcb931e43dc812a2d8  gcc/tree-ssa-math-opts.cc
  fa83f982a805985b3a3da2ca5e10e43a  gcc/tree-ssa-math-opts.h
  9b5221bc2087b040736afeb799949b04  gcc/tree-ssa-operands.cc
  f83d0b12185538e6f679296bebfe3d2f  gcc/tree-ssa-operands.h
! 71e56a69753c0fbb913084daa66a1fc0  gcc/tree-ssa-phiopt.cc
  449b769bbd461c05c5cd26af91829d37  gcc/tree-ssa-phiprop.cc
  9e8fa18fcd80eac2ecc935defc6a92f8  gcc/tree-ssa-pre.cc
  c4d808a5a97aafd0f847b4cb7aea56b2  gcc/tree-ssa-propagate.cc
  d38017eb69a50f24b5e47ee97928afde  gcc/tree-ssa-propagate.h
! d5d56178aca97e6452d6109cc13702cc  gcc/tree-ssa-reassoc.cc
  82a2c700ac2e32f106bcbd11fc5cf152  gcc/tree-ssa-reassoc.h
  b8f792d089265598daea56500282890f  gcc/tree-ssa-sccvn.cc
  9b0da40767981c9bb917d64c14b2a7c1  gcc/tree-ssa-sccvn.h
--- 129823,129845 ----
  73db7c26eb3c2afa63524b388a9849fd  gcc/tree-ssa-loop-ivopts.h
  3b019867aefd4f962c260256d5bed88e  gcc/tree-ssa-loop-manip.cc
  d6013c7f2ea70d40b0d82c53eacccd45  gcc/tree-ssa-loop-manip.h
! dd077208a385ebc47c36426a4208bf7a  gcc/tree-ssa-loop-niter.cc
  722669ffcd66a5eddeeebe77512a22fa  gcc/tree-ssa-loop-niter.h
  a00381a12f6e0a0c69845030d621d615  gcc/tree-ssa-loop-prefetch.cc
  ad87c41606eb7cb23a85736982ce8b9f  gcc/tree-ssa-loop-split.cc
  7d41277dc2b070fc20de82de11dfe8bc  gcc/tree-ssa-loop-unswitch.cc
  faa18178392bba086edee765e464318c  gcc/tree-ssa-loop.cc
  c1590659dad2b41a69adb7654db65644  gcc/tree-ssa-loop.h
! 388e2a3d7e31bd4eafb64e2ea8c722a8  gcc/tree-ssa-math-opts.cc
  fa83f982a805985b3a3da2ca5e10e43a  gcc/tree-ssa-math-opts.h
  9b5221bc2087b040736afeb799949b04  gcc/tree-ssa-operands.cc
  f83d0b12185538e6f679296bebfe3d2f  gcc/tree-ssa-operands.h
! eaf3aab0b351982dc8fcad385d24584b  gcc/tree-ssa-phiopt.cc
  449b769bbd461c05c5cd26af91829d37  gcc/tree-ssa-phiprop.cc
  9e8fa18fcd80eac2ecc935defc6a92f8  gcc/tree-ssa-pre.cc
  c4d808a5a97aafd0f847b4cb7aea56b2  gcc/tree-ssa-propagate.cc
  d38017eb69a50f24b5e47ee97928afde  gcc/tree-ssa-propagate.h
! 1f64e1425bb8bc82e544c5f49f89b084  gcc/tree-ssa-reassoc.cc
  82a2c700ac2e32f106bcbd11fc5cf152  gcc/tree-ssa-reassoc.h
  b8f792d089265598daea56500282890f  gcc/tree-ssa-sccvn.cc
  9b0da40767981c9bb917d64c14b2a7c1  gcc/tree-ssa-sccvn.h
*************** e316eddfbf9a02433a4ee93e648f3aa4  gcc/tr
*** 129700,129719 ****
  8b778220f046450b620cf0b570927dd3  gcc/tree-vect-data-refs.cc
  a423c268d5ba9ac563732fd6d038c572  gcc/tree-vect-generic.cc
  c1cdefadc1abb9281e2f4868a0bc14ff  gcc/tree-vect-loop-manip.cc
! 6bc54fe708866aa6fe7e186e0055d0bc  gcc/tree-vect-loop.cc
  550c845a7dca165130319d9b3d1f4b0f  gcc/tree-vect-patterns.cc
  ef0b51a362b8764cf6b0628ed16b2dde  gcc/tree-vect-slp-patterns.cc
! 1c5c289a3b0b8bbc09c2836b9217e035  gcc/tree-vect-slp.cc
! 8c1461c74e28a586e265605649368c74  gcc/tree-vect-stmts.cc
  42032e04f389a2e0f43fbb46ac091dac  gcc/tree-vector-builder.cc
  4a1b4947e64a076fdca46d14aab2181f  gcc/tree-vector-builder.h
  29624134a45fa2e54db69b6ee376164d  gcc/tree-vectorizer.cc
! 2bb36bce638c2744f5faccd34387b512  gcc/tree-vectorizer.h
  366e0ed463591e966ced4d1fd421282d  gcc/tree-vrp.cc
  d7273e63988959e17e61bc75f7f0cf29  gcc/tree-vrp.h
  d18ffa514babe55e8b1ef60efaf54e55  gcc/tree.cc
  f88475a43ca5e7c59112c941875a762c  gcc/tree.def
! 1d9f28c113a2d0e60cec482c059ca33b  gcc/tree.h
  56652e612288132aa8395fdf720b0146  gcc/treestruct.def
  6c6350469a3dbb37f658f247d16ed872  gcc/tristate.cc
  704359710c2d40a58b6646b2da626443  gcc/tristate.h
--- 129876,129895 ----
  8b778220f046450b620cf0b570927dd3  gcc/tree-vect-data-refs.cc
  a423c268d5ba9ac563732fd6d038c572  gcc/tree-vect-generic.cc
  c1cdefadc1abb9281e2f4868a0bc14ff  gcc/tree-vect-loop-manip.cc
! 0978b61fd549f214fdfe75d882a528e0  gcc/tree-vect-loop.cc
  550c845a7dca165130319d9b3d1f4b0f  gcc/tree-vect-patterns.cc
  ef0b51a362b8764cf6b0628ed16b2dde  gcc/tree-vect-slp-patterns.cc
! 11955ffbdc9146f2cd332eb6295f102e  gcc/tree-vect-slp.cc
! 08b3e853979fd179b6978d50d0882e85  gcc/tree-vect-stmts.cc
  42032e04f389a2e0f43fbb46ac091dac  gcc/tree-vector-builder.cc
  4a1b4947e64a076fdca46d14aab2181f  gcc/tree-vector-builder.h
  29624134a45fa2e54db69b6ee376164d  gcc/tree-vectorizer.cc
! cfa1038dc37b4524f6e31c0a3fd48158  gcc/tree-vectorizer.h
  366e0ed463591e966ced4d1fd421282d  gcc/tree-vrp.cc
  d7273e63988959e17e61bc75f7f0cf29  gcc/tree-vrp.h
  d18ffa514babe55e8b1ef60efaf54e55  gcc/tree.cc
  f88475a43ca5e7c59112c941875a762c  gcc/tree.def
! 329fce5912fef5bde6ed43043b570dc5  gcc/tree.h
  56652e612288132aa8395fdf720b0146  gcc/treestruct.def
  6c6350469a3dbb37f658f247d16ed872  gcc/tristate.cc
  704359710c2d40a58b6646b2da626443  gcc/tristate.h
*************** e992c1401c79c9a800a799632e7c3a66  gcc/va
*** 129742,129748 ****
  37f3f5b1a02f248b216bf2672c4f294e  gcc/value-range.h
  d8cea5c3e2f91237a9883149d5a0b189  gcc/value-relation.cc
  a5b43b36266e8e9188030eb977b957ea  gcc/value-relation.h
! 7941d213326ac7dec1b83fc1ab363fc9  gcc/var-tracking.cc
  14791399467ed24ab33a90132a800c50  gcc/varasm.cc
  183473e8cac5bad9279eb1937e4edda9  gcc/varasm.h
  136dfca78729a02f744f7929df4331c9  gcc/varpool.cc
--- 129918,129924 ----
  37f3f5b1a02f248b216bf2672c4f294e  gcc/value-range.h
  d8cea5c3e2f91237a9883149d5a0b189  gcc/value-relation.cc
  a5b43b36266e8e9188030eb977b957ea  gcc/value-relation.h
! 83b2f0f57059d42d6a9d2e6cc14dd6c7  gcc/var-tracking.cc
  14791399467ed24ab33a90132a800c50  gcc/varasm.cc
  183473e8cac5bad9279eb1937e4edda9  gcc/varasm.h
  136dfca78729a02f744f7929df4331c9  gcc/varpool.cc
*************** f26e462c6f89f856041d649e1dfa527e  includ
*** 129843,129851 ****
  46d6319e8ffc7eabf27cbecd6141a912  libada/configure
  ab9e00e84d092822a6cc241ba44f609b  libada/configure.ac
  46d3fe6da7a771cc2d5420c4137a6861  libatomic/.gitignore
! 10c1d0433908f33bda89d6b1b6539786  libatomic/ChangeLog
! 04e767371632b3f3d07691f8b680debc  libatomic/Makefile.am
! a96ad036b220d80426c2bce737e54a9f  libatomic/Makefile.in
  357dab2e679ef947dacf67e851f4e4ba  libatomic/acinclude.m4
  24697a8f49205fd232a3f6f3870a5d40  libatomic/aclocal.m4
  b741b38c451feebdcd9aedce6e37b702  libatomic/auto-config.h.in
--- 130019,130027 ----
  46d6319e8ffc7eabf27cbecd6141a912  libada/configure
  ab9e00e84d092822a6cc241ba44f609b  libada/configure.ac
  46d3fe6da7a771cc2d5420c4137a6861  libatomic/.gitignore
! d1a0ee508bee818641b828f33acb302c  libatomic/ChangeLog
! c44d570512be40353d5980ae6558bde3  libatomic/Makefile.am
! 478345437dc673f068d40e04128ccd29  libatomic/Makefile.in
  357dab2e679ef947dacf67e851f4e4ba  libatomic/acinclude.m4
  24697a8f49205fd232a3f6f3870a5d40  libatomic/aclocal.m4
  b741b38c451feebdcd9aedce6e37b702  libatomic/auto-config.h.in
*************** cffdeae41b78da05839b193e90188f55  libcod
*** 130046,130052 ****
  6419dfc879387358e95288142e569914  libcody/packet.cc
  688ece05c8b9d378b3df186808162e76  libcody/resolver.cc
  c94add0032978604acf65591bb86d2d6  libcody/server.cc
! c86948455f8560d4d55d101483454603  libcpp/ChangeLog
  2bd831b17997584e38305782cebe6948  libcpp/ChangeLog.jit
  4f1e80b433907c013fc6e4eaf2b0e8aa  libcpp/Makefile.in
  b07c7863f0e7ad4e6a0915d66fc9e582  libcpp/aclocal.m4
--- 130222,130228 ----
  6419dfc879387358e95288142e569914  libcody/packet.cc
  688ece05c8b9d378b3df186808162e76  libcody/resolver.cc
  c94add0032978604acf65591bb86d2d6  libcody/server.cc
! 38c2ff7bb4f5a0a82f14f7c16eb32ab3  libcpp/ChangeLog
  2bd831b17997584e38305782cebe6948  libcpp/ChangeLog.jit
  4f1e80b433907c013fc6e4eaf2b0e8aa  libcpp/Makefile.in
  b07c7863f0e7ad4e6a0915d66fc9e582  libcpp/aclocal.m4
*************** a5730f5ab9435bb5d8446830fe8f3706  libcpp
*** 130069,130075 ****
  1e65760d4159f777cf02dedef8a52357  libcpp/include/symtab.h
  5a44adf11235c72de2f0c0e89db76903  libcpp/init.cc
  5dd7b91660095eb30390141c1882293c  libcpp/internal.h
! 11d307dd4511117fab8b3db78888992c  libcpp/lex.cc
  83122fc92aa10f8e0e147c53f782a3d0  libcpp/line-map.cc
  46a07100f95f5e354c7e25cd19d26884  libcpp/location-example.txt
  8fdce4dfce3a69798f4bcfddbc367465  libcpp/macro.cc
--- 130245,130251 ----
  1e65760d4159f777cf02dedef8a52357  libcpp/include/symtab.h
  5a44adf11235c72de2f0c0e89db76903  libcpp/init.cc
  5dd7b91660095eb30390141c1882293c  libcpp/internal.h
! c9be53842b5b9c5317b73edb65b7fdc0  libcpp/lex.cc
  83122fc92aa10f8e0e147c53f782a3d0  libcpp/line-map.cc
  46a07100f95f5e354c7e25cd19d26884  libcpp/location-example.txt
  8fdce4dfce3a69798f4bcfddbc367465  libcpp/macro.cc
*************** a97c47969dfc92a7666dfe3c2e1e1448  libdec
*** 130174,130187 ****
  d4974701aea29eb07237c3fe5699033a  libdecnumber/dpd/decimal64.h
  0f6db29710e7075c2fd62bc4478b3b8d  libdecnumber/dpd/decimal64Symbols.h
  055606b47e85369c5d003f6e3a1b657e  libffi/.gitattributes
! 6f8f29557b3e9198fedf93251032920b  libffi/ChangeLog
  0e38ead823643c45765e5fe55e7ab16b  libffi/ChangeLog.libffi
  fbbc216bc25d759a72ea3e6d734af56b  libffi/ChangeLog.libgcj
  d946d2b97454ad50a1dbfbf48923c5be  libffi/ChangeLog.v1
  cc4552d9286c17a905988bf55f96def7  libffi/HOWTO_MERGE
  679b5c9bdc79a2b93ee574e193e7a7bc  libffi/LICENSE
  631bc8750a749106cf625001c1d6efb0  libffi/LICENSE-BUILDTOOLS
! 835b22825bd53e411ac26c18666e1ae5  libffi/LOCAL_PATCHES
  c55286ffa9013e1bc9fe188894b39e1d  libffi/MERGE
  1685fa58ee6d09dbcf84f25f1ed2be42  libffi/Makefile.am
  8072bae95b6d87464408fa1f8dbbef3f  libffi/Makefile.in
--- 130350,130363 ----
  d4974701aea29eb07237c3fe5699033a  libdecnumber/dpd/decimal64.h
  0f6db29710e7075c2fd62bc4478b3b8d  libdecnumber/dpd/decimal64Symbols.h
  055606b47e85369c5d003f6e3a1b657e  libffi/.gitattributes
! 49a2de84abac86aa2477527b187d211c  libffi/ChangeLog
  0e38ead823643c45765e5fe55e7ab16b  libffi/ChangeLog.libffi
  fbbc216bc25d759a72ea3e6d734af56b  libffi/ChangeLog.libgcj
  d946d2b97454ad50a1dbfbf48923c5be  libffi/ChangeLog.v1
  cc4552d9286c17a905988bf55f96def7  libffi/HOWTO_MERGE
  679b5c9bdc79a2b93ee574e193e7a7bc  libffi/LICENSE
  631bc8750a749106cf625001c1d6efb0  libffi/LICENSE-BUILDTOOLS
! aa69bb7958e068f86dbd0801c88113dd  libffi/LOCAL_PATCHES
  c55286ffa9013e1bc9fe188894b39e1d  libffi/MERGE
  1685fa58ee6d09dbcf84f25f1ed2be42  libffi/Makefile.am
  8072bae95b6d87464408fa1f8dbbef3f  libffi/Makefile.in
*************** dd7b61f56e75a1d052dd10dc02ac4940  libffi
*** 130214,130220 ****
  634ea3ff80c805d513f31c111c5e6d36  libffi/man/ffi_prep_cif.3
  3fac156e21ef8e1746b25464de61e40b  libffi/man/ffi_prep_cif_var.3
  00c15050127751bd8322e3a44f3a5e61  libffi/mdate-sh
! 3c3ee1f7953ffe94a2a8e80ef34f2c83  libffi/merge.sh
  7487ea3d59873bb39dc4886eb3616d5c  libffi/msvcc.sh
  9175551acbdd0ff98611d1daef987b47  libffi/src/aarch64/ffi.c
  b42af3dfe2dfed31394770bd1bb0baa4  libffi/src/aarch64/ffitarget.h
--- 130390,130396 ----
  634ea3ff80c805d513f31c111c5e6d36  libffi/man/ffi_prep_cif.3
  3fac156e21ef8e1746b25464de61e40b  libffi/man/ffi_prep_cif_var.3
  00c15050127751bd8322e3a44f3a5e61  libffi/mdate-sh
! dce3aff6e79185f3a81f2eda4bd02ae1  libffi/merge.sh
  7487ea3d59873bb39dc4886eb3616d5c  libffi/msvcc.sh
  9175551acbdd0ff98611d1daef987b47  libffi/src/aarch64/ffi.c
  b42af3dfe2dfed31394770bd1bb0baa4  libffi/src/aarch64/ffitarget.h
*************** a3eb5dee2788fe0a6c42502ba658eddd  libffi
*** 130570,130576 ****
  0f3c94e520870e194cf525de7ec404dc  libffi/testsuite/libffi.go/ffitest.h
  6cfb66c1c00023abb2c2276d85f16e77  libffi/testsuite/libffi.go/go.exp
  189dc193fd0e627a2d55b2e84871edc5  libffi/testsuite/libffi.go/static-chain.h
! 7c11d4e1a0ca9f53e24667e7100554b0  libga68/ChangeLog
  fad297e84229ab9c5c178ad0fc368da2  libga68/Makefile.am
  6005e14bc427347f6465e1567a1e1455  libga68/Makefile.in
  e582170826a5049ebe5f76ccb66fe5f2  libga68/README
--- 130746,130752 ----
  0f3c94e520870e194cf525de7ec404dc  libffi/testsuite/libffi.go/ffitest.h
  6cfb66c1c00023abb2c2276d85f16e77  libffi/testsuite/libffi.go/go.exp
  189dc193fd0e627a2d55b2e84871edc5  libffi/testsuite/libffi.go/static-chain.h
! b7cce7a3b76d8e87d45aaaf7c31abd32  libga68/ChangeLog
  fad297e84229ab9c5c178ad0fc368da2  libga68/Makefile.am
  6005e14bc427347f6465e1567a1e1455  libga68/Makefile.in
  e582170826a5049ebe5f76ccb66fe5f2  libga68/README
*************** b448cc4384a1f4e710c59734055b7e8a  libga6
*** 130579,130590 ****
  cf6be962dfa097e1e50ffbb773452c38  libga68/config.h.in
  37187e5a42fcecfef1a467140c165e7e  libga68/configure
  1b45ba632e248a206c0fd70c7648f70d  libga68/configure.ac
! 31e3a8364abfe35f3f97497f291562ae  libga68/ga68-alloc.c
  ab4bfff29b367495b338f951fb77ffd9  libga68/ga68-error.c
! 840e7f6921cc8acd305d61b045bc8e22  libga68/ga68-posix.c
  12f59efc2c02c8e22bec45f9a718e690  libga68/ga68-standenv.c
! 71b554bddc61bf228cd613d7570daa8d  libga68/ga68-unistr.c
! 705acf37a7457246a7cabfc9256312f9  libga68/ga68.h
  ef155d31968dfc48b5571fa874488c26  libga68/ga68.map
  93e37daf5a03d1329323ba4894247de0  libga68/libga68.c
  5a99bd84e0794e311b25ab281d6c294a  libga68/libga68.spec.in
--- 130755,130766 ----
  cf6be962dfa097e1e50ffbb773452c38  libga68/config.h.in
  37187e5a42fcecfef1a467140c165e7e  libga68/configure
  1b45ba632e248a206c0fd70c7648f70d  libga68/configure.ac
! 7caddd973773320b8d4520f3e575b2b1  libga68/ga68-alloc.c
  ab4bfff29b367495b338f951fb77ffd9  libga68/ga68-error.c
! 3f91eca832939316a64747fd9c5c7331  libga68/ga68-posix.c
  12f59efc2c02c8e22bec45f9a718e690  libga68/ga68-standenv.c
! 7aca1e001fafa5f4c00e9f7b50aca002  libga68/ga68-unistr.c
! c95c9bfe1dc60c5b7f1318c265d79c4e  libga68/ga68.h
  ef155d31968dfc48b5571fa874488c26  libga68/ga68.map
  93e37daf5a03d1329323ba4894247de0  libga68/libga68.c
  5a99bd84e0794e311b25ab281d6c294a  libga68/libga68.spec.in
*************** e52d95644dc6f186070f349a5903ca72  libibe
*** 142580,142586 ****
  6f774a92661ca4a067f1691a7925524b  libiberty/xstrerror.c
  82039c5e76badca485d7ec27bf160ba4  libiberty/xstrndup.c
  2052196fd1de9a9efa8722031398f544  libiberty/xvasprintf.c
! f368417254a08ad0fb8964d451486d25  libitm/ChangeLog
  763fe82c2e5c5ae9547defb28107952a  libitm/Makefile.am
  ef89f818c0c39a850af7e33129d6ba50  libitm/Makefile.in
  86465895a9d654faded88bc3fa075117  libitm/aatree.cc
--- 142756,142762 ----
  6f774a92661ca4a067f1691a7925524b  libiberty/xstrerror.c
  82039c5e76badca485d7ec27bf160ba4  libiberty/xstrndup.c
  2052196fd1de9a9efa8722031398f544  libiberty/xvasprintf.c
! 5de08d1cbf7bb2a72bd64c845989e1e2  libitm/ChangeLog
  763fe82c2e5c5ae9547defb28107952a  libitm/Makefile.am
  ef89f818c0c39a850af7e33129d6ba50  libitm/Makefile.in
  86465895a9d654faded88bc3fa075117  libitm/aatree.cc
*************** e15ca5fea1fc328695442dd6616fa3cb  libitm
*** 142659,142666 ****
  556e27be3e87082db63480f176a868be  libitm/testsuite/Makefile.in
  db1c194c69eb8c5f5b9c5d53d057f868  libitm/testsuite/config/default.exp
  9ab92f2310c96121666b692e1660d24f  libitm/testsuite/lib/libitm-dg.exp
! 7b5554a28cbafcb4a556d48dcc492325  libitm/testsuite/lib/libitm.exp
! ce1f605941723738a0074f4f3bd3e7f2  libitm/testsuite/libitm.c++/c++.exp
  11785412cb94b04ecc293453486ad223  libitm/testsuite/libitm.c++/dropref.C
  d806946f2845368f69a6513f60b085d2  libitm/testsuite/libitm.c++/eh-1.C
  4d185e0f675cc4954831fb956401121c  libitm/testsuite/libitm.c++/eh-2.C
--- 142835,142842 ----
  556e27be3e87082db63480f176a868be  libitm/testsuite/Makefile.in
  db1c194c69eb8c5f5b9c5d53d057f868  libitm/testsuite/config/default.exp
  9ab92f2310c96121666b692e1660d24f  libitm/testsuite/lib/libitm-dg.exp
! ea58824199b4262abc22455210d19bb9  libitm/testsuite/lib/libitm.exp
! cb49edf16f1890364c7730d433efddcc  libitm/testsuite/libitm.c++/c++.exp
  11785412cb94b04ecc293453486ad223  libitm/testsuite/libitm.c++/dropref.C
  d806946f2845368f69a6513f60b085d2  libitm/testsuite/libitm.c++/eh-1.C
  4d185e0f675cc4954831fb956401121c  libitm/testsuite/libitm.c++/eh-2.C
*************** db97a70a62d75baf7c6133362b383ccb  libobj
*** 142746,142766 ****
  d1e7c7c92a4c08557a1274ac25bac6e2  libobjc/selector.c
  029b66bb69dc70e347fe3849fc60cfd3  libobjc/sendmsg.c
  e968027639cc91f736aa2aeaee56682c  libobjc/thr.c
! c953729dfb11ae2975aa38f419ff0277  libphobos/ChangeLog
  958562279744f77373a0c5c9dc43b414  libphobos/Makefile.am
  a4ee57d4fc32508060fff33b4fc4f976  libphobos/Makefile.in
  ee88c20a7744a2305503e1670f3b7889  libphobos/README.gcc
  20b3967156eb78eebe5dd9dbb9ca4aad  libphobos/acinclude.m4
  5d61fe3538c61043be580f44d89a0ccd  libphobos/aclocal.m4
  0c33f8a64a5c7307de4f56c482966852  libphobos/config.h.in
! f3bb74835c6c88e98ec045fb5749c0ec  libphobos/configure
! 4eec45c6cb9e25da408c2646fcd1dc53  libphobos/configure.ac
  fe4d29c76b2813284a7595bb311d044e  libphobos/configure.tgt
  6bc36d3a1bb57ce2fd265f1abf3faa98  libphobos/d_rules.am
  e4224ccaecb14d942c71d31bef20d78c  libphobos/libdruntime/LICENSE.txt
! ddebe4c1ba53d5a98f1cbfe28019c009  libphobos/libdruntime/MERGE
! 48458c11faa22fe3763f06a3946d9050  libphobos/libdruntime/Makefile.am
! cf75280b73fdd370be120e7a97f9121e  libphobos/libdruntime/Makefile.in
  18eff990c3f2f99b151070e711027bf8  libphobos/libdruntime/__importc_builtins.di
  56bb01634c256cb5d65c7952ea1c4d67  libphobos/libdruntime/__main.di
  a36852e4bff4b656855a3664d2bc775d  libphobos/libdruntime/config/aarch64/switchcontext.S
--- 142922,142942 ----
  d1e7c7c92a4c08557a1274ac25bac6e2  libobjc/selector.c
  029b66bb69dc70e347fe3849fc60cfd3  libobjc/sendmsg.c
  e968027639cc91f736aa2aeaee56682c  libobjc/thr.c
! 13ce022b55b3aa72726e526427f21d8a  libphobos/ChangeLog
  958562279744f77373a0c5c9dc43b414  libphobos/Makefile.am
  a4ee57d4fc32508060fff33b4fc4f976  libphobos/Makefile.in
  ee88c20a7744a2305503e1670f3b7889  libphobos/README.gcc
  20b3967156eb78eebe5dd9dbb9ca4aad  libphobos/acinclude.m4
  5d61fe3538c61043be580f44d89a0ccd  libphobos/aclocal.m4
  0c33f8a64a5c7307de4f56c482966852  libphobos/config.h.in
! 8801ef01f6a4b0f374c625d57d497bd5  libphobos/configure
! 93f5dea1f6f8471657ee180f92f09f63  libphobos/configure.ac
  fe4d29c76b2813284a7595bb311d044e  libphobos/configure.tgt
  6bc36d3a1bb57ce2fd265f1abf3faa98  libphobos/d_rules.am
  e4224ccaecb14d942c71d31bef20d78c  libphobos/libdruntime/LICENSE.txt
! 246c09f9f74bea91c8087ac3a6dc2d25  libphobos/libdruntime/MERGE
! 92b619d324e8d6ab9afe4e20ed2c1d43  libphobos/libdruntime/Makefile.am
! 86eebd49f7970290817823f2d180d163  libphobos/libdruntime/Makefile.in
  18eff990c3f2f99b151070e711027bf8  libphobos/libdruntime/__importc_builtins.di
  56bb01634c256cb5d65c7952ea1c4d67  libphobos/libdruntime/__main.di
  a36852e4bff4b656855a3664d2bc775d  libphobos/libdruntime/config/aarch64/switchcontext.S
*************** cf1ac11681b12b35598fed7025ca3f80  libpho
*** 142774,142834 ****
  439d26fe48fc79059d901c1a99b669b2  libphobos/libdruntime/config/s390/get_tls_offset.S
  b53d30c3ef6f639c51c72c6297fc4629  libphobos/libdruntime/config/systemz/get_tls_offset.S
  5373ec7fbc0b47a057f966eb1de4d2b8  libphobos/libdruntime/config/x86/switchcontext.S
! 206534cdc7f180e23d651e0f346ef6d6  libphobos/libdruntime/core/atomic.d
  e24e403e904318fd5631db949f475769  libphobos/libdruntime/core/attribute.d
  3fd0a4eb2d172609d8c62bbe3756fc2d  libphobos/libdruntime/core/bitop.d
  e062253645c3da0b62cc738cf9f398da  libphobos/libdruntime/core/builtins.d
! bd1454b074a5890ef0e76c49f07e21d2  libphobos/libdruntime/core/checkedint.d
  80d1d0596eb558e1552c3ec6dcb82f0e  libphobos/libdruntime/core/cpuid.d
  0a882783a15c305d025968dfa221c98c  libphobos/libdruntime/core/demangle.d
  0dfd7378c6db36bc6ec25cea3ced4038  libphobos/libdruntime/core/exception.d
  456fa1344c86d322f867cb4b1736b33a  libphobos/libdruntime/core/factory.d
! 763ed71581c8c9dde7e7eb1321b0d560  libphobos/libdruntime/core/gc/config.d
! a78f9d16d411b849f49e83a802a48b5d  libphobos/libdruntime/core/gc/gcinterface.d
! 9473dda5fca28fa3b7f32a14603fd3c7  libphobos/libdruntime/core/gc/registry.d
! 2ed55eecf31e050c4e1ee1074a0fc666  libphobos/libdruntime/core/int128.d
  9b0990e1c273ba37e22e1016a832e50d  libphobos/libdruntime/core/internal/abort.d
! a2d32e80e72ade920dc6dbaa256f1901  libphobos/libdruntime/core/internal/array/appending.d
  68baa61f91aaeccba5172391e123900c  libphobos/libdruntime/core/internal/array/arrayassign.d
! a8e988793db0c50993d68d20db7e69bd  libphobos/libdruntime/core/internal/array/capacity.d
  cbe4dc09f4613e01a08f6e28d87e28d1  libphobos/libdruntime/core/internal/array/casting.d
  1905da04a68de992ae7b35c7b48368ba  libphobos/libdruntime/core/internal/array/comparison.d
! e04c894eb42699fda826f43ab520dc56  libphobos/libdruntime/core/internal/array/concatenation.d
! ba90a42bde674417d6caed781390b176  libphobos/libdruntime/core/internal/array/construction.d
! 6e7bb2834943a4c4dd34882dbbe95ea8  libphobos/libdruntime/core/internal/array/duplication.d
! f8f7c1514ef75305b82a937a1be23449  libphobos/libdruntime/core/internal/array/equality.d
  819931c48dd7002a422cf0408399c556  libphobos/libdruntime/core/internal/array/operations.d
! 78fb9b7c8129d1c774eae41d517a5739  libphobos/libdruntime/core/internal/array/utils.d
  aea2a448de5ae93354679fe04200b02e  libphobos/libdruntime/core/internal/atomic.d
  87f5099304bb6fa7f4723eb1c7b3aa7d  libphobos/libdruntime/core/internal/attributes.d
  1d80eef1b17b9b4ab7073ddd62d9e422  libphobos/libdruntime/core/internal/container/array.d
  196c764b6fe4523d0c4585b877b4aaa0  libphobos/libdruntime/core/internal/container/common.d
  651bcf61fd888da86b453d8a72d84069  libphobos/libdruntime/core/internal/container/hashtab.d
  f70666bdd80bfb970a17a9ed9be599ba  libphobos/libdruntime/core/internal/container/treap.d
! 5d51abe313d956dbd5d96e541042c84a  libphobos/libdruntime/core/internal/convert.d
  7ebc613824ac7845b1455ffd58392d8c  libphobos/libdruntime/core/internal/dassert.d
  963ea5f13b1323723157e4819d600aa2  libphobos/libdruntime/core/internal/destruction.d
  b7a158acc86998b63150c8e8767fff46  libphobos/libdruntime/core/internal/entrypoint.d
  70f9d4829a77c3ffdee4e1c117c64265  libphobos/libdruntime/core/internal/gc/bits.d
! 22194c3ad9cef30f5aabd896d37dd76c  libphobos/libdruntime/core/internal/gc/blkcache.d
  e3dfc38f8a65bebf4c55f8e9baad6c26  libphobos/libdruntime/core/internal/gc/blockmeta.d
! 720ea0ae682aabdcef80c8ff1460b4e9  libphobos/libdruntime/core/internal/gc/impl/conservative/gc.d
! 3aeb450fa7602248f945b80f1d4a88e1  libphobos/libdruntime/core/internal/gc/impl/manual/gc.d
! d415620d052ae1db6d70544c35d1be49  libphobos/libdruntime/core/internal/gc/impl/proto/gc.d
  2f460ecb63601828cb32f25093590fa3  libphobos/libdruntime/core/internal/gc/os.d
  98ef57307184c4709cd3666b62371006  libphobos/libdruntime/core/internal/gc/pooltable.d
! 4786bea52d54dcb23ca699fbe6eb83c3  libphobos/libdruntime/core/internal/gc/proxy.d
! 46d4be5b2533d26c5d4c6281a6eda634  libphobos/libdruntime/core/internal/hash.d
! 299e680f03c3ddc13696fd52fc8354c4  libphobos/libdruntime/core/internal/lifetime.d
  37bd48ea66ddb05259c7995f66a87815  libphobos/libdruntime/core/internal/moving.d
! 4f645e198123145858200ba494eff9a1  libphobos/libdruntime/core/internal/newaa.d
  3da42716a2bb1df75cc2b61bf90a9b2c  libphobos/libdruntime/core/internal/parseoptions.d
  c4a519a49c6da8005c2078035b344cf7  libphobos/libdruntime/core/internal/postblit.d
  033d129addd5b23c56c0f4e77446b299  libphobos/libdruntime/core/internal/qsort.d
  eb7626a08581a41afe77af77f3194a7a  libphobos/libdruntime/core/internal/spinlock.d
  ae51deb9af8fd5e2af56c159ecda8af6  libphobos/libdruntime/core/internal/string.d
  0e954400ebc20e538cb0df0607daaeca  libphobos/libdruntime/core/internal/switch_.d
! cc5fd49c62738f67b6c7d7cc5223eba2  libphobos/libdruntime/core/internal/traits.d
  93ec0ce1146bd4851b47fdcecd00ea56  libphobos/libdruntime/core/internal/utf.d
  31c5ef31a034f85a55e0763485479cee  libphobos/libdruntime/core/internal/util/array.d
  233370fbd6246580432384701cb2742a  libphobos/libdruntime/core/internal/util/math.d
--- 142950,143011 ----
  439d26fe48fc79059d901c1a99b669b2  libphobos/libdruntime/config/s390/get_tls_offset.S
  b53d30c3ef6f639c51c72c6297fc4629  libphobos/libdruntime/config/systemz/get_tls_offset.S
  5373ec7fbc0b47a057f966eb1de4d2b8  libphobos/libdruntime/config/x86/switchcontext.S
! bd1a8dd492733d2ecd7a2a5a4b394800  libphobos/libdruntime/core/atomic.d
  e24e403e904318fd5631db949f475769  libphobos/libdruntime/core/attribute.d
  3fd0a4eb2d172609d8c62bbe3756fc2d  libphobos/libdruntime/core/bitop.d
  e062253645c3da0b62cc738cf9f398da  libphobos/libdruntime/core/builtins.d
! 2f1f8fc06025e1daa8cda0ed65cc5195  libphobos/libdruntime/core/checkedint.d
  80d1d0596eb558e1552c3ec6dcb82f0e  libphobos/libdruntime/core/cpuid.d
  0a882783a15c305d025968dfa221c98c  libphobos/libdruntime/core/demangle.d
  0dfd7378c6db36bc6ec25cea3ced4038  libphobos/libdruntime/core/exception.d
  456fa1344c86d322f867cb4b1736b33a  libphobos/libdruntime/core/factory.d
! bdfd89919d3c819fa80ff3be0935eb43  libphobos/libdruntime/core/gc/config.d
! d509570f3ccc927f38449db6c180704f  libphobos/libdruntime/core/gc/gcinterface.d
! 3af0a86975c9c6f68e861eb366180130  libphobos/libdruntime/core/gc/registry.d
! 9d1e46b7ad0b4060d3448af794bfb5b2  libphobos/libdruntime/core/int128.d
  9b0990e1c273ba37e22e1016a832e50d  libphobos/libdruntime/core/internal/abort.d
! ac84184b2b53f5b11c37d7fe354d6a9f  libphobos/libdruntime/core/internal/array/appending.d
  68baa61f91aaeccba5172391e123900c  libphobos/libdruntime/core/internal/array/arrayassign.d
! 586ae6803d4da353f6d4ca7af6954dae  libphobos/libdruntime/core/internal/array/capacity.d
  cbe4dc09f4613e01a08f6e28d87e28d1  libphobos/libdruntime/core/internal/array/casting.d
  1905da04a68de992ae7b35c7b48368ba  libphobos/libdruntime/core/internal/array/comparison.d
! f06585a96d1e4f72a6ae889cbb4da064  libphobos/libdruntime/core/internal/array/concatenation.d
! 46a8ba35de64d3bd476756a73fb628db  libphobos/libdruntime/core/internal/array/construction.d
! 99b9e130db7ff5d36de6e092015b6a9f  libphobos/libdruntime/core/internal/array/duplication.d
! b087ad5347da018345e671b3803f93cb  libphobos/libdruntime/core/internal/array/equality.d
  819931c48dd7002a422cf0408399c556  libphobos/libdruntime/core/internal/array/operations.d
! cb1d03e7a2f678085aef10e507047e5b  libphobos/libdruntime/core/internal/array/utils.d
  aea2a448de5ae93354679fe04200b02e  libphobos/libdruntime/core/internal/atomic.d
  87f5099304bb6fa7f4723eb1c7b3aa7d  libphobos/libdruntime/core/internal/attributes.d
+ e01781192b15a285e00843e8eab41d9c  libphobos/libdruntime/core/internal/cast_.d
  1d80eef1b17b9b4ab7073ddd62d9e422  libphobos/libdruntime/core/internal/container/array.d
  196c764b6fe4523d0c4585b877b4aaa0  libphobos/libdruntime/core/internal/container/common.d
  651bcf61fd888da86b453d8a72d84069  libphobos/libdruntime/core/internal/container/hashtab.d
  f70666bdd80bfb970a17a9ed9be599ba  libphobos/libdruntime/core/internal/container/treap.d
! 6ea7aafb839c951fc9a503dda1fc33e7  libphobos/libdruntime/core/internal/convert.d
  7ebc613824ac7845b1455ffd58392d8c  libphobos/libdruntime/core/internal/dassert.d
  963ea5f13b1323723157e4819d600aa2  libphobos/libdruntime/core/internal/destruction.d
  b7a158acc86998b63150c8e8767fff46  libphobos/libdruntime/core/internal/entrypoint.d
  70f9d4829a77c3ffdee4e1c117c64265  libphobos/libdruntime/core/internal/gc/bits.d
! 8928945a6d4804bce290a013bac6a64d  libphobos/libdruntime/core/internal/gc/blkcache.d
  e3dfc38f8a65bebf4c55f8e9baad6c26  libphobos/libdruntime/core/internal/gc/blockmeta.d
! 46a1bf7207d62f31cc6f74488cc9242f  libphobos/libdruntime/core/internal/gc/impl/conservative/gc.d
! c13d940721e33ddc760ba87658864c05  libphobos/libdruntime/core/internal/gc/impl/manual/gc.d
! ba8495db5f1beaef0f71ba7a1a371bd2  libphobos/libdruntime/core/internal/gc/impl/proto/gc.d
  2f460ecb63601828cb32f25093590fa3  libphobos/libdruntime/core/internal/gc/os.d
  98ef57307184c4709cd3666b62371006  libphobos/libdruntime/core/internal/gc/pooltable.d
! d8c372fc06927765c514b2a74916948d  libphobos/libdruntime/core/internal/gc/proxy.d
! d565020de574afb0e162d91058993a97  libphobos/libdruntime/core/internal/hash.d
! 5cf3fd04327b7b7c41571b23d366adb8  libphobos/libdruntime/core/internal/lifetime.d
  37bd48ea66ddb05259c7995f66a87815  libphobos/libdruntime/core/internal/moving.d
! e5d5bc5813ae61d566b605e92ec31f48  libphobos/libdruntime/core/internal/newaa.d
  3da42716a2bb1df75cc2b61bf90a9b2c  libphobos/libdruntime/core/internal/parseoptions.d
  c4a519a49c6da8005c2078035b344cf7  libphobos/libdruntime/core/internal/postblit.d
  033d129addd5b23c56c0f4e77446b299  libphobos/libdruntime/core/internal/qsort.d
  eb7626a08581a41afe77af77f3194a7a  libphobos/libdruntime/core/internal/spinlock.d
  ae51deb9af8fd5e2af56c159ecda8af6  libphobos/libdruntime/core/internal/string.d
  0e954400ebc20e538cb0df0607daaeca  libphobos/libdruntime/core/internal/switch_.d
! 401c9664331a5de2312544b5b14f742b  libphobos/libdruntime/core/internal/traits.d
  93ec0ce1146bd4851b47fdcecd00ea56  libphobos/libdruntime/core/internal/utf.d
  31c5ef31a034f85a55e0763485479cee  libphobos/libdruntime/core/internal/util/array.d
  233370fbd6246580432384701cb2742a  libphobos/libdruntime/core/internal/util/math.d
*************** b9c6840aeaced95051c29d7184e88fa6  libpho
*** 142840,142857 ****
  94caf334d4b82b52b161e23aec46505d  libphobos/libdruntime/core/simd.d
  e61cb90709bb42a1617c1aa648a6438c  libphobos/libdruntime/core/stdc/assert_.d
  027bd40faf09b13abf5dc94da4aaa176  libphobos/libdruntime/core/stdc/complex.d
! e5cb8a81d0e505497bcc7e4507abfebd  libphobos/libdruntime/core/stdc/config.d
  e73e1e0aaf48227fef16ff41037ecbdd  libphobos/libdruntime/core/stdc/ctype.d
  d1e3e7c34509fb3fe879924e72b6f30e  libphobos/libdruntime/core/stdc/errno.d
  e91ed8a068db9723b27deb61078c2a0e  libphobos/libdruntime/core/stdc/errno_.c
! 55fd150a36649edd9a4239052a42a3b7  libphobos/libdruntime/core/stdc/fenv.d
  627bd812c57c65e72ca9360911ec5e37  libphobos/libdruntime/core/stdc/float_.d
  7b0fbc4eebf5b3364fd3541f51608b9a  libphobos/libdruntime/core/stdc/inttypes.d
  cc49d5c291f85a60da360856d321dba7  libphobos/libdruntime/core/stdc/limits.d
  1ec5e1d4f9cc5f454f6885ae47882e5b  libphobos/libdruntime/core/stdc/locale.d
! 942bd462653bafd8d70b5c0c6b223565  libphobos/libdruntime/core/stdc/math.d
  0527cc19df281c6561cb089ae3887c88  libphobos/libdruntime/core/stdc/signal.d
! 65a0d8a9876486120150abd25cc1d969  libphobos/libdruntime/core/stdc/stdarg.d
  306374fcd5c5628b804dc7b1f320399b  libphobos/libdruntime/core/stdc/stdatomic.d
  bf552e1cf2ceeb05e2231ba9b15a4317  libphobos/libdruntime/core/stdc/stddef.d
  9f5f25dd44bf80a08150cdfbe9d111d4  libphobos/libdruntime/core/stdc/stdint.d
--- 143017,143034 ----
  94caf334d4b82b52b161e23aec46505d  libphobos/libdruntime/core/simd.d
  e61cb90709bb42a1617c1aa648a6438c  libphobos/libdruntime/core/stdc/assert_.d
  027bd40faf09b13abf5dc94da4aaa176  libphobos/libdruntime/core/stdc/complex.d
! 72ec8dc19f0f492f7e49468329fa52c9  libphobos/libdruntime/core/stdc/config.d
  e73e1e0aaf48227fef16ff41037ecbdd  libphobos/libdruntime/core/stdc/ctype.d
  d1e3e7c34509fb3fe879924e72b6f30e  libphobos/libdruntime/core/stdc/errno.d
  e91ed8a068db9723b27deb61078c2a0e  libphobos/libdruntime/core/stdc/errno_.c
! e1f2c338c5d3317b194cbd1ae717dc7e  libphobos/libdruntime/core/stdc/fenv.d
  627bd812c57c65e72ca9360911ec5e37  libphobos/libdruntime/core/stdc/float_.d
  7b0fbc4eebf5b3364fd3541f51608b9a  libphobos/libdruntime/core/stdc/inttypes.d
  cc49d5c291f85a60da360856d321dba7  libphobos/libdruntime/core/stdc/limits.d
  1ec5e1d4f9cc5f454f6885ae47882e5b  libphobos/libdruntime/core/stdc/locale.d
! fffeb32a619982557b22736580ba45fe  libphobos/libdruntime/core/stdc/math.d
  0527cc19df281c6561cb089ae3887c88  libphobos/libdruntime/core/stdc/signal.d
! 883b080409dac0905df56a729355d996  libphobos/libdruntime/core/stdc/stdarg.d
  306374fcd5c5628b804dc7b1f320399b  libphobos/libdruntime/core/stdc/stdatomic.d
  bf552e1cf2ceeb05e2231ba9b15a4317  libphobos/libdruntime/core/stdc/stddef.d
  9f5f25dd44bf80a08150cdfbe9d111d4  libphobos/libdruntime/core/stdc/stdint.d
*************** e0c850123380d629cb7d467ed907c628  libpho
*** 142867,142873 ****
  4b01e553920b55f684bde1b9e3a0013d  libphobos/libdruntime/core/stdcpp/exception.d
  3eddadac69f83acab9d331f8f40d10f1  libphobos/libdruntime/core/stdcpp/memory.d
  ca3b2621c4836601de8b09d158ac3146  libphobos/libdruntime/core/stdcpp/new_.d
! 745b603b8b03c8d48d260283d52ca79c  libphobos/libdruntime/core/stdcpp/string.d
  928773810f41fd2b44f30a53f03b5d9a  libphobos/libdruntime/core/stdcpp/string_view.d
  12a17952827821958ee88a65eba6a869  libphobos/libdruntime/core/stdcpp/type_traits.d
  81021b3a29f068e9ade0f102f80de709  libphobos/libdruntime/core/stdcpp/typeinfo.d
--- 143044,143050 ----
  4b01e553920b55f684bde1b9e3a0013d  libphobos/libdruntime/core/stdcpp/exception.d
  3eddadac69f83acab9d331f8f40d10f1  libphobos/libdruntime/core/stdcpp/memory.d
  ca3b2621c4836601de8b09d158ac3146  libphobos/libdruntime/core/stdcpp/new_.d
! 3b9013ed8322ee022d0dd3e9de155a3a  libphobos/libdruntime/core/stdcpp/string.d
  928773810f41fd2b44f30a53f03b5d9a  libphobos/libdruntime/core/stdcpp/string_view.d
  12a17952827821958ee88a65eba6a869  libphobos/libdruntime/core/stdcpp/type_traits.d
  81021b3a29f068e9ade0f102f80de709  libphobos/libdruntime/core/stdcpp/typeinfo.d
*************** fbde46456ccf791794e8a05ff5e2514e  libpho
*** 142883,142897 ****
  9d0c31c030496644e123ff3169d29034  libphobos/libdruntime/core/sync/package.d
  812e07fc2fd1e1acb695d87fd9ab57b3  libphobos/libdruntime/core/sync/rwmutex.d
  7b4cf45e1f494fcb10817a325f9f13e4  libphobos/libdruntime/core/sync/semaphore.d
! 50fe5e30b4d51364e814298406f553f8  libphobos/libdruntime/core/sys/bionic/err.d
  d55bf2dad61f2510372f4bc81570b20b  libphobos/libdruntime/core/sys/bionic/fcntl.d
  61ec901bd4228ade72b80f786ea9f841  libphobos/libdruntime/core/sys/bionic/stdlib.d
! 37cf1fc03c8fb882e6bd777d1de22c7a  libphobos/libdruntime/core/sys/bionic/string.d
  6590cb511cc9a5f03165dd25827e7d5b  libphobos/libdruntime/core/sys/bionic/unistd.d
  e1a0c2ace7ce019d9507ff2e36d9046c  libphobos/libdruntime/core/sys/darwin/config.d
  7268f90152682f29fdbfdaea2235051f  libphobos/libdruntime/core/sys/darwin/crt_externs.d
  0eda72e3cac9805cc23af8959075decb  libphobos/libdruntime/core/sys/darwin/dlfcn.d
! a3c540146008694cd55b9331f0ea3c00  libphobos/libdruntime/core/sys/darwin/err.d
  57ead34bc2c10609cee697697c7109d9  libphobos/libdruntime/core/sys/darwin/execinfo.d
  67367ec1a9080206e76e5985a626b96f  libphobos/libdruntime/core/sys/darwin/fcntl.d
  b371cc55752f276343a5a951da246a8f  libphobos/libdruntime/core/sys/darwin/ifaddrs.d
--- 143060,143074 ----
  9d0c31c030496644e123ff3169d29034  libphobos/libdruntime/core/sync/package.d
  812e07fc2fd1e1acb695d87fd9ab57b3  libphobos/libdruntime/core/sync/rwmutex.d
  7b4cf45e1f494fcb10817a325f9f13e4  libphobos/libdruntime/core/sync/semaphore.d
! f2ac41f1272b3255ed1f918c8b3e7ad5  libphobos/libdruntime/core/sys/bionic/err.d
  d55bf2dad61f2510372f4bc81570b20b  libphobos/libdruntime/core/sys/bionic/fcntl.d
  61ec901bd4228ade72b80f786ea9f841  libphobos/libdruntime/core/sys/bionic/stdlib.d
! 758ea46c9f734d80503b8fb0a1fec889  libphobos/libdruntime/core/sys/bionic/string.d
  6590cb511cc9a5f03165dd25827e7d5b  libphobos/libdruntime/core/sys/bionic/unistd.d
  e1a0c2ace7ce019d9507ff2e36d9046c  libphobos/libdruntime/core/sys/darwin/config.d
  7268f90152682f29fdbfdaea2235051f  libphobos/libdruntime/core/sys/darwin/crt_externs.d
  0eda72e3cac9805cc23af8959075decb  libphobos/libdruntime/core/sys/darwin/dlfcn.d
! 975229dfeed3e7723733aa3b787e76cd  libphobos/libdruntime/core/sys/darwin/err.d
  57ead34bc2c10609cee697697c7109d9  libphobos/libdruntime/core/sys/darwin/execinfo.d
  67367ec1a9080206e76e5985a626b96f  libphobos/libdruntime/core/sys/darwin/fcntl.d
  b371cc55752f276343a5a951da246a8f  libphobos/libdruntime/core/sys/darwin/ifaddrs.d
*************** b494cd41558ecb995c4333baf8fc06e5  libpho
*** 142907,142925 ****
  e0cfebfa42a04ef83e94ce398f8d572a  libphobos/libdruntime/core/sys/darwin/netinet/in_.d
  99642cacbd6ed7ea6c4ea68521cbd236  libphobos/libdruntime/core/sys/darwin/pthread.d
  a638835645b7f6f237988cde82cdc023  libphobos/libdruntime/core/sys/darwin/stdlib.d
! b23e9db102d21fdfaae26d64270c36b4  libphobos/libdruntime/core/sys/darwin/string.d
  1822982f807a2d0bf4f414d7508f14b9  libphobos/libdruntime/core/sys/darwin/sys/attr.d
  f313052d67738ea2ef7ecb6a841d8e8a  libphobos/libdruntime/core/sys/darwin/sys/cdefs.d
  360c5926a42d6162839c384ccb749fc2  libphobos/libdruntime/core/sys/darwin/sys/event.d
  d45630fa4eae2334c1017e90da6181b4  libphobos/libdruntime/core/sys/darwin/sys/mman.d
  ee768f1e1a87f6a51cceb812e431b845  libphobos/libdruntime/core/sys/darwin/sys/sysctl.d
  6c97885f83797ff4aebb198ca52c218a  libphobos/libdruntime/core/sys/dragonflybsd/dlfcn.d
! 6eac382e99d9b8534968c86038d313d8  libphobos/libdruntime/core/sys/dragonflybsd/err.d
  acf1e3bd64ab277991c64333d3e0579b  libphobos/libdruntime/core/sys/dragonflybsd/execinfo.d
  a6a8f14bd00ff97c7e0951489f562ad8  libphobos/libdruntime/core/sys/dragonflybsd/netinet/in_.d
  c86f640d53951aff6dc85f8a55a95b29  libphobos/libdruntime/core/sys/dragonflybsd/pthread_np.d
  ca5f75ae9c3430ffa168de837fbdacce  libphobos/libdruntime/core/sys/dragonflybsd/stdlib.d
! 3ad6a87a26922e823d47a8e0deff95a9  libphobos/libdruntime/core/sys/dragonflybsd/string.d
  aebec2abbff9264fe5fb8fe7f0742f3e  libphobos/libdruntime/core/sys/dragonflybsd/sys/_bitset.d
  5ab9878143773ab170060d0052e88be1  libphobos/libdruntime/core/sys/dragonflybsd/sys/_cpuset.d
  9e2c4a7a7c64e5ecccf60e6ecc2bca8d  libphobos/libdruntime/core/sys/dragonflybsd/sys/cdefs.d
--- 143084,143102 ----
  e0cfebfa42a04ef83e94ce398f8d572a  libphobos/libdruntime/core/sys/darwin/netinet/in_.d
  99642cacbd6ed7ea6c4ea68521cbd236  libphobos/libdruntime/core/sys/darwin/pthread.d
  a638835645b7f6f237988cde82cdc023  libphobos/libdruntime/core/sys/darwin/stdlib.d
! 0f26bf679700716a787b3ec318b6434f  libphobos/libdruntime/core/sys/darwin/string.d
  1822982f807a2d0bf4f414d7508f14b9  libphobos/libdruntime/core/sys/darwin/sys/attr.d
  f313052d67738ea2ef7ecb6a841d8e8a  libphobos/libdruntime/core/sys/darwin/sys/cdefs.d
  360c5926a42d6162839c384ccb749fc2  libphobos/libdruntime/core/sys/darwin/sys/event.d
  d45630fa4eae2334c1017e90da6181b4  libphobos/libdruntime/core/sys/darwin/sys/mman.d
  ee768f1e1a87f6a51cceb812e431b845  libphobos/libdruntime/core/sys/darwin/sys/sysctl.d
  6c97885f83797ff4aebb198ca52c218a  libphobos/libdruntime/core/sys/dragonflybsd/dlfcn.d
! 5ee954baa2fdb3195c6f95217436e5e4  libphobos/libdruntime/core/sys/dragonflybsd/err.d
  acf1e3bd64ab277991c64333d3e0579b  libphobos/libdruntime/core/sys/dragonflybsd/execinfo.d
  a6a8f14bd00ff97c7e0951489f562ad8  libphobos/libdruntime/core/sys/dragonflybsd/netinet/in_.d
  c86f640d53951aff6dc85f8a55a95b29  libphobos/libdruntime/core/sys/dragonflybsd/pthread_np.d
  ca5f75ae9c3430ffa168de837fbdacce  libphobos/libdruntime/core/sys/dragonflybsd/stdlib.d
! 9f811aca3be3cf369cdd9ca3f2f829ea  libphobos/libdruntime/core/sys/dragonflybsd/string.d
  aebec2abbff9264fe5fb8fe7f0742f3e  libphobos/libdruntime/core/sys/dragonflybsd/sys/_bitset.d
  5ab9878143773ab170060d0052e88be1  libphobos/libdruntime/core/sys/dragonflybsd/sys/_cpuset.d
  9e2c4a7a7c64e5ecccf60e6ecc2bca8d  libphobos/libdruntime/core/sys/dragonflybsd/sys/cdefs.d
*************** f14294df112fde328fa8d60fe9777a4c  libpho
*** 142936,142942 ****
  d81de96f2f37b7ebcde77ba62486cb0a  libphobos/libdruntime/core/sys/elf/package.d
  bd301144c6d0d322af4d639445a1ea4d  libphobos/libdruntime/core/sys/freebsd/config.d
  fdbaf03147cfe71d5470a4e029044a7c  libphobos/libdruntime/core/sys/freebsd/dlfcn.d
! af280329e0c803d82636283b14c46642  libphobos/libdruntime/core/sys/freebsd/err.d
  380100960f334f1ed62e46fcde0154f3  libphobos/libdruntime/core/sys/freebsd/execinfo.d
  b9d71621d744e28f5408aca3599042ef  libphobos/libdruntime/core/sys/freebsd/ifaddrs.d
  0b59048b711d0736fb02a6aee1a5b4e4  libphobos/libdruntime/core/sys/freebsd/mqueue.d
--- 143113,143119 ----
  d81de96f2f37b7ebcde77ba62486cb0a  libphobos/libdruntime/core/sys/elf/package.d
  bd301144c6d0d322af4d639445a1ea4d  libphobos/libdruntime/core/sys/freebsd/config.d
  fdbaf03147cfe71d5470a4e029044a7c  libphobos/libdruntime/core/sys/freebsd/dlfcn.d
! a80f642410f6fad043f800073395e281  libphobos/libdruntime/core/sys/freebsd/err.d
  380100960f334f1ed62e46fcde0154f3  libphobos/libdruntime/core/sys/freebsd/execinfo.d
  b9d71621d744e28f5408aca3599042ef  libphobos/libdruntime/core/sys/freebsd/ifaddrs.d
  0b59048b711d0736fb02a6aee1a5b4e4  libphobos/libdruntime/core/sys/freebsd/mqueue.d
*************** b9d71621d744e28f5408aca3599042ef  libpho
*** 142945,142951 ****
  307b5921875f2667f8c2a0195d46589e  libphobos/libdruntime/core/sys/freebsd/netinet/in_.d
  eed1afcf0c9c1f7170550c80d4c1a294  libphobos/libdruntime/core/sys/freebsd/pthread_np.d
  ef7226f644352e61dd81ad370cf837fc  libphobos/libdruntime/core/sys/freebsd/stdlib.d
! 6a9dc335efc1298f3d31578c068ca4f9  libphobos/libdruntime/core/sys/freebsd/string.d
  760a556212d4a95cf4109e26f2492711  libphobos/libdruntime/core/sys/freebsd/sys/_bitset.d
  55344b2716c3a4c2b4dae60cf7c69ca8  libphobos/libdruntime/core/sys/freebsd/sys/_cpuset.d
  7935160b9fb1677ccd85bb239deaa975  libphobos/libdruntime/core/sys/freebsd/sys/cdefs.d
--- 143122,143128 ----
  307b5921875f2667f8c2a0195d46589e  libphobos/libdruntime/core/sys/freebsd/netinet/in_.d
  eed1afcf0c9c1f7170550c80d4c1a294  libphobos/libdruntime/core/sys/freebsd/pthread_np.d
  ef7226f644352e61dd81ad370cf837fc  libphobos/libdruntime/core/sys/freebsd/stdlib.d
! de107d272fe23928ef8abe57b90a0833  libphobos/libdruntime/core/sys/freebsd/string.d
  760a556212d4a95cf4109e26f2492711  libphobos/libdruntime/core/sys/freebsd/sys/_bitset.d
  55344b2716c3a4c2b4dae60cf7c69ca8  libphobos/libdruntime/core/sys/freebsd/sys/_cpuset.d
  7935160b9fb1677ccd85bb239deaa975  libphobos/libdruntime/core/sys/freebsd/sys/cdefs.d
*************** c68553e0e4c1471fcb8b5980937560d0  libpho
*** 142966,142972 ****
  24939ec8eecd1b249cedf4ecdae79cdd  libphobos/libdruntime/core/sys/linux/dlfcn.d
  9772302af1ce910f5d9341c067908b67  libphobos/libdruntime/core/sys/linux/elf.d
  dd35d5ec968968280acb0976353f23b0  libphobos/libdruntime/core/sys/linux/epoll.d
! d43645ebdb4cb7038c7eadc1216f334d  libphobos/libdruntime/core/sys/linux/err.d
  91d5d2c96df93f0773d9d91c761f449d  libphobos/libdruntime/core/sys/linux/errno.d
  a56839efe74c71ab60c49ebf16ca7b69  libphobos/libdruntime/core/sys/linux/execinfo.d
  3e71c86a817e8dbe949840fc092ca007  libphobos/libdruntime/core/sys/linux/fcntl.d
--- 143143,143149 ----
  24939ec8eecd1b249cedf4ecdae79cdd  libphobos/libdruntime/core/sys/linux/dlfcn.d
  9772302af1ce910f5d9341c067908b67  libphobos/libdruntime/core/sys/linux/elf.d
  dd35d5ec968968280acb0976353f23b0  libphobos/libdruntime/core/sys/linux/epoll.d
! f81d06b316902cdaa008361232c527e2  libphobos/libdruntime/core/sys/linux/err.d
  91d5d2c96df93f0773d9d91c761f449d  libphobos/libdruntime/core/sys/linux/errno.d
  a56839efe74c71ab60c49ebf16ca7b69  libphobos/libdruntime/core/sys/linux/execinfo.d
  3e71c86a817e8dbe949840fc092ca007  libphobos/libdruntime/core/sys/linux/fcntl.d
*************** a56839efe74c71ab60c49ebf16ca7b69  libpho
*** 142977,142989 ****
  46564c790cc7d63f5336608262fe45b7  libphobos/libdruntime/core/sys/linux/io_uring.d
  fc261411d8aef7ee816116115d19a256  libphobos/libdruntime/core/sys/linux/link.d
  ef8603d93023778c9a704c8c96f513d7  libphobos/libdruntime/core/sys/linux/linux/if_arp.d
! 11cb68a053083c4e64d294dd92813bef  libphobos/libdruntime/core/sys/linux/linux/if_packet.d
! 12fb5b8d3834b7b9da4b7c2158d39f82  libphobos/libdruntime/core/sys/linux/netinet/in_.d
  ef4ca38842cf7000f36294af3547a28a  libphobos/libdruntime/core/sys/linux/netinet/tcp.d
! f58c0282735041f3fcc76e5989d6bd48  libphobos/libdruntime/core/sys/linux/perf_event.d
! 0099ef95503090008310f7cfe82dad3a  libphobos/libdruntime/core/sys/linux/sched.d
  7931aab43c1ac5e2755373b67d411863  libphobos/libdruntime/core/sys/linux/stdio.d
! 5865ee9cfca7ce97fb6444080e379440  libphobos/libdruntime/core/sys/linux/string.d
  ee7a0de6e2861775d2d754c5ac23bffb  libphobos/libdruntime/core/sys/linux/sys/auxv.d
  0df34c56bc25c8f26c78e08c66d13cf8  libphobos/libdruntime/core/sys/linux/sys/eventfd.d
  d24094280e490194dedf87b353ff18bb  libphobos/libdruntime/core/sys/linux/sys/file.d
--- 143154,143166 ----
  46564c790cc7d63f5336608262fe45b7  libphobos/libdruntime/core/sys/linux/io_uring.d
  fc261411d8aef7ee816116115d19a256  libphobos/libdruntime/core/sys/linux/link.d
  ef8603d93023778c9a704c8c96f513d7  libphobos/libdruntime/core/sys/linux/linux/if_arp.d
! 1c17691ad5f708510ef87daba850b48f  libphobos/libdruntime/core/sys/linux/linux/if_packet.d
! b2dc68341c67721b34498f406b8eb078  libphobos/libdruntime/core/sys/linux/netinet/in_.d
  ef4ca38842cf7000f36294af3547a28a  libphobos/libdruntime/core/sys/linux/netinet/tcp.d
! cf93cb24231cf2c42585d8f3a533a1a7  libphobos/libdruntime/core/sys/linux/perf_event.d
! 1cc36a6a81ffb2bfff76bc9a714e6f07  libphobos/libdruntime/core/sys/linux/sched.d
  7931aab43c1ac5e2755373b67d411863  libphobos/libdruntime/core/sys/linux/stdio.d
! 775ca593c155682350352d3e4140fb97  libphobos/libdruntime/core/sys/linux/string.d
  ee7a0de6e2861775d2d754c5ac23bffb  libphobos/libdruntime/core/sys/linux/sys/auxv.d
  0df34c56bc25c8f26c78e08c66d13cf8  libphobos/libdruntime/core/sys/linux/sys/eventfd.d
  d24094280e490194dedf87b353ff18bb  libphobos/libdruntime/core/sys/linux/sys/file.d
*************** a4bc2500eb1954b8041afbfdf0c1c624  libpho
*** 142994,143030 ****
  8705c1f102a9e56f95b6accd221f1062  libphobos/libdruntime/core/sys/linux/sys/procfs.d
  be8020cc22c39cfb05963e86a584d8c6  libphobos/libdruntime/core/sys/linux/sys/signalfd.d
  f0914dd1a54b0ff2aee44bf97196d8ac  libphobos/libdruntime/core/sys/linux/sys/socket.d
  86a89527d97460eaf8460e185ad3f275  libphobos/libdruntime/core/sys/linux/sys/sysinfo.d
! 7a54339243710cbfd79bde1f56a32e73  libphobos/libdruntime/core/sys/linux/sys/time.d
  3050f0352c0814a99d50b30404d55e4a  libphobos/libdruntime/core/sys/linux/sys/xattr.d
  0b804d571d1307b84e7e1f15b4c3d019  libphobos/libdruntime/core/sys/linux/termios.d
  51b5b6cdb4decd39c003dd6fcd9216ce  libphobos/libdruntime/core/sys/linux/time.d
  3cc075f55b6c637e3edb96ab0b0dd212  libphobos/libdruntime/core/sys/linux/timerfd.d
  8b7729333b2e7c137f3d4a1e07783823  libphobos/libdruntime/core/sys/linux/tipc.d
  a8bd53389fa93de3a4d12b5d9e5a733d  libphobos/libdruntime/core/sys/linux/uinput.d
! b452ccd9e332d323be1b74d37dde33f5  libphobos/libdruntime/core/sys/linux/unistd.d
  1b582b30d3653f119276cadc05ee72d8  libphobos/libdruntime/core/sys/netbsd/dlfcn.d
! dfd28b5ab076802f136129647195c782  libphobos/libdruntime/core/sys/netbsd/err.d
  16687f12d9b35a350c3415c52d038cd0  libphobos/libdruntime/core/sys/netbsd/execinfo.d
  f03137d862ce397c6fb8ef85bcefab73  libphobos/libdruntime/core/sys/netbsd/stdlib.d
! 7b0f236b427b427e01e8fa52532b2c3c  libphobos/libdruntime/core/sys/netbsd/string.d
  e739d3dae4d70fa6737b4ce09c43994d  libphobos/libdruntime/core/sys/netbsd/sys/elf.d
  a138f936cbb80a12577ce380e01d6e58  libphobos/libdruntime/core/sys/netbsd/sys/elf32.d
  a1b5e465ae156df5e5813b732e9d8082  libphobos/libdruntime/core/sys/netbsd/sys/elf64.d
  313798ae65cfc16a242f6e0b4cf2f315  libphobos/libdruntime/core/sys/netbsd/sys/elf_common.d
  3b9b03a58246b1ff0add7bf8623db546  libphobos/libdruntime/core/sys/netbsd/sys/event.d
! b7d30227519e88528d6f108a0b716317  libphobos/libdruntime/core/sys/netbsd/sys/featuretest.d
  90e9b823006c634cf0ea0fc288e628f2  libphobos/libdruntime/core/sys/netbsd/sys/link_elf.d
  9de03b49678d737774525f946308c176  libphobos/libdruntime/core/sys/netbsd/sys/mman.d
  00fa230caafce571c5e5b9b1c0e66f55  libphobos/libdruntime/core/sys/netbsd/sys/sysctl.d
  c91b85e73f2ed19d2ab87faaa1954366  libphobos/libdruntime/core/sys/netbsd/time.d
  c7b4a367e75732d0bd109155097b4d01  libphobos/libdruntime/core/sys/openbsd/dlfcn.d
! 76a7cedaf47c514815473a2e187a7c4d  libphobos/libdruntime/core/sys/openbsd/err.d
  a3a5e904d4c5c7ebb1ea955088e42c15  libphobos/libdruntime/core/sys/openbsd/execinfo.d
  79a1fe62ab4709585b456f73ff271f31  libphobos/libdruntime/core/sys/openbsd/pthread_np.d
  d164e440f3d1a1253c38845bfffd62cd  libphobos/libdruntime/core/sys/openbsd/pwd.d
  e44c1bb0475bad210df34a6ac2f2b7c5  libphobos/libdruntime/core/sys/openbsd/stdlib.d
! a9eb1c1eaf5c0383b7eda373805c48a1  libphobos/libdruntime/core/sys/openbsd/string.d
  61119274dbe0da19bb7862b1d8e3be88  libphobos/libdruntime/core/sys/openbsd/sys/cdefs.d
  4f2b043926b16e1b37a2e25509085736  libphobos/libdruntime/core/sys/openbsd/sys/elf.d
  d4381103053302df0ba8c97d46d8b62b  libphobos/libdruntime/core/sys/openbsd/sys/elf32.d
--- 143171,143209 ----
  8705c1f102a9e56f95b6accd221f1062  libphobos/libdruntime/core/sys/linux/sys/procfs.d
  be8020cc22c39cfb05963e86a584d8c6  libphobos/libdruntime/core/sys/linux/sys/signalfd.d
  f0914dd1a54b0ff2aee44bf97196d8ac  libphobos/libdruntime/core/sys/linux/sys/socket.d
+ ba565b95f9e370ecf417289c342d7f2b  libphobos/libdruntime/core/sys/linux/sys/syscall.d
  86a89527d97460eaf8460e185ad3f275  libphobos/libdruntime/core/sys/linux/sys/sysinfo.d
! 2cb355519dece3f0fdf3dc1f6caea322  libphobos/libdruntime/core/sys/linux/sys/time.d
  3050f0352c0814a99d50b30404d55e4a  libphobos/libdruntime/core/sys/linux/sys/xattr.d
+ 164b5e475a4fb4f3cb856e026bf58429  libphobos/libdruntime/core/sys/linux/syscall.d
  0b804d571d1307b84e7e1f15b4c3d019  libphobos/libdruntime/core/sys/linux/termios.d
  51b5b6cdb4decd39c003dd6fcd9216ce  libphobos/libdruntime/core/sys/linux/time.d
  3cc075f55b6c637e3edb96ab0b0dd212  libphobos/libdruntime/core/sys/linux/timerfd.d
  8b7729333b2e7c137f3d4a1e07783823  libphobos/libdruntime/core/sys/linux/tipc.d
  a8bd53389fa93de3a4d12b5d9e5a733d  libphobos/libdruntime/core/sys/linux/uinput.d
! c221c9b91026095b75a349579e791b37  libphobos/libdruntime/core/sys/linux/unistd.d
  1b582b30d3653f119276cadc05ee72d8  libphobos/libdruntime/core/sys/netbsd/dlfcn.d
! 3d4a23f131fe534f263ef2eca60ceaa0  libphobos/libdruntime/core/sys/netbsd/err.d
  16687f12d9b35a350c3415c52d038cd0  libphobos/libdruntime/core/sys/netbsd/execinfo.d
  f03137d862ce397c6fb8ef85bcefab73  libphobos/libdruntime/core/sys/netbsd/stdlib.d
! 68b4c3fb76492a9fdfb1bc02d0bdb018  libphobos/libdruntime/core/sys/netbsd/string.d
  e739d3dae4d70fa6737b4ce09c43994d  libphobos/libdruntime/core/sys/netbsd/sys/elf.d
  a138f936cbb80a12577ce380e01d6e58  libphobos/libdruntime/core/sys/netbsd/sys/elf32.d
  a1b5e465ae156df5e5813b732e9d8082  libphobos/libdruntime/core/sys/netbsd/sys/elf64.d
  313798ae65cfc16a242f6e0b4cf2f315  libphobos/libdruntime/core/sys/netbsd/sys/elf_common.d
  3b9b03a58246b1ff0add7bf8623db546  libphobos/libdruntime/core/sys/netbsd/sys/event.d
! 4c17b2d2c0f8e41a00fb10a07a379958  libphobos/libdruntime/core/sys/netbsd/sys/featuretest.d
  90e9b823006c634cf0ea0fc288e628f2  libphobos/libdruntime/core/sys/netbsd/sys/link_elf.d
  9de03b49678d737774525f946308c176  libphobos/libdruntime/core/sys/netbsd/sys/mman.d
  00fa230caafce571c5e5b9b1c0e66f55  libphobos/libdruntime/core/sys/netbsd/sys/sysctl.d
  c91b85e73f2ed19d2ab87faaa1954366  libphobos/libdruntime/core/sys/netbsd/time.d
  c7b4a367e75732d0bd109155097b4d01  libphobos/libdruntime/core/sys/openbsd/dlfcn.d
! 458a8e1d2951a6e0d4ec88ef82269e80  libphobos/libdruntime/core/sys/openbsd/err.d
  a3a5e904d4c5c7ebb1ea955088e42c15  libphobos/libdruntime/core/sys/openbsd/execinfo.d
  79a1fe62ab4709585b456f73ff271f31  libphobos/libdruntime/core/sys/openbsd/pthread_np.d
  d164e440f3d1a1253c38845bfffd62cd  libphobos/libdruntime/core/sys/openbsd/pwd.d
  e44c1bb0475bad210df34a6ac2f2b7c5  libphobos/libdruntime/core/sys/openbsd/stdlib.d
! c26e2e37870ada29155d9d4d402a3346  libphobos/libdruntime/core/sys/openbsd/string.d
  61119274dbe0da19bb7862b1d8e3be88  libphobos/libdruntime/core/sys/openbsd/sys/cdefs.d
  4f2b043926b16e1b37a2e25509085736  libphobos/libdruntime/core/sys/openbsd/sys/elf.d
  d4381103053302df0ba8c97d46d8b62b  libphobos/libdruntime/core/sys/openbsd/sys/elf32.d
*************** b4bd052f0e8e57db0716f807263ad759  libpho
*** 143038,143045 ****
  c19da98e25834b2fc1c764a437973bf8  libphobos/libdruntime/core/sys/posix/aio.d
  d2d580de88e21c5ff2e144828e88cc50  libphobos/libdruntime/core/sys/posix/arpa/inet.d
  6bd440cdece560ee8908ae48063c14eb  libphobos/libdruntime/core/sys/posix/config.d
! bef1c9ca8fa8d35225eaad453de630ea  libphobos/libdruntime/core/sys/posix/dirent.d
! e4f1943c701d8c5427a60c85adc0236d  libphobos/libdruntime/core/sys/posix/dlfcn.d
  bce3cd4d2c5e1f0f0f185fe211625e83  libphobos/libdruntime/core/sys/posix/fcntl.d
  702d6944ce1feced53f524d8c6410bae  libphobos/libdruntime/core/sys/posix/grp.d
  3b65fc6ea1e8b95dbe86c5d20e65f522  libphobos/libdruntime/core/sys/posix/iconv.d
--- 143217,143225 ----
  c19da98e25834b2fc1c764a437973bf8  libphobos/libdruntime/core/sys/posix/aio.d
  d2d580de88e21c5ff2e144828e88cc50  libphobos/libdruntime/core/sys/posix/arpa/inet.d
  6bd440cdece560ee8908ae48063c14eb  libphobos/libdruntime/core/sys/posix/config.d
! 4276089c47374921aa63e17600f11094  libphobos/libdruntime/core/sys/posix/dirent.d
! 00b54b99561e0a4fce45c554bc97efe0  libphobos/libdruntime/core/sys/posix/dlfcn.d
! 5e0c2084f9a10b2b1e3b186e53b7c751  libphobos/libdruntime/core/sys/posix/endian.d
  bce3cd4d2c5e1f0f0f185fe211625e83  libphobos/libdruntime/core/sys/posix/fcntl.d
  702d6944ce1feced53f524d8c6410bae  libphobos/libdruntime/core/sys/posix/grp.d
  3b65fc6ea1e8b95dbe86c5d20e65f522  libphobos/libdruntime/core/sys/posix/iconv.d
*************** bce3cd4d2c5e1f0f0f185fe211625e83  libpho
*** 143048,143088 ****
  f872163f7db8d6c4044ed0ec34497240  libphobos/libdruntime/core/sys/posix/locale.d
  056c7e93dce141484a044dc2cbfc20cd  libphobos/libdruntime/core/sys/posix/mqueue.d
  1b0baf6dad835d2a338dfbd84007217b  libphobos/libdruntime/core/sys/posix/net/if_.d
! 13b8dae9bab5062136d53ccebd082d85  libphobos/libdruntime/core/sys/posix/netdb.d
! c7dcd36f9e6a7e0c43c734446334ad92  libphobos/libdruntime/core/sys/posix/netinet/in_.d
  e2bed0b739fc017fa2c967cab3adf1ab  libphobos/libdruntime/core/sys/posix/netinet/tcp.d
  5510e426fa4a2a90b0a79841d319e8f4  libphobos/libdruntime/core/sys/posix/poll.d
  dc2efa5751c64d98f883ba967ccdf64d  libphobos/libdruntime/core/sys/posix/pthread.d
  a228203a75c388b65c27a7059185e352  libphobos/libdruntime/core/sys/posix/pwd.d
! dca2ed8976351f808aaaaf8bfaa2ca34  libphobos/libdruntime/core/sys/posix/sched.d
  0d3f923f59a85545956c41021acd5c5b  libphobos/libdruntime/core/sys/posix/semaphore.d
  754f16078f3f2dc253c170d80d64ace4  libphobos/libdruntime/core/sys/posix/setjmp.d
! b6ff812d4893bb06cadc9a21c305a8c6  libphobos/libdruntime/core/sys/posix/signal.d
  af88cfa76758ed4a06ed76224d9edb61  libphobos/libdruntime/core/sys/posix/spawn.d
  59214daa1b5028710de013d36b56eb9b  libphobos/libdruntime/core/sys/posix/stdc/time.d
! fbb04909de62a4a4f4a95cfff272c7a3  libphobos/libdruntime/core/sys/posix/stdio.d
! 1dacf73803bc7f397074b38943d014f2  libphobos/libdruntime/core/sys/posix/stdlib.d
  f8ac1b696e7212c92caf062e9b8b6b8a  libphobos/libdruntime/core/sys/posix/string.d
  0a83f207b25c02c481a61faf3207cb6c  libphobos/libdruntime/core/sys/posix/strings.d
  4b07be0d0a605b5a855496178e995b95  libphobos/libdruntime/core/sys/posix/sys/filio.d
  b02e329aa6c0d9275bc5c2570f426a80  libphobos/libdruntime/core/sys/posix/sys/ioccom.d
! 9bd99416560c21132ad3baf480413d7d  libphobos/libdruntime/core/sys/posix/sys/ioctl.d
  b925ee7e2e3334ef78aa53486af14a6a  libphobos/libdruntime/core/sys/posix/sys/ipc.d
! 13815bc5f0c5c0179b9a4d0730ebf9df  libphobos/libdruntime/core/sys/posix/sys/mman.d
  1976f620d8e9fe05b793ca4130031dba  libphobos/libdruntime/core/sys/posix/sys/msg.d
  4710c8aa76b800477c154e69ab2b452e  libphobos/libdruntime/core/sys/posix/sys/resource.d
! da026db04950018a474b54890f559b7e  libphobos/libdruntime/core/sys/posix/sys/select.d
  81d15dd9b6a8d1f517857d304968b834  libphobos/libdruntime/core/sys/posix/sys/shm.d
! 2921d77709c0a301e4d9f692bd2ab7c8  libphobos/libdruntime/core/sys/posix/sys/socket.d
! 35d9c456572db09b94487f1fc9952b64  libphobos/libdruntime/core/sys/posix/sys/stat.d
! 7d00f70c2445657318f7344d8b4dcb6f  libphobos/libdruntime/core/sys/posix/sys/statvfs.d
  ab3f7338ce7949e238728e6631e10e7b  libphobos/libdruntime/core/sys/posix/sys/time.d
  7c741b07659843e1e0332e784c324e3f  libphobos/libdruntime/core/sys/posix/sys/ttycom.d
  1624217586c95bd2d793bd5bffcaccc8  libphobos/libdruntime/core/sys/posix/sys/types.d
  571b12f57fc1cf1ed69c5fcce8b89de4  libphobos/libdruntime/core/sys/posix/sys/uio.d
  51f7afe07c50617af673fc2dbdf3cf40  libphobos/libdruntime/core/sys/posix/sys/un.d
  cac398e14e045ed42244544f84db5c9a  libphobos/libdruntime/core/sys/posix/sys/utsname.d
! 373a749fe86c1b74bb6fa2483c3acc63  libphobos/libdruntime/core/sys/posix/sys/wait.d
  63c078cb4f123c4469cc1b2af384767d  libphobos/libdruntime/core/sys/posix/syslog.d
  7f8c41dea7291b93e10e0697c5c192bb  libphobos/libdruntime/core/sys/posix/termios.d
  5d1c0ca3d818900f2bfffc4a19b3b57a  libphobos/libdruntime/core/sys/posix/time.d
--- 143228,143268 ----
  f872163f7db8d6c4044ed0ec34497240  libphobos/libdruntime/core/sys/posix/locale.d
  056c7e93dce141484a044dc2cbfc20cd  libphobos/libdruntime/core/sys/posix/mqueue.d
  1b0baf6dad835d2a338dfbd84007217b  libphobos/libdruntime/core/sys/posix/net/if_.d
! d1504817173a9b7c56c3df5e6a1e19c3  libphobos/libdruntime/core/sys/posix/netdb.d
! a0f9b75bf63080c5ef398197ca556d84  libphobos/libdruntime/core/sys/posix/netinet/in_.d
  e2bed0b739fc017fa2c967cab3adf1ab  libphobos/libdruntime/core/sys/posix/netinet/tcp.d
  5510e426fa4a2a90b0a79841d319e8f4  libphobos/libdruntime/core/sys/posix/poll.d
  dc2efa5751c64d98f883ba967ccdf64d  libphobos/libdruntime/core/sys/posix/pthread.d
  a228203a75c388b65c27a7059185e352  libphobos/libdruntime/core/sys/posix/pwd.d
! 4d55d51e90754619f1af9b02860a035b  libphobos/libdruntime/core/sys/posix/sched.d
  0d3f923f59a85545956c41021acd5c5b  libphobos/libdruntime/core/sys/posix/semaphore.d
  754f16078f3f2dc253c170d80d64ace4  libphobos/libdruntime/core/sys/posix/setjmp.d
! 717afd2b619a9b6ede6a6df95b72191d  libphobos/libdruntime/core/sys/posix/signal.d
  af88cfa76758ed4a06ed76224d9edb61  libphobos/libdruntime/core/sys/posix/spawn.d
  59214daa1b5028710de013d36b56eb9b  libphobos/libdruntime/core/sys/posix/stdc/time.d
! eaa387fa09d5ea39cc2d7282dcb7d3f8  libphobos/libdruntime/core/sys/posix/stdio.d
! d3f530d741f609becdc4f8c9e21ea7b3  libphobos/libdruntime/core/sys/posix/stdlib.d
  f8ac1b696e7212c92caf062e9b8b6b8a  libphobos/libdruntime/core/sys/posix/string.d
  0a83f207b25c02c481a61faf3207cb6c  libphobos/libdruntime/core/sys/posix/strings.d
  4b07be0d0a605b5a855496178e995b95  libphobos/libdruntime/core/sys/posix/sys/filio.d
  b02e329aa6c0d9275bc5c2570f426a80  libphobos/libdruntime/core/sys/posix/sys/ioccom.d
! 2a0ba1b58279393a297b0e04dd2beab0  libphobos/libdruntime/core/sys/posix/sys/ioctl.d
  b925ee7e2e3334ef78aa53486af14a6a  libphobos/libdruntime/core/sys/posix/sys/ipc.d
! 9ec5ecdb29dd6c55060e13218ce69828  libphobos/libdruntime/core/sys/posix/sys/mman.d
  1976f620d8e9fe05b793ca4130031dba  libphobos/libdruntime/core/sys/posix/sys/msg.d
  4710c8aa76b800477c154e69ab2b452e  libphobos/libdruntime/core/sys/posix/sys/resource.d
! 4413cafb8f90f18928e6bbffa9604ea2  libphobos/libdruntime/core/sys/posix/sys/select.d
  81d15dd9b6a8d1f517857d304968b834  libphobos/libdruntime/core/sys/posix/sys/shm.d
! 850c8afe919c88457484916849f172a7  libphobos/libdruntime/core/sys/posix/sys/socket.d
! 623431374e156ac1b571c80365a0616f  libphobos/libdruntime/core/sys/posix/sys/stat.d
! d4dd4bb2ce19c7f61640dc25dfd39614  libphobos/libdruntime/core/sys/posix/sys/statvfs.d
  ab3f7338ce7949e238728e6631e10e7b  libphobos/libdruntime/core/sys/posix/sys/time.d
  7c741b07659843e1e0332e784c324e3f  libphobos/libdruntime/core/sys/posix/sys/ttycom.d
  1624217586c95bd2d793bd5bffcaccc8  libphobos/libdruntime/core/sys/posix/sys/types.d
  571b12f57fc1cf1ed69c5fcce8b89de4  libphobos/libdruntime/core/sys/posix/sys/uio.d
  51f7afe07c50617af673fc2dbdf3cf40  libphobos/libdruntime/core/sys/posix/sys/un.d
  cac398e14e045ed42244544f84db5c9a  libphobos/libdruntime/core/sys/posix/sys/utsname.d
! 8184d9ab4631dfe9221caad43a9b1490  libphobos/libdruntime/core/sys/posix/sys/wait.d
  63c078cb4f123c4469cc1b2af384767d  libphobos/libdruntime/core/sys/posix/syslog.d
  7f8c41dea7291b93e10e0697c5c192bb  libphobos/libdruntime/core/sys/posix/termios.d
  5d1c0ca3d818900f2bfffc4a19b3b57a  libphobos/libdruntime/core/sys/posix/time.d
*************** af71fddd1336ca49dfc7cec95b4ebdf6  libpho
*** 143091,143097 ****
  9414f9f2c6d77b7a1e93b61a9916681c  libphobos/libdruntime/core/sys/posix/utime.d
  30a7c865e2541fe983de69db93f37601  libphobos/libdruntime/core/sys/solaris/dlfcn.d
  e24762f124741eb7164ac6d35f819119  libphobos/libdruntime/core/sys/solaris/elf.d
! 6609181d8ebdbb548ac7d475d0b53e25  libphobos/libdruntime/core/sys/solaris/err.d
  d821485cf4fb84fc3a4823d17496c304  libphobos/libdruntime/core/sys/solaris/execinfo.d
  13168aebf00d1f79d79f7aa9a14ee45e  libphobos/libdruntime/core/sys/solaris/libelf.d
  b80defc2ca94dd32d65995270ef8aed4  libphobos/libdruntime/core/sys/solaris/link.d
--- 143271,143277 ----
  9414f9f2c6d77b7a1e93b61a9916681c  libphobos/libdruntime/core/sys/posix/utime.d
  30a7c865e2541fe983de69db93f37601  libphobos/libdruntime/core/sys/solaris/dlfcn.d
  e24762f124741eb7164ac6d35f819119  libphobos/libdruntime/core/sys/solaris/elf.d
! 29be2aa3faabb3db3e1671c7e1604376  libphobos/libdruntime/core/sys/solaris/err.d
  d821485cf4fb84fc3a4823d17496c304  libphobos/libdruntime/core/sys/solaris/execinfo.d
  13168aebf00d1f79d79f7aa9a14ee45e  libphobos/libdruntime/core/sys/solaris/libelf.d
  b80defc2ca94dd32d65995270ef8aed4  libphobos/libdruntime/core/sys/solaris/link.d
*************** f3220636fa9a34351a43f51401f4186d  libpho
*** 143110,143123 ****
  808bc3a894b23f128a067e177eb6ca6c  libphobos/libdruntime/core/sys/windows/accctrl.d
  2bbb1ebc3493cb45672097831b433d17  libphobos/libdruntime/core/sys/windows/aclapi.d
  9019e80f7ab7f1246b0bcfcf83b6d5ac  libphobos/libdruntime/core/sys/windows/aclui.d
! a2bffd2b9b462b551ddd39c82589c6a7  libphobos/libdruntime/core/sys/windows/basetsd.d
  da757341fa2bf63b89a77fc158634cd0  libphobos/libdruntime/core/sys/windows/basetyps.d
  aaa19b431331b227615fa463d6ed6f2a  libphobos/libdruntime/core/sys/windows/bcrypt.d
  f66a616c8baaf64c29936cd3048d19e6  libphobos/libdruntime/core/sys/windows/cderr.d
  40cf12972559ab3d59832fa5372fb9fd  libphobos/libdruntime/core/sys/windows/cguid.d
  629b11b6597684f0a7fc2fe4f7903f68  libphobos/libdruntime/core/sys/windows/com.d
  55640e2c23753bb0bba7db96a69a7df2  libphobos/libdruntime/core/sys/windows/comcat.d
! 03f4f12b61dc34e9a0924fc751b52d25  libphobos/libdruntime/core/sys/windows/commctrl.d
  5fcc424ba57cfc222dbc3c99baa12384  libphobos/libdruntime/core/sys/windows/commdlg.d
  bf3823be2764fc604e8c83099bd0aa17  libphobos/libdruntime/core/sys/windows/core.d
  080a37029d0af10fff081dcb013c4520  libphobos/libdruntime/core/sys/windows/cpl.d
--- 143290,143303 ----
  808bc3a894b23f128a067e177eb6ca6c  libphobos/libdruntime/core/sys/windows/accctrl.d
  2bbb1ebc3493cb45672097831b433d17  libphobos/libdruntime/core/sys/windows/aclapi.d
  9019e80f7ab7f1246b0bcfcf83b6d5ac  libphobos/libdruntime/core/sys/windows/aclui.d
! 0d2fa122db024176056fd038a657d4ec  libphobos/libdruntime/core/sys/windows/basetsd.d
  da757341fa2bf63b89a77fc158634cd0  libphobos/libdruntime/core/sys/windows/basetyps.d
  aaa19b431331b227615fa463d6ed6f2a  libphobos/libdruntime/core/sys/windows/bcrypt.d
  f66a616c8baaf64c29936cd3048d19e6  libphobos/libdruntime/core/sys/windows/cderr.d
  40cf12972559ab3d59832fa5372fb9fd  libphobos/libdruntime/core/sys/windows/cguid.d
  629b11b6597684f0a7fc2fe4f7903f68  libphobos/libdruntime/core/sys/windows/com.d
  55640e2c23753bb0bba7db96a69a7df2  libphobos/libdruntime/core/sys/windows/comcat.d
! ec63dace871ea9a426aca12321867d84  libphobos/libdruntime/core/sys/windows/commctrl.d
  5fcc424ba57cfc222dbc3c99baa12384  libphobos/libdruntime/core/sys/windows/commdlg.d
  bf3823be2764fc604e8c83099bd0aa17  libphobos/libdruntime/core/sys/windows/core.d
  080a37029d0af10fff081dcb013c4520  libphobos/libdruntime/core/sys/windows/cpl.d
*************** bf3823be2764fc604e8c83099bd0aa17  libpho
*** 143126,143132 ****
  0eb3d806d23ea59db37e74c4c84233cb  libphobos/libdruntime/core/sys/windows/dbghelp.d
  5d026ec2e43ebbbe3f06a24f39348ee9  libphobos/libdruntime/core/sys/windows/dbghelp_types.d
  94f7cb8b5aabbcd911308efc2d9cccc0  libphobos/libdruntime/core/sys/windows/dbt.d
! e0426218568fad89bba1620414ef705f  libphobos/libdruntime/core/sys/windows/dde.d
  e3898a3347a2f442cb800e4e94a38842  libphobos/libdruntime/core/sys/windows/ddeml.d
  9733a6c5da78960e6f4aae4ff54b5b63  libphobos/libdruntime/core/sys/windows/dhcpcsdk.d
  8bb836897d3d7f5aa12f841f5b353fd9  libphobos/libdruntime/core/sys/windows/dlgs.d
--- 143306,143312 ----
  0eb3d806d23ea59db37e74c4c84233cb  libphobos/libdruntime/core/sys/windows/dbghelp.d
  5d026ec2e43ebbbe3f06a24f39348ee9  libphobos/libdruntime/core/sys/windows/dbghelp_types.d
  94f7cb8b5aabbcd911308efc2d9cccc0  libphobos/libdruntime/core/sys/windows/dbt.d
! 907a9de85202837b4defe60416d4ad74  libphobos/libdruntime/core/sys/windows/dde.d
  e3898a3347a2f442cb800e4e94a38842  libphobos/libdruntime/core/sys/windows/ddeml.d
  9733a6c5da78960e6f4aae4ff54b5b63  libphobos/libdruntime/core/sys/windows/dhcpcsdk.d
  8bb836897d3d7f5aa12f841f5b353fd9  libphobos/libdruntime/core/sys/windows/dlgs.d
*************** f15343ede37ec86dcc75816d9d02868a  libpho
*** 143174,143190 ****
  40944b56ee73c24d3046fc9d313639d0  libphobos/libdruntime/core/sys/windows/mciavi.d
  de0387ad10e69b94fa784ddce6bf5b52  libphobos/libdruntime/core/sys/windows/mcx.d
  4af5abe81ec30e4594f5165be0e787e6  libphobos/libdruntime/core/sys/windows/mgmtapi.d
! d163cc5abad963a37848b34f1d8a7cad  libphobos/libdruntime/core/sys/windows/mmsystem.d
  da02316c0286de98909d35dced85d22e  libphobos/libdruntime/core/sys/windows/msacm.d
  cb09a9571f48cb8da6c47240ab32a69c  libphobos/libdruntime/core/sys/windows/mshtml.d
  1165bc4ee8dd5fddab6697f2ddda7abe  libphobos/libdruntime/core/sys/windows/mswsock.d
  ea0a8ea5da9f6d375ee3e7b415586a7b  libphobos/libdruntime/core/sys/windows/nb30.d
  0d5ebf7ff5907a657c784cf45edc6a2b  libphobos/libdruntime/core/sys/windows/nddeapi.d
  a36e1c22cb0cd979eaeebff6b6cb786e  libphobos/libdruntime/core/sys/windows/nspapi.d
! 04a5a3f41bebbba7ce9427f55a98dc4d  libphobos/libdruntime/core/sys/windows/ntdef.d
  5a972328a9f001f96b7f7afa2b624f65  libphobos/libdruntime/core/sys/windows/ntdll.d
  e853cd965a604797654d7dd7b7fb3cc1  libphobos/libdruntime/core/sys/windows/ntldap.d
! 46b40764437cf84b5ff4d81eb1c1c614  libphobos/libdruntime/core/sys/windows/ntsecapi.d
  cf14f024351e812f037a15e61e035b16  libphobos/libdruntime/core/sys/windows/ntsecpkg.d
  eec5257ed84683b9c6c8341222562d8c  libphobos/libdruntime/core/sys/windows/oaidl.d
  dc55a541ce748e353ed098be618b4dbe  libphobos/libdruntime/core/sys/windows/objbase.d
--- 143354,143370 ----
  40944b56ee73c24d3046fc9d313639d0  libphobos/libdruntime/core/sys/windows/mciavi.d
  de0387ad10e69b94fa784ddce6bf5b52  libphobos/libdruntime/core/sys/windows/mcx.d
  4af5abe81ec30e4594f5165be0e787e6  libphobos/libdruntime/core/sys/windows/mgmtapi.d
! 505a027d91ea467d17c2afa5190b9768  libphobos/libdruntime/core/sys/windows/mmsystem.d
  da02316c0286de98909d35dced85d22e  libphobos/libdruntime/core/sys/windows/msacm.d
  cb09a9571f48cb8da6c47240ab32a69c  libphobos/libdruntime/core/sys/windows/mshtml.d
  1165bc4ee8dd5fddab6697f2ddda7abe  libphobos/libdruntime/core/sys/windows/mswsock.d
  ea0a8ea5da9f6d375ee3e7b415586a7b  libphobos/libdruntime/core/sys/windows/nb30.d
  0d5ebf7ff5907a657c784cf45edc6a2b  libphobos/libdruntime/core/sys/windows/nddeapi.d
  a36e1c22cb0cd979eaeebff6b6cb786e  libphobos/libdruntime/core/sys/windows/nspapi.d
! 7e99b7b92c15237f346d368811898f8c  libphobos/libdruntime/core/sys/windows/ntdef.d
  5a972328a9f001f96b7f7afa2b624f65  libphobos/libdruntime/core/sys/windows/ntdll.d
  e853cd965a604797654d7dd7b7fb3cc1  libphobos/libdruntime/core/sys/windows/ntldap.d
! 4ae4b4fa75c6b7d02f2ef62451b937f9  libphobos/libdruntime/core/sys/windows/ntsecapi.d
  cf14f024351e812f037a15e61e035b16  libphobos/libdruntime/core/sys/windows/ntsecpkg.d
  eec5257ed84683b9c6c8341222562d8c  libphobos/libdruntime/core/sys/windows/oaidl.d
  dc55a541ce748e353ed098be618b4dbe  libphobos/libdruntime/core/sys/windows/objbase.d
*************** bc7b2c02d0149b6a56b6911f3106030b  libpho
*** 143197,143203 ****
  fb639dbdc66603824f6b26283a9c34ea  libphobos/libdruntime/core/sys/windows/ole2.d
  314785a8f31488c44e22711f37b32e61  libphobos/libdruntime/core/sys/windows/ole2ver.d
  f1014feeb7aa60f8966501198a1fd39b  libphobos/libdruntime/core/sys/windows/oleacc.d
! d2e35473d10776fb6b9732503668ed9c  libphobos/libdruntime/core/sys/windows/oleauto.d
  316de02bf25358124fc47d7d055b8889  libphobos/libdruntime/core/sys/windows/olectl.d
  8a2f4906efa1c72b408e26de16392c75  libphobos/libdruntime/core/sys/windows/olectlid.d
  9b62bd960b416fb13336803877c65384  libphobos/libdruntime/core/sys/windows/oledlg.d
--- 143377,143383 ----
  fb639dbdc66603824f6b26283a9c34ea  libphobos/libdruntime/core/sys/windows/ole2.d
  314785a8f31488c44e22711f37b32e61  libphobos/libdruntime/core/sys/windows/ole2ver.d
  f1014feeb7aa60f8966501198a1fd39b  libphobos/libdruntime/core/sys/windows/oleacc.d
! df89e057c759cdec375a1ddc91ff6f93  libphobos/libdruntime/core/sys/windows/oleauto.d
  316de02bf25358124fc47d7d055b8889  libphobos/libdruntime/core/sys/windows/olectl.d
  8a2f4906efa1c72b408e26de16392c75  libphobos/libdruntime/core/sys/windows/olectlid.d
  9b62bd960b416fb13336803877c65384  libphobos/libdruntime/core/sys/windows/oledlg.d
*************** f45b998596c1b10efbcaaa154e3824a1  libpho
*** 143232,143238 ****
  7756a3f5cad87d4789b99fea17805765  libphobos/libdruntime/core/sys/windows/shellapi.d
  0f9117458e2adccc8d6ce4ae0682b41f  libphobos/libdruntime/core/sys/windows/shldisp.d
  3ad5f1d120a46d1fab8f904f2c9e4c22  libphobos/libdruntime/core/sys/windows/shlguid.d
! c2126d4b550176dbad6b6615ad24e912  libphobos/libdruntime/core/sys/windows/shlobj.d
  000fc0a080bd483a02a25a4dadb2a494  libphobos/libdruntime/core/sys/windows/shlwapi.d
  b8e34210efaf228e2501f59f73077072  libphobos/libdruntime/core/sys/windows/snmp.d
  f6fd3920815e6f0c460857384f5ef896  libphobos/libdruntime/core/sys/windows/sql.d
--- 143412,143418 ----
  7756a3f5cad87d4789b99fea17805765  libphobos/libdruntime/core/sys/windows/shellapi.d
  0f9117458e2adccc8d6ce4ae0682b41f  libphobos/libdruntime/core/sys/windows/shldisp.d
  3ad5f1d120a46d1fab8f904f2c9e4c22  libphobos/libdruntime/core/sys/windows/shlguid.d
! da1eefcfa28e8309fe7f76590ce3e0f1  libphobos/libdruntime/core/sys/windows/shlobj.d
  000fc0a080bd483a02a25a4dadb2a494  libphobos/libdruntime/core/sys/windows/shlwapi.d
  b8e34210efaf228e2501f59f73077072  libphobos/libdruntime/core/sys/windows/snmp.d
  f6fd3920815e6f0c460857384f5ef896  libphobos/libdruntime/core/sys/windows/sql.d
*************** b276dc1b9ec6b033a467b1849662de6a  libpho
*** 143241,143261 ****
  996cc6ffc2a526f305b5e306a0a3966b  libphobos/libdruntime/core/sys/windows/sqlucode.d
  1186df0a3e354e09f8574725247b1c3b  libphobos/libdruntime/core/sys/windows/sspi.d
  d8933a9af92c9c5a5629e35a6807a3e2  libphobos/libdruntime/core/sys/windows/stacktrace.d
! 3878253238d28cf17d94b6d94d6a10ff  libphobos/libdruntime/core/sys/windows/stat.d
  504474997e9ec2d7b220c5798cbd0639  libphobos/libdruntime/core/sys/windows/stdc/malloc.d
  4c8d906b0fdf92aa1689b344b4f58031  libphobos/libdruntime/core/sys/windows/stdc/time.d
  26d4e6b2dd6a9231368560919fe3fb2f  libphobos/libdruntime/core/sys/windows/subauth.d
! 60cbbe09e15045bbe2269b958d381ac0  libphobos/libdruntime/core/sys/windows/threadaux.d
  1c03170e8729fdd1bd3c2afd3155ad1e  libphobos/libdruntime/core/sys/windows/tlhelp32.d
  66bd241f4835318c2108f0125b4bad5f  libphobos/libdruntime/core/sys/windows/tmschema.d
  cc11561706a7991b9feb77841b680282  libphobos/libdruntime/core/sys/windows/unknwn.d
  cb98ff926684a18df476f1124b5354d9  libphobos/libdruntime/core/sys/windows/uuid.d
! 5f290258828a86c1ab308dea34dc9a9d  libphobos/libdruntime/core/sys/windows/vfw.d
  4633f2ba9df184085550d29f9d42125f  libphobos/libdruntime/core/sys/windows/w32api.d
! 8ec0205c8540cc503777abcef9744577  libphobos/libdruntime/core/sys/windows/winbase.d
  36702b0a76945e3420222c08908bcae8  libphobos/libdruntime/core/sys/windows/winber.d
  2903bfe8992d2cb2bfaefea1db4dc184  libphobos/libdruntime/core/sys/windows/wincon.d
! 6d69b260397c77dc2c3dae8bb21692e6  libphobos/libdruntime/core/sys/windows/wincrypt.d
  65bcd9944f4abf3f2c5c5bab875e090e  libphobos/libdruntime/core/sys/windows/windef.d
  293f507b533fce5d73e47c24264d26ff  libphobos/libdruntime/core/sys/windows/windows.d
  b58950289b0dfb2d9e2ef2a62b697df3  libphobos/libdruntime/core/sys/windows/winerror.d
--- 143421,143441 ----
  996cc6ffc2a526f305b5e306a0a3966b  libphobos/libdruntime/core/sys/windows/sqlucode.d
  1186df0a3e354e09f8574725247b1c3b  libphobos/libdruntime/core/sys/windows/sspi.d
  d8933a9af92c9c5a5629e35a6807a3e2  libphobos/libdruntime/core/sys/windows/stacktrace.d
! 12f3c3928c5641f1364db587fead7295  libphobos/libdruntime/core/sys/windows/stat.d
  504474997e9ec2d7b220c5798cbd0639  libphobos/libdruntime/core/sys/windows/stdc/malloc.d
  4c8d906b0fdf92aa1689b344b4f58031  libphobos/libdruntime/core/sys/windows/stdc/time.d
  26d4e6b2dd6a9231368560919fe3fb2f  libphobos/libdruntime/core/sys/windows/subauth.d
! 1a3810be05de6a7b6589cb4ab4c2ec36  libphobos/libdruntime/core/sys/windows/threadaux.d
  1c03170e8729fdd1bd3c2afd3155ad1e  libphobos/libdruntime/core/sys/windows/tlhelp32.d
  66bd241f4835318c2108f0125b4bad5f  libphobos/libdruntime/core/sys/windows/tmschema.d
  cc11561706a7991b9feb77841b680282  libphobos/libdruntime/core/sys/windows/unknwn.d
  cb98ff926684a18df476f1124b5354d9  libphobos/libdruntime/core/sys/windows/uuid.d
! f994edbcfc14581d8dda44b50cf2ff9f  libphobos/libdruntime/core/sys/windows/vfw.d
  4633f2ba9df184085550d29f9d42125f  libphobos/libdruntime/core/sys/windows/w32api.d
! 05a3741ead6a597cef4c8c57245a2296  libphobos/libdruntime/core/sys/windows/winbase.d
  36702b0a76945e3420222c08908bcae8  libphobos/libdruntime/core/sys/windows/winber.d
  2903bfe8992d2cb2bfaefea1db4dc184  libphobos/libdruntime/core/sys/windows/wincon.d
! 5c4e769d493011d95160104dbff2dac9  libphobos/libdruntime/core/sys/windows/wincrypt.d
  65bcd9944f4abf3f2c5c5bab875e090e  libphobos/libdruntime/core/sys/windows/windef.d
  293f507b533fce5d73e47c24264d26ff  libphobos/libdruntime/core/sys/windows/windows.d
  b58950289b0dfb2d9e2ef2a62b697df3  libphobos/libdruntime/core/sys/windows/winerror.d
*************** a6ef0f37410314e536a070e712f80c32  libpho
*** 143266,143278 ****
  2fdae639c1094bb99ec4feab5c961471  libphobos/libdruntime/core/sys/windows/winldap.d
  b2582e2c49b687ebe4fdd7ed150a5f99  libphobos/libdruntime/core/sys/windows/winnetwk.d
  ce637be2829c4171626233b1baaee3b2  libphobos/libdruntime/core/sys/windows/winnls.d
! ea54a4308c111abdf0d903ad3aa593b3  libphobos/libdruntime/core/sys/windows/winnt.d
  aec0a54384dea87ba5f95eef663b8cc9  libphobos/libdruntime/core/sys/windows/winperf.d
  4bb0b47e114ccad718982a27943cfb7b  libphobos/libdruntime/core/sys/windows/winreg.d
  5282f73c2e2b77a86fa709b3ace991f2  libphobos/libdruntime/core/sys/windows/winsock2.d
  3fca7b46a6f195293e8bb548f25f4bf4  libphobos/libdruntime/core/sys/windows/winspool.d
  5627876b09ddab4a33043aaa00363adb  libphobos/libdruntime/core/sys/windows/winsvc.d
! 602c631d29bd9c84f4f9a2606f38cee5  libphobos/libdruntime/core/sys/windows/winuser.d
  91b924b795e506bbb8624edd7a5c04fe  libphobos/libdruntime/core/sys/windows/winver.d
  8a696576926989a12147948a41f20685  libphobos/libdruntime/core/sys/windows/wtsapi32.d
  db396938683f7ba1b2f3f8396c452873  libphobos/libdruntime/core/sys/windows/wtypes.d
--- 143446,143458 ----
  2fdae639c1094bb99ec4feab5c961471  libphobos/libdruntime/core/sys/windows/winldap.d
  b2582e2c49b687ebe4fdd7ed150a5f99  libphobos/libdruntime/core/sys/windows/winnetwk.d
  ce637be2829c4171626233b1baaee3b2  libphobos/libdruntime/core/sys/windows/winnls.d
! 410fdfadd75efa49a3d9b96aee40fd50  libphobos/libdruntime/core/sys/windows/winnt.d
  aec0a54384dea87ba5f95eef663b8cc9  libphobos/libdruntime/core/sys/windows/winperf.d
  4bb0b47e114ccad718982a27943cfb7b  libphobos/libdruntime/core/sys/windows/winreg.d
  5282f73c2e2b77a86fa709b3ace991f2  libphobos/libdruntime/core/sys/windows/winsock2.d
  3fca7b46a6f195293e8bb548f25f4bf4  libphobos/libdruntime/core/sys/windows/winspool.d
  5627876b09ddab4a33043aaa00363adb  libphobos/libdruntime/core/sys/windows/winsvc.d
! ae4f4a06c25bac1e0369fc09a22f6c33  libphobos/libdruntime/core/sys/windows/winuser.d
  91b924b795e506bbb8624edd7a5c04fe  libphobos/libdruntime/core/sys/windows/winver.d
  8a696576926989a12147948a41f20685  libphobos/libdruntime/core/sys/windows/wtsapi32.d
  db396938683f7ba1b2f3f8396c452873  libphobos/libdruntime/core/sys/windows/wtypes.d
*************** db396938683f7ba1b2f3f8396c452873  libpho
*** 143281,143292 ****
  465ddbb387156a894b0eb2d80b928aaf  libphobos/libdruntime/core/thread/fiber/package.d
  fccbb1b5fbca419524fda2cd977c96ff  libphobos/libdruntime/core/thread/osthread.d
  cc5f1b5b44f6a26421e39b60a8310c08  libphobos/libdruntime/core/thread/package.d
! f7ff44bd21af42e5a4cc2d1226928dfc  libphobos/libdruntime/core/thread/threadbase.d
  e56fd11737f2c55b4255fe3d6ac1ef28  libphobos/libdruntime/core/thread/threadgroup.d
  4b62ae0fdc1ad3c3f84e871d1805614e  libphobos/libdruntime/core/thread/types.d
  e64d0d602d45a7d0ff4f2d4918a511c1  libphobos/libdruntime/core/time.d
  dc2476225199a44698695428f73a3562  libphobos/libdruntime/core/vararg.d
! 4cf99596b90593fec63debe10874dfdb  libphobos/libdruntime/core/volatile.d
  064f788d347802e25a84b4176ad920a0  libphobos/libdruntime/etc/valgrind/valgrind.d
  6d8c84f9aadc849a94d832fa65ac8d66  libphobos/libdruntime/etc/valgrind/valgrind_.c
  4925070faeff62a19810edd5aa54a1e9  libphobos/libdruntime/gcc/attribute.d
--- 143461,143472 ----
  465ddbb387156a894b0eb2d80b928aaf  libphobos/libdruntime/core/thread/fiber/package.d
  fccbb1b5fbca419524fda2cd977c96ff  libphobos/libdruntime/core/thread/osthread.d
  cc5f1b5b44f6a26421e39b60a8310c08  libphobos/libdruntime/core/thread/package.d
! edc473c77ce29f43875eb8ca51ce10a4  libphobos/libdruntime/core/thread/threadbase.d
  e56fd11737f2c55b4255fe3d6ac1ef28  libphobos/libdruntime/core/thread/threadgroup.d
  4b62ae0fdc1ad3c3f84e871d1805614e  libphobos/libdruntime/core/thread/types.d
  e64d0d602d45a7d0ff4f2d4918a511c1  libphobos/libdruntime/core/time.d
  dc2476225199a44698695428f73a3562  libphobos/libdruntime/core/vararg.d
! 8fd3a62a61def138cfc3fc4cb394edf9  libphobos/libdruntime/core/volatile.d
  064f788d347802e25a84b4176ad920a0  libphobos/libdruntime/etc/valgrind/valgrind.d
  6d8c84f9aadc849a94d832fa65ac8d66  libphobos/libdruntime/etc/valgrind/valgrind_.c
  4925070faeff62a19810edd5aa54a1e9  libphobos/libdruntime/gcc/attribute.d
*************** f2bc5e78abadaa970deff8afc34f58a8  libpho
*** 143311,143323 ****
  371cb9df3a872784efb0e2e66a99f55b  libphobos/libdruntime/gcc/unwind/generic.d
  a65b4ab3edfbd40ae196e2ada43fc39e  libphobos/libdruntime/gcc/unwind/package.d
  df7fcef7caf5f63cafb73bdb2f8f4050  libphobos/libdruntime/gcc/unwind/pe.d
! 57c04bc56ae9b79300f63e4f559c059e  libphobos/libdruntime/object.d
  d8d516fbbcdaf56dbedecba292ccbbf0  libphobos/libdruntime/rt/aApply.d
  354d74322247f84a028b3aa1a5e7504b  libphobos/libdruntime/rt/aApplyR.d
- c6462c0827ba2937ba0fa71c568718aa  libphobos/libdruntime/rt/aaA.d
- 029f6ffc53ca3b23270a0877dd98bb61  libphobos/libdruntime/rt/adi.d
  b647fb15bc7ed8eeaa50ad59ae9bfe24  libphobos/libdruntime/rt/arraycat.d
- 89f371cbb57e25b0ce593464440b7c8a  libphobos/libdruntime/rt/cast_.d
  b1e402d9e259d6f12026d20eea906cdb  libphobos/libdruntime/rt/config.d
  a0ed14f9f9820952df01a04539a0f23d  libphobos/libdruntime/rt/critical_.d
  95971c2776b2763f2260ca4f40449ef7  libphobos/libdruntime/rt/deh.d
--- 143491,143500 ----
  371cb9df3a872784efb0e2e66a99f55b  libphobos/libdruntime/gcc/unwind/generic.d
  a65b4ab3edfbd40ae196e2ada43fc39e  libphobos/libdruntime/gcc/unwind/package.d
  df7fcef7caf5f63cafb73bdb2f8f4050  libphobos/libdruntime/gcc/unwind/pe.d
! 008bfe6fe8d2c3ce18ff1cfd7857a041  libphobos/libdruntime/object.d
  d8d516fbbcdaf56dbedecba292ccbbf0  libphobos/libdruntime/rt/aApply.d
  354d74322247f84a028b3aa1a5e7504b  libphobos/libdruntime/rt/aApplyR.d
  b647fb15bc7ed8eeaa50ad59ae9bfe24  libphobos/libdruntime/rt/arraycat.d
  b1e402d9e259d6f12026d20eea906cdb  libphobos/libdruntime/rt/config.d
  a0ed14f9f9820952df01a04539a0f23d  libphobos/libdruntime/rt/critical_.d
  95971c2776b2763f2260ca4f40449ef7  libphobos/libdruntime/rt/deh.d
*************** e05a3767be1ffefec3d99bc3db51bbc7  libpho
*** 143325,143333 ****
  94d63a76cd37f837fa8e39cf416590e6  libphobos/libdruntime/rt/dylib_fixes.c
  6487fb837b4932675bbb23237f9a7c03  libphobos/libdruntime/rt/ehalloc.d
  54c5f0846525d6e321ce6c2cbace4dbd  libphobos/libdruntime/rt/invariant_.d
! c3df17c6ca1188850a6d860e539afe12  libphobos/libdruntime/rt/lifetime.d
  3256fa529b5c773a7af9a6a8a2e989cb  libphobos/libdruntime/rt/memory.d
! 7991225305d723ea566edcbd11b4bbe4  libphobos/libdruntime/rt/minfo.d
  cdf59405351ba7c7e3d5450b0f0b0e0e  libphobos/libdruntime/rt/monitor_.d
  bd333879e9738908ba32ef93f52deafc  libphobos/libdruntime/rt/profilegc.d
  1e50d613ef2c1ba6637c9f9dcc750d49  libphobos/libdruntime/rt/sections.d
--- 143502,143510 ----
  94d63a76cd37f837fa8e39cf416590e6  libphobos/libdruntime/rt/dylib_fixes.c
  6487fb837b4932675bbb23237f9a7c03  libphobos/libdruntime/rt/ehalloc.d
  54c5f0846525d6e321ce6c2cbace4dbd  libphobos/libdruntime/rt/invariant_.d
! 9a080a45dcbb269ea73f3fc46db27311  libphobos/libdruntime/rt/lifetime.d
  3256fa529b5c773a7af9a6a8a2e989cb  libphobos/libdruntime/rt/memory.d
! 7e8ad70daaa09cd851c51d9c04812cf2  libphobos/libdruntime/rt/minfo.d
  cdf59405351ba7c7e3d5450b0f0b0e0e  libphobos/libdruntime/rt/monitor_.d
  bd333879e9738908ba32ef93f52deafc  libphobos/libdruntime/rt/profilegc.d
  1e50d613ef2c1ba6637c9f9dcc750d49  libphobos/libdruntime/rt/sections.d
*************** b3025f8fcdacfcfd19b2f680771e0d5b  libpho
*** 143348,143356 ****
  37831246a7b8e5f71727b7a713352035  libphobos/scripts/gen_phobos_sources.d
  483b5aeff7dae9fe9839ad556013fb2b  libphobos/scripts/tests_extractor.d
  e4224ccaecb14d942c71d31bef20d78c  libphobos/src/LICENSE_1_0.txt
! 3e51c8ba46243d4f9c30bbc59e471dcc  libphobos/src/MERGE
! f42d052e5ce59f809ff7d76e54da2d68  libphobos/src/Makefile.am
! 93a3771839df668433ac47fb7dd63d36  libphobos/src/Makefile.in
  ff30fe7275b03f69e2a7796e47d142e8  libphobos/src/drtstuff.spec
  145c3df6886ff3a292f7e57902766615  libphobos/src/etc/c/curl.d
  5b3f5b02dca77e030bb07df6acaa9066  libphobos/src/etc/c/odbc/odbc32.d
--- 143525,143533 ----
  37831246a7b8e5f71727b7a713352035  libphobos/scripts/gen_phobos_sources.d
  483b5aeff7dae9fe9839ad556013fb2b  libphobos/scripts/tests_extractor.d
  e4224ccaecb14d942c71d31bef20d78c  libphobos/src/LICENSE_1_0.txt
! a91791f734c4be59c06a68cba736248a  libphobos/src/MERGE
! af5b0313377f98414fbf08f809a90254  libphobos/src/Makefile.am
! 12d866b1f3b11e05c0876c9009989f67  libphobos/src/Makefile.in
  ff30fe7275b03f69e2a7796e47d142e8  libphobos/src/drtstuff.spec
  145c3df6886ff3a292f7e57902766615  libphobos/src/etc/c/curl.d
  5b3f5b02dca77e030bb07df6acaa9066  libphobos/src/etc/c/odbc/odbc32.d
*************** ff30fe7275b03f69e2a7796e47d142e8  libpho
*** 143362,143401 ****
  af47372314d40b7e06fa4d38102fabb9  libphobos/src/etc/c/odbc/sqlucode.d
  931c194ed998341ff80fd023dffed184  libphobos/src/etc/c/sqlite3.d
  7b80323c83065d7a653fce9728ebac50  libphobos/src/etc/c/zlib.d
! a39d2aad74f3f5fe083a190052cd9c31  libphobos/src/index.dd
  3a1ad66c3c47609c90c1f4d9cf8ddca2  libphobos/src/libgphobos.spec.in
  0cdefe4e8043166cd0339c34b314777f  libphobos/src/std/algorithm/comparison.d
  694c41f4d2a56ffa1cea9387144617a7  libphobos/src/std/algorithm/internal.d
! f3882f6d14e4cd3f0dc79d9a3b4a54e6  libphobos/src/std/algorithm/iteration.d
! 46f68e46c1723e74daf59de7c3fcb33d  libphobos/src/std/algorithm/mutation.d
  3f649d64367da82fd22630117d39a560  libphobos/src/std/algorithm/package.d
! b6fe2af1aa91cdf69b5d1429eac4faf0  libphobos/src/std/algorithm/searching.d
  0168970ef3ddd4482a1113ab62927465  libphobos/src/std/algorithm/setops.d
  c089a9994eed9a6f284bcecab22792e8  libphobos/src/std/algorithm/sorting.d
  62e38c28a4b5080469bebe517ff56026  libphobos/src/std/array.d
! 48d84292d39b7ff9bc2e13b8fa55c40c  libphobos/src/std/ascii.d
  4343438cc03cd4133da56302010ceb07  libphobos/src/std/base64.d
  2ed00320c4f6fe0bf39ad5cb882922b8  libphobos/src/std/bigint.d
  0bc946de2143058018a539da33b0b774  libphobos/src/std/bitmanip.d
  d39b906087da34c3c097a9d293bf5278  libphobos/src/std/checkedint.d
  5c954cc53846cbfcfdab57ef4fcb6abc  libphobos/src/std/compiler.d
! 374506485b6de9f0b3b3b60a86be2947  libphobos/src/std/complex.d
  075117d1c2173b99d010a1aef0b24927  libphobos/src/std/concurrency.d
  055473876e85cd377596e2eb86de9b41  libphobos/src/std/container/array.d
  b2899537b7218e7ff3c84509f244f1e3  libphobos/src/std/container/binaryheap.d
  21f786eb5ba0ba4d7458c50bfe9c56ce  libphobos/src/std/container/dlist.d
  65aae32a5b3a4a7f3e4e38bfe613eb94  libphobos/src/std/container/package.d
! 12b72228f182905b6e53e94c7215d55a  libphobos/src/std/container/rbtree.d
  8c76a4701d3d87cb96d456a7267f5fa5  libphobos/src/std/container/slist.d
  867341eefe22ccbb576dd75fd0283f0c  libphobos/src/std/container/util.d
! fdb5e62dd278889c019d19bf6225f170  libphobos/src/std/conv.d
  169872ce9cf21699f0ef882327c045d9  libphobos/src/std/csv.d
! d42a5e6078c30b46feaf1a69835845ed  libphobos/src/std/datetime/date.d
  18ad046c5d9ef5b4e1008f8a1e5c53ba  libphobos/src/std/datetime/interval.d
  e7bc223bf781f9daca7e4f191059f339  libphobos/src/std/datetime/package.d
  2a0cd347d2cf782c312bf3eb59614d24  libphobos/src/std/datetime/stopwatch.d
! b521a12d5b5cbdfbe6e42a755d0f2f63  libphobos/src/std/datetime/systime.d
! 31234619e842e8ac5b65a4894601946c  libphobos/src/std/datetime/timezone.d
  221da1b10eb5da893eb97e28d5de3171  libphobos/src/std/demangle.d
  9074ecdf1c11c2074e412fd65bc86e53  libphobos/src/std/digest/crc.d
  d6b59ab3bb8a093b58e1c0dfb19b800e  libphobos/src/std/digest/hmac.d
--- 143539,143578 ----
  af47372314d40b7e06fa4d38102fabb9  libphobos/src/etc/c/odbc/sqlucode.d
  931c194ed998341ff80fd023dffed184  libphobos/src/etc/c/sqlite3.d
  7b80323c83065d7a653fce9728ebac50  libphobos/src/etc/c/zlib.d
! fa25eb1b341e933154b909c87ba2fa4d  libphobos/src/index.dd
  3a1ad66c3c47609c90c1f4d9cf8ddca2  libphobos/src/libgphobos.spec.in
  0cdefe4e8043166cd0339c34b314777f  libphobos/src/std/algorithm/comparison.d
  694c41f4d2a56ffa1cea9387144617a7  libphobos/src/std/algorithm/internal.d
! efc0d0f7a95d7d2fe3dd53854c69ffec  libphobos/src/std/algorithm/iteration.d
! b38d74994191c451a28bd76b3d2c6dd0  libphobos/src/std/algorithm/mutation.d
  3f649d64367da82fd22630117d39a560  libphobos/src/std/algorithm/package.d
! e2d0704809516eca3359a1cb2a27a08b  libphobos/src/std/algorithm/searching.d
  0168970ef3ddd4482a1113ab62927465  libphobos/src/std/algorithm/setops.d
  c089a9994eed9a6f284bcecab22792e8  libphobos/src/std/algorithm/sorting.d
  62e38c28a4b5080469bebe517ff56026  libphobos/src/std/array.d
! 9d2cad1389a3ba0d00b5e5e14f404f89  libphobos/src/std/ascii.d
  4343438cc03cd4133da56302010ceb07  libphobos/src/std/base64.d
  2ed00320c4f6fe0bf39ad5cb882922b8  libphobos/src/std/bigint.d
  0bc946de2143058018a539da33b0b774  libphobos/src/std/bitmanip.d
  d39b906087da34c3c097a9d293bf5278  libphobos/src/std/checkedint.d
  5c954cc53846cbfcfdab57ef4fcb6abc  libphobos/src/std/compiler.d
! 5ed079a75eda900fd72b12e2ec90d91e  libphobos/src/std/complex.d
  075117d1c2173b99d010a1aef0b24927  libphobos/src/std/concurrency.d
  055473876e85cd377596e2eb86de9b41  libphobos/src/std/container/array.d
  b2899537b7218e7ff3c84509f244f1e3  libphobos/src/std/container/binaryheap.d
  21f786eb5ba0ba4d7458c50bfe9c56ce  libphobos/src/std/container/dlist.d
  65aae32a5b3a4a7f3e4e38bfe613eb94  libphobos/src/std/container/package.d
! f464afcc3757d4e8d441a4891ee559e2  libphobos/src/std/container/rbtree.d
  8c76a4701d3d87cb96d456a7267f5fa5  libphobos/src/std/container/slist.d
  867341eefe22ccbb576dd75fd0283f0c  libphobos/src/std/container/util.d
! 195bf0c220baced8395ae1828ca3d1d8  libphobos/src/std/conv.d
  169872ce9cf21699f0ef882327c045d9  libphobos/src/std/csv.d
! 41fdbc8fc708104faa45bbe031818fce  libphobos/src/std/datetime/date.d
  18ad046c5d9ef5b4e1008f8a1e5c53ba  libphobos/src/std/datetime/interval.d
  e7bc223bf781f9daca7e4f191059f339  libphobos/src/std/datetime/package.d
  2a0cd347d2cf782c312bf3eb59614d24  libphobos/src/std/datetime/stopwatch.d
! cb75306c6e79595521869842acb2ff90  libphobos/src/std/datetime/systime.d
! f6efdc17cf86e8edd0d4518d964cb4ae  libphobos/src/std/datetime/timezone.d
  221da1b10eb5da893eb97e28d5de3171  libphobos/src/std/demangle.d
  9074ecdf1c11c2074e412fd65bc86e53  libphobos/src/std/digest/crc.d
  d6b59ab3bb8a093b58e1c0dfb19b800e  libphobos/src/std/digest/hmac.d
*************** b47dbe3911d24e7ed5b66df2f0605ccb  libpho
*** 143404,143410 ****
  85ce5ae2e0d618bb94616d25761aef0b  libphobos/src/std/digest/package.d
  4a611bd9d6b92c30cfac32edfd614b54  libphobos/src/std/digest/ripemd.d
  140459aad8321d6a9b0c6e380d62ebed  libphobos/src/std/digest/sha.d
! cdc3d0431aa2e54b40e0570c9a848b27  libphobos/src/std/encoding.d
  40bd5132c4f9aa29a50b0c785523791f  libphobos/src/std/exception.d
  c6b20fb62f7a0f07789137e4e07c65e6  libphobos/src/std/experimental/allocator/building_blocks/affix_allocator.d
  f5a9a6e6207580b72ba6df2195748c52  libphobos/src/std/experimental/allocator/building_blocks/aligned_block_list.d
--- 143581,143587 ----
  85ce5ae2e0d618bb94616d25761aef0b  libphobos/src/std/digest/package.d
  4a611bd9d6b92c30cfac32edfd614b54  libphobos/src/std/digest/ripemd.d
  140459aad8321d6a9b0c6e380d62ebed  libphobos/src/std/digest/sha.d
! 4daba5ce32541978e49e9784cceba405  libphobos/src/std/encoding.d
  40bd5132c4f9aa29a50b0c785523791f  libphobos/src/std/exception.d
  c6b20fb62f7a0f07789137e4e07c65e6  libphobos/src/std/experimental/allocator/building_blocks/affix_allocator.d
  f5a9a6e6207580b72ba6df2195748c52  libphobos/src/std/experimental/allocator/building_blocks/aligned_block_list.d
*************** aaab7cd4d84a361d433bb44d4301c0af  libpho
*** 143415,143421 ****
  5d22e6ee907f6a7a397f942e6fd276f0  libphobos/src/std/experimental/allocator/building_blocks/fallback_allocator.d
  dec0d094addeefa439e83569f2c74cce  libphobos/src/std/experimental/allocator/building_blocks/free_list.d
  0d50c008cf3de079b8e5ef089f66b3b9  libphobos/src/std/experimental/allocator/building_blocks/free_tree.d
! 1f286a74564243215a5618419314de37  libphobos/src/std/experimental/allocator/building_blocks/kernighan_ritchie.d
  52b04093760e06f9eae5cf5a73ae094c  libphobos/src/std/experimental/allocator/building_blocks/null_allocator.d
  a163de86df71f23bd36c9b16fd87eda4  libphobos/src/std/experimental/allocator/building_blocks/package.d
  e1f1ef2268cab16fb9a11654338cbb3c  libphobos/src/std/experimental/allocator/building_blocks/quantizer.d
--- 143592,143598 ----
  5d22e6ee907f6a7a397f942e6fd276f0  libphobos/src/std/experimental/allocator/building_blocks/fallback_allocator.d
  dec0d094addeefa439e83569f2c74cce  libphobos/src/std/experimental/allocator/building_blocks/free_list.d
  0d50c008cf3de079b8e5ef089f66b3b9  libphobos/src/std/experimental/allocator/building_blocks/free_tree.d
! c11ae10268512a1766eb2f3f4a063a48  libphobos/src/std/experimental/allocator/building_blocks/kernighan_ritchie.d
  52b04093760e06f9eae5cf5a73ae094c  libphobos/src/std/experimental/allocator/building_blocks/null_allocator.d
  a163de86df71f23bd36c9b16fd87eda4  libphobos/src/std/experimental/allocator/building_blocks/package.d
  e1f1ef2268cab16fb9a11654338cbb3c  libphobos/src/std/experimental/allocator/building_blocks/quantizer.d
*************** f5600abfe1adcb27ff69f41acaab893b  libpho
*** 143437,143459 ****
  a6638776c1ae6dbc988632be56630654  libphobos/src/std/experimental/logger/nulllogger.d
  1d604e68182f77dfbe797dc01e78c297  libphobos/src/std/experimental/logger/package.d
  768b30d13593aba9e2715a7d868d763e  libphobos/src/std/experimental/note.md
! f4f06bbf7f086f3a622bfd7a11d749b6  libphobos/src/std/file.d
  ed69de5978237426e7bd4ad3c1739056  libphobos/src/std/format/internal/floats.d
  23800e940269aaa2d047e31bdf1ba455  libphobos/src/std/format/internal/read.d
! 9927d3a6be00705545f393e93230439d  libphobos/src/std/format/internal/write.d
  0b7939a8b36bc1ad7a1b39456a0f2f27  libphobos/src/std/format/package.d
  8b55a2d263807b24820e6e80a2b9cd8a  libphobos/src/std/format/read.d
  5ca6bf9438eb9b805e437decc0d26464  libphobos/src/std/format/spec.d
! 8aa87fd1333783a5a0eb34f8800e975d  libphobos/src/std/format/write.d
! e845921f2f8d4b89236548cef4365ba1  libphobos/src/std/functional.d
! c3a442458c258aada0ae9f6d97903e3d  libphobos/src/std/getopt.d
  8069d722b3e53ce8fcea3acb84948ee2  libphobos/src/std/int128.d
  8bc9fa8deafb0e80277b86268d55fa53  libphobos/src/std/internal/attributes.d
  4fc3dee264a23e6b241d6b1e77fc8a4c  libphobos/src/std/internal/cstring.d
! 419502817b164d347a77473f6a6511dc  libphobos/src/std/internal/math/biguintcore.d
  d3a41b19b71afaad9507ea2b7e63baa1  libphobos/src/std/internal/math/biguintnoasm.d
  8163acdb919296a99cd241f472263b56  libphobos/src/std/internal/math/errorfunction.d
! c85341045951a020b04a441a621bdfc3  libphobos/src/std/internal/math/gammafunction.d
  f25b12bd0896d34a7a63eeccbb71ddd1  libphobos/src/std/internal/memory.d
  b8a0549fa22a82b03b350b02592236a5  libphobos/src/std/internal/scopebuffer.d
  9d04fec81b9805b4cb23cb8c29ade815  libphobos/src/std/internal/test/dummyrange.d
--- 143614,143637 ----
  a6638776c1ae6dbc988632be56630654  libphobos/src/std/experimental/logger/nulllogger.d
  1d604e68182f77dfbe797dc01e78c297  libphobos/src/std/experimental/logger/package.d
  768b30d13593aba9e2715a7d868d763e  libphobos/src/std/experimental/note.md
! b33fcc5d233365eca57d47c9d8122bef  libphobos/src/std/file.d
  ed69de5978237426e7bd4ad3c1739056  libphobos/src/std/format/internal/floats.d
  23800e940269aaa2d047e31bdf1ba455  libphobos/src/std/format/internal/read.d
! bfcc8bf8666c2eb0fa777fb48c5dda14  libphobos/src/std/format/internal/write.d
  0b7939a8b36bc1ad7a1b39456a0f2f27  libphobos/src/std/format/package.d
  8b55a2d263807b24820e6e80a2b9cd8a  libphobos/src/std/format/read.d
  5ca6bf9438eb9b805e437decc0d26464  libphobos/src/std/format/spec.d
! c210167a3b02323e6329c264f61d8641  libphobos/src/std/format/write.d
! 38c4186aeeef06f29aaed6a6c2d7dcb2  libphobos/src/std/functional.d
! 417033d918c8a50578ee2b4750f4103f  libphobos/src/std/getopt.d
  8069d722b3e53ce8fcea3acb84948ee2  libphobos/src/std/int128.d
  8bc9fa8deafb0e80277b86268d55fa53  libphobos/src/std/internal/attributes.d
  4fc3dee264a23e6b241d6b1e77fc8a4c  libphobos/src/std/internal/cstring.d
! 76b34656b484bbc367218862de45334b  libphobos/src/std/internal/entropy.d
! 65b2752482c5beafe0d9c3b46fc749bd  libphobos/src/std/internal/math/biguintcore.d
  d3a41b19b71afaad9507ea2b7e63baa1  libphobos/src/std/internal/math/biguintnoasm.d
  8163acdb919296a99cd241f472263b56  libphobos/src/std/internal/math/errorfunction.d
! e6268b8967d003412ab038da4fff8738  libphobos/src/std/internal/math/gammafunction.d
  f25b12bd0896d34a7a63eeccbb71ddd1  libphobos/src/std/internal/memory.d
  b8a0549fa22a82b03b350b02592236a5  libphobos/src/std/internal/scopebuffer.d
  9d04fec81b9805b4cb23cb8c29ade815  libphobos/src/std/internal/test/dummyrange.d
*************** a81af891d911d203ff8431d130fe121d  libpho
*** 143466,143481 ****
  9e85724192d45f8482c5ade6cb407520  libphobos/src/std/internal/unicode_norm.d
  716c1de066b906a19b3a81fa44d7d30d  libphobos/src/std/internal/unicode_tables.d
  1032174c14b8ed750d026d9e33c0f28d  libphobos/src/std/internal/windows/advapi32.d
! 8a68605320e57337881ecc17242eb7b0  libphobos/src/std/internal/windows/bcrypt.d
! 3646a1f94af8490ad26786f6f2c890b6  libphobos/src/std/json.d
  929f2919fe4ac3248380ab2ac45c96d3  libphobos/src/std/logger/core.d
  8b49c5a777ce35ba21edc2815b1a42a3  libphobos/src/std/logger/filelogger.d
  23505f8d8333bbaab46e684fa3fb3e96  libphobos/src/std/logger/multilogger.d
  9c02c2498ffb731d11c25464e692a100  libphobos/src/std/logger/nulllogger.d
  a3782d3b8580d60ebaf89a70af7f468e  libphobos/src/std/logger/package.d
! 05514505beeff1f6c3fb3f6357c279de  libphobos/src/std/math/algebraic.d
  3cee3970cfe6bcde0d4b6c640b9aae04  libphobos/src/std/math/constants.d
! c9f23c32532d09c3ef25b7da6865ccd4  libphobos/src/std/math/exponential.d
  e0c33ea9d408897be690f484f22beb74  libphobos/src/std/math/hardware.d
  7ed460e316b0032b3afd54cbfaf4c2b9  libphobos/src/std/math/operations.d
  ffd91c7d720a05cc92297bfa00f7150d  libphobos/src/std/math/package.d
--- 143644,143658 ----
  9e85724192d45f8482c5ade6cb407520  libphobos/src/std/internal/unicode_norm.d
  716c1de066b906a19b3a81fa44d7d30d  libphobos/src/std/internal/unicode_tables.d
  1032174c14b8ed750d026d9e33c0f28d  libphobos/src/std/internal/windows/advapi32.d
! 66cc75c0ba4019fcaebc5b3f3f6f6da7  libphobos/src/std/json.d
  929f2919fe4ac3248380ab2ac45c96d3  libphobos/src/std/logger/core.d
  8b49c5a777ce35ba21edc2815b1a42a3  libphobos/src/std/logger/filelogger.d
  23505f8d8333bbaab46e684fa3fb3e96  libphobos/src/std/logger/multilogger.d
  9c02c2498ffb731d11c25464e692a100  libphobos/src/std/logger/nulllogger.d
  a3782d3b8580d60ebaf89a70af7f468e  libphobos/src/std/logger/package.d
! d8f795902be376414e804c2210e0022a  libphobos/src/std/math/algebraic.d
  3cee3970cfe6bcde0d4b6c640b9aae04  libphobos/src/std/math/constants.d
! fdcb7091f61f288ffb5fddf180890949  libphobos/src/std/math/exponential.d
  e0c33ea9d408897be690f484f22beb74  libphobos/src/std/math/hardware.d
  7ed460e316b0032b3afd54cbfaf4c2b9  libphobos/src/std/math/operations.d
  ffd91c7d720a05cc92297bfa00f7150d  libphobos/src/std/math/package.d
*************** ffd91c7d720a05cc92297bfa00f7150d  libpho
*** 143483,143502 ****
  7d5f60b5115b54dbb62902f440eff6bc  libphobos/src/std/math/rounding.d
  55d099fefe01ba1713d89a88e07604f7  libphobos/src/std/math/traits.d
  bb6782b1bf2a9aaca15560a63e26a8c7  libphobos/src/std/math/trigonometry.d
! 7fa986b6825d8e7e1d7602c9fae96379  libphobos/src/std/mathspecial.d
  3fcc7e62612171e7a4e18b8c0053b366  libphobos/src/std/meta.d
  5204762dc86326245efda7ef0935652e  libphobos/src/std/mmfile.d
! e2e3e4448ee7a4a6949d9ee7cd374079  libphobos/src/std/net/curl.d
  8f6dbfa8c1df10b8e6ef116eb55bbe40  libphobos/src/std/net/isemail.d
! 76d53c466a4130d76567b2f16a44955c  libphobos/src/std/numeric.d
  9dc136f20a441f69fb85806ebd8d9971  libphobos/src/std/outbuffer.d
  f0acf0010f4a57e539c9ce4e9d0f5755  libphobos/src/std/package.d
  fb97c6706a8ec3eeff9a08855dbbc191  libphobos/src/std/parallelism.d
! e3dcbcb47e44c146bfe964c32e3405b7  libphobos/src/std/path.d
  9f451091ebf983a7ebbc657afdd2033c  libphobos/src/std/process.d
! e50ec2f3b092d1ec03bb8d935f41fa85  libphobos/src/std/random.d
  9aefa68666e3b2384142dd9837b4d2af  libphobos/src/std/range/interfaces.d
! 99450dfbc22ce9a2140c1d6ef5039620  libphobos/src/std/range/package.d
  ae94d782479273704d5fc6db0ddc4610  libphobos/src/std/range/primitives.d
  4ca1f589b5a11920b25b46baeec8699a  libphobos/src/std/regex/internal/backtracking.d
  44883eb43e246b6b244c1ff51ebf2822  libphobos/src/std/regex/internal/generator.d
--- 143660,143679 ----
  7d5f60b5115b54dbb62902f440eff6bc  libphobos/src/std/math/rounding.d
  55d099fefe01ba1713d89a88e07604f7  libphobos/src/std/math/traits.d
  bb6782b1bf2a9aaca15560a63e26a8c7  libphobos/src/std/math/trigonometry.d
! 1d01e7e8d56cae738c9bd28dcedf13a4  libphobos/src/std/mathspecial.d
  3fcc7e62612171e7a4e18b8c0053b366  libphobos/src/std/meta.d
  5204762dc86326245efda7ef0935652e  libphobos/src/std/mmfile.d
! bfce3399bbfb8b0a89d282dd5be0d04e  libphobos/src/std/net/curl.d
  8f6dbfa8c1df10b8e6ef116eb55bbe40  libphobos/src/std/net/isemail.d
! bc2c3810ea01d879e9408dc7d301693d  libphobos/src/std/numeric.d
  9dc136f20a441f69fb85806ebd8d9971  libphobos/src/std/outbuffer.d
  f0acf0010f4a57e539c9ce4e9d0f5755  libphobos/src/std/package.d
  fb97c6706a8ec3eeff9a08855dbbc191  libphobos/src/std/parallelism.d
! ce1fe5d48bc66d2758b1c8b3de1d0184  libphobos/src/std/path.d
  9f451091ebf983a7ebbc657afdd2033c  libphobos/src/std/process.d
! 9fc77ecccca136b32c53d6d411e57e47  libphobos/src/std/random.d
  9aefa68666e3b2384142dd9837b4d2af  libphobos/src/std/range/interfaces.d
! 5ae74fc76ea8338eb7ec54cd5ce8da14  libphobos/src/std/range/package.d
  ae94d782479273704d5fc6db0ddc4610  libphobos/src/std/range/primitives.d
  4ca1f589b5a11920b25b46baeec8699a  libphobos/src/std/regex/internal/backtracking.d
  44883eb43e246b6b244c1ff51ebf2822  libphobos/src/std/regex/internal/generator.d
*************** ac0a9a606c95c4c1632599630d77cac4  libpho
*** 143511,143527 ****
  f1e5d9632198af0ed951b9298581129e  libphobos/src/std/socket.d
  65fa3f6f1125566206c3a4ac3e8adfe3  libphobos/src/std/stdint.d
  ba9b15fc7c0dacd4465cd8ac35bb1737  libphobos/src/std/stdio.d
! 5254adcca3d606e13ed19d6f8818f72f  libphobos/src/std/string.d
! 32b57e96d1127a6c8920a61eaa7fc6b1  libphobos/src/std/sumtype.d
  fe0985971c6aad99d6e99e55e8705f09  libphobos/src/std/system.d
! e1e754bd47a185fd7c5ce7857f2e9a8d  libphobos/src/std/traits.d
! f861aea339d5b71adcd4d085659a8018  libphobos/src/std/typecons.d
  8592c7afe7a1de32c25d04e3fa0f2bca  libphobos/src/std/typetuple.d
  88046575f79aa525d347b8652fd2b9ba  libphobos/src/std/uni/package.d
  c2ff190df1f5298cbcc40494150b1d48  libphobos/src/std/uri.d
  6925d1c023c389c0e8f51b64ef03a335  libphobos/src/std/utf.d
! d53dba64586b623edf2ae379fc36eb4c  libphobos/src/std/uuid.d
! 1245f559d26070a7dccc857105863503  libphobos/src/std/variant.d
  fb2675bdcc716cb272a59ab642e3b40b  libphobos/src/std/windows/charset.d
  dd46a2873cda836b4a607e35ac2a3835  libphobos/src/std/windows/registry.d
  c1a103b661be58e2c1a62e8aab13650e  libphobos/src/std/windows/syserror.d
--- 143688,143704 ----
  f1e5d9632198af0ed951b9298581129e  libphobos/src/std/socket.d
  65fa3f6f1125566206c3a4ac3e8adfe3  libphobos/src/std/stdint.d
  ba9b15fc7c0dacd4465cd8ac35bb1737  libphobos/src/std/stdio.d
! 3ce8af7c2852c1265dec0a87dcae7842  libphobos/src/std/string.d
! 50aac7e49f4e9f183cf6d8139f052561  libphobos/src/std/sumtype.d
  fe0985971c6aad99d6e99e55e8705f09  libphobos/src/std/system.d
! 40044e6203b6543c2a40ef7de9c98151  libphobos/src/std/traits.d
! 809a4871f261845dc9c0db1310a1ac7b  libphobos/src/std/typecons.d
  8592c7afe7a1de32c25d04e3fa0f2bca  libphobos/src/std/typetuple.d
  88046575f79aa525d347b8652fd2b9ba  libphobos/src/std/uni/package.d
  c2ff190df1f5298cbcc40494150b1d48  libphobos/src/std/uri.d
  6925d1c023c389c0e8f51b64ef03a335  libphobos/src/std/utf.d
! ccb0bf5b4db227ed3ce4406469008d1f  libphobos/src/std/uuid.d
! 28786b956eb7d3fc1856c675c46bdbde  libphobos/src/std/variant.d
  fb2675bdcc716cb272a59ab642e3b40b  libphobos/src/std/windows/charset.d
  dd46a2873cda836b4a607e35ac2a3835  libphobos/src/std/windows/registry.d
  c1a103b661be58e2c1a62e8aab13650e  libphobos/src/std/windows/syserror.d
*************** c345e0c58342f032fbeb00c63fdb3340  libpho
*** 143533,143539 ****
  aa70b4cf24946de203c671b652c53970  libphobos/testsuite/lib/libphobos-dg.exp
  58de7a7537cc7fc649654206ea43f0ee  libphobos/testsuite/lib/libphobos.exp
  cbb0b94d3f71fbf479418214a976a34d  libphobos/testsuite/libphobos.aa/aa.exp
! bdf16dafaa6a389d60b373bd2cb66abd  libphobos/testsuite/libphobos.aa/test_aa.d
  d86b969dda21cc9af1483872e4a3dcc8  libphobos/testsuite/libphobos.allocations/alloc_from_assert.d
  ef2bd4a0583795c33a64a5f146f0dfb9  libphobos/testsuite/libphobos.allocations/allocations.exp
  7dfee0831ce08cfd971056dee5ce8519  libphobos/testsuite/libphobos.allocations/overflow_from_existing.d
--- 143710,143716 ----
  aa70b4cf24946de203c671b652c53970  libphobos/testsuite/lib/libphobos-dg.exp
  58de7a7537cc7fc649654206ea43f0ee  libphobos/testsuite/lib/libphobos.exp
  cbb0b94d3f71fbf479418214a976a34d  libphobos/testsuite/libphobos.aa/aa.exp
! 937d7b2264e909d3515b1b6604e7c622  libphobos/testsuite/libphobos.aa/test_aa.d
  d86b969dda21cc9af1483872e4a3dcc8  libphobos/testsuite/libphobos.allocations/alloc_from_assert.d
  ef2bd4a0583795c33a64a5f146f0dfb9  libphobos/testsuite/libphobos.allocations/allocations.exp
  7dfee0831ce08cfd971056dee5ce8519  libphobos/testsuite/libphobos.allocations/overflow_from_existing.d
*************** cbb0b94d3f71fbf479418214a976a34d  libpho
*** 143589,143595 ****
  d06bb08dcefe11cf56550d766ac037d9  libphobos/testsuite/libphobos.hash/test_hash.d
  d132751bd41e111dc5e97a83ea5cfe55  libphobos/testsuite/libphobos.imports/bug18193.d
  3f746b9ece82f3daf339499783841843  libphobos/testsuite/libphobos.imports/imports.exp
! 3711270b62cf23653c36c22efc9cfdea  libphobos/testsuite/libphobos.init_fini/custom_gc.d
  9ef8a15824b040d3d5eac4a429deba5b  libphobos/testsuite/libphobos.init_fini/init_fini.exp
  b6bbf47234f6bdb61c628cae44fb04f9  libphobos/testsuite/libphobos.init_fini/runtime_args.d
  6e0f2e6611c4974eb8f6ad893e3243c9  libphobos/testsuite/libphobos.init_fini/test18996.d
--- 143766,143772 ----
  d06bb08dcefe11cf56550d766ac037d9  libphobos/testsuite/libphobos.hash/test_hash.d
  d132751bd41e111dc5e97a83ea5cfe55  libphobos/testsuite/libphobos.imports/bug18193.d
  3f746b9ece82f3daf339499783841843  libphobos/testsuite/libphobos.imports/imports.exp
! 0ba42ef3c303a2e62528b94d8ccb78b0  libphobos/testsuite/libphobos.init_fini/custom_gc.d
  9ef8a15824b040d3d5eac4a429deba5b  libphobos/testsuite/libphobos.init_fini/init_fini.exp
  b6bbf47234f6bdb61c628cae44fb04f9  libphobos/testsuite/libphobos.init_fini/runtime_args.d
  6e0f2e6611c4974eb8f6ad893e3243c9  libphobos/testsuite/libphobos.init_fini/test18996.d
*************** a73d560a3ba317c5ad0a7919d87b4b6d  libssp
*** 144406,144412 ****
  7d75fa0d30318408fe4cd91d9cbe3ac7  libssp/vsnprintf-chk.c
  e9ff0f4bdd1be75a507480ed1267459d  libssp/vsprintf-chk.c
  9e2de2e1f20ab0ffa2201164de02824f  libstdc++-v3/.editorconfig
! 365d0d6544424653c6303fc319d5b63d  libstdc++-v3/ChangeLog
  7aa6c40440a44fcf5ec94c066160c2f8  libstdc++-v3/ChangeLog-1998
  7aff86600b6a1ed3fa87305075a92db0  libstdc++-v3/ChangeLog-1999
  a6f28e8fc9bb07696a9e068b439a3a87  libstdc++-v3/ChangeLog-2000
--- 144583,144589 ----
  7d75fa0d30318408fe4cd91d9cbe3ac7  libssp/vsnprintf-chk.c
  e9ff0f4bdd1be75a507480ed1267459d  libssp/vsprintf-chk.c
  9e2de2e1f20ab0ffa2201164de02824f  libstdc++-v3/.editorconfig
! ae6dfd3c5d360f896125c44755edec2a  libstdc++-v3/ChangeLog
  7aa6c40440a44fcf5ec94c066160c2f8  libstdc++-v3/ChangeLog-1998
  7aff86600b6a1ed3fa87305075a92db0  libstdc++-v3/ChangeLog-1999
  a6f28e8fc9bb07696a9e068b439a3a87  libstdc++-v3/ChangeLog-2000
*************** f1d0636ae23d86ef530870b7af26304f  libstd
*** 144532,144538 ****
  038a0d5fd0ce020a651d805ea6b89b4c  libstdc++-v3/config/locale/gnu/c_locale.h
  84b31f2fc888cc41a6284ee8b1ffaacf  libstdc++-v3/config/locale/gnu/codecvt_members.cc
  97fe817e7fd8a775c987857a2de1c7e1  libstdc++-v3/config/locale/gnu/collate_members.cc
! 9920e1abc55631bebaae8f4caff1d672  libstdc++-v3/config/locale/gnu/ctype_members.cc
  530d638694990b86ff2157ed50040393  libstdc++-v3/config/locale/gnu/messages_members.cc
  e62ff531437c3255098476fbdd1f4204  libstdc++-v3/config/locale/gnu/messages_members.h
  ddada81c32f9922e3a3f71183dba39a9  libstdc++-v3/config/locale/gnu/monetary_members.cc
--- 144709,144715 ----
  038a0d5fd0ce020a651d805ea6b89b4c  libstdc++-v3/config/locale/gnu/c_locale.h
  84b31f2fc888cc41a6284ee8b1ffaacf  libstdc++-v3/config/locale/gnu/codecvt_members.cc
  97fe817e7fd8a775c987857a2de1c7e1  libstdc++-v3/config/locale/gnu/collate_members.cc
! 1271b312321caab3a210dee1d62c98ba  libstdc++-v3/config/locale/gnu/ctype_members.cc
  530d638694990b86ff2157ed50040393  libstdc++-v3/config/locale/gnu/messages_members.cc
  e62ff531437c3255098476fbdd1f4204  libstdc++-v3/config/locale/gnu/messages_members.h
  ddada81c32f9922e3a3f71183dba39a9  libstdc++-v3/config/locale/gnu/monetary_members.cc
*************** bc0412a9556e7ed39afe5103b73f1f26  libstd
*** 145070,145077 ****
  7b70f0f77a50b976605aef6dbeb1e282  libstdc++-v3/doc/xml/spine.xml
  bd966b4a0df6f2a84f9770525581d45c  libstdc++-v3/doc/xsl/customization.xsl.in
  42d14268f2b16c54a6bc2f71538a838c  libstdc++-v3/fragment.am
! 08dac128f197db92bc5aad9e5c9c96ea  libstdc++-v3/include/Makefile.am
! dfe89e84a7d05d846fbd2c1df43f04af  libstdc++-v3/include/Makefile.in
  c43a95ade3f229bbf11e4df12e566d23  libstdc++-v3/include/backward/auto_ptr.h
  a5311733ecd17a8f51066f4a2a351abd  libstdc++-v3/include/backward/backward_warning.h
  5c3fe230b3089d4b9c58b4a86af57005  libstdc++-v3/include/backward/binders.h
--- 145247,145254 ----
  7b70f0f77a50b976605aef6dbeb1e282  libstdc++-v3/doc/xml/spine.xml
  bd966b4a0df6f2a84f9770525581d45c  libstdc++-v3/doc/xsl/customization.xsl.in
  42d14268f2b16c54a6bc2f71538a838c  libstdc++-v3/fragment.am
! 1360304538a542575b0d83eb658a1498  libstdc++-v3/include/Makefile.am
! 47a40d8988f233f8ebb233e6e42c9113  libstdc++-v3/include/Makefile.in
  c43a95ade3f229bbf11e4df12e566d23  libstdc++-v3/include/backward/auto_ptr.h
  a5311733ecd17a8f51066f4a2a351abd  libstdc++-v3/include/backward/backward_warning.h
  5c3fe230b3089d4b9c58b4a86af57005  libstdc++-v3/include/backward/binders.h
*************** bceed1a9b573696caadf95cf3ea8f02f  libstd
*** 145085,145091 ****
  dec832c4e096f15d10aafd4c825cc195  libstdc++-v3/include/bits/alloc_traits.h
  54d70975b96f74e9dab06dcfdeb88658  libstdc++-v3/include/bits/allocated_ptr.h
  0165e84a80837de3ebdfeed0fa40ec8d  libstdc++-v3/include/bits/allocator.h
! 2cfbe359478e6cf4c8824f0ba55d72b1  libstdc++-v3/include/bits/atomic_base.h
  504ddf67fe31254fb67815770ee690ba  libstdc++-v3/include/bits/atomic_futex.h
  e901edfc8eef441d1adabd54be25b807  libstdc++-v3/include/bits/atomic_timed_wait.h
  f9d5ca9bad80a3b4725fbabfd0ff8318  libstdc++-v3/include/bits/atomic_wait.h
--- 145262,145268 ----
  dec832c4e096f15d10aafd4c825cc195  libstdc++-v3/include/bits/alloc_traits.h
  54d70975b96f74e9dab06dcfdeb88658  libstdc++-v3/include/bits/allocated_ptr.h
  0165e84a80837de3ebdfeed0fa40ec8d  libstdc++-v3/include/bits/allocator.h
! 91a03cd35941ae7ed8d8be72934ef4d3  libstdc++-v3/include/bits/atomic_base.h
  504ddf67fe31254fb67815770ee690ba  libstdc++-v3/include/bits/atomic_futex.h
  e901edfc8eef441d1adabd54be25b807  libstdc++-v3/include/bits/atomic_timed_wait.h
  f9d5ca9bad80a3b4725fbabfd0ff8318  libstdc++-v3/include/bits/atomic_wait.h
*************** c04d8e83343df391a348af7cf384e792  libstd
*** 145172,145178 ****
  571addb6a7ba251f10f9342f9b041ae5  libstdc++-v3/include/bits/ranges_uninitialized.h
  1e16e9219782b5cd7f75c9d3e4611b1b  libstdc++-v3/include/bits/ranges_util.h
  eba2c9ee0f0d650f6223eb4f40e83b02  libstdc++-v3/include/bits/refwrap.h
! 29b907d496a3123737aa7efce4d590fc  libstdc++-v3/include/bits/regex.h
  746950b080d4cbb1e202307e888a93c3  libstdc++-v3/include/bits/regex.tcc
  d62176e59366818434c2a0ad6ef3b77b  libstdc++-v3/include/bits/regex_automaton.h
  7f7a38e87eaa1a1df665e82e34676187  libstdc++-v3/include/bits/regex_automaton.tcc
--- 145349,145355 ----
  571addb6a7ba251f10f9342f9b041ae5  libstdc++-v3/include/bits/ranges_uninitialized.h
  1e16e9219782b5cd7f75c9d3e4611b1b  libstdc++-v3/include/bits/ranges_util.h
  eba2c9ee0f0d650f6223eb4f40e83b02  libstdc++-v3/include/bits/refwrap.h
! 6764b39d51cbc4f39fddde947d8fe251  libstdc++-v3/include/bits/regex.h
  746950b080d4cbb1e202307e888a93c3  libstdc++-v3/include/bits/regex.tcc
  d62176e59366818434c2a0ad6ef3b77b  libstdc++-v3/include/bits/regex_automaton.h
  7f7a38e87eaa1a1df665e82e34676187  libstdc++-v3/include/bits/regex_automaton.tcc
*************** d62176e59366818434c2a0ad6ef3b77b  libstd
*** 145180,145187 ****
  491f2e1710d8e0ee4cbfadbbd2892662  libstdc++-v3/include/bits/regex_compiler.tcc
  d3f233b7eec1704a8dbae3ba302cd591  libstdc++-v3/include/bits/regex_constants.h
  50ec2de0a344b64a276e732b37641aae  libstdc++-v3/include/bits/regex_error.h
! 338d5bd9e2890da336f471575c7fbd03  libstdc++-v3/include/bits/regex_executor.h
! 7711d5ae14e51817cded9e3c634c02d2  libstdc++-v3/include/bits/regex_executor.tcc
  fc20035df7d49f1eceffb4cb72ad6814  libstdc++-v3/include/bits/regex_scanner.h
  cbd44f9447b308b0901004443db53e93  libstdc++-v3/include/bits/regex_scanner.tcc
  22a9676313472917eaaccc27ddfb10f4  libstdc++-v3/include/bits/requires_hosted.h
--- 145357,145364 ----
  491f2e1710d8e0ee4cbfadbbd2892662  libstdc++-v3/include/bits/regex_compiler.tcc
  d3f233b7eec1704a8dbae3ba302cd591  libstdc++-v3/include/bits/regex_constants.h
  50ec2de0a344b64a276e732b37641aae  libstdc++-v3/include/bits/regex_error.h
! 6c8ff0bed217343128e9191134ee89f6  libstdc++-v3/include/bits/regex_executor.h
! 5d5c2c9d7afbd50070738d21addc8520  libstdc++-v3/include/bits/regex_executor.tcc
  fc20035df7d49f1eceffb4cb72ad6814  libstdc++-v3/include/bits/regex_scanner.h
  cbd44f9447b308b0901004443db53e93  libstdc++-v3/include/bits/regex_scanner.tcc
  22a9676313472917eaaccc27ddfb10f4  libstdc++-v3/include/bits/requires_hosted.h
*************** cbd44f9447b308b0901004443db53e93  libstd
*** 145189,145195 ****
  39e2988a6581d891172e27c28e87c62f  libstdc++-v3/include/bits/semaphore_base.h
  a5e720346d3b4c60bfbcb9cf9a79f417  libstdc++-v3/include/bits/shared_ptr.h
  06d870671ae35152d9e8442900c80215  libstdc++-v3/include/bits/shared_ptr_atomic.h
! 0f5813d0f3c66b3146cee40b1f5cf407  libstdc++-v3/include/bits/shared_ptr_base.h
  c7864edd44ec162778d0cb89b0129937  libstdc++-v3/include/bits/slice_array.h
  78e195bd62ca638897505b698c3193de  libstdc++-v3/include/bits/specfun.h
  42139ff046a9321ce4a72fb8ee89a008  libstdc++-v3/include/bits/sstream.tcc
--- 145366,145372 ----
  39e2988a6581d891172e27c28e87c62f  libstdc++-v3/include/bits/semaphore_base.h
  a5e720346d3b4c60bfbcb9cf9a79f417  libstdc++-v3/include/bits/shared_ptr.h
  06d870671ae35152d9e8442900c80215  libstdc++-v3/include/bits/shared_ptr_atomic.h
! 702f905b7fc00c89ecacee8e82ba19d9  libstdc++-v3/include/bits/shared_ptr_base.h
  c7864edd44ec162778d0cb89b0129937  libstdc++-v3/include/bits/slice_array.h
  78e195bd62ca638897505b698c3193de  libstdc++-v3/include/bits/specfun.h
  42139ff046a9321ce4a72fb8ee89a008  libstdc++-v3/include/bits/sstream.tcc
*************** d1cf5a35c4ad3820cb023d8f84762cc7  libstd
*** 145248,145255 ****
  ddd4bdc2fa29f8f2aa3386cead9ebcb2  libstdc++-v3/include/bits/valarray_array.tcc
  16c6db3f5b1e7b3e37c3febbf4dc4e8c  libstdc++-v3/include/bits/valarray_before.h
  5a7dd3eca21d4650e654ea51da466c59  libstdc++-v3/include/bits/vector.tcc
! d89531786a0bf6e9703d85bf20430596  libstdc++-v3/include/bits/version.def
! 7c50b02cca48a05bf1465c0c25b1334d  libstdc++-v3/include/bits/version.h
  f92789aa59d1ed5207e13c936667059d  libstdc++-v3/include/bits/version.tpl
  d99b1b69e5f87e5a631c8a881d053766  libstdc++-v3/include/c/cassert
  7f5b12607c4d7cbbcf705b672613447b  libstdc++-v3/include/c/cctype
--- 145425,145432 ----
  ddd4bdc2fa29f8f2aa3386cead9ebcb2  libstdc++-v3/include/bits/valarray_array.tcc
  16c6db3f5b1e7b3e37c3febbf4dc4e8c  libstdc++-v3/include/bits/valarray_before.h
  5a7dd3eca21d4650e654ea51da466c59  libstdc++-v3/include/bits/vector.tcc
! db60147851e09e1376cd4a0514c74409  libstdc++-v3/include/bits/version.def
! 71086b5f0aa4277dd3f0819ca2f8eab9  libstdc++-v3/include/bits/version.h
  f92789aa59d1ed5207e13c936667059d  libstdc++-v3/include/bits/version.tpl
  d99b1b69e5f87e5a631c8a881d053766  libstdc++-v3/include/c/cassert
  7f5b12607c4d7cbbcf705b672613447b  libstdc++-v3/include/c/cctype
*************** c6720f0a7f2a3f9397a1d015515a6ca6  libstd
*** 145405,145411 ****
  60c94b172174d97035d0f922981ceaf2  libstdc++-v3/include/experimental/bits/string_view.tcc
  bb1f9ef706b721a2de289747165208b1  libstdc++-v3/include/experimental/buffer
  d048e5b70f22e59dfeef185737f94eec  libstdc++-v3/include/experimental/chrono
- 5acbb50c9ad85bb8fcf3cae295858cdb  libstdc++-v3/include/experimental/contract
  c97cf9ce9193ec48be8a332c03f1570c  libstdc++-v3/include/experimental/deque
  cad6cabb644462acbbfbe6eb144e500c  libstdc++-v3/include/experimental/executor
  b5527ea1991610f4f17edbefd678d40d  libstdc++-v3/include/experimental/filesystem
--- 145582,145587 ----
*************** c698c1ffe0a8bca7840bf982885e5592  libstd
*** 145770,145776 ****
  b598ca744dd57c47a8db41c9c83fa8c4  libstdc++-v3/include/parallel/unique_copy.h
  d8d948c3273e96ae05bc4e2157b7ed8f  libstdc++-v3/include/parallel/workstealing.h
  efd116d146d6a6c8e05e44e670969ea4  libstdc++-v3/include/precompiled/extc++.h
! 73607c563f6a32ec33783be9fd868d54  libstdc++-v3/include/precompiled/stdc++.h
  3ab672866727a190adc92eb3b765484f  libstdc++-v3/include/precompiled/stdtr1c++.h
  75cfb36aeb3ed8672bb4e2957272203c  libstdc++-v3/include/pstl/LICENSE.txt
  6aa52d6b70bfb53073697375741dff45  libstdc++-v3/include/pstl/algorithm_fwd.h
--- 145946,145952 ----
  b598ca744dd57c47a8db41c9c83fa8c4  libstdc++-v3/include/parallel/unique_copy.h
  d8d948c3273e96ae05bc4e2157b7ed8f  libstdc++-v3/include/parallel/workstealing.h
  efd116d146d6a6c8e05e44e670969ea4  libstdc++-v3/include/precompiled/extc++.h
! a11d273c4a3fef59b0d065d9af1d9c56  libstdc++-v3/include/precompiled/stdc++.h
  3ab672866727a190adc92eb3b765484f  libstdc++-v3/include/precompiled/stdtr1c++.h
  75cfb36aeb3ed8672bb4e2957272203c  libstdc++-v3/include/pstl/LICENSE.txt
  6aa52d6b70bfb53073697375741dff45  libstdc++-v3/include/pstl/algorithm_fwd.h
*************** f1cc3238df41adc204bc4f90accc63f3  libstd
*** 145799,145805 ****
  4598b57244995567c24672d3c0cdb7b3  libstdc++-v3/include/std/algorithm
  f1c08a4c9a736109edfd3c39c60c1669  libstdc++-v3/include/std/any
  7eec97c02f2ad002721647488d07f1d7  libstdc++-v3/include/std/array
! 6c9f4e0328759f035ac054990b6e4118  libstdc++-v3/include/std/atomic
  43d5b40ea90d5c416339579b4b867b3f  libstdc++-v3/include/std/barrier
  085ec2d298f0be079b303330b81b05d1  libstdc++-v3/include/std/bit
  c3ffcd8b87d4589e457faa7a3a7601d6  libstdc++-v3/include/std/bitset
--- 145975,145981 ----
  4598b57244995567c24672d3c0cdb7b3  libstdc++-v3/include/std/algorithm
  f1c08a4c9a736109edfd3c39c60c1669  libstdc++-v3/include/std/any
  7eec97c02f2ad002721647488d07f1d7  libstdc++-v3/include/std/array
! 65ed1af3aa1b4755db9e67e27e6543fb  libstdc++-v3/include/std/atomic
  43d5b40ea90d5c416339579b4b867b3f  libstdc++-v3/include/std/barrier
  085ec2d298f0be079b303330b81b05d1  libstdc++-v3/include/std/bit
  c3ffcd8b87d4589e457faa7a3a7601d6  libstdc++-v3/include/std/bitset
*************** f626b898ff7fcaf45e839e0aaaf8b995  libstd
*** 145809,145819 ****
  841a79fbef033cbe8ca8c554dc66d5b9  libstdc++-v3/include/std/complex
  d2be6ad28181eee2feab5cac0a1cf141  libstdc++-v3/include/std/concepts
  6a29620511421350fff096067c3ca0da  libstdc++-v3/include/std/condition_variable
  30926456f62b01c212f18e128fa8f543  libstdc++-v3/include/std/coroutine
  f945d16289e71c13744e7d9177de9ccc  libstdc++-v3/include/std/debugging
  7d736af3f0c3ef350561362e2e73c5a6  libstdc++-v3/include/std/deque
  649d9183a0fa35d50371bb1bce3f70c2  libstdc++-v3/include/std/execution
! 052926694ae14ab58056f592f18ff448  libstdc++-v3/include/std/expected
  a7bd3ed542c1ec721a89a69bc151a3d6  libstdc++-v3/include/std/filesystem
  f004e380db68bad2f1a8548323345a5c  libstdc++-v3/include/std/flat_map
  b384f6e8eb77f0d5747534b3ed9a89cb  libstdc++-v3/include/std/flat_set
--- 145985,145996 ----
  841a79fbef033cbe8ca8c554dc66d5b9  libstdc++-v3/include/std/complex
  d2be6ad28181eee2feab5cac0a1cf141  libstdc++-v3/include/std/concepts
  6a29620511421350fff096067c3ca0da  libstdc++-v3/include/std/condition_variable
+ 06b11a1e5cc0c972b2dd8f609c556cec  libstdc++-v3/include/std/contracts
  30926456f62b01c212f18e128fa8f543  libstdc++-v3/include/std/coroutine
  f945d16289e71c13744e7d9177de9ccc  libstdc++-v3/include/std/debugging
  7d736af3f0c3ef350561362e2e73c5a6  libstdc++-v3/include/std/deque
  649d9183a0fa35d50371bb1bce3f70c2  libstdc++-v3/include/std/execution
! cf1ce3b9ae9b0bf218dd78fc89d04300  libstdc++-v3/include/std/expected
  a7bd3ed542c1ec721a89a69bc151a3d6  libstdc++-v3/include/std/filesystem
  f004e380db68bad2f1a8548323345a5c  libstdc++-v3/include/std/flat_map
  b384f6e8eb77f0d5747534b3ed9a89cb  libstdc++-v3/include/std/flat_set
*************** a5c4f3df840ba7c3fbc9b7b9d5567ef2  libstd
*** 145854,145860 ****
  a53d359dd7618cc0d3f2447f5f60fff3  libstdc++-v3/include/std/semaphore
  8c7c0f73062baca94fefcd7643a3f699  libstdc++-v3/include/std/set
  d9b30ac9f13a2d342a56ff319aca749e  libstdc++-v3/include/std/shared_mutex
! b3ff5d9751c631a9afbb044b52dfb623  libstdc++-v3/include/std/source_location
  b5619289ac9c606b19a5eaf5008fe7df  libstdc++-v3/include/std/span
  efdde6d8d883a91854d4ae616b627e53  libstdc++-v3/include/std/spanstream
  f00ff992c96a4a6422d964aad9315664  libstdc++-v3/include/std/sstream
--- 146031,146037 ----
  a53d359dd7618cc0d3f2447f5f60fff3  libstdc++-v3/include/std/semaphore
  8c7c0f73062baca94fefcd7643a3f699  libstdc++-v3/include/std/set
  d9b30ac9f13a2d342a56ff319aca749e  libstdc++-v3/include/std/shared_mutex
! 587b98001ea4db3cac03e009eec4700d  libstdc++-v3/include/std/source_location
  b5619289ac9c606b19a5eaf5008fe7df  libstdc++-v3/include/std/span
  efdde6d8d883a91854d4ae616b627e53  libstdc++-v3/include/std/spanstream
  f00ff992c96a4a6422d964aad9315664  libstdc++-v3/include/std/sstream
*************** ba1de75ac9c1bb7d2506c503fe17708a  libstd
*** 146184,146190 ****
  ea41b659ccf9f3e1850802e2fddaba52  libstdc++-v3/src/c++23/print.cc
  15f6b28b71ad24bc5b6d33c21048e59a  libstdc++-v3/src/c++23/stacktrace.cc
  c319163994652e23066095eded5869f0  libstdc++-v3/src/c++23/std-clib.cc.in
! 8b3786ec30b7e0442db2886fc6e05fc0  libstdc++-v3/src/c++23/std.cc.in
  ef2786c62e1aa27a5405d7bf70e5212c  libstdc++-v3/src/c++23/std.compat.cc.in
  9b1a87f1df1badcb59f9d461e995392d  libstdc++-v3/src/c++26/Makefile.am
  7bb4fc4ec0d17bf1e304be661919aad7  libstdc++-v3/src/c++26/Makefile.in
--- 146361,146367 ----
  ea41b659ccf9f3e1850802e2fddaba52  libstdc++-v3/src/c++23/print.cc
  15f6b28b71ad24bc5b6d33c21048e59a  libstdc++-v3/src/c++23/stacktrace.cc
  c319163994652e23066095eded5869f0  libstdc++-v3/src/c++23/std-clib.cc.in
! 416dc8e4fc393925a3e508d64d08a236  libstdc++-v3/src/c++23/std.cc.in
  ef2786c62e1aa27a5405d7bf70e5212c  libstdc++-v3/src/c++23/std.compat.cc.in
  9b1a87f1df1badcb59f9d461e995392d  libstdc++-v3/src/c++26/Makefile.am
  7bb4fc4ec0d17bf1e304be661919aad7  libstdc++-v3/src/c++26/Makefile.in
*************** cb9f0ce7b6b1204a1709a4edd6e2c581  libstd
*** 146230,146238 ****
  d3f0cc2cabf7299b55620ca9aa06a57a  libstdc++-v3/src/c++98/strstream.cc
  78352ac8023edf853e7108794fbee149  libstdc++-v3/src/c++98/tree.cc
  067c47f2f42913b2b6f5f68837afe9f7  libstdc++-v3/src/c++98/valarray.cc
! 8c057a876c989b76bf5b9ff883653fe4  libstdc++-v3/src/experimental/Makefile.am
! 108862e7463db10a9bf58c3240482dba  libstdc++-v3/src/experimental/Makefile.in
! 378dbcd9bb3413a94ec82dbaeab12c8b  libstdc++-v3/src/experimental/contract.cc
  b6eb8bb1cd9be8390c8051e209be07bb  libstdc++-v3/src/filesystem/Makefile.am
  92882265e9dd6b1e3a3ad1f734fc9e7f  libstdc++-v3/src/filesystem/Makefile.in
  266958109b626ccbcdd44b040cc2409c  libstdc++-v3/src/filesystem/cow-dir.cc
--- 146407,146415 ----
  d3f0cc2cabf7299b55620ca9aa06a57a  libstdc++-v3/src/c++98/strstream.cc
  78352ac8023edf853e7108794fbee149  libstdc++-v3/src/c++98/tree.cc
  067c47f2f42913b2b6f5f68837afe9f7  libstdc++-v3/src/c++98/valarray.cc
! 7d0a1c9e233e4f04bd2af43f94422ae6  libstdc++-v3/src/experimental/Makefile.am
! e6a13537ccd33424af067aab2dbe6313  libstdc++-v3/src/experimental/Makefile.in
! 92e60cd249975451ed5b40d57a045cb7  libstdc++-v3/src/experimental/contract26.cc
  b6eb8bb1cd9be8390c8051e209be07bb  libstdc++-v3/src/filesystem/Makefile.am
  92882265e9dd6b1e3a3ad1f734fc9e7f  libstdc++-v3/src/filesystem/Makefile.in
  266958109b626ccbcdd44b040cc2409c  libstdc++-v3/src/filesystem/cow-dir.cc
*************** c10fe70e48c9fa9c48a817108d290629  libstd
*** 146320,146325 ****
--- 146497,146505 ----
  bdd469026d3bc77ddbe9761819df1999  libstdc++-v3/testsuite/18_support/comparisons/object/93479.cc
  7b45b0d874b32588521fd2729eccc3cf  libstdc++-v3/testsuite/18_support/comparisons/object/lwg3530.cc
  c25441430dc4aeccff157f8fd0f6bfad  libstdc++-v3/testsuite/18_support/comparisons/type_order/1.cc
+ 34d57c1d9a8be936f81aab528468a98b  libstdc++-v3/testsuite/18_support/contracts/includes.cc
+ 2a26a0a0e6856b66827cceaf8257e9b6  libstdc++-v3/testsuite/18_support/contracts/invoke_default_cvh.cc
+ a48259cf2dc7fdce0dd213702cb38485  libstdc++-v3/testsuite/18_support/contracts/invoke_default_cvh2.cc
  d0a24cdda56dca4acc05b4d194c731e3  libstdc++-v3/testsuite/18_support/coroutines/95917.cc
  783af524f848615e0b0b76d03bcc9e9c  libstdc++-v3/testsuite/18_support/coroutines/hash.cc
  74c121e0875645b9d2f8ff1bed2655c1  libstdc++-v3/testsuite/18_support/coroutines/lwg3460.cc
*************** b6846002a3a56bb10b1621e1792c246a  libstd
*** 146829,146835 ****
  087d8f0146738536fce2d6ebd4e78f9a  libstdc++-v3/testsuite/20_util/expected/lwg4366.cc
  4824cecd15088232e3348b8bad95b2ce  libstdc++-v3/testsuite/20_util/expected/monadic.cc
  9f3d4b6d2922882be16e10312d73ca38  libstdc++-v3/testsuite/20_util/expected/observers.cc
! 8854ae6d49bfd2df3b2f3a9095f61fc4  libstdc++-v3/testsuite/20_util/expected/requirements.cc
  8c41a21e12dcb978b196eabf48e15513  libstdc++-v3/testsuite/20_util/expected/swap.cc
  44dfca2fb3ccdb8f3ea97514568bab14  libstdc++-v3/testsuite/20_util/expected/synopsis.cc
  4b84f057fc22805edcab3b394acb5a2f  libstdc++-v3/testsuite/20_util/expected/unexpected.cc
--- 147009,147015 ----
  087d8f0146738536fce2d6ebd4e78f9a  libstdc++-v3/testsuite/20_util/expected/lwg4366.cc
  4824cecd15088232e3348b8bad95b2ce  libstdc++-v3/testsuite/20_util/expected/monadic.cc
  9f3d4b6d2922882be16e10312d73ca38  libstdc++-v3/testsuite/20_util/expected/observers.cc
! fbc55e5b031355e586d9d25d43d3000d  libstdc++-v3/testsuite/20_util/expected/requirements.cc
  8c41a21e12dcb978b196eabf48e15513  libstdc++-v3/testsuite/20_util/expected/swap.cc
  44dfca2fb3ccdb8f3ea97514568bab14  libstdc++-v3/testsuite/20_util/expected/synopsis.cc
  4b84f057fc22805edcab3b394acb5a2f  libstdc++-v3/testsuite/20_util/expected/unexpected.cc
*************** fd968dbf2fcb9e3f38ec990b5a68790a  libstd
*** 153957,153962 ****
--- 154137,154143 ----
  37484f2185fa134b24894e9bae0f9dcd  libstdc++-v3/testsuite/29_atomics/atomic_integral/cons/value_init.cc
  c194c379a7913582e21284169fb07dab  libstdc++-v3/testsuite/29_atomics/atomic_integral/is_always_lock_free.cc
  49916b00a3edf0ee609af9f7b43beebd  libstdc++-v3/testsuite/29_atomics/atomic_integral/nonmembers.cc
+ 80657e5fe1155ba0eff550cd9d41a930  libstdc++-v3/testsuite/29_atomics/atomic_integral/nonmembers_fetch_minmax.cc
  1649b721a86d7fa1fb699730f6a3effe  libstdc++-v3/testsuite/29_atomics/atomic_integral/operators/bitwise.cc
  51103359c0774e947c399caa898e96ea  libstdc++-v3/testsuite/29_atomics/atomic_integral/operators/bitwise_neg.cc
  83da00975afa7b0616add9c483c16847  libstdc++-v3/testsuite/29_atomics/atomic_integral/operators/decrement.cc
*************** c57185193702620b24b0faea2ddffe07  libstd
*** 153978,153983 ****
--- 154159,154165 ----
  ff483e47cc304ebed2db904a6b22972d  libstdc++-v3/testsuite/29_atomics/atomic_ref/float.cc
  8162e7335db0d5d2f52d167918157dbd  libstdc++-v3/testsuite/29_atomics/atomic_ref/generic.cc
  76d0cc744a07bb7d5fb86e971a18a3c5  libstdc++-v3/testsuite/29_atomics/atomic_ref/integral.cc
+ 466eeaef9d0bd9d12bfc1c0d9b52cc18  libstdc++-v3/testsuite/29_atomics/atomic_ref/integral_fetch_minmax.cc
  779308cbe51f34e0b8b26f34816217fd  libstdc++-v3/testsuite/29_atomics/atomic_ref/op_support.cc
  7f262f301b67efbcff14280713c325ba  libstdc++-v3/testsuite/29_atomics/atomic_ref/pointer.cc
  d89567d561f7608f056076f9523ac8ce  libstdc++-v3/testsuite/29_atomics/atomic_ref/requirements.cc
*************** dee72a6a60e99528b0d17bf3ff9a1e15  ltopti
*** 156679,156685 ****
  bc2f6032c98896249eadb56177c7d357  ltsugar.m4
  c30cd33c496505f13d9fbdb6970c7c33  ltversion.m4
  293853a13b7e218e3a4342cf85fbbf25  lt~obsolete.m4
! 29642b36e10ee0301830c202dca5abd2  maintainer-scripts/ChangeLog
  33c7bc2d2c55956dfac85a05d8a80eff  maintainer-scripts/README
  507e832af5f2d63b8a78eef217c807a7  maintainer-scripts/branch_changer.py
  c819510f0d438149c1518bda7b165ac4  maintainer-scripts/bugzilla-close-candidate.py
--- 156861,156867 ----
  bc2f6032c98896249eadb56177c7d357  ltsugar.m4
  c30cd33c496505f13d9fbdb6970c7c33  ltversion.m4
  293853a13b7e218e3a4342cf85fbbf25  lt~obsolete.m4
! 04bf09ef34da593b8167afac026a20eb  maintainer-scripts/ChangeLog
  33c7bc2d2c55956dfac85a05d8a80eff  maintainer-scripts/README
  507e832af5f2d63b8a78eef217c807a7  maintainer-scripts/branch_changer.py
  c819510f0d438149c1518bda7b165ac4  maintainer-scripts/bugzilla-close-candidate.py
*************** c67f943b672b0dc1c628ebb0e2df97a3  mainta
*** 156689,156695 ****
  33d97164a8610c7abf67eff7d28f47ff  maintainer-scripts/maintainer-addresses
  1fcc4f18e9f9043eaea6c3c990d96d9b  maintainer-scripts/setup.cfg
  1012437849cecda6e54b3948f279ae93  maintainer-scripts/update_version_git
! fc6ca4aa2bd66d8a1ca62ac146f634bf  maintainer-scripts/update_web_docs_git
  f96ea8872725419d57ba3089658c607e  maintainer-scripts/update_web_docs_libstdcxx_git
  5f2a276ee7b8decec541391229d03591  missing
  fbe2467afef81c41c166173adeb0ee20  mkdep
--- 156871,156877 ----
  33d97164a8610c7abf67eff7d28f47ff  maintainer-scripts/maintainer-addresses
  1fcc4f18e9f9043eaea6c3c990d96d9b  maintainer-scripts/setup.cfg
  1012437849cecda6e54b3948f279ae93  maintainer-scripts/update_version_git
! c54146fad8d652b15279dc9ef7a83901  maintainer-scripts/update_web_docs_git
  f96ea8872725419d57ba3089658c607e  maintainer-scripts/update_web_docs_libstdcxx_git
  5f2a276ee7b8decec541391229d03591  missing
  fbe2467afef81c41c166173adeb0ee20  mkdep
diff -Nrcpad gcc-16-20260125/contrib/ChangeLog gcc-16-20260201/contrib/ChangeLog
*** gcc-16-20260125/contrib/ChangeLog	Sun Jan 25 22:32:06 2026
--- gcc-16-20260201/contrib/ChangeLog	Sun Feb  1 22:32:06 2026
***************
*** 1,3 ****
--- 1,7 ----
+ 2026-01-31  Pietro Monteiro  <pietro@sociotechnical.xyz>
+ 
+ 	* compare_tests: Use egrep if 'grep -E' is not supported.
+ 
  2026-01-09  Jakub Jelinek  <jakub@redhat.com>
  
  	* update-copyright.py (GCCFilter): Don't filter out
diff -Nrcpad gcc-16-20260125/contrib/compare_tests gcc-16-20260201/contrib/compare_tests
*** gcc-16-20260125/contrib/compare_tests	Sun Jan 25 22:32:06 2026
--- gcc-16-20260201/contrib/compare_tests	Sun Feb  1 22:32:06 2026
*************** sort -t ':' $skip1 "$before" > "$before_
*** 136,143 ****
  # If we used the input files (so generally several times the same
  # results in one section per target), we would incorreclty detect
  # duplicates (as many as targets)
! grep -E '^(PASS|XPASS|FAIL|XFAIL|UNRESOLVED|UNSUPPORTED|UNTESTED|ERROR):' "$now_s"    | uniq -cd > "$now_u"
! grep -E '^(PASS|XPASS|FAIL|XFAIL|UNRESOLVED|UNSUPPORTED|UNTESTED|ERROR):' "$before_s" | uniq -cd > "$before_u"
  
  same_uniq=" now"
  cmp -s "$before_u" "$now_u" && same_uniq=""
--- 136,149 ----
  # If we used the input files (so generally several times the same
  # results in one section per target), we would incorreclty detect
  # duplicates (as many as targets)
! EGREP="grep -E"
! 
! if ! echo PASS | $EGREP '^(PASS|FAIL)' >/dev/null 2>&1; then
!     EGREP="egrep"
! fi
! 
! $EGREP '^(PASS|XPASS|FAIL|XFAIL|UNRESOLVED|UNSUPPORTED|UNTESTED|ERROR):' "$now_s"    | uniq -cd > "$now_u"
! $EGREP '^(PASS|XPASS|FAIL|XFAIL|UNRESOLVED|UNSUPPORTED|UNTESTED|ERROR):' "$before_s" | uniq -cd > "$before_u"
  
  same_uniq=" now"
  cmp -s "$before_u" "$now_u" && same_uniq=""
*************** fi
*** 151,157 ****
  
  if [ -s "$before_u" -a "x$same_uniq" != "x" ]; then
      echo "Changes to non-unique test names:"
!     diff -u "$before_u" "$now_u" | grep -E '^[-\\+] '
      echo
      exit_status=1
  fi
--- 157,163 ----
  
  if [ -s "$before_u" -a "x$same_uniq" != "x" ]; then
      echo "Changes to non-unique test names:"
!     diff -u "$before_u" "$now_u" | $EGREP '^[-\\+] '
      echo
      exit_status=1
  fi
diff -Nrcpad gcc-16-20260125/gcc/ChangeLog gcc-16-20260201/gcc/ChangeLog
*** gcc-16-20260125/gcc/ChangeLog	Sun Jan 25 22:32:06 2026
--- gcc-16-20260201/gcc/ChangeLog	Sun Feb  1 22:32:06 2026
***************
*** 1,3 ****
--- 1,705 ----
+ 2026-01-31  Keith Packard  <keithp@keithp.com>
+ 
+ 	* config/picolibc-spec.h (LIBC_LINK_SPEC): Use find-file for test
+ 	and access to picolibc.ld.
+ 
+ 2026-01-31  Richard Biener  <rguenther@suse.de>
+ 
+ 	PR middle-end/123887
+ 	* match.pd ((a ? x : y) !=/== (b ? x : y)): Make sure
+ 	x and y have no side-effects before evaluating them
+ 	unconditionally.
+ 
+ 2026-01-31  Gerald Pfeifer  <gerald@pfeifer.com>
+ 
+ 	* doc/install.texi (Binaries): Switch delorie.com to https.
+ 
+ 2026-01-30  Richard Biener  <rguenther@suse.de>
+ 
+ 	PR middle-end/123887
+ 	* match.pd ((zero_one ==/!= 0) ? .. z <op> y .. -> zero_one * z ..):
+ 	Check evaluating z unconditionally has no side-effects, like
+ 	trapping.
+ 
+ 2026-01-30  Richard Biener  <rguenther@suse.de>
+ 
+ 	PR debug/123886
+ 	* dwarf2out.cc (sym_off_pair::sym): Remove GTY((skip)).
+ 
+ 2026-01-30  Michal Jires  <mjires@suse.cz>
+ 
+ 	* doc/extend.texi: Mention flto-toplevel-asm-heuristics.
+ 	* doc/invoke.texi: Add flto-toplevel-asm-heuristics.
+ 
+ 2026-01-30  Richard Biener  <rguenther@suse.de>
+ 
+ 	PR debug/110885
+ 	* dwarf2out.cc (generate_skeleton_bottom_up): Generate the
+ 	skeleton ancestor tree when moving a new child to the parent
+ 	even for template instantiations.
+ 
+ 2026-01-30  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR tree-optimization/123864
+ 	* match.pd (__builtin_mul_overflow_p (x, cst, (stype) 0) ->
+ 	x > stype_max / cst || x < stype_min / cst): Only check
+ 	integer_minus_onep for signed types.
+ 
+ 2026-01-30  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR c++/123790
+ 	* fold-const.cc (fold_convert_const): Handle conversion of
+ 	integer_zerop to NULLPTR_TYPE.
+ 	(fold_convert_loc): Likewise.
+ 
+ 2026-01-30  Jørgen Kvalsvik  <j@lambda.is>
+ 
+ 	PR gcov-profile/123855
+ 	* path-coverage.cc (flush_on_edges): Only look up SSA name def
+ 	stmt when counter is non-const.
+ 
+ 2026-01-30  Jørgen Kvalsvik  <j@lambda.is>
+ 
+ 	* gcov-dump.cc (tag_paths): New function.
+ 
+ 2026-01-30  Jørgen Kvalsvik  <j@lambda.is>
+ 
+ 	* common.opt: ftest-coverage enabled by fpath-coverage or
+ 	fcondition-coverage
+ 
+ 2026-01-30  Jørgen Kvalsvik  <j@lambda.is>
+ 
+ 	* gcov-dump.cc (tag_conditions):  Read position before blocks,
+ 	terms.
+ 
+ 2026-01-30  Jørgen Kvalsvik  <j@lambda.is>
+ 
+ 	PR gcov-profile/121084
+ 	PR gcov-profile/121123
+ 	PR gcov-profile/121409
+ 	* profile.cc (branch_prob): Record seen_locations without
+ 	discriminators.
+ 
+ 2026-01-30  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR middle-end/123876
+ 	* omp-low.cc (diagnose_sb_2): Handle GIMPLE_ASM.
+ 
+ 2026-01-30  Alex Coplan  <alex.coplan@arm.com>
+ 
+ 	PR target/123206
+ 	* config/aarch64/aarch64-builtins.cc (struct aarch64_pragma_builtins_data):
+ 	Declare array as CONSTEXPR.
+ 	* config/aarch64/aarch64-simd-pragma-builtins.def: Update
+ 	incorrect uses of TARGET_SIMD to use AARCH64_FL_SIMD instead.
+ 
+ 2026-01-30  Richard Biener  <rguenther@suse.de>
+ 
+ 	PR tree-optimization/109410
+ 	* tree-ssa-reassoc.cc (build_and_add_sum): Use
+ 	gsi_start_nondebug_after_labels_bb to look for a possible
+ 	returns-twice call.
+ 
+ 2026-01-30  Iain Buclaw  <ibuclaw@gdcproject.org>
+ 
+ 	* config/darwin-d.cc (darwin_d_os_builtins): Add Apple.
+ 
+ 2026-01-30  Andrew Pinski  <andrew.pinski@oss.qualcomm.com>
+ 
+ 	PR rtl-optimization/122170
+ 	* ifcvt.cc (noce_can_force_operand): Don't only check if
+ 	there is an optab for the code check the entry for the
+ 	mode is non-null. Handle non integral div by checking
+ 	optab like force_operand does.
+ 
+ 2026-01-30  Lulu Cheng  <chenglulu@loongson.cn>
+ 
+ 	* config/loongarch/loongarch-ftypes.def: Remove unused type.
+ 
+ 2026-01-30  Lulu Cheng  <chenglulu@loongson.cn>
+ 
+ 	PR target/123766
+ 	* config/loongarch/loongarch-builtins.cc
+ 	(loongarch_build_vpointer_type): New function.  Return a type
+ 	for 'volatile void *'.
+ 	(LARCH_ATYPE_VPOINTER): New macro.
+ 	* config/loongarch/loongarch-ftypes.def: Change the pointer
+ 	type of the store class function from CVPOINTER to VPOINTER.
+ 
+ 2026-01-30  Lulu Cheng  <chenglulu@loongson.cn>
+ 
+ 	PR target/123807
+ 	* config/loongarch/loongarch.cc
+ 	(loongarch_expand_vector_init_same): When same is MEM and
+ 	GET_MODE(same) != imode, first load the data from memory
+ 	and then process it further.
+ 
+ 2026-01-30  mengqinggang  <mengqinggang@loongson.cn>
+ 
+ 	* config/loongarch/loongarch.md: Delete movsf TARGET_HARD_FLOAT
+ 	condition.
+ 
+ 2026-01-29  Andrew Pinski  <andrew.pinski@oss.qualcomm.com>
+ 
+ 	PR middle-end/123869
+ 	* optabs.cc (expand_unop): Move the NEG optab
+ 	handling before the widening code.
+ 	Move the ABS bitwise expansion from expand_abs_nojump
+ 	to before the widening code.
+ 	(expand_abs_nojump): Remove the bitwise expansion trial
+ 	since expand_unop is called right above.
+ 
+ 2026-01-29  Roger Sayle  <roger@nextmovesoftware.com>
+ 
+ 	* expr.cc (emit_group_load_1): Don't call force_reg if orig_src
+ 	is already a CONCAT.
+ 
+ 2026-01-29  Sandra Loosemore  <sloosemore@baylibre.com>
+ 
+ 	* doc/options.texi (Options): Point to the "user experience"
+ 	documentation.
+ 	* doc/ux.texi (Guidelines for Options): Add some.
+ 
+ 2026-01-29  Robin Dapp  <rdapp@oss.qualcomm.com>
+ 
+ 	PR target/123806
+ 	* config/riscv/riscv-string.cc (expand_rawmemchr): Use unified
+ 	vl_read.
+ 	(expand_strcmp): Ditto.
+ 	* config/riscv/riscv-vector-builtins-bases.cc:
+ 	* config/riscv/riscv-vector-builtins.cc (function_expander::use_fof_load_insn):
+ 	Only emit the store and not the VL read.
+ 	* config/riscv/riscv-vsetvl.cc (get_fof_set_vl_reg): New
+ 	function.
+ 	(init_rtl_ssa): New wrapper.
+ 	(finish_rtl_ssa): Ditto.
+ 	(emit_fof_read_vls): Emit read_vl after each fault-only-first
+ 	load.
+ 	(pass_vsetvl::simple_vsetvl): Call emit_fof_read_vls ().
+ 	(pass_vsetvl::lazy_vsetvl): Ditto.
+ 	* config/riscv/vector-iterators.md: Add read_vl unspec.
+ 	* config/riscv/vector.md (read_vlsi): Unify.
+ 	(@read_vl<mode>): Ditto.
+ 	(read_vldi_zero_extend): Ditto.
+ 	(@pred_fault_load_set_vl<V_VLS:mode><P:mode>): New FoF variant
+ 	that saves VL in a register.
+ 	(@pred_fault_load_set_vl<VT:mode><P:mode>): Ditto.
+ 
+ 2026-01-29  Filip Kastl  <fkastl@suse.cz>
+ 
+ 	* gimple-ssa-pta-constraints.cc (make_param_constraints): Adjust
+ 	comment: The function only creates varinfos for the parameters,
+ 	the return value and the static chain.
+ 
+ 2026-01-29  Richard Biener  <rguenther@suse.de>
+ 
+ 	PR tree-optimization/122537
+ 	* tree-ssa-loop-niter.cc (number_of_iterations_lt_to_ne): Register
+ 	may_be_zero condition when the IV may overflow.
+ 
+ 2026-01-29  Sangamesh Mallayya  <swamy.sangamesh@gmail.com>
+ 
+ 	* diagnostics/sarif-sink.cc: Move config.h at the begining.
+ 
+ 2026-01-29  Richard Biener  <rguenther@suse.de>
+ 
+ 	PR tree-optimization/123596
+ 	* tree-eh.cc (sink_clobbers): Create a virtual PHI when
+ 	one is required but not present, queuing arguments
+ 	for renaming.
+ 
+ 2026-01-29  Richard Biener  <rguenther@suse.de>
+ 
+ 	PR tree-optimization/116747
+ 	* tree-ssa-phiopt.cc (cond_if_else_store_replacement): Avoid
+ 	duplicate stmts in the set of store pairs to process.
+ 
+ 2026-01-28  Uros Bizjak  <ubizjak@gmail.com>
+ 
+ 	PR target/36503
+ 	* config/i386/i386.md (*<insn:any_shift><mode:SWI48>3_sub):
+ 	Also allow operands[3] & (<mode_bitsize>-1) == (<mode_bitsize>-1)
+ 	in insn condition. Emit NOT RTX instead of NEG RTX in this case.
+ 	(*<insn:any_shift><mode:SWI48>3_sub_1): Ditto.
+ 
+ 2026-01-28  Robin Dapp  <rdapp@oss.qualcomm.com>
+ 
+ 	PR target/123824
+ 	* config/riscv/riscv.cc (riscv_vls_mode_fits_in_gprs_p): New
+ 	helper.
+ 	(riscv_pass_vls_aggregate_in_gpr): Use helper and distribute
+ 	half-fitting vector to GPR and stack.
+ 	(riscv_pass_aggregate_in_vr): Reformat comment.
+ 	(riscv_get_arg_info): Use helper.
+ 	(riscv_pass_by_reference): Ditto.
+ 
+ 2026-01-28  Vladimir N. Makarov  <vmakarov@redhat.com>
+ 
+ 	PR target/121571
+ 	* lra-constraints.cc (process_alt_operands): Reprocess asm insn
+ 	when there are no enough regs for the asm-insn.
+ 
+ 2026-01-28  Richard Biener  <rguenther@suse.de>
+ 
+ 	PR middle-end/123575
+ 	* match.pd (abs ((T)x) -> absu (x)): For vector type
+ 	arguments require the resulting operation is supported.
+ 
+ 2026-01-28  Richard Biener  <rguenther@suse.de>
+ 
+ 	PR ipa/111036
+ 	* match.pd (__builtin_constant_p ((T)x)): Strip nop-conversions
+ 	from __builtin_constant_p arguments.
+ 
+ 2026-01-28  Richard Biener  <rguenther@suse.de>
+ 
+ 	PR rtl-optimization/106859
+ 	* var-tracking.cc (val_store): Dump -1 as UID if setting_insn
+ 	is NULL.
+ 
+ 2026-01-28  Richard Biener  <rguenther@suse.de>
+ 
+ 	PR tree-optimization/123537
+ 	* match.pd (REDUC (@0 & @1) -> @0[I] & @1[I]): Restrict
+ 	allowed conversions.
+ 
+ 2026-01-28  Karl Meakin  <karl.meakin@arm.com>
+ 
+ 	* doc/invoke.texi: Document `+sve-bfscale` flag.
+ 	* config/aarch64/aarch64.h (TARGET_SVE_BFSCALE): New macro.
+ 	* config/aarch64/aarch64-c.cc (aarch64_update_cpp_builtins):
+ 	Define `__AARCH64_FEATURE_SVE_BFSCALE`.
+ 	* config/aarch64/aarch64-sve-builtins-base.cc: Skip constant
+ 	folding for floating-point or unpredicated multiplications.
+ 	* config/aarch64/aarch64-sve-builtins-sve2.def: New `SVE_FUNCTION`s.
+ 	* config/aarch64/aarch64-sve.md: Modify insns for
+ 	`SVE_COND_FP_BINARY_INT` to handle BF16 modes.
+ 	* config/aarch64/aarch64-sve2.md
+ 	(@aarch64_sve_<optab><mode>, @aarch64_sve_<optab><mode>_single): New insn for `BFSCALE`.
+ 	Modify insns for `UNSPEC_FSCALE` to handle BF16 modes.
+ 	* config/aarch64/iterators.md (SVE_FULL_F_SCALAR): Add `VNx8BF` to iterator.
+ 	(SVE_FULL_F_BFSCALE): New iterator.
+ 	(SVE_Fx24_BFSCALE): New iterator.
+ 	(SVE_BFx24): New iterator.
+ 	(UNSPEC_FMUL): New unspec.
+ 	(V_INT_EQUIV): Add entries for BF16 modes.
+ 	(b): Add entries for scalar float modes.
+ 	(is_bf16): Add entries for BF16 modes and reformat.
+ 	(SVSCALE_SINGLE_INTARG): Likewise.
+ 	(SVSCALE_INTARG): Likewise.
+ 	(SVE_FP_MULL): New iterator.
+ 
+ 2026-01-28  Pengfei Li  <Pengfei.Li2@arm.com>
+ 
+ 	PR middle-end/123447
+ 	* expr.cc (expand_expr_real_1): Increase stack slot alignment
+ 	for STRICT_ALIGNMENT targets.
+ 
+ 2026-01-28  Andre Vieira  <andre.simoesdiasvieira@arm.com>
+ 
+ 	PR target/123016
+ 	* tree-vect-stmts.cc (vectorizable_simd_clone_call): use
+ 	'build_truth_vector_type_for_mode' to reconstruct mask's vectype for
+ 	non-scalar masks.
+ 
+ 2026-01-28  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR c/101312
+ 	* langhooks.h (struct lang_hooks_for_types): Remove
+ 	copy_lang_qualifiers.  Add build_lang_qualified_type.
+ 	* langhooks.cc (lhd_build_lang_qualified_type): New function.
+ 	* langhooks-def.h (lhd_build_lang_qualified_type): Declare.
+ 	(LANG_HOOKS_COPY_LANG_QUALIFIERS): Remove.
+ 	(LANG_HOOKS_BUILD_LANG_QUALIFIED_TYPE): Add.
+ 	(LANG_HOOKS_FOR_TYPES_INITIALIZER): Use
+ 	LANG_HOOKS_BUILD_LANG_QUALIFIED_TYPE instead of
+ 	LANG_HOOKS_COPY_LANG_QUALIFIERS.
+ 	* attribs.cc (build_type_attribute_qual_variant): Use
+ 	lang_hooks.types.build_lang_qualified_type instead of
+ 	build_qualified_type and/or build_qualified_type with
+ 	optional lang_hooks.types.copy_lang_qualifiers call.
+ 	(attr_access::array_as_string): Use "array " attribute instead of
+ 	"array".  If attribute has been created or intended quals differ
+ 	from quals of build_array_type, use copy_node and adjust quals and
+ 	attributes on the copy, print and then ggc_free.
+ 
+ 2026-01-28  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR c++/123837
+ 	* ipa-free-lang-data.cc (find_decls_types_r): Remove C++ annotations
+ 	from {DECL,TYPE}_ATRIBUTES.
+ 
+ 2026-01-28  Andrew Pinski  <andrew.pinski@oss.qualcomm.com>
+ 
+ 	PR tree-optimization/123849
+ 	* gimple-ssa-warn-access.cc (new_delete_mismatch_p): Handle
+ 	DEMANGLE_COMPONENT_EXTENDED_BUILTIN_TYPE like DEMANGLE_COMPONENT_BUILTIN_TYPE.
+ 
+ 2026-01-28  Richard Biener  <rguenther@suse.de>
+ 
+ 	PR tree-optimization/110043
+ 	* pointer-query.cc (get_offset_range): Fail for integer
+ 	types with precision larger than ptrdiff_type_node.
+ 
+ 2026-01-28  Hongyu Wang  <hongyu.wang@intel.com>
+ 
+ 	PR target/123779
+ 	* config/i386/sse.md (*sse4_1_<code>v8qiv8hi2<mask_name>_2):
+ 	Rename to ...
+ 	(*sse4_1_<code>v8qiv8hi2_2): ... this, and drop mask conditions.
+ 	(*avx2_<code>v8qiv8si2<mask_name>_2): Rename to ...
+ 	(*avx2_<code>v8qiv8si2_2): ... this, and likewise.
+ 	(*sse4_1_<code>v4qiv4si2<mask_name>_2): Rename to ...
+ 	(*sse4_1_<code>v4qiv4si2_2): ... this, and likewise.
+ 	(*sse4_1_<code>v4hiv4si2<mask_name>_2): Rename to ...
+ 	(*sse4_1_<code>v4hiv4si2_2): ... this, and likewise.
+ 	(*avx2_<code>v4qiv4di2<mask_name>_2): Rename to ...
+ 	(*avx2_<code>v4qiv4di2_2): ... this, and likewise.
+ 	(*avx2_<code>v4hiv4di2<mask_name>_2): Rename to ...
+ 	(*avx2_<code>v4hiv4di2_2): ... this, and likewise.
+ 	(*sse4_1_<code>v2hiv2di2<mask_name>_2): Rename to ...
+ 	(*sse4_1_<code>v2hiv2di2_2): ... this, and likewise.
+ 	(*sse4_1_<code>v2siv2di2<mask_name>_2): Rename to ...
+ 	(*sse4_1_<code>v2siv2di2_2): ... this, and likewise.
+ 	(*avx512f_<code>v8qiv8di2<mask_name>_2): Rename to ...
+ 	(*avx512f_<code>v8qiv8di2_2): ... this.
+ 	(*avx512vl_<code>v8qiv8hi2_mask_2): New define_insn_and_split.
+ 	(*avx512vl_<code>v8qiv8si2_mask_2): Likewise.
+ 	(*avx512vl_<code>v4qiv4si2_mask_2): Likewise.
+ 	(*avx512vl_<code>v4hiv4si2_mask_2): Likewise.
+ 	(*avx512f_<code>v8qiv8di2_mask_2): Likewise.
+ 	(*avx512vl_<code>v4qiv4di2_mask_2): Likewise.
+ 	(*avx512vl_<code>v4hiv4di2_mask_2): Likewise.
+ 	(*avx512vl_<code>v2hiv2di2_mask_2): Likewise.
+ 	(*avx512vl_<code>v2siv2di2_mask_2): Likewise.
+ 
+ 2026-01-28  Nina Ranns  <dinka.ranns@gmail.com>
+ 	    Iain Sandoe  <iain@sandoe.co.uk>
+ 	    Ville Voutilainen  <ville.voutilainen@gmail.com>
+ 
+ 	* doc/invoke.texi: Document -fcontracts-client-check= and
+ 	-fcontracts-definition-check=.
+ 
+ 2026-01-28  Nina Ranns  <dinka.ranns@gmail.com>
+ 	    Iain Sandoe  <iain@sandoe.co.uk>
+ 	    Ville Voutilainen  <ville.voutilainen@gmail.com>
+ 
+ 	* doc/invoke.texi: Document -fcontract-checks-outlined and
+ 	-fcontract-disable-optimized-checks.
+ 
+ 2026-01-28  Nina Ranns  <dinka.ranns@gmail.com>
+ 	    Iain Sandoe  <iain@sandoe.co.uk>
+ 
+ 	* tree-core.h (struct tree_base): Update tree flag usage comment.
+ 
+ 2026-01-28  Nina Ranns  <dinka.ranns@gmail.com>
+ 	    Iain Sandoe  <iain@sandoe.co.uk>
+ 
+ 	* tree.h (CONST_WRAPPER_P): New.
+ 
+ 2026-01-28  Nina Ranns  <dinka.ranns@gmail.com>
+ 	    Iain Sandoe  <iain@sandoe.co.uk>
+ 
+ 	* doc/invoke.texi: Document -fcontracts-conservative-ipa.
+ 
+ 2026-01-28  Iain Sandoe  <iain@sandoe.co.uk>
+ 	    Nina Ranns  <dinka.ranns@gmail.com>
+ 	    Ville Voutilainen  <ville.voutilainen@gmail.com>
+ 
+ 	* config/darwin.h (ASM_GENERATE_INTERNAL_LABEL): Add cases for contract
+ 	constant data that need to be in independent link-time 'atoms'.
+ 	* doc/invoke.texi: Document -fcontracts and
+ 	-fcontract-evaluation-semantic=.
+ 
+ 2026-01-28  Iain Sandoe  <iain@sandoe.co.uk>
+ 	    Nina Ranns  <dinka.ranns@gmail.com>
+ 
+ 	* doc/invoke.texi: Remove documentation of contracts options.
+ 
+ 2026-01-27  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR other/123841
+ 	* acinclude.m4 (gcc_GAS_FLAGS) <i?86-*-* | x86_64-*-*>: Set
+ 	gcc_cv_as_flags irrespective of $gas_flag.
+ 	* configure: Regenerate.
+ 
+ 2026-01-27  David Malcolm  <dmalcolm@redhat.com>
+ 
+ 	PR analyzer/122623
+ 	* doc/invoke.texi (-fanalyzer-assume-nothrow): New option.
+ 
+ 2026-01-27  Andrew Pinski  <andrew.pinski@oss.qualcomm.com>
+ 
+ 	PR middle-end/97898
+ 	* omp-expand.cc (expand_omp_for_static_chunk): Don't
+ 	conditionalize the call to force_gimple_operand_gsi on DECL_P/TREE_ADDRESSABLE
+ 	but rather pass that as the 3rd argument.
+ 
+ 2026-01-27  Jan Hubicka  <hubicka@ucw.cz>
+ 
+ 	PR ipa/123619
+ 	* ipa-polymorphic-call.cc
+ 	(ipa_polymorphic_call_context::possible_dynamic_type_change): Remove impossible
+ 	speuculation.
+ 
+ 2026-01-27  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
+ 
+ 	* configure.ac (ld_32_opt, ld_64_opt): Set.
+ 	(ld_ix86_gld_32_opt): Replace by ld_32_opt.
+ 	(ld_ix86_gld_64_opt): Replace by ld_64_opt.
+ 	Replace -melf_x86_64 by ld_64_opt.
+ 	* configure: Regenerate.
+ 
+ 2026-01-27  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
+ 
+ 	* acinclude.m4 (gcc_cv_as_flags) Provide Solaris settings.
+ 	Apply Linux/x86 gas settings on all x86 gas targets, too.
+ 	(as_32_opt, as_64_opt): Set on all x86 gas targets.
+ 	* configure.ac: Consistenly use as_32_opt, as_64_opt instead of
+ 	as_ix86_gas_{32,64}_opt or hardcoded --64.
+ 	<sparc*-*-*>: Simplify setting TLS test code.
+ 	* configure: Regenerate.
+ 
+ 2026-01-27  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
+ 
+ 	* configure.ac (fw_as_opt): Set.
+ 	Replace --fatal-warnings by $fw_as_opt.
+ 	(tls_as_opt): Remove --fatal-warnings.
+ 	(gcc_cv_as_tls): Use $fw_as_opt.
+ 	* configure: Regenerate.
+ 
+ 2026-01-27  Richard Biener  <rguenther@suse.de>
+ 
+ 	PR ipa/116296
+ 	* ipa-modref-tree.cc (modref_access_node::contains): Use
+ 	poly_offset_int for the param offset difference and the
+ 	overlap computation.
+ 
+ 2026-01-27  Richard Biener  <rguenther@suse.de>
+ 
+ 	PR debug/123376
+ 	* dwarf2out.cc (tree_add_const_value_attribute): Walk all
+ 	initializers for early mangling of referenced decls.
+ 	(mangle_referenced_decls): Also walk subtrees of CONSTRUCTORS.
+ 
+ 2026-01-27  Robin Dapp  <rdapp@oss.qualcomm.com>
+ 
+ 	PR tree-optimization/123799
+ 	* tree-ssa-forwprop.cc (simplify_vector_constructor): Pun
+ 	conversion element type with integer type.
+ 
+ 2026-01-27  Wilco Dijkstra  <wilco.dijkstra@arm.com>
+ 
+ 	PR target/123791
+ 	* config/aarch64/aarch64.cc (aarch64_cannot_force_const_mem):
+ 	Always return true for symbols and labels except for large model.
+ 	(aarch64_select_rtx_section): Force .rodata for constants only.
+ 
+ 2026-01-27  Wilco Dijkstra  <wilco.dijkstra@arm.com>
+ 
+ 	PR target/123792
+ 	* config/aarch64/aarch64.md (aarch64_<optab>_reg_minus<mode>3):
+ 	Add support for invert in shift count.
+ 
+ 2026-01-27  Tobias Burnus  <tburnus@baylibre.com>
+ 
+ 	* doc/install.texi (gcn): Require Newlib 4.6.0+, replacing 4.3.0+
+ 	requirement with long list of recommended fixes up to post-4.5.0.
+ 
+ 2026-01-27  Tamar Christina  <tamar.christina@arm.com>
+ 
+ 	PR tree-optimization/122749
+ 	* tree-ssa-math-opts.cc (convert_mult_to_fma_1, convert_mult_to_fma):
+ 	Unwrap converts around addend.
+ 
+ 2026-01-26  Andrew Pinski  <andrew.pinski@oss.qualcomm.com>
+ 
+ 	PR tree-optimization/123820
+ 	* gimple-ssa-strength-reduction.cc (create_add_on_incoming_edge): Use
+ 	the correct type for the stride (lhs if non-pointer).
+ 
+ 2026-01-26  Andrew Pinski  <andrew.pinski@oss.qualcomm.com>
+ 
+ 	PR middle-end/123709
+ 	* final.cc (output_asm_operand_names): Skip over
+ 	opnum which is MAX_RECOG_OPERANDS (invalid).
+ 	(output_asm_insn): Increase opoutput and oporder size
+ 	by 1. For out of range operands, set the opnum to
+ 	MAX_RECOG_OPERANDS.
+ 
+ 2026-01-26  Filip Kastl  <fkastl@suse.cz>
+ 
+ 	* doc/invoke.texi: Document --param auto-profile-reorder-only.
+ 	* params.opt: Fix spelling.
+ 
+ 2026-01-26  Richard Biener  <rguenther@suse.de>
+ 
+ 	PR tree-optimization/122474
+ 	* tree-vectorizer.h (vect_reduc_info_s::neutral_op): New.
+ 	(VECT_REDUC_INFO_NEUTRAL_OP): New.
+ 	* tree-vect-loop.cc (vectorizable_reduction): Adjust condition
+ 	guarding the check for .VEC_SHL_INSERT.
+ 
+ 2026-01-26  Richard Biener  <rguenther@suse.de>
+ 
+ 	PR tree-optimization/123755
+ 	* tree-vect-stmts.cc (vectorizable_call): Fixup LEN masking
+ 	of unconditional but possibly trapping calls.
+ 
+ 2026-01-26  Victor Do Nascimento  <victor.donascimento@arm.com>
+ 
+ 	PR tree-optimization/123657
+ 	* tree-vect-loop.cc (vect_analyze_loop_form): Add
+ 	chrec_dont_know check.
+ 
+ 2026-01-26  Richard Biener  <rguenther@suse.de>
+ 
+ 	PR tree-optimization/123794
+ 	* tree-vect-slp.cc (vect_remove_slp_scalar_calls): Unlink
+ 	VOPs for all calls.
+ 
+ 2026-01-26  Tamar Christina  <tamar.christina@arm.com>
+ 
+ 	PR tree-optimization/122103
+ 	PR tree-optimization/123628
+ 	* tree-if-conv.cc (if_convertible_simdclone_stmt_p): New.
+ 	(if_convertible_stmt_p, predicate_statements): Use it.
+ 
+ 2026-01-25  Sandra Loosemore  <sloosemore@baylibre.com>
+ 
+ 	* gcc-urlifier.cc (test_gcc_urlifier): Match either positive
+ 	or negative option URLS.
+ 
+ 2026-01-25  Roger Sayle  <roger@nextmovesoftware.com>
+ 
+ 	PR middle-end/122348
+ 	* expr.cc (store_constructor): Ignore fields where DECL_SIZE
+ 	is NULL_TREE, i.e. flexible array members.
+ 
+ 2026-01-25  Sandra Loosemore  <sloosemore@baylibre.com>
+ 
+ 	* common.opt.urls: Regenerated.
+ 	* config/alpha/alpha.opt.urls: Regenerated.
+ 	* config/arc/arc.opt.urls: Regenerated.
+ 	* config/arm/arm.opt.urls: Regenerated.
+ 	* config/avr/avr.opt.urls: Regenerated.
+ 	* config/bpf/bpf.opt.urls: Regenerated.
+ 	* config/cris/cris.opt.urls: Regenerated.
+ 	* config/lynx.opt.urls: Regenerated.
+ 	* config/m68k/m68k.opt.urls: Regenerated.
+ 	* config/mcore/mcore.opt.urls: Regenerated.
+ 	* config/mingw/cygming.opt.urls: Regenerated.
+ 	* config/mips/mips.opt.urls: Regenerated.
+ 	* config/mips/sde.opt.urls: Regenerated.
+ 	* config/mmix/mmix.opt.urls: Regenerated.
+ 	* config/nvptx/nvptx.opt.urls: Regenerated.
+ 	* config/rs6000/linux64.opt.urls: Regenerated.
+ 	* config/rs6000/rs6000.opt.urls: Regenerated.
+ 	* config/rs6000/sysv4.opt.urls: Regenerated.
+ 	* config/sh/sh.opt.urls: Regenerated.
+ 
+ 2026-01-25  Sandra Loosemore  <sloosemore@baylibre.com>
+ 
+ 	* doc/invoke.texi (Option Summary): Fix whitespace in @gccoptlist
+ 	tables.
+ 
+ 2026-01-25  Sandra Loosemore  <sloosemore@baylibre.com>
+ 
+ 	PR other/122243
+ 	* doc/cppopts.texi: Add missing @opindex entries for
+ 	-fno-* options.
+ 	* doc/invoke.texi: Likewise.
+ 
+ 2026-01-25  Sandra Loosemore  <sloosemore@baylibre.com>
+ 
+ 	PR other/122243
+ 	* doc/cppwarnopts.texi: Add missing @opindex entries for
+ 	-Wno-* options.
+ 	* doc/invoke.texi: Likewise.
+ 
+ 2026-01-25  Sandra Loosemore  <sloosemore@baylibre.com>
+ 
+ 	PR other/122243
+ 	* doc/cppdiropts.texi: Document -imultiarch.
+ 	* doc/invoke.texi (Option Summary) <Optimization Options>: Add
+ 	-flto-toplevel-asm-heuristics.
+ 	<Program Instrumentation Options>: Remove -fbounds-check.
+ 	<Directory Options>: Add -imultiarch.
+ 	<ARC Options>: Add -mbitops, -mcmem, -munaligned-access.
+ 	<ARM Options>: Add -mvectorize-with-neon-quad and
+ 	-mvectorize-with-neon-double.
+ 	<AVR Options>: Add -mrmw and -mstrict-X.
+ 	<CRIS Options>: Fix typo in -mmax-stackframe.
+ 	<Cygwin and MinGW Options>: Add -muse-libstdc-wrappers.
+ 	<M680x0 Options>: Add several missing CPU options, plus -mxtls.
+ 	<MIPS Options>: Add -mno-data-in-code and -mcode-xonly.
+ 	<MMIX Options>: Add mset-data-start, -mset-program-start, and
+ 	-mno-set-program-start.
+ 	<Nvidia PTX Options>: Add -msoft-stack-reserve-local.
+ 	<RS/6000 and PowerPC Options>: Add -mprofile-kernel, -mbit-word,
+ 	-mno-splat-word-constant, -mno-splat-float-constant,
+ 	-mno-ieee128-constant, and -mno-warn-altivec-long.
+ 	(Optimization Options): Document -flto-toplevel-asm-heuristics.
+ 	(ARC Options): Document -mbitops and -mcmem.
+ 	(ARM Options): Add index entries for mbe32,
+ 	m[no-]fix-cortex-a57-aes-1742098, m[no-]fix-cortex-a72-aes-1655431.
+ 	Document -mvectorize-with-neon-quad and -mvectorize-with-neon-double.
+ 	(AVR Options): Document -mpmem-wrap-around.
+ 	(CRIS Options): Fix typo in -mmax-stackframe.
+ 	(Cygwin and MinGW Options): Document -muse-libstdc-wrappers.
+ 	(DEC Alpha Options): Fix typo in -mfp-regs.
+ 	(eBPF Options): Add @opindex for -mframe-limit.
+ 	(HPPA Options): Fix typos in -mno-disable-fpregs and -mno-gas
+ 	index entries.
+ 	(m680x0 Options): Document -m68302, -m68332, -m68851, and -mfidoa.
+ 	Document -mnoshort and -mnortd aliases.  Document -mxtls.
+ 	(MCore Options): Fix typos in -m[no-]relax-immediates.
+ 	(MIPS Options): Document -mno-data-in-code and -mcode-xonly.
+ 	(MMIX Options): Document -mset-data-start, -mset-program-start, and
+ 	-mno-set-program-start.
+ 	(Nvidia PTX Options): Document -msoft-stack-reserve-local.
+ 	(RS/6000 and PowerPC Options): Document -mprofile-kernel,
+ 	-mbit-word, -msplat-word-constant, -msplat-float-constant,
+ 	-mieee128-constant, and -mwarn-altivec-long.
+ 	(SH Options): Add index entry for -m2e.  Document -m4-400.
+ 
+ 2026-01-25  Sandra Loosemore  <sloosemore@baylibre.com>
+ 
+ 	PR other/122243
+ 	* common.opt (fbounds-check): Mark as Undocumented, expand comments
+ 	to explain why.
+ 	* config/frv/frv.opt (msched-lookahead=): Mark unused option as
+ 	Undocumented.
+ 	* config/m68k/m68k.opt (m68851): Add RejectNegative.
+ 	* config/nvptx/nvptx.opt (minit-regs=): Mark as Undocumented.  It's
+ 	not currently documented and seems to have been introduced as a
+ 	stopgap to experiment with different implementation strategies.
+ 	* config/rs6000/476.opt (mpreserve-link-stack): Mark as Undocumented.
+ 	It seems to be an internal option that is enabled by default on the
+ 	cpu that can benefit from it.
+ 
+ 2026-01-25  Sandra Loosemore  <sloosemore@baylibre.com>
+ 
+ 	PR other/122243
+ 	* common.opt (gtoggle): Mark RejectNegative.
+ 	* doc/invoke.texi (Option Summary) <Debugging Options>: Remove
+ 	redundant -gno- forms from the list.
+ 	(Debugging Options): Add @opindex for -gno- option forms.
+ 	Copy-edit option descriptions to avoid future tense and use of
+ 	implementor jargon.
+ 
+ 2026-01-25  Sandra Loosemore  <sloosemore@baylibre.com>
+ 
+ 	PR other/67300
+ 	* common.opt (foffload-abi, foffload-abi-host-opts): Mark
+ 	"Undocumented".
+ 
+ 2026-01-25  Sandra Loosemore  <sloosemore@baylibre.com>
+ 
+ 	PR other/122243
+ 	* doc/invoke.texi (Option Summary) <LynxOS Options>: New.
+ 	(LynxOS Options): New section.
+ 
  2026-01-24  Andrew Pinski  <andrew.pinski@oss.qualcomm.com>
  
  	PR tree-optimization/123803
diff -Nrcpad gcc-16-20260125/gcc/DATESTAMP gcc-16-20260201/gcc/DATESTAMP
*** gcc-16-20260125/gcc/DATESTAMP	Sun Jan 25 22:32:06 2026
--- gcc-16-20260201/gcc/DATESTAMP	Sun Feb  1 22:32:06 2026
***************
*** 1 ****
! 20260125
--- 1 ----
! 20260201
diff -Nrcpad gcc-16-20260125/gcc/acinclude.m4 gcc-16-20260201/gcc/acinclude.m4
*** gcc-16-20260125/gcc/acinclude.m4	Sun Jan 25 22:32:06 2026
--- gcc-16-20260201/gcc/acinclude.m4	Sun Feb  1 22:32:06 2026
*************** dnl # Used by gcc_GAS_CHECK_FEATURE
*** 464,492 ****
  dnl #
  AC_DEFUN([gcc_GAS_FLAGS],
  [AC_CACHE_CHECK([assembler flags], gcc_cv_as_flags,
! [ case "$target" in
!   i[[34567]]86-*-linux*)
!     dnl Override the default, which may be incompatible.
!     gcc_cv_as_flags=--32
!     ;;
!   x86_64-*-linux-gnux32)
      dnl Override the default, which may be incompatible.
!     gcc_cv_as_flags=--x32
      ;;
!   x86_64-*-linux*)
      dnl Override the default, which may be incompatible.
!     gcc_cv_as_flags=--64
      ;;
!   powerpc*-*-darwin*)
      dnl Always pass -arch ppc to assembler.
      gcc_cv_as_flags="-arch ppc"
      ;;
!   amdgcn*)
      dnl Currently, only the llvm-mc assembler is supported.
      dnl Add flags to ensure an amdgcn ELF file is written.
      gcc_cv_as_flags="--filetype=obj -triple=amdgcn--amdhsa"
      ;;
!   *)
      gcc_cv_as_flags=" "
      ;;
    esac])
--- 464,509 ----
  dnl #
  AC_DEFUN([gcc_GAS_FLAGS],
  [AC_CACHE_CHECK([assembler flags], gcc_cv_as_flags,
! [ case "$target:$gas_flag" in
!   *-*-solaris2*:no)
      dnl Override the default, which may be incompatible.
!     case "$target" in
!       i?86-*-* | sparc-*-*)
! 	gcc_cv_as_flags=-m32
! 	;;
!       x86_64-*-* | sparcv9-*-* | sparc64-*-*)
! 	gcc_cv_as_flags=-m64
! 	;;
!     esac
!     as_32_opt=-m32
!     as_64_opt=-m64
      ;;
!   i?86-*-*:* | x86_64-*-*:* )
      dnl Override the default, which may be incompatible.
!     case "$target" in
!       i?86-*-*)
! 	gcc_cv_as_flags=--32
! 	;;
!       x86_64-*-linux-gnux32*)
! 	gcc_cv_as_flags=--x32
! 	;;
!       x86_64-*-linux*)
! 	gcc_cv_as_flags=--64
! 	;;
!     esac
!     as_32_opt=--32
!     as_64_opt=--64
      ;;
!   powerpc*-*-darwin*:*)
      dnl Always pass -arch ppc to assembler.
      gcc_cv_as_flags="-arch ppc"
      ;;
!   amdgcn*:*)
      dnl Currently, only the llvm-mc assembler is supported.
      dnl Add flags to ensure an amdgcn ELF file is written.
      gcc_cv_as_flags="--filetype=obj -triple=amdgcn--amdhsa"
      ;;
!   *:*)
      gcc_cv_as_flags=" "
      ;;
    esac])
diff -Nrcpad gcc-16-20260125/gcc/ada/ChangeLog gcc-16-20260201/gcc/ada/ChangeLog
*** gcc-16-20260125/gcc/ada/ChangeLog	Sun Jan 25 22:32:06 2026
--- gcc-16-20260201/gcc/ada/ChangeLog	Sun Feb  1 22:32:06 2026
***************
*** 1,5 ****
--- 1,56 ----
+ 2026-01-30  Gary Dismukes  <dismukes@adacore.com>
+ 
+ 	* sem_ch8.adb (End_Use_Type): Remove test of Prev_Use_Clause as
+ 	as a condition for resetting In_Use and Current_Use_Clause, and
+ 	change setting of that flag and field based on Prev_Use_Clause
+ 	rather than setting them to Empty. Revise preceding comment.
+ 
+ 2026-01-30  Eric Botcazou  <ebotcazou@adacore.com>
+ 
+ 	PR ada/123867
+ 	* sem_ch10.adb (Analyze_Compilation_Unit): Output info message
+ 	when -gnatdi is specified.
+ 	(Install_Parents): Likewise.  Set the Is_Visible_Lib_Unit flag
+ 	on the unit.
+ 	(Install_Private_With_Clauses): Do not output info message here.
+ 	(Remove_Parents): Output info message when -gnatdi is specified
+ 	and clear the Is_Visible_Lib_Unit flag on the unit.
+ 
+ 2026-01-29  Eric Botcazou  <ebotcazou@adacore.com>
+ 
+ 	PR ada/123861
+ 	* sem_type.adb (Covers): Fix couple of typos in comment.
+ 	(Specific_Type): Adjust to Covers' handling of types declared
+ 	with the Aggregate aspect in Ada 2022.
+ 
+ 2026-01-28  Eric Botcazou  <ebotcazou@adacore.com>
+ 
+ 	PR ada/123857
+ 	* checks.adb (Apply_Parameter_Validity_Checks.Add_Validity_Check):
+ 	Set Is_Checked on the generated {Pre,Post}_Condition pragma and
+ 	bail out if the parameter is of an Unchecked_Union type.
+ 
+ 2026-01-28  Eric Botcazou  <ebotcazou@adacore.com>
+ 
+ 	PR ada/123832
+ 	* exp_imgv.adb: Add with and use clauses for Exp_Ch7.
+ 	(Expand_Image_Attribute): Establish a transient scope before
+ 	rewriting the attribute as a call to Put_Image.
+ 	(Expand_Wide_Image_Attribute): Likewise.
+ 	(Expand_Wide_Wide_Image_Attribute): Likewise.
+ 	* exp_put_image.ads (Build_Image_Call): Add note about the
+ 	need for a transient scope when the function is invoked.
+ 	* exp_put_image.adb (Build_Image_Call): Call Insert_Actions
+ 	to immediately insert the actions instead of wrapping them
+ 	in an Expression_With_Actions node.
+ 
+ 2026-01-25  Sandra Loosemore  <sloosemore@baylibre.com>
+ 
+ 	* gcc-interface/lang.opt.urls: Regenerated.
+ 
  2026-01-21  Eric Botcazou  <ebotcazou@adacore.com>
  
+ 	PR ada/123580
  	* sem_ch13.adb (Analyze_Aspects_At_Freeze_Point): Replace call to
  	Scope_Within_Or_Same (Current_Scope, S) with In_Open_Scopes (S) to
  	test whether S is open in the current scope.
diff -Nrcpad gcc-16-20260125/gcc/ada/checks.adb gcc-16-20260201/gcc/ada/checks.adb
*** gcc-16-20260125/gcc/ada/checks.adb	Sun Jan 25 22:32:06 2026
--- gcc-16-20260201/gcc/ada/checks.adb	Sun Feb  1 22:32:06 2026
*************** package body Checks is
*** 2584,2589 ****
--- 2584,2593 ----
                      Chars      => Name_Check,
                      Expression => Expr)));
  
+             --  The check is enabled unconditionally
+ 
+             Set_Is_Checked (Prag);
+ 
              --  Add a message unless exception messages are suppressed
  
              if not Exception_Locations_Suppressed then
*************** package body Checks is
*** 2641,2649 ****
           if Is_Scalar_Type (Typ) then
              Nam := Name_Valid;
  
!          --  For any non-scalar with scalar parts, generate 'Valid_Scalars test
  
!          elsif Scalar_Part_Present (Typ) then
              Nam := Name_Valid_Scalars;
  
           --  No test needed for other cases (no scalars to test)
--- 2645,2656 ----
           if Is_Scalar_Type (Typ) then
              Nam := Name_Valid;
  
!          --  For non-scalars with scalar parts, generate 'Valid_Scalars test,
!          --  except for unchecked unions since we cannot know where they are.
  
!          elsif Scalar_Part_Present (Typ)
!            and then not Is_Unchecked_Union (Typ)
!          then
              Nam := Name_Valid_Scalars;
  
           --  No test needed for other cases (no scalars to test)
*************** package body Checks is
*** 2735,2742 ****
           return;
        end if;
  
!       --  Inspect all the formals applying aliasing and scalar initialization
!       --  checks where applicable.
  
        Formal := First_Formal (Subp);
        while Present (Formal) loop
--- 2742,2748 ----
           return;
        end if;
  
!       --  Apply scalar initialization checks to formals where applicable
  
        Formal := First_Formal (Subp);
        while Present (Formal) loop
diff -Nrcpad gcc-16-20260125/gcc/ada/exp_ch5.adb gcc-16-20260201/gcc/ada/exp_ch5.adb
*** gcc-16-20260125/gcc/ada/exp_ch5.adb	Sun Jan 25 22:32:06 2026
--- gcc-16-20260201/gcc/ada/exp_ch5.adb	Sun Feb  1 22:32:06 2026
*************** package body Exp_Ch5 is
*** 5061,5067 ****
        Array_Dim  : constant Pos        := Number_Dimensions (Array_Typ);
        Id         : constant Entity_Id  := Defining_Identifier (I_Spec);
        Loc        : constant Source_Ptr := Sloc (Isc);
!       Stats      : List_Id    := Statements (N);
        Core_Loop  : Node_Id;
        Dim1       : Int;
        Ind_Comp   : Node_Id;
--- 5061,5070 ----
        Array_Dim  : constant Pos        := Number_Dimensions (Array_Typ);
        Id         : constant Entity_Id  := Defining_Identifier (I_Spec);
        Loc        : constant Source_Ptr := Sloc (Isc);
! 
!       Stats : List_Id := Statements (N);
!       --  Maybe wrapped in a conditional if a filter is present
! 
        Core_Loop  : Node_Id;
        Dim1       : Int;
        Ind_Comp   : Node_Id;
*************** package body Exp_Ch5 is
*** 5351,5357 ****
        Id_Kind  : constant Entity_Kind := Ekind (Id);
        Loc      : constant Source_Ptr  := Sloc (N);
  
!       Stats    : List_Id     := Statements (N);
        --  Maybe wrapped in a conditional if a filter is present
  
        Cursor         : Entity_Id;
--- 5354,5360 ----
        Id_Kind  : constant Entity_Kind := Ekind (Id);
        Loc      : constant Source_Ptr  := Sloc (N);
  
!       Stats : List_Id := Statements (N);
        --  Maybe wrapped in a conditional if a filter is present
  
        Cursor         : Entity_Id;
*************** package body Exp_Ch5 is
*** 5871,5877 ****
              Loop_Id : constant Entity_Id := Defining_Identifier (LPS);
              Ltype   : constant Entity_Id := Etype (Loop_Id);
              Btype   : constant Entity_Id := Base_Type (Ltype);
!             Stats   : constant List_Id   := Statements (N);
              Expr    : Node_Id;
              Decls   : List_Id;
              New_Id  : Entity_Id;
--- 5874,5880 ----
              Loop_Id : constant Entity_Id := Defining_Identifier (LPS);
              Ltype   : constant Entity_Id := Etype (Loop_Id);
              Btype   : constant Entity_Id := Base_Type (Ltype);
! 
              Expr    : Node_Id;
              Decls   : List_Id;
              New_Id  : Entity_Id;
*************** package body Exp_Ch5 is
*** 5892,5898 ****
                 Set_Statements (N,
                    New_List (Make_If_Statement (Loc,
                      Condition => Iterator_Filter (LPS),
!                     Then_Statements => Stats)));
                 Analyze_List (Statements (N));
              end if;
  
--- 5895,5901 ----
                 Set_Statements (N,
                    New_List (Make_If_Statement (Loc,
                      Condition => Iterator_Filter (LPS),
!                     Then_Statements => Statements (N))));
                 Analyze_List (Statements (N));
              end if;
  
*************** package body Exp_Ch5 is
*** 6012,6018 ****
                         Declarations => Decls,
                         Handled_Statement_Sequence =>
                           Make_Handled_Sequence_Of_Statements (Loc,
!                            Statements => Stats))),
  
                     End_Label => End_Label (N)));
  
--- 6015,6021 ----
                         Declarations => Decls,
                         Handled_Statement_Sequence =>
                           Make_Handled_Sequence_Of_Statements (Loc,
!                            Statements => Statements (N)))),
  
                     End_Label => End_Label (N)));
  
diff -Nrcpad gcc-16-20260125/gcc/ada/exp_imgv.adb gcc-16-20260201/gcc/ada/exp_imgv.adb
*** gcc-16-20260125/gcc/ada/exp_imgv.adb	Sun Jan 25 22:32:06 2026
--- gcc-16-20260201/gcc/ada/exp_imgv.adb	Sun Feb  1 22:32:06 2026
*************** with Checks;         use Checks;
*** 29,34 ****
--- 29,35 ----
  with Einfo.Entities; use Einfo.Entities;
  with Einfo.Utils;    use Einfo.Utils;
  with Debug;          use Debug;
+ with Exp_Ch7;        use Exp_Ch7;
  with Exp_Put_Image;
  with Exp_Util;       use Exp_Util;
  with Lib;            use Lib;
*************** package body Exp_Imgv is
*** 1050,1055 ****
--- 1051,1057 ----
        --  Exp_Put_Image for details.
  
        if Exp_Put_Image.Image_Should_Call_Put_Image (N) then
+          Establish_Transient_Scope (N, Manage_Sec_Stack => True);
           Rewrite (N, Exp_Put_Image.Build_Image_Call (N));
           Analyze_And_Resolve (N, Standard_String, Suppress => All_Checks);
           return;
*************** package body Exp_Imgv is
*** 1863,1868 ****
--- 1865,1871 ----
        --  Exp_Put_Image for details.
  
        if Exp_Put_Image.Image_Should_Call_Put_Image (N) then
+          Establish_Transient_Scope (N, Manage_Sec_Stack => True);
           Rewrite (N, Exp_Put_Image.Build_Image_Call (N));
           Analyze_And_Resolve (N, Standard_Wide_String, Suppress => All_Checks);
           return;
*************** package body Exp_Imgv is
*** 1972,1977 ****
--- 1975,1981 ----
        --  Exp_Put_Image for details.
  
        if Exp_Put_Image.Image_Should_Call_Put_Image (N) then
+          Establish_Transient_Scope (N, Manage_Sec_Stack => True);
           Rewrite (N, Exp_Put_Image.Build_Image_Call (N));
           Analyze_And_Resolve
             (N, Standard_Wide_Wide_String, Suppress => All_Checks);
diff -Nrcpad gcc-16-20260125/gcc/ada/exp_put_image.adb gcc-16-20260201/gcc/ada/exp_put_image.adb
*** gcc-16-20260125/gcc/ada/exp_put_image.adb	Sun Jan 25 22:32:06 2026
--- gcc-16-20260201/gcc/ada/exp_put_image.adb	Sun Feb  1 22:32:06 2026
*************** package body Exp_Put_Image is
*** 1289,1315 ****
     ----------------------
  
     function Build_Image_Call (N : Node_Id) return Node_Id is
!       --  For T'[[Wide_]Wide_]Image (X) Generate an Expression_With_Actions
!       --  node:
        --
!       --     do
!       --        S : Buffer;
!       --        U_Type'Put_Image (S, X);
!       --        Result : constant [[Wide_]Wide_]String :=
!       --          [[Wide_[Wide_]]Get (S);
!       --        Destroy (S);
!       --     in Result end
        --
!       --  where U_Type is the underlying type, as needed to bypass privacy.
  
-       Loc : constant Source_Ptr := Sloc (N);
-       U_Type : constant Entity_Id := Underlying_Type (Entity (Prefix (N)));
-       Sink_Entity : constant Entity_Id :=
-         Make_Temporary (Loc, 'S');
        Sink_Decl : constant Node_Id :=
          Make_Object_Declaration (Loc,
            Defining_Identifier => Sink_Entity,
!           Object_Definition =>
              New_Occurrence_Of (RTE (RE_Buffer_Type), Loc));
  
        Image_Prefix : constant Node_Id :=
--- 1289,1311 ----
     ----------------------
  
     function Build_Image_Call (N : Node_Id) return Node_Id is
!       --  For Typ'[[Wide_]Wide_]Image (X) generate:
        --
!       --    S : Buffer_Type;
!       --    U_Typ'Put_Image (S, X);
!       --    [[Wide_[Wide_]]Get (S)
        --
!       --  where U_Typ is the underlying type, as needed to bypass privacy.
! 
!       Loc   : constant Source_Ptr := Sloc (N);
!       U_Typ : constant Entity_Id  := Underlying_Type (Entity (Prefix (N)));
! 
!       Sink_Entity : constant Entity_Id := Make_Temporary (Loc, 'S');
  
        Sink_Decl : constant Node_Id :=
          Make_Object_Declaration (Loc,
            Defining_Identifier => Sink_Entity,
!           Object_Definition   =>
              New_Occurrence_Of (RTE (RE_Buffer_Type), Loc));
  
        Image_Prefix : constant Node_Id :=
*************** package body Exp_Put_Image is
*** 1317,1391 ****
  
        Put_Im : constant Node_Id :=
          Make_Attribute_Reference (Loc,
!           Prefix         => New_Occurrence_Of (U_Type, Loc),
            Attribute_Name => Name_Put_Image,
            Expressions    => New_List (
              New_Occurrence_Of (Sink_Entity, Loc),
              Image_Prefix));
-       Result_Entity : constant Entity_Id :=
-         Make_Temporary (Loc, 'R');
- 
-       subtype Image_Name_Id is Name_Id with Static_Predicate =>
-         Image_Name_Id in Name_Image | Name_Wide_Image | Name_Wide_Wide_Image;
-       --  Attribute names that will be mapped to the corresponding result types
-       --  and functions.
- 
-       Attribute_Name_Id : constant Name_Id :=
-         (if Attribute_Name (N) = Name_Img then Name_Image
-          else Attribute_Name (N));
  
!       Result_Typ    : constant Entity_Id :=
!         (case Image_Name_Id'(Attribute_Name_Id) is
!             when Name_Image           => Stand.Standard_String,
!             when Name_Wide_Image      => Stand.Standard_Wide_String,
!             when Name_Wide_Wide_Image => Stand.Standard_Wide_Wide_String);
!       Get_Func_Id   : constant RE_Id :=
!         (case Image_Name_Id'(Attribute_Name_Id) is
!             when Name_Image           => RE_Get,
!             when Name_Wide_Image      => RE_Wide_Get,
!             when Name_Wide_Wide_Image => RE_Wide_Wide_Get);
  
-       Result_Decl : constant Node_Id :=
-         Make_Object_Declaration (Loc,
-           Defining_Identifier => Result_Entity,
-           Object_Definition =>
-             New_Occurrence_Of (Result_Typ, Loc),
-           Expression =>
-             Make_Function_Call (Loc,
-               Name => New_Occurrence_Of (RTE (Get_Func_Id), Loc),
-               Parameter_Associations => New_List (
-                 New_Occurrence_Of (Sink_Entity, Loc))));
        Actions : List_Id;
  
     --  Start of processing for Build_Image_Call
  
     begin
!       if Is_Class_Wide_Type (U_Type) then
           Actions := New_List (Sink_Decl);
  
           Put_Specific_Type_Name_Qualifier (Loc,
             Stms              => Actions,
             Tagged_Obj        => Image_Prefix,
             Buffer_Name       => New_Occurrence_Of (Sink_Entity, Loc),
!            Is_Interface_Type => Is_Interface (U_Type));
  
           Append_To (Actions, Put_Im);
!          Append_To (Actions, Result_Decl);
        else
!          Actions := New_List (Sink_Decl, Put_Im, Result_Decl);
        end if;
  
!       --  To avoid leaks, we need to manage the secondary stack, because Get is
!       --  returning a String allocated thereon. It might be cleaner to let the
!       --  normal mechanisms for functions returning on the secondary stack call
!       --  Set_Uses_Sec_Stack, but this expansion of 'Image is happening too
!       --  late for that.
! 
!       Set_Uses_Sec_Stack (Current_Scope);
  
!       return Make_Expression_With_Actions (Loc,
!         Actions    => Actions,
!         Expression => New_Occurrence_Of (Result_Entity, Loc));
     end Build_Image_Call;
  
     ------------------------------
--- 1313,1359 ----
  
        Put_Im : constant Node_Id :=
          Make_Attribute_Reference (Loc,
!           Prefix         => New_Occurrence_Of (U_Typ, Loc),
            Attribute_Name => Name_Put_Image,
            Expressions    => New_List (
              New_Occurrence_Of (Sink_Entity, Loc),
              Image_Prefix));
  
!       Get_Func_Id : constant RE_Id :=
!         (case Get_Attribute_Id (Attribute_Name (N)) is
!           when Attribute_Img             => RE_Get,
!           when Attribute_Image           => RE_Get,
!           when Attribute_Wide_Image      => RE_Wide_Get,
!           when Attribute_Wide_Wide_Image => RE_Wide_Wide_Get,
!           when others                    => raise Program_Error);
  
        Actions : List_Id;
  
     --  Start of processing for Build_Image_Call
  
     begin
!       if Is_Class_Wide_Type (U_Typ) then
           Actions := New_List (Sink_Decl);
  
           Put_Specific_Type_Name_Qualifier (Loc,
             Stms              => Actions,
             Tagged_Obj        => Image_Prefix,
             Buffer_Name       => New_Occurrence_Of (Sink_Entity, Loc),
!            Is_Interface_Type => Is_Interface (U_Typ));
  
           Append_To (Actions, Put_Im);
! 
        else
!          Actions := New_List (Sink_Decl, Put_Im);
        end if;
  
!       Insert_Actions (N, Actions);
  
!       return
!         Make_Function_Call (Loc,
!           Name => New_Occurrence_Of (RTE (Get_Func_Id), Loc),
!             Parameter_Associations => New_List (
!               New_Occurrence_Of (Sink_Entity, Loc)));
     end Build_Image_Call;
  
     ------------------------------
diff -Nrcpad gcc-16-20260125/gcc/ada/exp_put_image.ads gcc-16-20260201/gcc/ada/exp_put_image.ads
*** gcc-16-20260125/gcc/ada/exp_put_image.ads	Sun Jan 25 22:32:06 2026
--- gcc-16-20260201/gcc/ada/exp_put_image.ads	Sun Feb  1 22:32:06 2026
*************** package Exp_Put_Image is
*** 89,95 ****
     function Build_Image_Call (N : Node_Id) return Node_Id;
     --  N is a call to T'[[Wide_]Wide_]Image, and this translates it into the
     --  appropriate code to call T'Put_Image into a buffer and then extract the
!    --  [[wide] wide] string from the buffer.
  
     procedure Preload_Root_Buffer_Type (Compilation_Unit : Node_Id);
     --  Call RTE (RE_Root_Buffer_Type) if necessary, to load the packages
--- 89,97 ----
     function Build_Image_Call (N : Node_Id) return Node_Id;
     --  N is a call to T'[[Wide_]Wide_]Image, and this translates it into the
     --  appropriate code to call T'Put_Image into a buffer and then extract the
!    --  [[wide] wide] string from the buffer. N must be wrapped in a transient
!    --  scope before invoking the function because the buffer is controlled and
!    --  the extraction is done on the secondary stack.
  
     procedure Preload_Root_Buffer_Type (Compilation_Unit : Node_Id);
     --  Call RTE (RE_Root_Buffer_Type) if necessary, to load the packages
diff -Nrcpad gcc-16-20260125/gcc/ada/sem_ch10.adb gcc-16-20260201/gcc/ada/sem_ch10.adb
*** gcc-16-20260125/gcc/ada/sem_ch10.adb	Sun Jan 25 22:32:06 2026
--- gcc-16-20260201/gcc/ada/sem_ch10.adb	Sun Feb  1 22:32:07 2026
*************** package body Sem_Ch10 is
*** 1134,1139 ****
--- 1134,1153 ----
  
        --  Now analyze the unit (package, subprogram spec, body) itself
  
+       if Debug_Flag_I then
+          if Nkind (Unit_Node) in N_Package_Declaration
+                                | N_Package_Renaming_Declaration
+                                | N_Subprogram_Declaration
+                                | N_Generic_Declaration
+            or else (Nkind (Unit_Node) = N_Subprogram_Body
+                      and then Acts_As_Spec (Unit_Node))
+          then
+             Write_Str ("install unit ");
+             Write_Name (Chars (Defining_Entity (Unit_Node)));
+             Write_Eol;
+          end if;
+       end if;
+ 
        Analyze (Unit_Node);
  
        if Warn_On_Redundant_Constructs then
*************** package body Sem_Ch10 is
*** 4675,4680 ****
--- 4689,4706 ----
           end if;
        end if;
  
+       if Debug_Flag_I then
+          Write_Str ("install parent unit ");
+          Write_Name (Chars (P_Name));
+          Write_Eol;
+       end if;
+ 
+       --  Skip this for predefined units because of the rtsfind mechanism
+ 
+       if not In_Predefined_Unit (P_Name) then
+          Set_Is_Visible_Lib_Unit (P_Name);
+       end if;
+ 
        --  This is the recursive call that ensures all parents are loaded
  
        if Is_Child_Spec (P) then
*************** package body Sem_Ch10 is
*** 4747,4758 ****
        Item   : Node_Id;
  
     begin
-       if Debug_Flag_I then
-          Write_Str ("install private with clauses of ");
-          Write_Name (Chars (P));
-          Write_Eol;
-       end if;
- 
        if Nkind (Parent (Decl)) = N_Compilation_Unit then
           Item := First (Context_Items (Parent (Decl)));
           while Present (Item) loop
--- 4773,4778 ----
*************** package body Sem_Ch10 is
*** 7319,7324 ****
--- 7339,7356 ----
           --  in the reverse order of their installation.
  
           Remove_Parents (P);
+ 
+          if Debug_Flag_I then
+             Write_Str ("remove parent unit ");
+             Write_Name (Chars (P_Name));
+             Write_Eol;
+          end if;
+ 
+          --  Skip this for predefined units because of the rtsfind mechanism
+ 
+          if not In_Predefined_Unit (P_Name) then
+             Set_Is_Visible_Lib_Unit (P_Name, False);
+          end if;
        end if;
     end Remove_Parents;
  
diff -Nrcpad gcc-16-20260125/gcc/ada/sem_ch4.adb gcc-16-20260201/gcc/ada/sem_ch4.adb
*** gcc-16-20260125/gcc/ada/sem_ch4.adb	Sun Jan 25 22:32:06 2026
--- gcc-16-20260201/gcc/ada/sem_ch4.adb	Sun Feb  1 22:32:07 2026
*************** package body Sem_Ch4 is
*** 5741,5752 ****
           --  Ada 2005 (AI05-0030): In the case of dispatching requeue, the
           --  selected component should resolve to a name.
  
!          --  Extension feature: Also support calls with prefixed views for
!          --  untagged record types.
  
           if Ada_Version >= Ada_2005
             and then (Is_Tagged_Type (Prefix_Type)
!                        or else Core_Extensions_Allowed)
             and then not Is_Concurrent_Type (Prefix_Type)
           then
              if Nkind (Parent (N)) = N_Generic_Association
--- 5741,5752 ----
           --  Ada 2005 (AI05-0030): In the case of dispatching requeue, the
           --  selected component should resolve to a name.
  
!          --  GNAT extension: Accept calls with prefixed view for untagged
!          --  record types.
  
           if Ada_Version >= Ada_2005
             and then (Is_Tagged_Type (Prefix_Type)
!                       or else Core_Extensions_Allowed)
             and then not Is_Concurrent_Type (Prefix_Type)
           then
              if Nkind (Parent (N)) = N_Generic_Association
*************** package body Sem_Ch4 is
*** 5816,5823 ****
                 --  Before declaring an error, check whether this is tagged
                 --  private type and a call to a primitive operation.
  
                 elsif Ada_Version >= Ada_2005
!                  and then Is_Tagged_Type (Prefix_Type)
                   and then Try_Object_Operation (N)
                 then
                    return;
--- 5816,5827 ----
                 --  Before declaring an error, check whether this is tagged
                 --  private type and a call to a primitive operation.
  
+                --  GNAT extension: Accept calls with prefixed view for
+                --  untagged private types
+ 
                 elsif Ada_Version >= Ada_2005
!                  and then (Is_Tagged_Type (Prefix_Type)
!                             or else Core_Extensions_Allowed)
                   and then Try_Object_Operation (N)
                 then
                    return;
*************** package body Sem_Ch4 is
*** 5835,5842 ****
              Next_Entity (Comp);
           end loop;
  
!          --  Extension feature: Also support calls with prefixed views for
!          --  untagged private types.
  
           if Core_Extensions_Allowed then
              if Try_Object_Operation (N) then
--- 5839,5846 ----
              Next_Entity (Comp);
           end loop;
  
!          --  GNAT extension: Accept calls with prefixed view for untagged
!          --  private types.
  
           if Core_Extensions_Allowed then
              if Try_Object_Operation (N) then
*************** package body Sem_Ch4 is
*** 6018,6026 ****
           --  visible entities are plausible interpretations, check whether
           --  there is some other primitive operation with that name.
  
           if Ada_Version >= Ada_2005 and then Is_Tagged_Type (Prefix_Type) then
!             if (Etype (N) = Any_Type
!                   or else not Has_Candidate)
                and then Try_Object_Operation (N)
              then
                 return;
--- 6022,6034 ----
           --  visible entities are plausible interpretations, check whether
           --  there is some other primitive operation with that name.
  
+          --  Note that, unlike for other types, we do not accept calls with
+          --  prefixed view for untagged concurrent types with -gnatX, since
+          --  this would require associated legality rules to avoid conflict
+          --  with protected operations or entries of the concurrent types.
+ 
           if Ada_Version >= Ada_2005 and then Is_Tagged_Type (Prefix_Type) then
!             if (Etype (N) = Any_Type or else not Has_Candidate)
                and then Try_Object_Operation (N)
              then
                 return;
*************** package body Sem_Ch4 is
*** 6096,6103 ****
  
           Set_Is_Overloaded (N, Is_Overloaded (Sel));
  
!       --  Extension feature: Also support calls with prefixed views for
!       --  untagged types.
  
        elsif Core_Extensions_Allowed
          and then Try_Object_Operation (N)
--- 6104,6110 ----
  
           Set_Is_Overloaded (N, Is_Overloaded (Sel));
  
!       --  GNAT extension: Accept calls with prefixed view for untagged types
  
        elsif Core_Extensions_Allowed
          and then Try_Object_Operation (N)
*************** package body Sem_Ch4 is
*** 10364,10371 ****
           --  type, this is not a prefixed call. Restore the previous type as
           --  the current one is not a legal candidate.
  
!          --  Extension feature: Calls with prefixed views are also supported
!          --  for untagged types, so skip the early return when extensions are
           --  enabled, unless the type doesn't have a primitive operations list
           --  (such as in the case of predefined types).
  
--- 10371,10378 ----
           --  type, this is not a prefixed call. Restore the previous type as
           --  the current one is not a legal candidate.
  
!          --  GNAT extension: Given that calls with prefixed view are accepted
!          --  for untagged types, skip the early return when extensions are
           --  enabled, unless the type doesn't have a primitive operations list
           --  (such as in the case of predefined types).
  
*************** package body Sem_Ch4 is
*** 10391,10397 ****
                     (Call_Node       => New_Call_Node,
                      Node_To_Replace => Node_To_Replace);
  
!                --  Extension feature: In the case where the prefix is of an
                 --  access type, and a primitive wasn't found for the designated
                 --  type, then if the access type has primitives we attempt a
                 --  prefixed call using one of its primitives. (It seems that
--- 10398,10404 ----
                     (Call_Node       => New_Call_Node,
                      Node_To_Replace => Node_To_Replace);
  
!                --  GNAT extension: In the case where the prefix is of an
                 --  access type, and a primitive wasn't found for the designated
                 --  type, then if the access type has primitives we attempt a
                 --  prefixed call using one of its primitives. (It seems that
diff -Nrcpad gcc-16-20260125/gcc/ada/sem_ch8.adb gcc-16-20260201/gcc/ada/sem_ch8.adb
*** gcc-16-20260125/gcc/ada/sem_ch8.adb	Sun Jan 25 22:32:06 2026
--- gcc-16-20260201/gcc/ada/sem_ch8.adb	Sun Feb  1 22:32:07 2026
*************** package body Sem_Ch8 is
*** 5516,5534 ****
           elsif In_Open_Scopes (Scope (Base_Type (T))) then
              null;
  
!          --  Turn off the use_type_clause on the type unless the clause is
!          --  redundant, or there's a previous use_type_clause. (The case where
!          --  a use_type_clause without "all" is followed by one with "all" in
!          --  a more nested scope is not considered redundant, necessitating
!          --  the test for a previous clause. One might expect the latter test
!          --  to suffice, but it turns out there are cases where Redundant_Use
!          --  is set, but Prev_Use_Clause is not set. ???)
  
!          elsif not Redundant_Use (Id) and then No (Prev_Use_Clause (N)) then
!             Set_In_Use (T, False);
!             Set_In_Use (Base_Type (T), False);
!             Set_Current_Use_Clause (T, Empty);
!             Set_Current_Use_Clause (Base_Type (T), Empty);
  
              --  See Use_One_Type for the rationale. This is a bit on the naive
              --  side, but should be good enough in practice.
--- 5516,5529 ----
           elsif In_Open_Scopes (Scope (Base_Type (T))) then
              null;
  
!          --  Reinstate a previous use_type_clause (if any) on the type unless
!          --  the current use_type_clause is redundant.
  
!          elsif not Redundant_Use (Id) then
!             Set_In_Use (T, Present (Prev_Use_Clause (N)));
!             Set_In_Use (Base_Type (T), Present (Prev_Use_Clause (N)));
!             Set_Current_Use_Clause (T, Prev_Use_Clause (N));
!             Set_Current_Use_Clause (Base_Type (T), Prev_Use_Clause (N));
  
              --  See Use_One_Type for the rationale. This is a bit on the naive
              --  side, but should be good enough in practice.
diff -Nrcpad gcc-16-20260125/gcc/ada/sem_type.adb gcc-16-20260201/gcc/ada/sem_type.adb
*** gcc-16-20260125/gcc/ada/sem_type.adb	Sun Jan 25 22:32:06 2026
--- gcc-16-20260201/gcc/ada/sem_type.adb	Sun Feb  1 22:32:07 2026
*************** package body Sem_Type is
*** 1013,1020 ****
        elsif T2 = Any_Composite and then Is_Aggregate_Type (T1) then
           return True;
  
!       --  In Ada_2022, an aggregate is compatible with the type that
!       --  as the corresponding aspect.
  
        elsif Ada_Version >= Ada_2022
          and then T2 = Any_Composite
--- 1013,1020 ----
        elsif T2 = Any_Composite and then Is_Aggregate_Type (T1) then
           return True;
  
!       --  In Ada 2022, an aggregate is compatible with the type that
!       --  has the corresponding aspect.
  
        elsif Ada_Version >= Ada_2022
          and then T2 = Any_Composite
*************** package body Sem_Type is
*** 3377,3382 ****
--- 3377,3385 ----
          or else (T1 = Any_Character     and then Is_Character_Type (T2))
          or else (T1 = Any_String        and then Is_String_Type (T2))
          or else (T1 = Any_Composite     and then Is_Aggregate_Type (T2))
+         or else (Ada_Version >= Ada_2022
+                   and then T1 = Any_Composite
+                   and then Has_Aspect (T2, Aspect_Aggregate))
        then
           return B2;
  
*************** package body Sem_Type is
*** 3397,3402 ****
--- 3400,3408 ----
          or else (T2 = Any_Character     and then Is_Character_Type (T1))
          or else (T2 = Any_String        and then Is_String_Type (T1))
          or else (T2 = Any_Composite     and then Is_Aggregate_Type (T1))
+         or else (Ada_Version >= Ada_2022
+                   and then T2 = Any_Composite
+                   and then Has_Aspect (T1, Aspect_Aggregate))
        then
           return B1;
  
diff -Nrcpad gcc-16-20260125/gcc/algol68/ChangeLog gcc-16-20260201/gcc/algol68/ChangeLog
*** gcc-16-20260125/gcc/algol68/ChangeLog	Sun Jan 25 22:32:06 2026
--- gcc-16-20260201/gcc/algol68/ChangeLog	Sun Feb  1 22:32:07 2026
***************
*** 1,3 ****
--- 1,59 ----
+ 2026-01-31  Jose E. Marchesi  <jemarch@gnu.org>
+ 
+ 	* a68.h: Prototypes for a68_bits_test and a68_lower_test3.
+ 	* a68-low-bits.cc (a68_bits_test): New function.
+ 	* a68-low-prelude.cc (a68_lower_test3): Likewise.
+ 	* a68-parser-prelude.cc (gnu_prelude): Declare TEST operators and
+ 	their priority.
+ 	* ga68.texi (Extended bits operators): New section.
+ 
+ 2026-01-31  Jose E. Marchesi  <jemarch@gnu.org>
+ 
+ 	* ga68.texi (POSIX files): Document SET and CLEAR operators.
+ 	* a68.h: Prototypes for a68_bits_set, a68_bits_clear,
+ 	a68_lower_set3 and a68_lower_clear3.
+ 	* a68-low-bits.cc (a68_bits_set): New function.
+ 	(a68_bits_clear): Likewise.
+ 	* a68-low-prelude.cc (a68_lower_set3): Likewise.
+ 	(a68_lower_clear3): Likewise.
+ 	* a68-parser-prelude.cc (gnu_prelude): Declare operators SET and
+ 	CLEAR and their priorities.
+ 
+ 2026-01-30  Marc Poulhiès  <dkm@kataplop.net>
+ 
+ 	* ga68-coding-guidelines.texi: Typo fix.
+ 
+ 2026-01-29  Jose E. Marchesi  <jemarch@gnu.org>
+ 
+ 	* ga68.vw: Update formal grammar to express the GNU extension.
+ 	* a68-parser.cc (a68_dont_mark_here): Likewise.
+ 	* a68-parser-scanner.cc (SINGLE_QUOTE_CHAR): Define.
+ 	(get_next_token): Recognize ' as QUOTE_SYMBOL.
+ 	(tokenise_source): Acknowledge QUOTE_SYMBOL.
+ 	* a68-parser-keywords.cc (a68_set_up_tables): Likewise.
+ 	* a68-parser-bottom-up.cc (reduce_primary_parts): Adjust parser to
+ 	brief form of selection.
+ 	* a68-parser-attrs.def (QUOTE_SYMBOL): New attribute.
+ 	* ga68.texi (Brief selection): New section.
+ 
+ 2026-01-29  Jose E. Marchesi  <jemarch@gnu.org>
+ 
+ 	* ga68.vw: Fix grammar for formal holes.
+ 	* ga68.texi (Particular programs): New section.
+ 	(Comments): Likewise.
+ 	* a68.h: Prototypes for a68_is_c_mode, a68_make_fomal_hole_decl,
+ 	a68_lower_formal_hole.
+ 	* a68-parser-attrs.def (FORMAL_HOLE): New attribute.
+ 	(LANGUAGE_INDICANT): Likewise.
+ 	* a68-parser-extract.cc (a68_elaborate_bold_tags): Elaborate
+ 	language indicants.
+ 	* a68-parser-moids-check.cc (mode_check_unit): Check mode in
+ 	formal holes.
+ 	* a68-low-units.cc (a68_lower_formal_hole): New function.
+ 	* a68-low.cc (a68_make_formal_hole_decl): Likewise.
+ 	* a68-moids-misc.cc (a68_is_c_mode): Likewise.
+ 	* a68-parser-bottom-up.cc (reduce_formal_holes): Likewise.
+ 
  2026-01-24  Jose E. Marchesi  <jemarch@gnu.org>
  
  	PR algol68/123733
diff -Nrcpad gcc-16-20260125/gcc/algol68/a68-low-bits.cc gcc-16-20260201/gcc/algol68/a68-low-bits.cc
*** gcc-16-20260125/gcc/algol68/a68-low-bits.cc	Sun Jan 25 22:32:06 2026
--- gcc-16-20260201/gcc/algol68/a68-low-bits.cc	Sun Feb  1 22:32:07 2026
*************** a68_bits_ne (tree a, tree b, location_t
*** 295,297 ****
--- 295,408 ----
  {
    return fold_build2_loc (loc, NE_EXPR, boolean_type_node, a, b);
  }
+ 
+ /* Set the bit NUMBIT in BITS.
+ 
+    NUMBIT is one based and counts bits from least significative to most
+    significative, i.e. from "right" to "left".  If NUMBIT is not in range then
+    this is a nop. */
+ 
+ tree
+ a68_bits_set (MOID_T *m, tree bits, tree numbit, location_t loc)
+ {
+   tree bits_type = CTYPE (m);
+   tree int_type = TREE_TYPE (numbit);
+ 
+   bits = save_expr (bits);
+   numbit = save_expr (numbit);
+ 
+   tree numbit_minus_one = fold_build2 (MINUS_EXPR, int_type,
+ 				       numbit, build_int_cst (int_type, 1));
+   tree mask = fold_build2 (BIT_IOR_EXPR, bits_type,
+ 			   bits,
+ 			   fold_build2 (LSHIFT_EXPR,
+ 					bits_type,
+ 					build_int_cst (bits_type, 1),
+ 					numbit_minus_one));
+   tree res = fold_build2 (BIT_IOR_EXPR, bits_type, bits, mask);
+   tree in_range = fold_build2 (TRUTH_AND_EXPR,
+ 			       int_type,
+ 			       fold_build2 (GE_EXPR, int_type,
+ 					    numbit, build_int_cst (int_type, 1)),
+ 			       fold_build2 (LE_EXPR, int_type,
+ 					    numbit, a68_bits_width (bits_type)));
+ 
+   return fold_build3_loc (loc, COND_EXPR,
+ 			  bits_type,
+ 			  in_range, res, bits);
+ }
+ 
+ /* Clear the bit NUMBIT in BITS.
+ 
+    NUMBIT is one based and counts bits from least significative to most
+    significative, i.e. from "right" to "left".  If NUMBIT is not in range then
+    this is a nop. */
+ 
+ tree
+ a68_bits_clear (MOID_T *m, tree bits, tree numbit, location_t loc)
+ {
+   tree bits_type = CTYPE (m);
+   tree int_type = TREE_TYPE (numbit);
+ 
+   bits = save_expr (bits);
+   numbit = save_expr (numbit);
+ 
+   tree mask = fold_build1 (BIT_NOT_EXPR,
+ 			   bits_type,
+ 			   fold_build2 (LSHIFT_EXPR,
+ 					bits_type,
+ 					build_int_cst (bits_type, 1),
+ 					fold_build2 (MINUS_EXPR,
+ 						     int_type,
+ 						     numbit,
+ 						     build_int_cst (int_type, 1))));
+   tree res = fold_build2 (BIT_AND_EXPR, bits_type, bits, mask);
+   tree in_range = fold_build2 (TRUTH_AND_EXPR,
+ 			       int_type,
+ 			       fold_build2 (GE_EXPR, int_type,
+ 					    numbit, build_int_cst (int_type, 1)),
+ 			       fold_build2 (LE_EXPR, int_type,
+ 					    numbit, a68_bits_width (bits_type)));
+   return fold_build3_loc (loc, COND_EXPR,
+ 			  bits_type,
+ 			  in_range, res, bits);
+ }
+ 
+ /* Test the bit NUMBIT in BITS.
+ 
+    NUMBIT is one based and counts bits from least significative to most
+    significative, i.e. from "right" to "left".  If NUMBIT is not in range then
+    the operator yields false.  */
+ 
+ tree
+ a68_bits_test (tree bits, tree numbit, location_t loc)
+ {
+   tree bits_type = TREE_TYPE (bits);
+   tree int_type = TREE_TYPE (numbit);
+ 
+   bits = save_expr (bits);
+   numbit = save_expr (numbit);
+ 
+   tree numbit_minus_one = fold_build2 (MINUS_EXPR, int_type,
+ 				       numbit, build_one_cst (int_type));
+   tree mask = fold_build2 (BIT_AND_EXPR, bits_type,
+ 			   bits,
+ 			   fold_build2 (LSHIFT_EXPR,
+ 					bits_type,
+ 					build_one_cst (bits_type),
+ 					fold_convert (bits_type, numbit_minus_one)));
+   tree res = fold_build2 (NE_EXPR,
+ 			  a68_bool_type,
+ 			  fold_build2 (BIT_AND_EXPR, bits_type, bits, mask),
+ 			  build_int_cst (bits_type, 0));
+   tree in_range = fold_build2 (TRUTH_AND_EXPR,
+ 			       int_type,
+ 			       fold_build2 (GE_EXPR, int_type,
+ 					    numbit, build_int_cst (int_type, 1)),
+ 			       fold_build2 (LE_EXPR, int_type,
+ 					    numbit, a68_bits_width (bits_type)));
+ 
+   return fold_build3_loc (loc, COND_EXPR,
+ 			  a68_bool_type,
+ 			  in_range, res, build_zero_cst (a68_bool_type));
+ }
diff -Nrcpad gcc-16-20260125/gcc/algol68/a68-low-prelude.cc gcc-16-20260201/gcc/algol68/a68-low-prelude.cc
*** gcc-16-20260125/gcc/algol68/a68-low-prelude.cc	Sun Jan 25 22:32:06 2026
--- gcc-16-20260201/gcc/algol68/a68-low-prelude.cc	Sun Feb  1 22:32:07 2026
*************** a68_lower_elems3 (NODE_T *p, LOW_CTX_T c
*** 751,756 ****
--- 751,780 ----
  }
  
  tree
+ a68_lower_set3 (NODE_T *p, LOW_CTX_T ctx)
+ {
+   tree op1 = a68_lower_tree (SUB (p), ctx);
+   tree op2 = a68_lower_tree (NEXT (NEXT (SUB (p))), ctx);
+   return a68_bits_set (MOID (p), op1, op2, a68_get_node_location (p));
+ }
+ 
+ tree
+ a68_lower_clear3 (NODE_T *p, LOW_CTX_T ctx)
+ {
+   tree op1 = a68_lower_tree (SUB (p), ctx);
+   tree op2 = a68_lower_tree (NEXT (NEXT (SUB (p))), ctx);
+   return a68_bits_clear (MOID (p), op1, op2, a68_get_node_location (p));
+ }
+ 
+ tree
+ a68_lower_test3 (NODE_T *p, LOW_CTX_T ctx)
+ {
+   tree op1 = a68_lower_tree (SUB (p), ctx);
+   tree op2 = a68_lower_tree (NEXT (NEXT (SUB (p))), ctx);
+   return a68_bits_test (op1, op2, a68_get_node_location (p));
+ }
+ 
+ tree
  a68_lower_pow_int (NODE_T *p, LOW_CTX_T ctx)
  {
    tree op1 = a68_lower_tree (SUB (p), ctx);
diff -Nrcpad gcc-16-20260125/gcc/algol68/a68-low-units.cc gcc-16-20260201/gcc/algol68/a68-low-units.cc
*** gcc-16-20260125/gcc/algol68/a68-low-units.cc	Sun Jan 25 22:32:06 2026
--- gcc-16-20260201/gcc/algol68/a68-low-units.cc	Sun Feb  1 22:32:07 2026
*************** a68_lower_routine_text (NODE_T *p, LOW_C
*** 1238,1243 ****
--- 1238,1270 ----
  			func_decl);
  }
  
+ /* Lower a formal hole.
+ 
+       formal hole : formal nest symbol, tertiary ;
+                     formal nest symbol, language indicant, tertiary.
+ */
+ 
+ tree
+ a68_lower_formal_hole (NODE_T *p, LOW_CTX_T ctx ATTRIBUTE_UNUSED)
+ {
+   NODE_T *str = NEXT_SUB (p);
+   if (IS (str, LANGUAGE_INDICANT))
+     FORWARD (str);
+   gcc_assert (IS (str, TERTIARY));
+   while (str != NO_NODE && !IS (str, ROW_CHAR_DENOTATION))
+     str = SUB (str);
+   gcc_assert (IS (str, ROW_CHAR_DENOTATION));
+ 
+   char *symbol = a68_string_process_breaks (p, NSYMBOL (str));
+ 
+   tree decl;
+   if (IS (MOID (p), PROC_SYMBOL))
+     decl = a68_make_proc_formal_hole_decl (p, symbol);
+   else
+     decl = a68_make_formal_hole_decl (p, symbol);
+   return decl;
+ }
+ 
  /* Lower an unit.
  
        unit : assignation; identity relation;
diff -Nrcpad gcc-16-20260125/gcc/algol68/a68-low.cc gcc-16-20260201/gcc/algol68/a68-low.cc
*** gcc-16-20260125/gcc/algol68/a68-low.cc	Sun Jan 25 22:32:06 2026
--- gcc-16-20260201/gcc/algol68/a68-low.cc	Sun Feb  1 22:32:07 2026
*************** a68_make_variable_declaration_decl (NODE
*** 631,636 ****
--- 631,692 ----
    return decl;
  }
  
+ /* Make an extern declaration for a formal hole.  */
+ 
+ tree
+ a68_make_formal_hole_decl (NODE_T *p, const char *extern_symbol)
+ {
+   /* The CTYPE of MODE is a pointer to a function.  We need the pointed
+      function type for the FUNCTION_DECL.  */
+   tree type = (IS (MOID (p), PROC_SYMBOL)
+ 	       ? TREE_TYPE (CTYPE (MOID (p)))
+ 	       : CTYPE (MOID (p)));
+ 
+   gcc_assert (strlen (extern_symbol) > 0);
+   const char *sym = (extern_symbol[0] == '&'
+ 		     ? extern_symbol + 1
+ 		     : extern_symbol);
+ 
+   tree decl = build_decl (a68_get_node_location (p),
+ 			  VAR_DECL,
+ 			  get_identifier (sym),
+ 			  type);
+   DECL_EXTERNAL (decl) = 1;
+   TREE_PUBLIC (decl) = 1;
+   DECL_INITIAL (decl) = a68_get_skip_tree (MOID (p));
+ 
+   if (extern_symbol[0] == '&')
+     decl = fold_build1 (ADDR_EXPR, type, decl);
+   return decl;
+ }
+ 
+ /* Make an extern declaration for a formal hole that is a function.  */
+ 
+ tree
+ a68_make_proc_formal_hole_decl (NODE_T *p, const char *extern_symbol)
+ {
+   /* The CTYPE of MODE is a pointer to a function.  We need the pointed
+      function type for the FUNCTION_DECL.  */
+   tree type = TREE_TYPE (CTYPE (MOID (p)));
+ 
+   gcc_assert (strlen (extern_symbol) > 0);
+   const char *sym = (extern_symbol[0] == '&'
+ 		     ? extern_symbol + 1
+ 		     : extern_symbol);
+ 
+   tree decl = build_decl (a68_get_node_location (p),
+ 			  FUNCTION_DECL,
+ 			  get_identifier (sym),
+ 			  type);
+   DECL_EXTERNAL (decl) = 1;
+   TREE_PUBLIC (decl) = 1;
+   DECL_INITIAL (decl) = a68_get_skip_tree (MOID (p));
+ 
+   if (extern_symbol[0] == '&')
+     decl = fold_build1 (ADDR_EXPR, type, decl);
+   return decl;
+ }
+ 
  /* Do a checked indirection.
  
     P is a tree node used for its location information.
*************** a68_lower_tree (NODE_T *p, LOW_CTX_T ctx
*** 1621,1626 ****
--- 1677,1685 ----
      case OR_FUNCTION:
        res = a68_lower_logic_function (p, ctx);
        break;
+     case FORMAL_HOLE:
+       res = a68_lower_formal_hole (p, ctx);
+       break;
      case IDENTITY_RELATION:
        res = a68_lower_identity_relation (p, ctx);
        break;
diff -Nrcpad gcc-16-20260125/gcc/algol68/a68-moids-misc.cc gcc-16-20260201/gcc/algol68/a68-moids-misc.cc
*** gcc-16-20260125/gcc/algol68/a68-moids-misc.cc	Sun Jan 25 22:32:06 2026
--- gcc-16-20260201/gcc/algol68/a68-moids-misc.cc	Sun Feb  1 22:32:07 2026
*************** a68_is_balanced (NODE_T *n, SOID_T *y, i
*** 1059,1065 ****
      {
        bool k = false;
  
!       for (; y != NO_SOID && !k; FORWARD (y)) 
  	k = (!IS (MOID (y), STOWED_MODE));
  
        if (k == false)
--- 1059,1065 ----
      {
        bool k = false;
  
!       for (; y != NO_SOID && !k; FORWARD (y))
  	k = (!IS (MOID (y), STOWED_MODE));
  
        if (k == false)
*************** a68_determine_unique_mode (SOID_T *z, in
*** 1189,1194 ****
--- 1189,1232 ----
      }
  }
  
+ /* Whether the given mode M is a valid mode for a C formal hole.  See
+    metaproduction rule 561B in ga68.vw.  */
+ 
+ bool
+ a68_is_c_mode (MOID_T *m)
+ {
+   if (m == M_VOID || m == M_BOOL || m == M_CHAR)
+     return true;
+   else if (IS_INTEGRAL (m))
+     return true;
+   else if (IS_BITS (m))
+     return true;
+   else if (IS_REAL (m))
+     return true;
+   else if (IS_REF (m))
+     return a68_is_c_mode (SUB (m));
+   else if (IS (m, PROC_SYMBOL))
+     {
+       bool yielded_mode_valid = a68_is_c_mode (SUB (m));
+       bool params_valid = true;
+ 
+       for (PACK_T *z = PACK (m); z != NO_PACK; FORWARD (z))
+ 	params_valid &= a68_is_c_mode (MOID (z));
+ 
+       return yielded_mode_valid && params_valid;
+     }
+   else if (IS_STRUCT (m))
+     {
+       bool fields_valid = true;
+ 
+       for (PACK_T *z = PACK (m); z != NO_PACK; FORWARD (z))
+ 	fields_valid &= a68_is_c_mode (MOID (z));
+       return fields_valid;
+     }
+ 
+   return false;
+ }
+ 
  /* Insert coercion A in the tree.  */
  
  void
diff -Nrcpad gcc-16-20260125/gcc/algol68/a68-parser-attrs.def gcc-16-20260201/gcc/algol68/a68-parser-attrs.def
*** gcc-16-20260125/gcc/algol68/a68-parser-attrs.def	Sun Jan 25 22:32:06 2026
--- gcc-16-20260201/gcc/algol68/a68-parser-attrs.def	Sun Feb  1 22:32:07 2026
*************** A68_ATTR(FORMAL_BOUNDS_LIST, "list of fo
*** 140,145 ****
--- 140,146 ----
  A68_ATTR(FORMAL_DECLARERS, "formal declarers")
  A68_ATTR(FORMAL_DECLARERS_LIST, "list of formal declarers")
  A68_ATTR(FORMAL_DECLARER_MARK, "formal declarer mark")
+ A68_ATTR(FORMAL_HOLE, "formal hole")
  A68_ATTR(FORMAL_NEST_SYMBOL, "formal-nest-symbol")
  A68_ATTR(FORMULA, "formula")
  A68_ATTR(FOR_PART, "for-part")
*************** A68_ATTR(LABEL, "label")
*** 223,228 ****
--- 224,230 ----
  A68_ATTR(LABELED_UNIT, "labeled unit")
  A68_ATTR(LABEL_IDENTIFIER, "label identifier")
  A68_ATTR(LABEL_SEQUENCE, "label sequence")
+ A68_ATTR(LANGUAGE_INDICANT, "language indicant")
  A68_ATTR(LITERAL, "literal")
  A68_ATTR(LOCAL_LABEL, "local label")
  A68_ATTR(LOC_SYMBOL, "loc-symbol")
*************** A68_ATTR(PROCEDURING, "proceduring coerc
*** 303,308 ****
--- 305,311 ----
  A68_ATTR(PROC_SYMBOL, "proc-symbol")
  A68_ATTR(PUBLIC_SYMBOL, "public-symbol")
  A68_ATTR(QUALIFIER, "qualifier")
+ A68_ATTR(QUOTE_SYMBOL,"quote-symbol")
  A68_ATTR(RADIX_FRAME, "radix frame")
  A68_ATTR(REAL_DENOTATION, "real denotation")
  A68_ATTR(REAL_PATTERN, "real pattern")
diff -Nrcpad gcc-16-20260125/gcc/algol68/a68-parser-bottom-up.cc gcc-16-20260201/gcc/algol68/a68-parser-bottom-up.cc
*** gcc-16-20260125/gcc/algol68/a68-parser-bottom-up.cc	Sun Jan 25 22:32:06 2026
--- gcc-16-20260201/gcc/algol68/a68-parser-bottom-up.cc	Sun Feb  1 22:32:07 2026
*************** static void reduce_basic_declarations (N
*** 135,140 ****
--- 135,141 ----
  static void reduce_declaration_lists (NODE_T *p);
  static void reduce_module_texts (NODE_T *p);
  static void reduce_module_text_parts (NODE_T *p);
+ static void reduce_formal_holes (NODE_T *p);
  static NODE_T *reduce_dyadic (NODE_T *p, int u);
  
  /* Whether a series is serial or collateral.  */
*************** reduce_branch (NODE_T *q, enum a68_attri
*** 687,692 ****
--- 688,694 ----
  	  reduce_right_to_left_constructs (p);
  	  /* Reduce units and declarations.  */
  	  reduce_basic_declarations (p);
+ 	  reduce_formal_holes (p);
  	  reduce_units (p);
  	  reduce_erroneous_units (p);
  	  if (expect != UNIT)
*************** reduce_primary_parts (NODE_T *p, enum a6
*** 1194,1205 ****
  {
    for (NODE_T *q = p; q != NO_NODE; FORWARD (q))
      {
!       if (a68_whether (q, IDENTIFIER, OF_SYMBOL, STOP))
  	ATTRIBUTE (q) = FIELD_IDENTIFIER;
  
        reduce (q, NO_NOTE, NO_TICK, NIHIL, NIL_SYMBOL, STOP);
        reduce (q, NO_NOTE, NO_TICK, SKIP, SKIP_SYMBOL, STOP);
        reduce (q, NO_NOTE, NO_TICK, SELECTOR, FIELD_IDENTIFIER, OF_SYMBOL, STOP);
        /* JUMPs without GOTO are resolved later.  */
        reduce (q, NO_NOTE, NO_TICK, JUMP, GOTO_SYMBOL, IDENTIFIER, STOP);
        reduce (q, NO_NOTE, NO_TICK, DENOTATION, LONGETY, INT_DENOTATION, STOP);
--- 1196,1209 ----
  {
    for (NODE_T *q = p; q != NO_NODE; FORWARD (q))
      {
!       if (a68_whether (q, IDENTIFIER, OF_SYMBOL, STOP)
! 	  || a68_whether (q, IDENTIFIER, QUOTE_SYMBOL, STOP))
  	ATTRIBUTE (q) = FIELD_IDENTIFIER;
  
        reduce (q, NO_NOTE, NO_TICK, NIHIL, NIL_SYMBOL, STOP);
        reduce (q, NO_NOTE, NO_TICK, SKIP, SKIP_SYMBOL, STOP);
        reduce (q, NO_NOTE, NO_TICK, SELECTOR, FIELD_IDENTIFIER, OF_SYMBOL, STOP);
+       reduce (q, NO_NOTE, NO_TICK, SELECTOR, FIELD_IDENTIFIER, QUOTE_SYMBOL, STOP);
        /* JUMPs without GOTO are resolved later.  */
        reduce (q, NO_NOTE, NO_TICK, JUMP, GOTO_SYMBOL, IDENTIFIER, STOP);
        reduce (q, NO_NOTE, NO_TICK, DENOTATION, LONGETY, INT_DENOTATION, STOP);
*************** reduce_tertiaries (NODE_T *p)
*** 1840,1849 ****
      }
  }
  
  /* Reduce units. */
  
  static void
! reduce_units (NODE_T * p)
  {
    /* Stray ~ is a SKIP.  */
    for (NODE_T *q = p; q != NO_NODE; FORWARD (q))
--- 1844,1884 ----
      }
  }
  
+ /* Reduce formal holes.  */
+ 
+ static void
+ reduce_formal_holes (NODE_T *p)
+ {
+   for (NODE_T *q = p; q != NO_NODE; FORWARD (q))
+     {
+       bool ahole = false;
+       reduce (q, NO_NOTE, &ahole, FORMAL_HOLE,
+ 	      FORMAL_NEST_SYMBOL, TERTIARY, STOP);
+       reduce (q, NO_NOTE, &ahole, FORMAL_HOLE,
+ 	      FORMAL_NEST_SYMBOL, LANGUAGE_INDICANT, TERTIARY, STOP);
+ 
+       if (ahole)
+ 	{
+ 	  /* Check that the tertiary is a row of chars denotation.  */
+ 	  for (NODE_T *s = SUB (q); s != NO_NODE; FORWARD (s))
+ 	    {
+ 	      if (IS (s, TERTIARY)
+ 		  && !(IS (SUB (s), SECONDARY)
+ 		       && IS (SUB (SUB (s)), PRIMARY)
+ 		       && IS (SUB (SUB (SUB (s))), DENOTATION)
+ 		       && IS (SUB (SUB (SUB (SUB (s)))), ROW_CHAR_DENOTATION)))
+ 		{
+ 		  a68_error (s, "expected row char denotation");
+ 		}
+ 	    }
+ 	}
+     }
+ }
+ 
  /* Reduce units. */
  
  static void
! reduce_units (NODE_T *p)
  {
    /* Stray ~ is a SKIP.  */
    for (NODE_T *q = p; q != NO_NODE; FORWARD (q))
*************** reduce_units (NODE_T * p)
*** 1864,1869 ****
--- 1899,1905 ----
        reduce (q, NO_NOTE, NO_TICK, UNIT, SKIP, STOP);
        reduce (q, NO_NOTE, NO_TICK, UNIT, TERTIARY, STOP);
        reduce (q, NO_NOTE, NO_TICK, UNIT, ASSERTION, STOP);
+       reduce (q, NO_NOTE, NO_TICK, UNIT, FORMAL_HOLE, STOP);
      }
  }
  
diff -Nrcpad gcc-16-20260125/gcc/algol68/a68-parser-extract.cc gcc-16-20260201/gcc/algol68/a68-parser-extract.cc
*** gcc-16-20260125/gcc/algol68/a68-parser-extract.cc	Sun Jan 25 22:32:06 2026
--- gcc-16-20260201/gcc/algol68/a68-parser-extract.cc	Sun Feb  1 22:32:07 2026
*************** find_tag_definition (TABLE_T *table, con
*** 135,141 ****
      return 0;
  }
  
! /* Fill in whether bold tag is operator, indicant or module indicant.  */
  
  void
  a68_elaborate_bold_tags (NODE_T *p)
--- 135,142 ----
      return 0;
  }
  
! /* Fill in whether bold tag is operator, indicant, module indicant or language
!    indicant.  */
  
  void
  a68_elaborate_bold_tags (NODE_T *p)
*************** a68_elaborate_bold_tags (NODE_T *p)
*** 144,163 ****
      {
        if (IS (q, BOLD_TAG))
  	{
! 	  switch (find_tag_definition (TABLE (q), NSYMBOL (q)))
  	    {
! 	    case 0:
! 	      a68_error (q, "tag S has not been declared properly");
! 	      break;
! 	    case INDICANT:
! 	      ATTRIBUTE (q) = INDICANT;
! 	      break;
! 	    case OPERATOR:
! 	      ATTRIBUTE (q) = OPERATOR;
! 	      break;
! 	    case MODULE_INDICANT:
! 	      ATTRIBUTE (q) = MODULE_INDICANT;
! 	      break;
  	    }
  	}
      }
--- 145,175 ----
      {
        if (IS (q, BOLD_TAG))
  	{
! 	  if (PREVIOUS (q) != NO_NODE
! 	      && IS (PREVIOUS (q), FORMAL_NEST_SYMBOL))
  	    {
! 	      if (strcmp (NSYMBOL (q), "C") != 0)
! 		a68_error (q, "S is not a valid language indication");
! 	      else
! 		ATTRIBUTE (q) = LANGUAGE_INDICANT;
! 	    }
! 	  else
! 	    {
! 	      switch (find_tag_definition (TABLE (q), NSYMBOL (q)))
! 		{
! 		case 0:
! 		  a68_error (q, "tag S has not been declared properly");
! 		  break;
! 		case INDICANT:
! 		  ATTRIBUTE (q) = INDICANT;
! 		  break;
! 		case OPERATOR:
! 		  ATTRIBUTE (q) = OPERATOR;
! 		  break;
! 		case MODULE_INDICANT:
! 		  ATTRIBUTE (q) = MODULE_INDICANT;
! 		  break;
! 		}
  	    }
  	}
      }
*************** extract_identities (NODE_T *p)
*** 746,751 ****
--- 758,764 ----
  	      FORWARD (q);
  	    }
  
+ 	  NODE_T *declarer = q;
  	  do
  	    {
  	      if (a68_whether ((FORWARD (q)), IDENTIFIER, EQUALS_SYMBOL, STOP))
*************** extract_identities (NODE_T *p)
*** 755,760 ****
--- 768,779 ----
  		    gcc_unreachable ();
  		  ATTRIBUTE (q) = DEFINING_IDENTIFIER;
  		  PUBLICIZED (q) = is_public;
+ 		  if (IS (SUB (declarer), PROC_SYMBOL))
+ 		    {
+ 		      NODE_T *actual_param = NEXT (NEXT (q));
+ 		      if (actual_param != NO_NODE && IS (actual_param, FORMAL_NEST_SYMBOL))
+ 			IN_PROC (tag) = true;
+ 		    }
  		  FORWARD (q);
  		  ATTRIBUTE (q) = ALT_EQUALS_SYMBOL;
  		  q = skip_unit (q);
diff -Nrcpad gcc-16-20260125/gcc/algol68/a68-parser-keywords.cc gcc-16-20260201/gcc/algol68/a68-parser-keywords.cc
*** gcc-16-20260125/gcc/algol68/a68-parser-keywords.cc	Sun Jan 25 22:32:06 2026
--- gcc-16-20260201/gcc/algol68/a68-parser-keywords.cc	Sun Feb  1 22:32:07 2026
*************** a68_set_up_tables (void)
*** 147,152 ****
--- 147,153 ----
        add_keyword (&A68 (top_keyword), ORF_SYMBOL, "OREL");
        add_keyword (&A68 (top_keyword), BRIEF_COMMENT_BEGIN_SYMBOL, "{");
        add_keyword (&A68 (top_keyword), BRIEF_COMMENT_END_SYMBOL, "}");
+       add_keyword (&A68 (top_keyword), QUOTE_SYMBOL, "'");
  
        if (OPTION_STROPPING (&A68_JOB) != SUPPER_STROPPING)
  	{
diff -Nrcpad gcc-16-20260125/gcc/algol68/a68-parser-moids-check.cc gcc-16-20260201/gcc/algol68/a68-parser-moids-check.cc
*** gcc-16-20260125/gcc/algol68/a68-parser-moids-check.cc	Sun Jan 25 22:32:06 2026
--- gcc-16-20260201/gcc/algol68/a68-parser-moids-check.cc	Sun Feb  1 22:32:07 2026
*************** mode_check_unit (NODE_T *p, SOID_T *x, S
*** 1840,1845 ****
--- 1840,1892 ----
        mode_check_bool_function (SUB (p), x, y);
        a68_warn_for_voiding (p, x, y, OR_FUNCTION);
      }
+   else if (IS (p, FORMAL_HOLE))
+     {
+       NODE_T *tertiary = NO_NODE;
+ 
+       for (NODE_T *q = SUB (p); q != NO_NODE; FORWARD (q))
+ 	{
+ 	  if (IS (q, TERTIARY))
+ 	    {
+ 	      tertiary = q;
+ 	      break;
+ 	    }
+ 	}
+ 
+       NODE_T *str = tertiary;
+       while (str != NO_NODE && !IS (str, ROW_CHAR_DENOTATION))
+ 	str = SUB (str);
+       gcc_assert (IS (str, ROW_CHAR_DENOTATION));
+ 
+       if (SORT (x) != STRONG)
+ 	{
+ 	  /* A formal hole should appear in a strong context, and its mode is
+ 	     the goal mode of the context.  */
+ 	  a68_error (p, "formal hole should be in a strong context");
+ 	  a68_make_soid (y, STRONG, M_ERROR, 0);
+ 	}
+       else if (!a68_is_c_mode (MOID (x)))
+ 	{
+ 	  /* Additionally, the mode of the formal hole should be amenable to be
+ 	     somehow "translated" to C semantics. */
+ 	  a68_error (p, "formal hole cannot be of mode M", MOID (x));
+ 	  a68_make_soid (y, STRONG, M_ERROR, 0);
+ 	}
+       else if (NSYMBOL (str)[0] == '&' && !IS_REF (MOID (x)))
+ 	{
+ 	  /* A C formal whole whose string starts with & requires
+ 	     a ref mode.  */
+ 	  a68_error (p, "formal hole should be a name (ref to a mode)");
+ 	  a68_make_soid (y, STRONG, M_ERROR, 0);
+ 	}
+       else
+ 	{
+ 	  SOID_T z;
+ 	  mode_check_unit (tertiary, x, &z);
+ 	  a68_make_soid (y, SORT (x), MOID (x), 0);
+ 	  a68_warn_for_voiding (p, x, y, FORMAL_HOLE);
+ 	}
+     }
  
    MOID (p) = MOID (y);
  }
diff -Nrcpad gcc-16-20260125/gcc/algol68/a68-parser-prelude.cc gcc-16-20260201/gcc/algol68/a68-parser-prelude.cc
*** gcc-16-20260125/gcc/algol68/a68-parser-prelude.cc	Sun Jan 25 22:32:06 2026
--- gcc-16-20260201/gcc/algol68/a68-parser-prelude.cc	Sun Feb  1 22:32:07 2026
*************** gnu_prelude (void)
*** 1315,1320 ****
--- 1315,1323 ----
    MOID_T *m = NO_MOID;
    /* Priorities.  */
    a68_prio ("ELEMS", 8);
+   a68_prio ("SET", 7);
+   a68_prio ("CLEAR", 7);
+   a68_prio ("TEST", 7);
    /* Identifiers.  */
    a68_idf (A68_EXT, "infinity", M_REAL, a68_lower_infinity);
    a68_idf (A68_EXT, "minusinfinity", M_REAL, a68_lower_minusinfinity);
*************** gnu_prelude (void)
*** 1364,1369 ****
--- 1367,1402 ----
    a68_op (A68_EXT, "ELEMS", m, a68_lower_elems2);
    m = a68_proc (M_INT, M_INT, M_ROWS, NO_MOID);
    a68_op (A68_EXT, "ELEMS", m, a68_lower_elems3);
+   /* SHORT SHORT BITS operators.  */
+   m = a68_proc (M_SHORT_SHORT_BITS, M_SHORT_SHORT_BITS, M_INT, NO_MOID);
+   a68_op (A68_EXT, "SET", m, a68_lower_set3);
+   a68_op (A68_EXT, "CLEAR", m, a68_lower_clear3);
+   m = a68_proc (M_BOOL, M_SHORT_SHORT_BITS, M_INT, NO_MOID);
+   a68_op (A68_EXT, "TEST", m, a68_lower_test3);
+   /* SHORT BITS operators.  */
+   m = a68_proc (M_SHORT_BITS, M_SHORT_BITS, M_INT, NO_MOID);
+   a68_op (A68_EXT, "SET", m, a68_lower_set3);
+   a68_op (A68_EXT, "CLEAR", m, a68_lower_clear3);
+   m = a68_proc (M_BOOL, M_SHORT_BITS, M_INT, NO_MOID);
+   a68_op (A68_EXT, "TEST", m, a68_lower_test3);
+   /* BITS operators.  */
+   m = a68_proc (M_BITS, M_BITS, M_INT, NO_MOID);
+   a68_op (A68_EXT, "SET", m, a68_lower_set3);
+   a68_op (A68_EXT, "CLEAR", m, a68_lower_clear3);
+   m = a68_proc (M_BOOL, M_BITS, M_INT, NO_MOID);
+   a68_op (A68_EXT, "TEST", m, a68_lower_test3);
+   /* LONG BITS operators.  */
+   m = a68_proc (M_LONG_BITS, M_LONG_BITS, M_INT, NO_MOID);
+   a68_op (A68_EXT, "SET", m, a68_lower_set3);
+   a68_op (A68_EXT, "CLEAR", m, a68_lower_clear3);
+   m = a68_proc (M_BOOL, M_LONG_BITS, M_INT, NO_MOID);
+   a68_op (A68_EXT, "TEST", m, a68_lower_test3);
+   /* LONG LONG BITS operators.  */
+   m = a68_proc (M_LONG_LONG_BITS, M_LONG_LONG_BITS, M_INT, NO_MOID);
+   a68_op (A68_EXT, "SET", m, a68_lower_set3);
+   a68_op (A68_EXT, "CLEAR", m, a68_lower_clear3);
+   m = a68_proc (M_BOOL, M_LONG_LONG_BITS, M_INT, NO_MOID);
+   a68_op (A68_EXT, "TEST", m, a68_lower_test3);
  }
  
  /* POSIX prelude.  */
diff -Nrcpad gcc-16-20260125/gcc/algol68/a68-parser-scanner.cc gcc-16-20260201/gcc/algol68/a68-parser-scanner.cc
*** gcc-16-20260125/gcc/algol68/a68-parser-scanner.cc	Sun Jan 25 22:32:06 2026
--- gcc-16-20260201/gcc/algol68/a68-parser-scanner.cc	Sun Feb  1 22:32:07 2026
*************** supper_postlude[] = {
*** 77,82 ****
--- 77,83 ----
  #define STOP_CHAR 127
  #define FORMFEED_CHAR '\f'
  #define CR_CHAR '\r'
+ #define SINGLE_QUOTE_CHAR '\''
  #define QUOTE_CHAR '"'
  #define APOSTROPHE_CHAR '\''
  #define BACKSLASH_CHAR '\\'
*************** get_next_token (bool in_format,
*** 1631,1636 ****
--- 1632,1644 ----
  	  *att = POINT_SYMBOL;
  	}
      }
+   else if (!OPTION_STRICT (&A68_JOB) && c == SINGLE_QUOTE_CHAR)
+     {
+       c = next_char (ref_l, ref_s, true);
+       (sym++)[0] = SINGLE_QUOTE_CHAR;
+       sym[0] = '\0';
+       *att = QUOTE_SYMBOL;
+     }
    else if (ISDIGIT (c))
      {
        /* Something that begins with a digit:
*************** tokenise_source (NODE_T **root, int leve
*** 2213,2218 ****
--- 2221,2227 ----
  		case ESAC_SYMBOL:
  		case OD_SYMBOL:
  		case OF_SYMBOL:
+ 		case QUOTE_SYMBOL:
  		case FI_SYMBOL:
  		case CLOSE_SYMBOL:
  		case BUS_SYMBOL:
diff -Nrcpad gcc-16-20260125/gcc/algol68/a68-parser.cc gcc-16-20260201/gcc/algol68/a68-parser.cc
*** gcc-16-20260125/gcc/algol68/a68-parser.cc	Sun Jan 25 22:32:06 2026
--- gcc-16-20260201/gcc/algol68/a68-parser.cc	Sun Feb  1 22:32:07 2026
*************** a68_dont_mark_here (NODE_T *p)
*** 377,382 ****
--- 377,383 ----
      case NIL_SYMBOL:
      case OD_SYMBOL:
      case OF_SYMBOL:
+     case QUOTE_SYMBOL:
      case OPEN_SYMBOL:
      case OP_SYMBOL:
      case ORF_SYMBOL:
diff -Nrcpad gcc-16-20260125/gcc/algol68/a68.h gcc-16-20260201/gcc/algol68/a68.h
*** gcc-16-20260125/gcc/algol68/a68.h	Sun Jan 25 22:32:06 2026
--- gcc-16-20260201/gcc/algol68/a68.h	Sun Feb  1 22:32:07 2026
*************** void a68_make_soid (SOID_T *s, int sort,
*** 476,481 ****
--- 476,482 ----
  void a68_make_strong (NODE_T *n, MOID_T *p, MOID_T *q);
  void a68_make_uniting_coercion (NODE_T *n, MOID_T *q);
  void a68_make_void (NODE_T *p, MOID_T *q);
+ bool a68_is_c_mode (MOID_T *m);
  
  #define A68_DEPREF true
  #define A68_NO_DEPREF false
*************** tree a68_bits_subset (tree bits1, tree b
*** 536,541 ****
--- 537,545 ----
  tree a68_bits_shift (tree shift, tree bits);
  tree a68_bits_eq (tree a, tree b, location_t loc = UNKNOWN_LOCATION);
  tree a68_bits_ne (tree a, tree b, location_t loc = UNKNOWN_LOCATION);
+ tree a68_bits_set (MOID_T *m, tree bits, tree numbit, location_t loc = UNKNOWN_LOCATION);
+ tree a68_bits_clear (MOID_T *m, tree bits, tree numbit, location_t loc = UNKNOWN_LOCATION);
+ tree a68_bits_test (tree bits, tree numbit, location_t loc = UNKNOWN_LOCATION);
  
  /* a68-low_bools.cc  */
  
*************** tree a68_make_variable_declaration_decl
*** 810,815 ****
--- 814,821 ----
  tree a68_make_proc_identity_declaration_decl (NODE_T *identifier, const char *module_name = NULL,
  					      bool indicant = false, bool external = false,
  					      const char *extern_symbol = NULL);
+ tree a68_make_formal_hole_decl (NODE_T *p, const char *extern_symbol);
+ tree a68_make_proc_formal_hole_decl (NODE_T *p, const char *extern_symbol);
  tree a68_make_anonymous_routine_decl (MOID_T *mode);
  tree a68_get_skip_tree (MOID_T *m);
  tree a68_get_empty (void);
*************** tree a68_lower_assignation (NODE_T *p, L
*** 873,878 ****
--- 879,885 ----
  tree a68_lower_routine_text (NODE_T *p, LOW_CTX_T ctx);
  tree a68_lower_generator (NODE_T *p, LOW_CTX_T ctx);
  tree a68_lower_call (NODE_T *p, LOW_CTX_T ctx);
+ tree a68_lower_formal_hole (NODE_T *p, LOW_CTX_T ctx);
  tree a68_lower_unit (NODE_T *p, LOW_CTX_T ctx);
  
  /* a68-low-generator.c  */
*************** tree a68_lower_shortenreal2 (NODE_T *p,
*** 1067,1072 ****
--- 1074,1082 ----
  tree a68_lower_random (NODE_T *p, LOW_CTX_T ctx);
  tree a68_lower_longrandom (NODE_T *p, LOW_CTX_T ctx);
  tree a68_lower_longlongrandom (NODE_T *p, LOW_CTX_T ctx);
+ tree a68_lower_set3 (NODE_T *p, LOW_CTX_T ctx);
+ tree a68_lower_clear3 (NODE_T *p, LOW_CTX_T ctx);
+ tree a68_lower_test3 (NODE_T *p, LOW_CTX_T ctx);
  tree a68_lower_posixargc (NODE_T *p, LOW_CTX_T ctx);
  tree a68_lower_posixargv (NODE_T *p, LOW_CTX_T ctx);
  tree a68_lower_posixputchar (NODE_T *p, LOW_CTX_T ctx);
diff -Nrcpad gcc-16-20260125/gcc/algol68/ga68-coding-guidelines.texi gcc-16-20260201/gcc/algol68/ga68-coding-guidelines.texi
*** gcc-16-20260125/gcc/algol68/ga68-coding-guidelines.texi	Sun Jan 25 22:32:06 2026
--- gcc-16-20260201/gcc/algol68/ga68-coding-guidelines.texi	Sun Feb  1 22:32:07 2026
*************** proc hash_string (string s)
*** 441,447 ****
  @node Closed clauses
  @section Closed clauses
  
! Algol 68 allows using @code{(} an @code{)} instead of @code{begin} and
  @code{end} to delimit closed clauses.  In fact, parenthesized
  expression in other programming languages are realized in Algol 68
  with closed clauses, in a very orthogonal way.  Both forms are useful
--- 441,447 ----
  @node Closed clauses
  @section Closed clauses
  
! Algol 68 allows using @code{(} and @code{)} instead of @code{begin} and
  @code{end} to delimit closed clauses.  In fact, parenthesized
  expression in other programming languages are realized in Algol 68
  with closed clauses, in a very orthogonal way.  Both forms are useful
diff -Nrcpad gcc-16-20260125/gcc/algol68/ga68.texi gcc-16-20260201/gcc/algol68/ga68.texi
*** gcc-16-20260125/gcc/algol68/ga68.texi	Sun Jan 25 22:32:06 2026
--- gcc-16-20260201/gcc/algol68/ga68.texi	Sun Feb  1 22:32:07 2026
*************** variable @B{C}} is a pseudo-comment.
*** 108,113 ****
--- 108,114 ----
  @menu
  * Invoking ga68::               How to run the compiler.
  * Composing programs::          Packets, modules, holes, particular programs.
+ * Foreign Function Interface::  Communicating with other languages via holes.
  * Comments and pragmats::       Comments and pragmas.
  * Hardware representation::     Representation of programs.
  * Standard prelude::            Standard modes, operators, etc.
*************** modules and separated compilation suppor
*** 407,412 ****
--- 408,414 ----
  @menu
  * Packets::                  Compilation units.
  * Modules::                  Facilities for bottom-up programming.
+ * Holes::                    Facilities for top-down programming.
  * Particular programs::      The main program.
  * The standard environment:: Environment conforming a full program.
  @end menu
*************** identify user-defined modes and operator
*** 997,1002 ****
--- 999,1020 ----
  
  XXX
  
+ @node Holes
+ @section Holes
+ @cindex holes
+ 
+ @dfn{Holes} are part of the modules system and are a mechanism used
+ for two main purposes:
+ 
+ @itemize @minus
+ @item Top-down programming.
+ @item Communication with other programming languages.
+ @end itemize
+ 
+ 
+ At the moment only the second kind of holes are supported by this
+ compiler.  @xref{Foreign Function Interface}.
+ 
  @node Particular programs
  @section Particular programs
  @cindex particular program
*************** involved then the user-prelude is empty.
*** 1137,1142 ****
--- 1155,1316 ----
  Subsequent sections in this manual include a detailed description of
  the contents of these preludes.
  
+ @node Foreign Function Interface
+ @chapter Foreign Function Interface
+ @cindex FFI
+ 
+ It is possible to call functions written in other programming
+ languages, and also to access variables and constants, using the
+ following form of @dfn{formal hole}:
+ 
+ @example
+ @B{nest} @B{language_indicant} "row char denotation"
+ @end example
+ 
+ @noindent
+ Where @B{language_indicant} is a bold word indicating the programming
+ language we are communicating with and the row char denotation
+ specifies the entity we are accessing.  The interpretation of the
+ later depends on the specific language.
+ 
+ The formal hole construction is an @dfn{unit}, and can only appear in
+ a strong context.  It's mode is the mode expected by the strong
+ context.  For example, in the following declaration:
+ 
+ @example
+ int counter = nest C "_counter";
+ @end example
+ 
+ @noindent
+ The mode of the formal hole is @code{@B{int}}, since it is in a strong
+ context (the actual parameter of an identity declaration) in which an
+ integral value is expected.  Likewise, in:
+ 
+ @example
+ proc long int func = nest C "random";
+ @end example
+ 
+ @noindent
+ The expected mode is a procedure that gets no arguments and returns a
+ @code{@B{long} @B{int}}.
+ 
+ The set of modes that are accepted in the formal holes depend on the
+ specific language we are communicating to.  These are usually
+ restricted because the compiler may not know how to translate certain
+ Algol 68 concepts into the foreign language ones.  A compile time
+ error is issued if an invalid mode is required.  Specifics are
+ described in the sections below.
+ 
+ It is important to note that the language-indicants like @code{@B{C}}
+ or @code{@B{Fortran}} are still available to be used as mode
+ indicants, operators or module indicants: they only qualify as
+ language indicants when they appear in a formal hole (@code{@B{nest}})
+ construct.
+ 
+ The following subsections document the specific supported foreign
+ languages.
+ 
+ @menu
+ * Communicating with C::     Accessing C variables and functions.
+ @end menu
+ 
+ @node Communicating with C
+ @section Communicating with C
+ 
+ The language indicant @code{@B{C}} is used to access C variables and
+ calling C functions:
+ 
+ @example
+ @B{nest} @B{C} "[&]symbol"
+ @end example
+ 
+ The row char denotation should contain a symbol corresponding to a C
+ variable or function, optionally preceded by an ampersand @code{&}.
+ It is the responsibility of the programmer to make sure the specified
+ symbol actually corresponds to an entity with the right type.  In case
+ a malformed symbol is specified it will very likely result in an
+ assembler error.
+ 
+ For example, this is how we can access a C variable as an Algol 68
+ constant:
+ 
+ @example
+ @B{int} counter = @B{nest} @B{C} "counter";
+ 
+ @B{if} counter = 0
+ @B{then} ... @B{fi};
+ @end example
+ 
+ If we wanted to be able to change the value of the C variable
+ @code{counter} then we need to add a leading ampersand to the row
+ denotation, and of course change the mode on the Algol 68 side to a
+ @code{@B{ref} @B{int}}:
+ 
+ @example
+ @B{ref} @B{int} counter = @B{nest} @B{C} "&counter";
+ 
+ counter +:= 1;
+ @end example
+ 
+ If we wanted to access a C pointer variable @code{int *ptr} as an
+ Algol 68 name we could do:
+ 
+ @example
+ @B{ref} @B{int} ptr = @B{nest} @B{C} "ptr";
+ 
+ ptr := 100; @{ Changes the value pointed by the C pointer ptr,
+               not of ptr itself @}
+ @end example
+ 
+ If we wanted to call the standard POSIX functions @code{random} and
+ @code{srandom} we could do:
+ 
+ @example
+ @B{proc} @B{long} @B{int} random = @B{nest} @B{C} "random";
+ @B{proc}(@B{bits})@B{void} srandom = @B{nest} @B{C} "srandom";
+ 
+ @B{if} random < 100 @B{then} ... @B{fi}
+ @end example
+ 
+ The modes accepted in a formal hole for C are:
+ 
+ @table @asis
+ @item @code{@B{void}}
+ As C @code{void}.
+ @item @code{@B{bool}}
+ As C @code{bool}.
+ @item @code{@B{char}}
+ As C 32-bit integer.
+ @item @code{@B{int}}
+ As C @code{int}.
+ @item @code{@B{short} @B{int}}
+ As C @code{short}.
+ @item @code{@B{short} @B{short} @B{int}}
+ As C @code{char}.
+ @item @code{@B{long} @B{int}}
+ As C @code{long} or as C @code{int}.
+ @item @code{@B{long} @B{long} @B{int}}
+ As C @code{long long} or as C @code{long} or as C @code{int}.
+ @item @code{@B{bits}}
+ As C @code{unsigned int}.
+ @item @code{@B{short} @B{bits}}
+ As C @code{unsigned short}.
+ @item @code{@B{short} @B{short} @B{bits}}
+ As C @code{unsigned char}.
+ @item @code{@B{long} @B{bits}}
+ As C @code{unsigned long} or as C @code{unsigned int}.
+ @item @code{@B{long} @B{long} @B{bits}}
+ As C @code{unsigned long long} or as C @code{unsigned long} or as C @code{unsigned int}.
+ @item @code{@B{real}}
+ As C @code{float}
+ @item @code{@B{long} @B{real}}
+ As C @code{double}
+ @item @B{proc} with accepted formal parameter modes and yielded mode
+ As the corresponding C functions.
+ @item Structs with fields of accepted modes
+ As the corresponding C structs.
+ @end table
+ 
  @node Comments and pragmats
  @chapter Comments and pragmats
  
*************** Dyadic operator that yields the bit excl
*** 2863,2868 ****
--- 3037,3060 ----
  given bits arguments.
  @end deftypefn
  
+ @deftypefn Operator {} {@B{set}} {= (@B{l} @B{bits} b, @B{int} n) @B{l} @B{bits}}
+ Dyadic operator that sets the @code{n}th least significant bit in
+ @code{@B{b}}.  If @code{n} is not in the range @code{[1,L_bits_width]}
+ then the operator yields @B{b}.
+ @end deftypefn
+ 
+ @deftypefn Operator {} {@B{clear}} {= (@B{l} @B{bits} b, @B{int} n) @B{l} @B{bits}}
+ Dyadic operator that clears the @code{n}th least significant bit in
+ @code{@B{b}}.  If @code{n} is not in the range @code{[1,L_bits_width]}
+ then the operator yields @B{b}.
+ @end deftypefn
+ 
+ @deftypefn Operator {} {@B{test}} {= (@B{l} @B{bits} b, @B{int} n) @B{bool}}
+ Dyadic operator that tests whether the @code{n}th least significant
+ bit in @code{@B{b}} is set. If @code{n} is not in the range
+ @code{1,L_bits_width]} then the operator yields @B{false}.
+ @end deftypefn
+ 
  @node Extended math procedures
  @section Extended math procedures
  
*************** invoking the compiler.
*** 3190,3195 ****
--- 3382,3388 ----
  @menu
  * @code{@B{bin}} and @code{@B{abs}} of negative integral values::
  * Bold taggles::              Using underscores in mode and operator indications.
+ * Brief selection::           Shorter form of the @code{of-symbol}.
  @end menu
  
  @node @code{@B{bin}} and @code{@B{abs}} of negative integral values
*************** like @code{Foo__bar} and @code{_Baz} are
*** 3310,3315 ****
--- 3503,3530 ----
  Bold taggles are available when the gnu68 dialect of the language is
  selected.  @xref{Dialect options}.
  
+ @node Brief selection
+ @section Brief selection
+ 
+ It was early recognized that a shorter alternative representation the
+ of-symbol was very much needed, considering the fact the bold version
+ @code{@B{of}} is at least four characters long.  This makes certain
+ phrases long and also slightly laborious to read, like in:
+ 
+ @example
+ @B{pub} @B{op} + = (@B{Pos} a,b) @B{Pos}: (c @B{of} a + c @B{of} b, r @B{of} a + r @B{of} b),
+        - = (@B{Pos} a,b) @B{Pos}: (c @B{of} a - c @B{of} b, r @B{of} a - r @B{of} b);
+ @end example
+ 
+ This compiler allows using a quote character @code{'} instead of
+ @code{of} in selections of structs and multiples.  Using this brief
+ style the example above now can be written as:
+ 
+ @example
+ @B{pub} @B{op} + = (@B{Pos} a,b) @B{Pos}: (c'a + c'b, r'a + r'b),
+        - = (@B{Pos} a,b) @B{Pos}: (c'a - c'b, r'a - r'b);
+ @end example
+ 
  @include gpl_v3.texi
  @include fdl.texi
  
diff -Nrcpad gcc-16-20260125/gcc/algol68/ga68.vw gcc-16-20260201/gcc/algol68/ga68.vw
*** gcc-16-20260125/gcc/algol68/ga68.vw	Sun Jan 25 22:32:06 2026
--- gcc-16-20260201/gcc/algol68/ga68.vw	Sun Feb  1 22:32:07 2026
***************
*** 40,45 ****
--- 40,48 ----
    [NC] This is the GNU68-2025-005-nestable-comments GNU extension.  It
         adds support for nestable block comments.
  
+   [BF] This is the GNU68-2026-001-brief-selection GNU extension.  It
+        adds support for a brief form of the selection construct.
+ 
    The metaproduction rules, hyper-rules and hyper-alternatives
    introduced by each extension are clearly marked in the sections
    below.  You can easily search for them using the extensions tags in
*************** k) *vacuum : EMPTY PACK.
*** 388,394 ****
  3.4.1 Syntax
  
  A) CHOICE :: choice using boolean ; CASE.
! B) CASE :: choice using intgral ; choice using UNITED.
  
  a) SOID NEST1 CHOICE clause{5D,551a,A341h,A349a} :
       CHOICE STYLE start{91a,-},
--- 391,397 ----
  3.4.1 Syntax
  
  A) CHOICE :: choice using boolean ; CASE.
! B) CASE :: choice using integral ; choice using UNITED.
  
  a) SOID NEST1 CHOICE clause{5D,551a,A341h,A349a} :
       CHOICE STYLE start{91a,-},
*************** a) strong reference to MODE NEST nihil{5
*** 1060,1072 ****
  
  5.3.1.1 Syntax
  
  A) REFETY :: REF to ; EMPTY.
  B) REFLEXETY :: REF to ; REF to flexible ; EMPTY.
  
  a) REFETY MODE1 NEST selection{5C} :
       MODE1 field FIELDS applied field selector with TAG{48d},
!        of{94f} token, weak REFLEXETY ROWS of structured with
!                            FIELDS mode NEST SECONDARY{5C},
         where (REFETY) is derived from (REFLEXETY){b,c,-}.
  b) WHETHER (transient reference to) is derived from
             (REF to flexible){a,532,66a} :
--- 1063,1078 ----
  
  5.3.1.1 Syntax
  
+ { Extensions:
+   [BF] brief selection }
+ 
  A) REFETY :: REF to ; EMPTY.
  B) REFLEXETY :: REF to ; REF to flexible ; EMPTY.
  
  a) REFETY MODE1 NEST selection{5C} :
       MODE1 field FIELDS applied field selector with TAG{48d},
!        STYLE selection token, weak REFLEXETY ROWS of structured with
!                                    FIELDS mode NEST SECONDARY{5C},
         where (REFETY) is derived from (REFLEXETY){b,c,-}.
  b) WHETHER (transient reference to) is derived from
             (REF to flexible){a,532,66a} :
*************** a) strong MOID NEST skip{5A} : skip{94f}
*** 1217,1228 ****
  
  5.6.1 Syntax
  
! A) LANGUAGE :: algol sixty eight ; fortran ; c language ; cpp language.
! B) ALGOL68 :: algol sixty eight.
! C) FORTRAM :: fortran.
! D) CLANG :: c language.
! E) CPPLANG :: cpp language.
! F) DLANG :: d language.
  
  a) strong MOID NEST virtual hole{5A} :
       virtual nest symbol, strong MOID NEST closed clause{31a}.
--- 1223,1236 ----
  
  5.6.1 Syntax
  
! A) LANGUAGE :: algol sixty eight ; c language.
! B) CODE :: CAIN ; CLAN ; reference to CAIN ;
!            procedure with PERFORMERS yieling COID ;
!            procedure yielding COID.
! C) PERFORMERS :: PERFORMER ; PERFORMERS PERFORMER.
! D) PERFORMER :: CODE parameter.
! E) COID :: CODE ; void.
! F) CAIN :: real ; long real ; integral ; BITS ; boolean ; char.
  
  a) strong MOID NEST virtual hole{5A} :
       virtual nest symbol, strong MOID NEST closed clause{31a}.
*************** c) MOID NEST actual hole{A6a} :
*** 1233,1247 ****
       strong MOID NEST ENCLOSED clause{31a,33a,c,34a,35a,36a,-}.
  d) hole indication{b} :
       character denotation{814a} ; row of character denotation{83a}.
! e) MOID ALGOL68 indication{b} : EMPTY.
! f) MOID FORTRAN indication{b} : bold letter f letter o letter r letter t
!                                      letter r letter a letter n token.
! g) MOID CLANG indication{b} : bold letter c letter l letter a letter n
!                                    letter g.
! e) MOID CPPLANG indication{b} : bold letter c letter p letter p letter l
!                                      letter a letter n letter g.
! f) MOID DLANG indication{b} : bold letter d letter l letter a letter n
!                                    letter g.
  
  { Since no representation is provided for the virtual-nest-symbol, the
    user is unable to construct virtual-holes for himself, but a
--- 1241,1252 ----
       strong MOID NEST ENCLOSED clause{31a,33a,c,34a,35a,36a,-}.
  d) hole indication{b} :
       character denotation{814a} ; row of character denotation{83a}.
! e) MOID algol sixty eight indication{b} : EMPTY.
! f) COID c language indication{b} : bold letter c token.
! 
! { COID-c-language-indication restricts the `MOID's to the set for
!   which a C equivalence can be immediately determined by the compiler
!   without any additional information.  }
  
  { Since no representation is provided for the virtual-nest-symbol, the
    user is unable to construct virtual-holes for himself, but a
*************** d) CHOICE STYLE out{34l} :
*** 1623,1629 ****
         STYLE else{94f,-} token ;
       where (CHOICE) is (CASE), STYLE out{94f,-} token.
  e) CHOICE STYLE finish{34a} :
!      whre (CHOICE) is (choice using boolean),
         STYLE fi{94f,-} token ;
       where (CHOICE) is (CASE), STYLE esac{94f,-} token.
  f) NOTION token :
--- 1628,1634 ----
         STYLE else{94f,-} token ;
       where (CHOICE) is (CASE), STYLE out{94f,-} token.
  e) CHOICE STYLE finish{34a} :
!      where (CHOICE) is (choice using boolean),
         STYLE fi{94f,-} token ;
       where (CHOICE) is (CASE), STYLE esac{94f,-} token.
  f) NOTION token :
*************** f) STYLE nestable comment item{e} :
*** 1675,1681 ****
    [CS] andth symbol, orel symbol
    [MR] access symbol, module symbol, def symbol, public symbol,
         postlude symbol, formal nest symbol, egg symbol
!   [US] unsafe symbol }
  
  { This section of the Report doesn't describe syntax, but lists all
    the different symbols along with their representation in the
--- 1680,1687 ----
    [CS] andth symbol, orel symbol
    [MR] access symbol, module symbol, def symbol, public symbol,
         postlude symbol, formal nest symbol, egg symbol
!   [US] unsafe symbol
!   [SS] brief of symbol }
  
  { This section of the Report doesn't describe syntax, but lists all
    the different symbols along with their representation in the
*************** d) module symbol{49a}
*** 1695,1700 ****
--- 1701,1708 ----
     formal nest symbol{56b}              NEST
     egg symbol{A6a,c}                    EGG
  f) unsafe symbol{37a}                   UNSAFE
+    bold of symbol{53a}                  OF
+    brief of symbol{53a}                 '
  h) bold comment begin symbol{92a}       NOTE
     bold comment end symbol{92a}         ETON
     brief comment begin symbol{92a}      {
diff -Nrcpad gcc-16-20260125/gcc/analyzer/ChangeLog gcc-16-20260201/gcc/analyzer/ChangeLog
*** gcc-16-20260125/gcc/analyzer/ChangeLog	Sun Jan 25 22:32:06 2026
--- gcc-16-20260201/gcc/analyzer/ChangeLog	Sun Feb  1 22:32:07 2026
***************
*** 1,3 ****
--- 1,41 ----
+ 2026-01-31  David Malcolm  <dmalcolm@redhat.com>
+ 
+ 	PR analyzer/123880
+ 	* engine.cc (throw_custom_edge::update_model): Gracefully handle
+ 	not knowing the current exception in a rethrow.
+ 	(exploded_node::on_throw): Likewise.
+ 
+ 2026-01-27  David Malcolm  <dmalcolm@redhat.com>
+ 
+ 	PR analyzer/122623
+ 	* analyzer.opt (fanalyzer-assume-nothrow): New.
+ 	* analyzer.opt.urls: Regenerate.
+ 	* region-model.cc (can_throw_p): Bail out if the user specified
+ 	-fanalyzer-assume-nothrow.
+ 
+ 2026-01-26  David Malcolm  <dmalcolm@redhat.com>
+ 
+ 	PR analyzer/123145
+ 	* program-state.cc (sm_state_map::impl_set_state): Update
+ 	iteration to avoid looking up binding_key values.
+ 	* region-model-reachability.cc (reachable_regions::handle_sval):
+ 	Use iter.get_svalue.
+ 	(reachable_regions::handle_parm): Likewise.
+ 	* region-model.cc (iterable_cluster::iterable_cluster): Update
+ 	iteration to avoid looking up binding_key values.
+ 	(iterable_cluster::dump_to_pp): Likewise.
+ 	(exposure_through_uninit_copy::calc_num_uninit_bits): Likewise.
+ 	(exposure_through_uninit_copy::complain_about_uninit_ranges):
+ 	Likewise.
+ 	(contains_uninit_p): Likewise.
+ 	* store.cc (binding_map::hash): Likewise.
+ 	* store.h (bit_range::hash): New, based on...
+ 	(concrete_binding::hash): ...this.  Reimplement using the above.
+ 	(binding_map::const_iterator::get_svalue): New decl.
+ 	(binding_map::get_symbolic_bindings): New accessor.
+ 	(binding_map::for_each_value): Update iteration to avoid looking
+ 	up binding_key values.
+ 
  2026-01-21  David Malcolm  <dmalcolm@redhat.com>
  
  	* store.cc (binding_cluster::validate): Reimplement as...
diff -Nrcpad gcc-16-20260125/gcc/analyzer/analyzer.opt gcc-16-20260201/gcc/analyzer/analyzer.opt
*** gcc-16-20260125/gcc/analyzer/analyzer.opt	Sun Jan 25 22:32:06 2026
--- gcc-16-20260201/gcc/analyzer/analyzer.opt	Sun Feb  1 22:32:07 2026
*************** Wanalyzer-too-complex
*** 278,283 ****
--- 278,287 ----
  Common Var(warn_analyzer_too_complex) Init(0) Warning
  Warn if the code is too complicated for the analyzer to fully explore.
  
+ fanalyzer-assume-nothrow
+ Common Var(flag_analyzer_assume_nothrow) Init(0)
+ Assume that no function calls can throw exceptions.
+ 
  fanalyzer-checker=
  Common Joined RejectNegative Var(flag_analyzer_checker)
  Restrict the analyzer to run just the named checker.
diff -Nrcpad gcc-16-20260125/gcc/analyzer/analyzer.opt.urls gcc-16-20260201/gcc/analyzer/analyzer.opt.urls
*** gcc-16-20260125/gcc/analyzer/analyzer.opt.urls	Sun Jan 25 22:32:06 2026
--- gcc-16-20260201/gcc/analyzer/analyzer.opt.urls	Sun Feb  1 22:32:07 2026
*************** UrlSuffix(gcc/Static-Analyzer-Options.ht
*** 156,161 ****
--- 156,164 ----
  Wanalyzer-too-complex
  UrlSuffix(gcc/Static-Analyzer-Options.html#index-Wanalyzer-too-complex)
  
+ fanalyzer-assume-nothrow
+ UrlSuffix(gcc/Static-Analyzer-Options.html#index-fanalyzer-assume-nothrow)
+ 
  fanalyzer-checker=
  UrlSuffix(gcc/Static-Analyzer-Options.html#index-fanalyzer-checker)
  
diff -Nrcpad gcc-16-20260125/gcc/analyzer/engine.cc gcc-16-20260201/gcc/analyzer/engine.cc
*** gcc-16-20260125/gcc/analyzer/engine.cc	Sun Jan 25 22:32:06 2026
--- gcc-16-20260201/gcc/analyzer/engine.cc	Sun Feb  1 22:32:07 2026
*************** public:
*** 1575,1583 ****
    {
      if (m_is_rethrow)
        {
! 	auto eh_node = model->get_current_caught_exception ();
! 	gcc_assert (eh_node);
! 	model->push_thrown_exception (*eh_node);
        }
      else
        {
--- 1575,1588 ----
    {
      if (m_is_rethrow)
        {
! 	if (auto eh_node = model->get_current_caught_exception ())
! 	  model->push_thrown_exception (*eh_node);
! 	else
! 	  {
! 	    /* We have a rethrow of some unknown exception.
! 	       We don't have a good way of representing this;
! 	       leave the exception stack empty.  */
! 	  }
        }
      else
        {
*************** exploded_node::on_throw (exploded_graph
*** 1811,1818 ****
    if (is_rethrow)
      {
        const exception_node *eh_node = model->get_current_caught_exception ();
!       gcc_assert (eh_node);
!       type = eh_node->maybe_get_type ();
      }
    else
      {
--- 1816,1830 ----
    if (is_rethrow)
      {
        const exception_node *eh_node = model->get_current_caught_exception ();
!       if (eh_node)
! 	type = eh_node->maybe_get_type ();
!       else
! 	{
! 	  /* We have a "throw;" but no exception to rethrow.
! 	     Presumably the top-level of the analysis is an
! 	     entrypoint for handling exceptions, so we will
! 	     simulate fully unwinding.  */
! 	}
      }
    else
      {
diff -Nrcpad gcc-16-20260125/gcc/analyzer/program-state.cc gcc-16-20260201/gcc/analyzer/program-state.cc
*** gcc-16-20260125/gcc/analyzer/program-state.cc	Sun Jan 25 22:32:06 2026
--- gcc-16-20260201/gcc/analyzer/program-state.cc	Sun Feb  1 22:32:07 2026
*************** sm_state_map::impl_set_state (const sval
*** 562,570 ****
      {
        if (const compound_svalue *compound_sval
  	    = sval->dyn_cast_compound_svalue ())
! 	for (auto iter : *compound_sval)
  	  {
! 	    const svalue *inner_sval = iter.m_sval;
  	    if (inner_sval->can_have_associated_state_p ())
  	      impl_set_state (inner_sval, state, origin, ext_state);
  	  }
--- 562,571 ----
      {
        if (const compound_svalue *compound_sval
  	    = sval->dyn_cast_compound_svalue ())
! 	for (auto iter = compound_sval->begin ();
! 	     iter != compound_sval->end (); ++iter)
  	  {
! 	    const svalue *inner_sval = iter.get_svalue ();
  	    if (inner_sval->can_have_associated_state_p ())
  	      impl_set_state (inner_sval, state, origin, ext_state);
  	  }
diff -Nrcpad gcc-16-20260125/gcc/analyzer/region-model-reachability.cc gcc-16-20260201/gcc/analyzer/region-model-reachability.cc
*** gcc-16-20260125/gcc/analyzer/region-model-reachability.cc	Sun Jan 25 22:32:06 2026
--- gcc-16-20260201/gcc/analyzer/region-model-reachability.cc	Sun Feb  1 22:32:07 2026
*************** reachable_regions::handle_sval (const sv
*** 172,178 ****
        for (auto iter = compound_sval->begin ();
  	   iter != compound_sval->end (); ++iter)
  	{
! 	  const svalue *iter_sval = (*iter).m_sval;
  	  handle_sval (iter_sval);
  	}
      }
--- 172,178 ----
        for (auto iter = compound_sval->begin ();
  	   iter != compound_sval->end (); ++iter)
  	{
! 	  const svalue *iter_sval = iter.get_svalue ();
  	  handle_sval (iter_sval);
  	}
      }
*************** reachable_regions::handle_parm (const sv
*** 238,244 ****
        for (auto iter = compound_sval->begin ();
  	   iter != compound_sval->end (); ++iter)
  	{
! 	  const svalue *iter_sval = (*iter).m_sval;
  	  handle_sval (iter_sval);
  	}
      }
--- 238,244 ----
        for (auto iter = compound_sval->begin ();
  	   iter != compound_sval->end (); ++iter)
  	{
! 	  const svalue *iter_sval = iter.get_svalue ();
  	  handle_sval (iter_sval);
  	}
      }
diff -Nrcpad gcc-16-20260125/gcc/analyzer/region-model.cc gcc-16-20260201/gcc/analyzer/region-model.cc
*** gcc-16-20260125/gcc/analyzer/region-model.cc	Sun Jan 25 22:32:06 2026
--- gcc-16-20260201/gcc/analyzer/region-model.cc	Sun Feb  1 22:32:07 2026
*************** can_throw_p (const gcall &call, tree fnd
*** 2198,2203 ****
--- 2198,2210 ----
    if (!flag_exceptions)
      return false;
  
+   /* Compatibility flag to allow the user to assume external functions
+      never throw exceptions.  This may be useful when using the analyzer
+      on C code that is compiled with -fexceptions, but for which the headers
+      haven't yet had "nothrow" attributes systematically added.  */
+   if (flag_analyzer_assume_nothrow)
+     return false;
+ 
    if (gimple_call_nothrow_p (&call))
      return false;
  
*************** public:
*** 4509,4529 ****
    {
      if (!cluster)
        return;
!     for (auto iter : *cluster)
        {
! 	const binding_key *key = iter.m_key;
! 	const svalue *sval = iter.m_sval;
  
! 	if (const concrete_binding *concrete_key
! 	    = key->dyn_cast_concrete_binding ())
! 	  {
! 	    byte_range fragment_bytes (0, 0);
! 	    if (concrete_key->get_byte_range (&fragment_bytes))
! 	      m_fragments.safe_push (fragment (fragment_bytes, sval));
! 	  }
! 	else
! 	  m_symbolic_bindings.safe_push (key);
        }
      m_fragments.qsort (fragment::cmp_ptrs);
    }
  
--- 4516,4532 ----
    {
      if (!cluster)
        return;
!     for (auto iter : cluster->get_map ().get_concrete_bindings ())
        {
! 	const bit_range &bits = iter.first;
! 	const svalue *sval = iter.second;
  
! 	byte_range fragment_bytes (0, 0);
! 	if (bits.as_byte_range (&fragment_bytes))
! 	  m_fragments.safe_push (fragment (fragment_bytes, sval));
        }
+     for (auto iter : cluster->get_map ().get_symbolic_bindings ())
+       m_symbolic_bindings.safe_push (iter);
      m_fragments.qsort (fragment::cmp_ptrs);
    }
  
*************** public:
*** 4562,4575 ****
        {
  	if (&iter != m_symbolic_bindings.begin ())
  	  pp_string (pp, ", ");
! 	(*iter).dump_to_pp (pp, true);
        }
      pp_string (pp, "])");
    }
  
  private:
    auto_vec<fragment> m_fragments;
!   auto_vec<const binding_key *> m_symbolic_bindings;
  };
  
  /* Simulate reading the bytes at BYTES from BASE_REG.
--- 4565,4578 ----
        {
  	if (&iter != m_symbolic_bindings.begin ())
  	  pp_string (pp, ", ");
! 	iter.m_region->dump_to_pp (pp, true);
        }
      pp_string (pp, "])");
    }
  
  private:
    auto_vec<fragment> m_fragments;
!   auto_vec<binding_map::symbolic_binding> m_symbolic_bindings;
  };
  
  /* Simulate reading the bytes at BYTES from BASE_REG.
*************** private:
*** 7122,7139 ****
  	    = as_a <const compound_svalue *> (m_copied_sval);
  	  bit_size_t result = 0;
  	  /* Find keys for uninit svals.  */
! 	  for (auto iter : *compound_sval)
  	    {
! 	      const svalue *sval = iter.m_sval;
  	      if (const poisoned_svalue *psval
  		  = sval->dyn_cast_poisoned_svalue ())
  		if (psval->get_poison_kind () == poison_kind::uninit)
  		  {
! 		    const binding_key *key = iter.m_key;
! 		    const concrete_binding *ckey
! 		      = key->dyn_cast_concrete_binding ();
! 		    gcc_assert (ckey);
! 		    result += ckey->get_size_in_bits ();
  		  }
  	    }
  	  return result;
--- 7125,7139 ----
  	    = as_a <const compound_svalue *> (m_copied_sval);
  	  bit_size_t result = 0;
  	  /* Find keys for uninit svals.  */
! 	  for (auto iter : compound_sval->get_map ().get_concrete_bindings ())
  	    {
! 	      const svalue *sval = iter.second;
  	      if (const poisoned_svalue *psval
  		  = sval->dyn_cast_poisoned_svalue ())
  		if (psval->get_poison_kind () == poison_kind::uninit)
  		  {
! 		    const bit_range &bits = iter.first;
! 		    result += bits.m_size_in_bits;
  		  }
  	    }
  	  return result;
*************** private:
*** 7173,7195 ****
  	= m_copied_sval->dyn_cast_compound_svalue ())
        {
  	/* Find keys for uninit svals.  */
! 	auto_vec<const concrete_binding *> uninit_keys;
! 	for (auto iter : *compound_sval)
  	  {
! 	    const svalue *sval = iter.m_sval;
  	    if (const poisoned_svalue *psval
  		= sval->dyn_cast_poisoned_svalue ())
  	      if (psval->get_poison_kind () == poison_kind::uninit)
! 		{
! 		  const binding_key *key = iter.m_key;
! 		  const concrete_binding *ckey
! 		    = key->dyn_cast_concrete_binding ();
! 		  gcc_assert (ckey);
! 		  uninit_keys.safe_push (ckey);
! 		}
  	  }
- 	/* Complain about them in sorted order.  */
- 	uninit_keys.qsort (concrete_binding::cmp_ptr_ptr);
  
  	std::unique_ptr<record_layout> layout;
  
--- 7173,7187 ----
  	= m_copied_sval->dyn_cast_compound_svalue ())
        {
  	/* Find keys for uninit svals.  */
! 	auto_vec<bit_range> uninit_bit_ranges;
! 	for (auto iter : compound_sval->get_map ().get_concrete_bindings ())
  	  {
! 	    const svalue *sval = iter.second;
  	    if (const poisoned_svalue *psval
  		= sval->dyn_cast_poisoned_svalue ())
  	      if (psval->get_poison_kind () == poison_kind::uninit)
! 		uninit_bit_ranges.safe_push (iter.first);
  	  }
  
  	std::unique_ptr<record_layout> layout;
  
*************** private:
*** 7203,7213 ****
  	  }
  
  	unsigned i;
! 	const concrete_binding *ckey;
! 	FOR_EACH_VEC_ELT (uninit_keys, i, ckey)
  	  {
! 	    bit_offset_t start_bit = ckey->get_start_bit_offset ();
! 	    bit_offset_t next_bit = ckey->get_next_bit_offset ();
  	    complain_about_uninit_range (loc, start_bit, next_bit,
  					 layout.get ());
  	  }
--- 7195,7205 ----
  	  }
  
  	unsigned i;
! 	bit_range *bits;
! 	FOR_EACH_VEC_ELT (uninit_bit_ranges, i, bits)
  	  {
! 	    bit_offset_t start_bit = bits->get_start_bit_offset ();
! 	    bit_offset_t next_bit = bits->get_next_bit_offset ();
  	    complain_about_uninit_range (loc, start_bit, next_bit,
  					 layout.get ());
  	  }
*************** contains_uninit_p (const svalue *sval)
*** 7389,7399 ****
  	const compound_svalue *compound_sval
  	  = as_a <const compound_svalue *> (sval);
  
! 	for (auto iter : *compound_sval)
  	  {
! 	    const svalue *sval = iter.m_sval;
  	    if (const poisoned_svalue *psval
! 		= sval->dyn_cast_poisoned_svalue ())
  	      if (psval->get_poison_kind () == poison_kind::uninit)
  		return true;
  	  }
--- 7381,7392 ----
  	const compound_svalue *compound_sval
  	  = as_a <const compound_svalue *> (sval);
  
! 	for (auto iter = compound_sval->begin ();
! 	     iter != compound_sval->end (); ++iter)
  	  {
! 	    const svalue *inner_sval = iter.get_svalue ();
  	    if (const poisoned_svalue *psval
! 		= inner_sval->dyn_cast_poisoned_svalue ())
  	      if (psval->get_poison_kind () == poison_kind::uninit)
  		return true;
  	  }
diff -Nrcpad gcc-16-20260125/gcc/analyzer/store.cc gcc-16-20260201/gcc/analyzer/store.cc
*** gcc-16-20260125/gcc/analyzer/store.cc	Sun Jan 25 22:32:06 2026
--- gcc-16-20260201/gcc/analyzer/store.cc	Sun Feb  1 22:32:07 2026
*************** binding_map::const_iterator::operator* (
*** 658,663 ****
--- 658,675 ----
      }
  }
  
+ const svalue *
+ binding_map::const_iterator::get_svalue () const
+ {
+   if (m_concrete != m_map.m_concrete.end ())
+     return m_concrete->second;
+   else
+     {
+       gcc_assert (m_symbolic != m_map.m_symbolic.end ());
+       return m_symbolic->m_sval;
+     }
+ }
+ 
  /* class binding_map::iterator.  */
  
  bool
*************** hashval_t
*** 754,765 ****
  binding_map::hash () const
  {
    hashval_t result = 0;
!   for (auto iter : *this)
      {
        /* Use a new hasher for each key to avoid depending on the ordering
  	 of keys when accumulating the result.  */
        inchash::hash hstate;
!       hstate.add_ptr (iter.m_key);
        hstate.add_ptr (iter.m_sval);
        result ^= hstate.end ();
      }
--- 766,784 ----
  binding_map::hash () const
  {
    hashval_t result = 0;
!   for (auto iter : m_concrete)
!     {
!       result ^= iter.first.hash ();
!       inchash::hash hstate;
!       hstate.add_ptr (iter.second);
!       result ^= hstate.end ();
!     }
!   for (auto iter : m_symbolic)
      {
        /* Use a new hasher for each key to avoid depending on the ordering
  	 of keys when accumulating the result.  */
        inchash::hash hstate;
!       hstate.add_ptr (iter.m_region);
        hstate.add_ptr (iter.m_sval);
        result ^= hstate.end ();
      }
diff -Nrcpad gcc-16-20260125/gcc/analyzer/store.h gcc-16-20260201/gcc/analyzer/store.h
*** gcc-16-20260125/gcc/analyzer/store.h	Sun Jan 25 22:32:06 2026
--- gcc-16-20260201/gcc/analyzer/store.h	Sun Feb  1 22:32:07 2026
*************** struct bit_range
*** 309,314 ****
--- 309,322 ----
      return (m_size_in_bits < other.m_size_in_bits);
    }
  
+   hashval_t hash () const
+   {
+     inchash::hash hstate;
+     hstate.add_wide_int (m_start_bit_offset);
+     hstate.add_wide_int (m_size_in_bits);
+     return hstate.end ();
+   }
+ 
    bit_offset_t m_start_bit_offset;
    bit_size_t m_size_in_bits;
  };
*************** public:
*** 396,408 ****
    }
    bool concrete_p () const final override { return true; }
  
!   hashval_t hash () const
!   {
!     inchash::hash hstate;
!     hstate.add_wide_int (m_bit_range.m_start_bit_offset);
!     hstate.add_wide_int (m_bit_range.m_size_in_bits);
!     return hstate.end ();
!   }
    bool operator== (const concrete_binding &other) const
    {
      return m_bit_range == other.m_bit_range;
--- 404,410 ----
    }
    bool concrete_p () const final override { return true; }
  
!   hashval_t hash () const { return m_bit_range.hash (); }
    bool operator== (const concrete_binding &other) const
    {
      return m_bit_range == other.m_bit_range;
*************** public:
*** 567,572 ****
--- 569,575 ----
      const_iterator &operator++ ();
  
      binding_pair operator* ();
+     const svalue *get_svalue () const;
  
    private:
      const binding_map &m_map;
*************** public:
*** 662,667 ****
--- 665,673 ----
    const concrete_bindings_t &
    get_concrete_bindings () const { return m_concrete; }
  
+   const symbolic_bindings_t &
+   get_symbolic_bindings () const { return m_symbolic; }
+ 
  private:
    void get_overlapping_bindings (const binding_key *key,
  				 auto_vec<const binding_key *> *out);
*************** public:
*** 746,753 ****
    void for_each_value (void (*cb) (const svalue *sval, T user_data),
  		       T user_data) const
    {
!     for (auto iter : m_map)
!       cb (iter.m_sval, user_data);
    }
  
    static bool can_merge_p (const binding_cluster *cluster_a,
--- 752,759 ----
    void for_each_value (void (*cb) (const svalue *sval, T user_data),
  		       T user_data) const
    {
!     for (auto iter = m_map.begin (); iter != m_map.end (); ++iter)
!       cb (iter.get_svalue (), user_data);
    }
  
    static bool can_merge_p (const binding_cluster *cluster_a,
diff -Nrcpad gcc-16-20260125/gcc/attribs.cc gcc-16-20260201/gcc/attribs.cc
*** gcc-16-20260125/gcc/attribs.cc	Sun Jan 25 22:32:06 2026
--- gcc-16-20260201/gcc/attribs.cc	Sun Feb  1 22:32:07 2026
*************** build_type_attribute_qual_variant (tree
*** 1322,1335 ****
  	  warning (OPT_Wattributes,
  		   "ignoring attributes applied to %qT after definition",
  		   TYPE_MAIN_VARIANT (ttype));
! 	  return build_qualified_type (ttype, quals);
  	}
  
!       ttype = build_qualified_type (ttype, TYPE_UNQUALIFIED);
!       if (lang_hooks.types.copy_lang_qualifiers
! 	  && otype != TYPE_MAIN_VARIANT (otype))
! 	ttype = (lang_hooks.types.copy_lang_qualifiers
! 		 (ttype, TYPE_MAIN_VARIANT (otype)));
  
        tree dtype = ntype = build_distinct_type_copy (ttype);
  
--- 1322,1336 ----
  	  warning (OPT_Wattributes,
  		   "ignoring attributes applied to %qT after definition",
  		   TYPE_MAIN_VARIANT (ttype));
! 	  return lang_hooks.types.build_lang_qualified_type (ttype, NULL_TREE,
! 							     quals);
  	}
  
!       tree mtype = NULL_TREE;
!       if (otype != TYPE_MAIN_VARIANT (otype))
! 	mtype = TYPE_MAIN_VARIANT (otype);
!       ttype = lang_hooks.types.build_lang_qualified_type (ttype, mtype,
! 							  TYPE_UNQUALIFIED);
  
        tree dtype = ntype = build_distinct_type_copy (ttype);
  
*************** build_type_attribute_qual_variant (tree
*** 1354,1366 ****
        else if (TYPE_CANONICAL (ntype) == ntype)
  	TYPE_CANONICAL (ntype) = TYPE_CANONICAL (ttype);
  
!       ttype = build_qualified_type (ntype, quals);
!       if (lang_hooks.types.copy_lang_qualifiers
! 	  && otype != TYPE_MAIN_VARIANT (otype))
! 	ttype = lang_hooks.types.copy_lang_qualifiers (ttype, otype);
      }
    else if (TYPE_QUALS (ttype) != quals)
!     ttype = build_qualified_type (ttype, quals);
  
    return ttype;
  }
--- 1355,1369 ----
        else if (TYPE_CANONICAL (ntype) == ntype)
  	TYPE_CANONICAL (ntype) = TYPE_CANONICAL (ttype);
  
!       if (otype != TYPE_MAIN_VARIANT (otype))
! 	mtype = otype;
!       else
! 	mtype = NULL_TREE;
!       ttype = lang_hooks.types.build_lang_qualified_type (ntype, mtype, quals);
      }
    else if (TYPE_QUALS (ttype) != quals)
!     ttype = lang_hooks.types.build_lang_qualified_type (ttype, NULL_TREE,
! 							quals);
  
    return ttype;
  }
*************** std::string
*** 2652,2657 ****
--- 2655,2661 ----
  attr_access::array_as_string (tree type) const
  {
    std::string typstr;
+   bool free_type = false;
  
    if (type == error_mark_node)
      return std::string ();
*************** attr_access::array_as_string (tree type)
*** 2692,2703 ****
  	     [*] is represented the same as [0] this hack only works for
  	     the most significant bound like static and the others are
  	     rendered as [0].  */
! 	  arat = build_tree_list (get_identifier ("array"), flag);
  	}
  
        const int quals = TYPE_QUALS (type);
        type = build_array_type (eltype, index_type);
!       type = build_type_attribute_qual_variant (type, arat, quals);
      }
  
    /* Format the type using the current pretty printer.  The generic tree
--- 2696,2730 ----
  	     [*] is represented the same as [0] this hack only works for
  	     the most significant bound like static and the others are
  	     rendered as [0].  */
! 	  arat = build_tree_list (get_identifier ("array "), flag);
  	}
  
        const int quals = TYPE_QUALS (type);
        type = build_array_type (eltype, index_type);
!       if (arat || TYPE_QUALS (type) != quals)
! 	{
! 	  /* We create a new array type which is only used during
! 	     printing.  Can't use build_type_attribute_qual_variant
! 	     because it might with some lang hooks e.g. try to push
! 	     qualifiers to the element type, while for the printing
! 	     this wants the element type qualifiers to be unmodified
! 	     and ARRAY_TYPE qualifiers to be a copy of the pointer
! 	     type qualifiers.  Furthermore, a type with somtimes
! 	     weird qualifiers or artificial attribute should be
! 	     freed right after the use.  */
! 	  type = copy_node (type);
! 	  if (arat)
! 	    {
! 	      TREE_CHAIN (arat) = TYPE_ATTRIBUTES (type);
! 	      TYPE_ATTRIBUTES (type) = arat;
! 	    }
! 	  TYPE_READONLY (type) = (quals & TYPE_QUAL_CONST) != 0;
! 	  TYPE_VOLATILE (type) = (quals & TYPE_QUAL_VOLATILE) != 0;
! 	  TYPE_ATOMIC (type) = (quals & TYPE_QUAL_ATOMIC) != 0;
! 	  TYPE_RESTRICT (type) = (quals & TYPE_QUAL_RESTRICT) != 0;
! 	  TYPE_ADDR_SPACE (type) = DECODE_QUAL_ADDR_SPACE (quals);
! 	  free_type = true;
! 	}
      }
  
    /* Format the type using the current pretty printer.  The generic tree
*************** attr_access::array_as_string (tree type)
*** 2705,2710 ****
--- 2732,2739 ----
    std::unique_ptr<pretty_printer> pp (global_dc->clone_printer ());
    pp_printf (pp.get (), "%qT", type);
    typstr = pp_formatted_text (pp.get ());
+   if (free_type)
+     ggc_free (type);
  
    return typstr;
  }
diff -Nrcpad gcc-16-20260125/gcc/c/ChangeLog gcc-16-20260201/gcc/c/ChangeLog
*** gcc-16-20260125/gcc/c/ChangeLog	Sun Jan 25 22:32:06 2026
--- gcc-16-20260201/gcc/c/ChangeLog	Sun Feb  1 22:32:07 2026
***************
*** 1,3 ****
--- 1,29 ----
+ 2026-01-28  Andrew Pinski  <andrew.pinski@oss.qualcomm.com>
+ 
+ 	PR c++/102846
+ 	PR c/102846
+ 	* c-decl.cc (lookup_name_fuzzy): Lookup function-like macro and
+ 	notify of misuse there.
+ 
+ 2026-01-28  Senthil Kumar Selvaraj  <saaadhu@gcc.gnu.org>
+ 
+ 	PR c/123583
+ 	* c-parser.cc (c_parser_maybe_reclassify_token): Reclassify only
+ 	C_ID_ID and C_ID_TYPENAME tokens.
+ 
+ 2026-01-28  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR c/101312
+ 	* c-tree.h (c_build_lang_qualified_type): Declare.
+ 	* c-objc-common.h (LANG_HOOKS_BUILD_LANG_QUALIFIED_TYPE): Define.
+ 	* c-objc-common.cc (c_build_lang_qualified_type): New function.
+ 
+ 2026-01-27  Qing Zhao  <qing.zhao@oracle.com>
+ 
+ 	PR c/123500
+ 	* c-typeck.cc (build_c_cast): Exclude call to .ACCESS_WITH_SIZE from
+ 	-Wbad-function-cast warnings.
+ 
  2026-01-16  Jakub Jelinek  <jakub@redhat.com>
  	    Peter Damianov  <peter0x44@disroot.org>
  
diff -Nrcpad gcc-16-20260125/gcc/c/c-decl.cc gcc-16-20260201/gcc/c/c-decl.cc
*** gcc-16-20260125/gcc/c/c-decl.cc	Sun Jan 25 22:32:06 2026
--- gcc-16-20260201/gcc/c/c-decl.cc	Sun Feb  1 22:32:07 2026
*************** lookup_name_fuzzy (tree name, enum looku
*** 4671,4677 ****
  {
    gcc_assert (TREE_CODE (name) == IDENTIFIER_NODE);
  
!   /* First, try some well-known names in the C standard library, in case
       the user forgot a #include.  */
    const char *header_hint
      = get_c_stdlib_header_for_name (IDENTIFIER_POINTER (name));
--- 4671,4687 ----
  {
    gcc_assert (TREE_CODE (name) == IDENTIFIER_NODE);
  
!   /* Look up function-like macros first; maybe misusing them. */
!   auto cpp_node = cpp_lookup (parse_in,
! 			      (const unsigned char*)IDENTIFIER_POINTER (name),
! 			      IDENTIFIER_LENGTH (name));
!   if (cpp_node && cpp_fun_like_macro_p (cpp_node))
!     return name_hint
!       (nullptr,
!        std::make_unique<macro_like_function_used> (loc,
! 						   IDENTIFIER_POINTER (name)));
! 
!   /* Next, try some well-known names in the C standard library, in case
       the user forgot a #include.  */
    const char *header_hint
      = get_c_stdlib_header_for_name (IDENTIFIER_POINTER (name));
diff -Nrcpad gcc-16-20260125/gcc/c/c-objc-common.cc gcc-16-20260201/gcc/c/c-objc-common.cc
*** gcc-16-20260125/gcc/c/c-objc-common.cc	Sun Jan 25 22:32:06 2026
--- gcc-16-20260201/gcc/c/c-objc-common.cc	Sun Feb  1 22:32:07 2026
*************** c_register_features ()
*** 70,75 ****
--- 70,86 ----
      }
  }
  
+ /* Langhook for building qualified types.  */
+ 
+ tree
+ c_build_lang_qualified_type (tree type, tree, int type_quals)
+ {
+   if (TREE_CODE (type) == ARRAY_TYPE)
+     return c_build_qualified_type (type, type_quals);
+   else
+     return build_qualified_type (type, type_quals);
+ }
+ 
  bool
  c_missing_noreturn_ok_p (tree decl)
  {
diff -Nrcpad gcc-16-20260125/gcc/c/c-objc-common.h gcc-16-20260201/gcc/c/c-objc-common.h
*** gcc-16-20260125/gcc/c/c-objc-common.h	Sun Jan 25 22:32:06 2026
--- gcc-16-20260201/gcc/c/c-objc-common.h	Sun Feb  1 22:32:07 2026
*************** extern void c_register_features ();
*** 59,64 ****
--- 59,66 ----
  #define LANG_HOOKS_PRINT_IDENTIFIER c_print_identifier
  #undef LANG_HOOKS_TYPES_COMPATIBLE_P
  #define LANG_HOOKS_TYPES_COMPATIBLE_P c_types_compatible_p
+ #undef LANG_HOOKS_BUILD_LANG_QUALIFIED_TYPE
+ #define LANG_HOOKS_BUILD_LANG_QUALIFIED_TYPE c_build_lang_qualified_type
  #undef LANG_HOOKS_MISSING_NORETURN_OK_P
  #define LANG_HOOKS_MISSING_NORETURN_OK_P c_missing_noreturn_ok_p
  #undef LANG_HOOKS_BLOCK_MAY_FALLTHRU
diff -Nrcpad gcc-16-20260125/gcc/c/c-parser.cc gcc-16-20260201/gcc/c/c-parser.cc
*** gcc-16-20260125/gcc/c/c-parser.cc	Sun Jan 25 22:32:06 2026
--- gcc-16-20260201/gcc/c/c-parser.cc	Sun Feb  1 22:32:07 2026
*************** c_parser_maybe_reclassify_token (c_parse
*** 2323,2329 ****
      {
        c_token *token = c_parser_peek_token (parser);
  
!       if (token->id_kind != C_ID_CLASSNAME)
  	{
  	  tree decl = lookup_name (token->value);
  
--- 2323,2329 ----
      {
        c_token *token = c_parser_peek_token (parser);
  
!       if (token->id_kind == C_ID_ID || token->id_kind == C_ID_TYPENAME)
  	{
  	  tree decl = lookup_name (token->value);
  
diff -Nrcpad gcc-16-20260125/gcc/c/c-tree.h gcc-16-20260201/gcc/c/c-tree.h
*** gcc-16-20260125/gcc/c/c-tree.h	Sun Jan 25 22:32:06 2026
--- gcc-16-20260201/gcc/c/c-tree.h	Sun Feb  1 22:32:07 2026
*************** extern tree c_finish_bc_name (location_t
*** 780,785 ****
--- 780,786 ----
  
  /* in c-objc-common.cc */
  extern bool c_objc_common_init (void);
+ extern tree c_build_lang_qualified_type (tree, tree, int);
  extern bool c_missing_noreturn_ok_p (tree);
  extern bool c_warn_unused_global_decl (const_tree);
  extern void c_initialize_diagnostics (diagnostics::context *);
diff -Nrcpad gcc-16-20260125/gcc/c/c-typeck.cc gcc-16-20260201/gcc/c/c-typeck.cc
*** gcc-16-20260125/gcc/c/c-typeck.cc	Sun Jan 25 22:32:06 2026
--- gcc-16-20260201/gcc/c/c-typeck.cc	Sun Feb  1 22:32:07 2026
*************** build_c_cast (location_t loc, tree type,
*** 7455,7461 ****
  	warning_at (loc, OPT_Wpointer_to_int_cast,
  		    "cast from pointer to integer of different size");
  
!       if (TREE_CODE (value) == CALL_EXPR
  	  && TREE_CODE (type) != TREE_CODE (otype))
  	warning_at (loc, OPT_Wbad_function_cast,
  		    "cast from function call of type %qT "
--- 7455,7462 ----
  	warning_at (loc, OPT_Wpointer_to_int_cast,
  		    "cast from pointer to integer of different size");
  
!       if ((TREE_CODE (value) == CALL_EXPR
! 	   && !is_access_with_size_p (value))
  	  && TREE_CODE (type) != TREE_CODE (otype))
  	warning_at (loc, OPT_Wbad_function_cast,
  		    "cast from function call of type %qT "
diff -Nrcpad gcc-16-20260125/gcc/c-family/ChangeLog gcc-16-20260201/gcc/c-family/ChangeLog
*** gcc-16-20260125/gcc/c-family/ChangeLog	Sun Jan 25 22:32:06 2026
--- gcc-16-20260201/gcc/c-family/ChangeLog	Sun Feb  1 22:32:07 2026
***************
*** 1,3 ****
--- 1,76 ----
+ 2026-01-28  Andrew Pinski  <andrew.pinski@oss.qualcomm.com>
+ 
+ 	PR c++/102846
+ 	PR c/102846
+ 	* known-headers.cc (macro_like_function_used::macro_like_function_used): New.
+ 	(macro_like_function_used::~macro_like_function_used): New.
+ 	* known-headers.h (class macro_like_function_used): New class.
+ 
+ 2026-01-28  Iain Sandoe  <iain@sandoe.co.uk>
+ 
+ 	* c.opt: Append a period to the message for
+ 	-fcontracts-client-check=.
+ 
+ 2026-01-28  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR c/101312
+ 	* c-pretty-print.cc (c_pretty_printer::direct_abstract_declarator):
+ 	Look up "array " attribute instead of "array".
+ 
+ 2026-01-28  Nina Ranns  <dinka.ranns@gmail.com>
+ 	    Iain Sandoe  <iain@sandoe.co.uk>
+ 	    Ville Voutilainen  <ville.voutilainen@gmail.com>
+ 
+ 	* c.opt (fcontracts-definition-check=,
+ 	fcontracts-client-check=): New.
+ 	* c.opt.urls: Regenerate.
+ 
+ 2026-01-28  Nina Ranns  <dinka.ranns@gmail.com>
+ 	    Iain Sandoe  <iain@sandoe.co.uk>
+ 	    Ville Voutilainen  <ville.voutilainen@gmail.com>
+ 
+ 	* c.opt (fcontract-checks-outlined,
+ 	fcontract-disable-optimized-checks): New.
+ 	* c.opt.urls: Regenerate.
+ 
+ 2026-01-28  Nina Ranns  <dinka.ranns@gmail.com>
+ 	    Iain Sandoe  <iain@sandoe.co.uk>
+ 
+ 	* c.opt (fcontracts-conservative-ipa): New.
+ 
+ 2026-01-28  Iain Sandoe  <iain@sandoe.co.uk>
+ 	    Nina Ranns  <dinka.ranns@gmail.com>
+ 	    Ville Voutilainen  <ville.voutilainen@gmail.com>
+ 
+ 	* c-common.cc: Add contract_assert keyword.
+ 	* c-common.h (enum rid): Likewise.
+ 	* c-cppbuiltin.cc (c_cpp_builtins): Add C++26 contracts feature test
+ 	macro.
+ 	* c.opt: Add a flag to control the TU-wide evaluation semantic. Add
+ 	a flag to control whether P1494 observable_checkpoints are inserted
+ 	to separate contract checks.
+ 	* c.opt.urls: Regenerate.
+ 
+ 2026-01-28  Iain Sandoe  <iain@sandoe.co.uk>
+ 	    Nina Ranns  <dinka.ranns@gmail.com>
+ 
+ 	* c-cppbuiltin.cc (c_cpp_builtins): Remove C++2a-specific
+ 	feature macros.
+ 	* c.opt: Remove C++2a-specific flags.
+ 
+ 2026-01-25  Sandra Loosemore  <sloosemore@baylibre.com>
+ 
+ 	* c.opt.urls: Regenerated.
+ 
+ 2026-01-25  Sandra Loosemore  <sloosemore@baylibre.com>
+ 
+ 	PR other/122243
+ 	* c.opt (-output-pch): Mark as Undocumented, as it seems to be
+ 	an internal option that has never been documented anyway.
+ 	(Werror-implicit-function-declaration): Mark deprecated option
+ 	that is not currently documented as Undocumented.
+ 	(fconstant-string-class=): Add RejectNegative property.
+ 
  2026-01-20  Jakub Jelinek  <jakub@redhat.com>
  
  	PR c++/123694
diff -Nrcpad gcc-16-20260125/gcc/c-family/c-common.cc gcc-16-20260201/gcc/c-family/c-common.cc
*** gcc-16-20260125/gcc/c-family/c-common.cc	Sun Jan 25 22:32:06 2026
--- gcc-16-20260201/gcc/c-family/c-common.cc	Sun Feb  1 22:32:07 2026
*************** machine_mode c_default_pointer_mode = VO
*** 103,109 ****
  	tree dfloat32_type_node;
  	tree dfloat64_type_node;
  	tree dfloat128_type_node;
! 	tree dfloat64x_type_node; 
  
  	tree intQI_type_node;
  	tree intHI_type_node;
--- 103,109 ----
  	tree dfloat32_type_node;
  	tree dfloat64_type_node;
  	tree dfloat128_type_node;
! 	tree dfloat64x_type_node;
  
  	tree intQI_type_node;
  	tree intHI_type_node;
*************** const struct c_common_resword c_common_r
*** 472,477 ****
--- 472,478 ----
    { "__const",		RID_CONST,	0 },
    { "__const__",	RID_CONST,	0 },
    { "__constinit",	RID_CONSTINIT,	D_CXXONLY },
+   { "__contract_assert", RID_CONTASSERT, D_CXXONLY | D_CXXWARN  },
    { "__decltype",       RID_DECLTYPE,   D_CXXONLY },
    { "__extension__",	RID_EXTENSION,	0 },
    { "__func__",		RID_C99_FUNCTION_NAME, 0 },
*************** const struct c_common_resword c_common_r
*** 519,524 ****
--- 520,526 ----
    { "constinit",	RID_CONSTINIT,	D_CXXONLY | D_CXX20 | D_CXXWARN },
    { "const_cast",	RID_CONSTCAST,	D_CXXONLY | D_CXXWARN },
    { "continue",		RID_CONTINUE,	0 },
+   { "contract_assert",	RID_CONTASSERT,	D_CXXONLY | D_CXXWARN | D_CXX26 },
    { "decltype",         RID_DECLTYPE,   D_CXXONLY | D_CXX11 | D_CXXWARN },
    { "default",		RID_DEFAULT,	0 },
    { "delete",		RID_DELETE,	D_CXXONLY | D_CXXWARN },
diff -Nrcpad gcc-16-20260125/gcc/c-family/c-common.h gcc-16-20260201/gcc/c-family/c-common.h
*** gcc-16-20260125/gcc/c-family/c-common.h	Sun Jan 25 22:32:06 2026
--- gcc-16-20260201/gcc/c-family/c-common.h	Sun Feb  1 22:32:07 2026
*************** enum rid
*** 189,194 ****
--- 189,197 ----
    /* C++ coroutines */
    RID_CO_AWAIT, RID_CO_YIELD, RID_CO_RETURN,
  
+   /* C++26 */
+   RID_CONTASSERT,
+ 
    /* C++ transactional memory.  */
    RID_ATOMIC_NOEXCEPT, RID_ATOMIC_CANCEL, RID_SYNCHRONIZED,
  
*************** enum rid
*** 258,263 ****
--- 261,268 ----
    RID_LAST_CXX11 = RID_STATIC_ASSERT,
    RID_FIRST_CXX20 = RID_CONSTINIT,
    RID_LAST_CXX20 = RID_CO_RETURN,
+   RID_FIRST_CXX26 = RID_CONTASSERT,
+   RID_LAST_CXX26 = RID_CONTASSERT,
    RID_FIRST_AT = RID_AT_ENCODE,
    RID_LAST_AT = RID_AT_IMPLEMENTATION,
    RID_FIRST_PQ = RID_IN,
diff -Nrcpad gcc-16-20260125/gcc/c-family/c-cppbuiltin.cc gcc-16-20260201/gcc/c-family/c-cppbuiltin.cc
*** gcc-16-20260125/gcc/c-family/c-cppbuiltin.cc	Sun Jan 25 22:32:06 2026
--- gcc-16-20260201/gcc/c-family/c-cppbuiltin.cc	Sun Feb  1 22:32:07 2026
*************** c_cpp_builtins (cpp_reader *pfile)
*** 1126,1136 ****
        else if (cxx_dialect >= cxx20)
  	cpp_warn (pfile, "__cpp_concepts");
        if (flag_contracts)
! 	{
! 	  cpp_define (pfile, "__cpp_contracts=201906L");
! 	  cpp_define (pfile, "__cpp_contracts_literal_semantics=201906L");
! 	  cpp_define (pfile, "__cpp_contracts_roles=201906L");
! 	}
        else if (cxx_dialect >= cxx26)
  	cpp_warn (pfile, "__cpp_contracts");
        if (flag_modules)
--- 1126,1132 ----
        else if (cxx_dialect >= cxx20)
  	cpp_warn (pfile, "__cpp_concepts");
        if (flag_contracts)
! 	cpp_define (pfile, "__cpp_contracts=202502L");
        else if (cxx_dialect >= cxx26)
  	cpp_warn (pfile, "__cpp_contracts");
        if (flag_modules)
diff -Nrcpad gcc-16-20260125/gcc/c-family/c-pretty-print.cc gcc-16-20260201/gcc/c-family/c-pretty-print.cc
*** gcc-16-20260125/gcc/c-family/c-pretty-print.cc	Sun Jan 25 22:32:06 2026
--- gcc-16-20260201/gcc/c-family/c-pretty-print.cc	Sun Feb  1 22:32:07 2026
*************** c_pretty_printer::direct_abstract_declar
*** 634,640 ****
  	  add_space = true;
  	}
  
!       if (tree arr = lookup_attribute ("array", TYPE_ATTRIBUTES (t)))
  	{
  	  if (TREE_VALUE (arr))
  	    {
--- 634,640 ----
  	  add_space = true;
  	}
  
!       if (tree arr = lookup_attribute ("array ", TYPE_ATTRIBUTES (t)))
  	{
  	  if (TREE_VALUE (arr))
  	    {
diff -Nrcpad gcc-16-20260125/gcc/c-family/c.opt gcc-16-20260201/gcc/c-family/c.opt
*** gcc-16-20260125/gcc/c-family/c.opt	Sun Jan 25 22:32:06 2026
--- gcc-16-20260201/gcc/c-family/c.opt	Sun Feb  1 22:32:07 2026
*************** C++ ObjC++ Joined RejectNegative Host_Wi
*** 1902,1945 ****
  
  fcontracts
  C++ ObjC++ Var(flag_contracts) Init(0)
! Enable certain features present in drafts of C++ Contracts.
  
  Enum
! Name(on_off) Type(int) UnknownError(argument %qs must be either %<on%> or %<off%>)
  
  EnumValue
! Enum(on_off) String(off) Value(0)
  
  EnumValue
! Enum(on_off) String(on) Value(1)
  
! fcontract-assumption-mode=
! C++ ObjC++ Joined RejectNegative
! -fcontract-assumption-mode=[on|off]	Enable or disable treating axiom level contracts as assumptions (default on).
  
! fcontract-build-level=
! C++ ObjC++ Joined RejectNegative
! -fcontract-build-level=[off|default|audit]	Specify max contract level to generate runtime checks for.
  
! fcontract-strict-declarations=
! C++ ObjC++ Var(flag_contract_strict_declarations) Enum(on_off) Joined Init(0) RejectNegative
! -fcontract-strict-declarations=[on|off]	Enable or disable warnings on generalized redeclaration of functions with contracts (default off).
  
! fcontract-mode=
! C++ ObjC++ Var(flag_contract_mode) Enum(on_off) Joined Init(1) RejectNegative
! -fcontract-mode=[on|off]	Enable or disable all contract facilities (default on).
  
! fcontract-continuation-mode=
! C++ ObjC++ Joined RejectNegative
! -fcontract-continuation-mode=[on|off]	Enable or disable contract continuation mode (default off).
  
! fcontract-role=
! C++ ObjC++ Joined RejectNegative
! -fcontract-role=<name>:<semantics>	Specify the semantics for all levels in a role (default, review), or a custom contract role with given semantics (ex: opt:assume,assume,assume).
  
! fcontract-semantic=
! C++ ObjC++ Joined RejectNegative
! -fcontract-semantic=<level>:<semantic>	Specify the concrete semantics for level.
  
  fcoroutines
  C++ ObjC++ LTO Var(flag_coroutines)
--- 1902,1971 ----
  
  fcontracts
  C++ ObjC++ Var(flag_contracts) Init(0)
! Enable features proposed for C++26 Contracts.
! 
! ; Keep these in step with the values in cp/contracts.h
  
  Enum
! Name(contract_semantic) Type(int)  UnknownError(unrecognized contract evaluation semantic %qs)
  
  EnumValue
! Enum(contract_semantic) String(ignore) Value(1)
  
  EnumValue
! Enum(contract_semantic) String(observe) Value(2)
  
! EnumValue
! Enum(contract_semantic) String(enforce) Value(3)
  
! EnumValue
! Enum(contract_semantic) String(quick_enforce) Value(4)
  
! fcontract-evaluation-semantic=
! C++ ObjC++ Joined RejectNegative Enum(contract_semantic) Var(flag_contract_evaluation_semantic) Init(3)
! -fcontract-evaluation-semantic=[ignore|observe|enforce|quick_enforce]	Select the contract evaluation semantic (defaults to enforce).
  
! fcontracts-conservative-ipa
! C++ ObjC++ Var(flag_contracts_conservative_ipa) Init(1)
! -fcontracts-conservative-ipa	Do not allow certain optimisations between
! functions in contract assertions.
  
! fcontract-checks-outlined
! C++ ObjC++ Var(flag_contract_checks_outlined) Init(0)
! -fcontract-checks-outlined	Build contract checks using outlined functions.
  
! fcontract-disable-optimized-checks
! C++ ObjC++ Var(flag_contract_disable_optimized_checks) Init(0)
! -fcontract-disable-optimized-checks	Disable optimisation of contract checks.
  
! Enum
! Name(client_contract_check) Type(int)  UnknownError(unrecognized client contract check option %qs)
! 
! EnumValue
! Enum(client_contract_check) String(none) Value(0)
! 
! EnumValue
! Enum(client_contract_check) String(pre) Value(1)
! 
! EnumValue
! Enum(client_contract_check) String(all) Value(2)
! 
! fcontracts-client-check=
! C++ ObjC++ Joined RejectNegative Enum(client_contract_check) Var(flag_contract_client_check) Init (0)
! -fcontracts-client-check=[none|pre|all] Select which contracts will be checked on the client side for non virtual functions.
! 
! Enum
! Name(on_off) Type(int) UnknownError(argument %qs must be either %<on%> or %<off%>)
! 
! EnumValue
! Enum(on_off) String(off) Value(0)
! 
! EnumValue
! Enum(on_off) String(on) Value(1)
! 
! fcontracts-definition-check=
! C++ ObjC++ Joined RejectNegative Enum(on_off) Var(flag_contracts_definition_check) Init(1)
! -fcontracts-definition-check=[on|off]	Enable or disable contract checks on the definition side for all functions (default on).
  
  fcoroutines
  C++ ObjC++ LTO Var(flag_coroutines)
diff -Nrcpad gcc-16-20260125/gcc/c-family/c.opt.urls gcc-16-20260201/gcc/c-family/c.opt.urls
*** gcc-16-20260125/gcc/c-family/c.opt.urls	Sun Jan 25 22:32:06 2026
--- gcc-16-20260201/gcc/c-family/c.opt.urls	Sun Feb  1 22:32:07 2026
*************** UrlSuffix(gcc/C_002b_002b-Dialect-Option
*** 1095,1120 ****
  fcontracts
  UrlSuffix(gcc/C_002b_002b-Dialect-Options.html#index-fcontracts)
  
! fcontract-assumption-mode=
! UrlSuffix(gcc/C_002b_002b-Dialect-Options.html#index-fcontract-assumption-mode)
! 
! fcontract-build-level=
! UrlSuffix(gcc/C_002b_002b-Dialect-Options.html#index-fcontract-build-level)
  
! fcontract-strict-declarations=
! UrlSuffix(gcc/C_002b_002b-Dialect-Options.html#index-fcontract-strict-declarations)
  
! fcontract-mode=
! UrlSuffix(gcc/C_002b_002b-Dialect-Options.html#index-fcontract-mode)
  
! fcontract-continuation-mode=
! UrlSuffix(gcc/C_002b_002b-Dialect-Options.html#index-fcontract-continuation-mode)
  
! fcontract-role=
! UrlSuffix(gcc/C_002b_002b-Dialect-Options.html#index-fcontract-role)
  
! fcontract-semantic=
! UrlSuffix(gcc/C_002b_002b-Dialect-Options.html#index-fcontract-semantic)
  
  fcoroutines
  UrlSuffix(gcc/C_002b_002b-Dialect-Options.html#index-fcoroutines)
--- 1095,1117 ----
  fcontracts
  UrlSuffix(gcc/C_002b_002b-Dialect-Options.html#index-fcontracts)
  
! fcontract-evaluation-semantic=
! UrlSuffix(gcc/C_002b_002b-Dialect-Options.html#index-fcontract-evaluation-semantic)
  
! fcontracts-conservative-ipa
! UrlSuffix(gcc/C_002b_002b-Dialect-Options.html#index-fcontracts-conservative-ipa)
  
! fcontract-checks-outlined
! UrlSuffix(gcc/C_002b_002b-Dialect-Options.html#index-fcontract-checks-outlined)
  
! fcontract-disable-optimized-checks
! UrlSuffix(gcc/C_002b_002b-Dialect-Options.html#index-fcontract-disable-optimized-checks)
  
! fcontracts-client-check=
! UrlSuffix(gcc/C_002b_002b-Dialect-Options.html#index-fcontracts-client-check)
  
! fcontracts-definition-check=
! UrlSuffix(gcc/C_002b_002b-Dialect-Options.html#index-fcontracts-definition-check)
  
  fcoroutines
  UrlSuffix(gcc/C_002b_002b-Dialect-Options.html#index-fcoroutines)
diff -Nrcpad gcc-16-20260125/gcc/c-family/known-headers.cc gcc-16-20260201/gcc/c-family/known-headers.cc
*** gcc-16-20260125/gcc/c-family/known-headers.cc	Sun Jan 25 22:32:06 2026
--- gcc-16-20260201/gcc/c-family/known-headers.cc	Sun Feb  1 22:32:07 2026
*************** suggest_missing_option::~suggest_missing
*** 352,354 ****
--- 352,374 ----
  	  " this is probably fixable by adding %qs to the command-line options",
  	  m_name_str, option_name, option_name);
  }
+ 
+ /* macro_like_function_used's ctor.  */
+ 
+ macro_like_function_used::macro_like_function_used (location_t loc, const char *name)
+ : deferred_diagnostic (loc), m_name_str (name)
+ {
+   gcc_assert (name);
+ }
+ 
+ /* macro_like_function_used's dtor.  */
+ 
+ macro_like_function_used::~macro_like_function_used ()
+ {
+   if (is_suppressed_p ())
+     return;
+ 
+   inform (get_location (),
+ 	  "%qs is a function-like macro and might be used incorrectly",
+ 	  m_name_str);
+ }
diff -Nrcpad gcc-16-20260125/gcc/c-family/known-headers.h gcc-16-20260201/gcc/c-family/known-headers.h
*** gcc-16-20260125/gcc/c-family/known-headers.h	Sun Jan 25 22:32:06 2026
--- gcc-16-20260201/gcc/c-family/known-headers.h	Sun Feb  1 22:32:07 2026
*************** class suggest_missing_option : public de
*** 56,59 ****
--- 56,72 ----
    diagnostics::option_id m_option_id;
  };
  
+ /* Subclass of deferred_diagnostic for suggesting to the user
+    that they have misused a function like macro.  */
+ class macro_like_function_used : public deferred_diagnostic
+ {
+  public:
+   macro_like_function_used (location_t loc, const char *name);
+ 
+   ~macro_like_function_used ();
+ 
+  private:
+   const char *m_name_str;
+ };
+ 
  #endif /* GCC_KNOWN_HEADERS_H */
diff -Nrcpad gcc-16-20260125/gcc/common.opt gcc-16-20260201/gcc/common.opt
*** gcc-16-20260125/gcc/common.opt	Sun Jan 25 22:32:06 2026
--- gcc-16-20260201/gcc/common.opt	Sun Feb  1 22:32:07 2026
*************** Common Var(flag_syntax_only)
*** 3142,3148 ****
  Check for syntax errors, then stop.
  
  ftest-coverage
! Common Var(flag_test_coverage)
  Create data files needed by \"gcov\".
  
  fthread-jumps
--- 3142,3148 ----
  Check for syntax errors, then stop.
  
  ftest-coverage
! Common Var(flag_test_coverage) EnabledBy(fpath-coverage || fcondition-coverage)
  Create data files needed by \"gcov\".
  
  fthread-jumps
diff -Nrcpad gcc-16-20260125/gcc/config/aarch64/aarch64-builtins.cc gcc-16-20260201/gcc/config/aarch64/aarch64-builtins.cc
*** gcc-16-20260125/gcc/config/aarch64/aarch64-builtins.cc	Sun Jan 25 22:32:06 2026
--- gcc-16-20260201/gcc/config/aarch64/aarch64-builtins.cc	Sun Feb  1 22:32:07 2026
*************** struct aarch64_pragma_builtins_data
*** 1739,1745 ****
    unsigned int flags;
  };
  
! static aarch64_pragma_builtins_data aarch64_pragma_builtins[] = {
  #include "aarch64-simd-pragma-builtins.def"
  };
  
--- 1739,1745 ----
    unsigned int flags;
  };
  
! static CONSTEXPR aarch64_pragma_builtins_data aarch64_pragma_builtins[] = {
  #include "aarch64-simd-pragma-builtins.def"
  };
  
diff -Nrcpad gcc-16-20260125/gcc/config/aarch64/aarch64-c.cc gcc-16-20260201/gcc/config/aarch64/aarch64-c.cc
*** gcc-16-20260125/gcc/config/aarch64/aarch64-c.cc	Sun Jan 25 22:32:06 2026
--- gcc-16-20260201/gcc/config/aarch64/aarch64-c.cc	Sun Feb  1 22:32:07 2026
*************** aarch64_update_cpp_builtins (cpp_reader
*** 275,280 ****
--- 275,282 ----
  			"__ARM_FEATURE_BF16", pfile);
    aarch64_def_or_undef (TARGET_SVE_BF16,
  			"__ARM_FEATURE_SVE_BF16", pfile);
+   aarch64_def_or_undef (TARGET_SVE_BFSCALE,
+ 			"__ARM_FEATURE_SVE_BFSCALE", pfile);
  
    aarch64_def_or_undef (TARGET_LUT, "__ARM_FEATURE_LUT", pfile);
    aarch64_def_or_undef (TARGET_SME_LUTv2, "__ARM_FEATURE_SME_LUTv2", pfile);
diff -Nrcpad gcc-16-20260125/gcc/config/aarch64/aarch64-simd-pragma-builtins.def gcc-16-20260201/gcc/config/aarch64/aarch64-simd-pragma-builtins.def
*** gcc-16-20260125/gcc/config/aarch64/aarch64-simd-pragma-builtins.def	Sun Jan 25 22:32:06 2026
--- gcc-16-20260201/gcc/config/aarch64/aarch64-simd-pragma-builtins.def	Sun Feb  1 22:32:07 2026
*************** ENTRY_FMA_FPM (vmlalltt, f32, UNSPEC_FML
*** 197,203 ****
  #undef REQUIRED_EXTENSIONS
  
  // bsl
! #define REQUIRED_EXTENSIONS nonstreaming_only (TARGET_SIMD)
  ENTRY_TERNARY (vbsl_mf8, mf8, u8, mf8, mf8, UNSPEC_BSL, QUIET)
  ENTRY_TERNARY (vbslq_mf8, mf8q, u8q, mf8q, mf8q, UNSPEC_BSL, QUIET)
  #undef REQUIRED_EXTENSIONS
--- 197,203 ----
  #undef REQUIRED_EXTENSIONS
  
  // bsl
! #define REQUIRED_EXTENSIONS nonstreaming_only (AARCH64_FL_SIMD)
  ENTRY_TERNARY (vbsl_mf8, mf8, u8, mf8, mf8, UNSPEC_BSL, QUIET)
  ENTRY_TERNARY (vbslq_mf8, mf8q, u8q, mf8q, mf8q, UNSPEC_BSL, QUIET)
  #undef REQUIRED_EXTENSIONS
*************** ENTRY_BINARY (vcombine_mf8, mf8q, mf8, m
*** 208,214 ****
  #undef REQUIRED_EXTENSIONS
  
  // copy_lane
! #define REQUIRED_EXTENSIONS nonstreaming_only (TARGET_SIMD)
  ENTRY_BINARY_TWO_LANES (vcopy_lane_mf8, mf8, mf8, mf8,
  			UNSPEC_VEC_COPY, QUIET)
  ENTRY_BINARY_TWO_LANES (vcopyq_lane_mf8, mf8q, mf8q, mf8,
--- 208,214 ----
  #undef REQUIRED_EXTENSIONS
  
  // copy_lane
! #define REQUIRED_EXTENSIONS nonstreaming_only (AARCH64_FL_SIMD)
  ENTRY_BINARY_TWO_LANES (vcopy_lane_mf8, mf8, mf8, mf8,
  			UNSPEC_VEC_COPY, QUIET)
  ENTRY_BINARY_TWO_LANES (vcopyq_lane_mf8, mf8q, mf8q, mf8,
*************** ENTRY_BINARY_TWO_LANES (vcopyq_laneq_mf8
*** 220,231 ****
  #undef REQUIRED_EXTENSIONS
  
  // create
! #define REQUIRED_EXTENSIONS nonstreaming_only (TARGET_SIMD)
  ENTRY_UNARY (vcreate_mf8, mf8, u64_scalar, UNSPEC_VCREATE, QUIET)
  #undef REQUIRED_EXTENSIONS
  
  // dup
! #define REQUIRED_EXTENSIONS nonstreaming_only (TARGET_SIMD)
  ENTRY_UNARY (vdup_n_mf8, mf8, mf8_scalar, UNSPEC_DUP, QUIET)
  ENTRY_UNARY (vdupq_n_mf8, mf8q, mf8_scalar, UNSPEC_DUP, QUIET)
  
--- 220,231 ----
  #undef REQUIRED_EXTENSIONS
  
  // create
! #define REQUIRED_EXTENSIONS nonstreaming_only (AARCH64_FL_SIMD)
  ENTRY_UNARY (vcreate_mf8, mf8, u64_scalar, UNSPEC_VCREATE, QUIET)
  #undef REQUIRED_EXTENSIONS
  
  // dup
! #define REQUIRED_EXTENSIONS nonstreaming_only (AARCH64_FL_SIMD)
  ENTRY_UNARY (vdup_n_mf8, mf8, mf8_scalar, UNSPEC_DUP, QUIET)
  ENTRY_UNARY (vdupq_n_mf8, mf8q, mf8_scalar, UNSPEC_DUP, QUIET)
  
*************** ENTRY_UNARY_LANE (vdupq_laneq_mf8, mf8q,
*** 236,254 ****
  #undef REQUIRED_EXTENSIONS
  
  // dupb_lane
! #define REQUIRED_EXTENSIONS nonstreaming_only (TARGET_SIMD)
  ENTRY_UNARY_LANE (vdupb_lane_mf8, mf8_scalar, mf8, UNSPEC_GET_LANE, QUIET)
  ENTRY_UNARY_LANE (vdupb_laneq_mf8, mf8_scalar, mf8q, UNSPEC_GET_LANE, QUIET)
  #undef REQUIRED_EXTENSIONS
  
  // ext
! #define REQUIRED_EXTENSIONS nonstreaming_only (TARGET_SIMD)
  ENTRY_BINARY_LANE (vext_mf8, mf8, mf8, mf8, UNSPEC_EXT, QUIET)
  ENTRY_BINARY_LANE (vextq_mf8, mf8q, mf8q, mf8q, UNSPEC_EXT, QUIET)
  #undef REQUIRED_EXTENSIONS
  
  // ld1
! #define REQUIRED_EXTENSIONS nonstreaming_only (TARGET_SIMD)
  ENTRY_LOAD (vld1_mf8, mf8, mf8_scalar_const_ptr, UNSPEC_LD1)
  ENTRY_LOAD (vld1q_mf8, mf8q, mf8_scalar_const_ptr, UNSPEC_LD1)
  ENTRY_LOAD (vld1_dup_mf8, mf8, mf8_scalar_const_ptr, UNSPEC_DUP)
--- 236,254 ----
  #undef REQUIRED_EXTENSIONS
  
  // dupb_lane
! #define REQUIRED_EXTENSIONS nonstreaming_only (AARCH64_FL_SIMD)
  ENTRY_UNARY_LANE (vdupb_lane_mf8, mf8_scalar, mf8, UNSPEC_GET_LANE, QUIET)
  ENTRY_UNARY_LANE (vdupb_laneq_mf8, mf8_scalar, mf8q, UNSPEC_GET_LANE, QUIET)
  #undef REQUIRED_EXTENSIONS
  
  // ext
! #define REQUIRED_EXTENSIONS nonstreaming_only (AARCH64_FL_SIMD)
  ENTRY_BINARY_LANE (vext_mf8, mf8, mf8, mf8, UNSPEC_EXT, QUIET)
  ENTRY_BINARY_LANE (vextq_mf8, mf8q, mf8q, mf8q, UNSPEC_EXT, QUIET)
  #undef REQUIRED_EXTENSIONS
  
  // ld1
! #define REQUIRED_EXTENSIONS nonstreaming_only (AARCH64_FL_SIMD)
  ENTRY_LOAD (vld1_mf8, mf8, mf8_scalar_const_ptr, UNSPEC_LD1)
  ENTRY_LOAD (vld1q_mf8, mf8q, mf8_scalar_const_ptr, UNSPEC_LD1)
  ENTRY_LOAD (vld1_dup_mf8, mf8, mf8_scalar_const_ptr, UNSPEC_DUP)
*************** ENTRY_LOAD_LANE (vld1q_lane_mf8, mf8q, m
*** 261,267 ****
  #undef REQUIRED_EXTENSIONS
  
  // ld<n>
! #define REQUIRED_EXTENSIONS nonstreaming_only (TARGET_SIMD)
  ENTRY_LOAD (vld1_mf8_x2, mf8x2, mf8_scalar_const_ptr, UNSPEC_LD1x2)
  ENTRY_LOAD (vld1q_mf8_x2, mf8qx2, mf8_scalar_const_ptr, UNSPEC_LD1x2)
  ENTRY_LOAD (vld2_mf8, mf8x2, mf8_scalar_const_ptr, UNSPEC_LD2)
--- 261,267 ----
  #undef REQUIRED_EXTENSIONS
  
  // ld<n>
! #define REQUIRED_EXTENSIONS nonstreaming_only (AARCH64_FL_SIMD)
  ENTRY_LOAD (vld1_mf8_x2, mf8x2, mf8_scalar_const_ptr, UNSPEC_LD1x2)
  ENTRY_LOAD (vld1q_mf8_x2, mf8qx2, mf8_scalar_const_ptr, UNSPEC_LD1x2)
  ENTRY_LOAD (vld2_mf8, mf8x2, mf8_scalar_const_ptr, UNSPEC_LD2)
*************** ENTRY_TERNARY (vmmlaq_f32_mf8, f32q, f32
*** 307,319 ****
  #undef REQUIRED_EXTENSIONS
  
  // mov
! #define REQUIRED_EXTENSIONS nonstreaming_only (TARGET_SIMD)
  ENTRY_UNARY (vmov_n_mf8, mf8, mf8_scalar, UNSPEC_DUP, QUIET)
  ENTRY_UNARY (vmovq_n_mf8, mf8q, mf8_scalar, UNSPEC_DUP, QUIET)
  #undef REQUIRED_EXTENSIONS
  
  // rev
! #define REQUIRED_EXTENSIONS nonstreaming_only (TARGET_SIMD)
  ENTRY_UNARY (vrev64_mf8, mf8, mf8, UNSPEC_REV64, QUIET)
  ENTRY_UNARY (vrev64q_mf8, mf8q, mf8q, UNSPEC_REV64, QUIET)
  
--- 307,319 ----
  #undef REQUIRED_EXTENSIONS
  
  // mov
! #define REQUIRED_EXTENSIONS nonstreaming_only (AARCH64_FL_SIMD)
  ENTRY_UNARY (vmov_n_mf8, mf8, mf8_scalar, UNSPEC_DUP, QUIET)
  ENTRY_UNARY (vmovq_n_mf8, mf8q, mf8_scalar, UNSPEC_DUP, QUIET)
  #undef REQUIRED_EXTENSIONS
  
  // rev
! #define REQUIRED_EXTENSIONS nonstreaming_only (AARCH64_FL_SIMD)
  ENTRY_UNARY (vrev64_mf8, mf8, mf8, UNSPEC_REV64, QUIET)
  ENTRY_UNARY (vrev64q_mf8, mf8q, mf8q, UNSPEC_REV64, QUIET)
  
*************** ENTRY_UNARY (vrev16q_mf8, mf8q, mf8q, UN
*** 325,337 ****
  #undef REQUIRED_EXTENSIONS
  
  // set_lane
! #define REQUIRED_EXTENSIONS nonstreaming_only (TARGET_SIMD)
  ENTRY_BINARY_LANE (vset_lane_mf8, mf8, mf8_scalar, mf8, UNSPEC_SET_LANE, QUIET)
  ENTRY_BINARY_LANE (vsetq_lane_mf8, mf8q, mf8_scalar, mf8q, UNSPEC_SET_LANE, QUIET)
  #undef REQUIRED_EXTENSIONS
  
  // st1
! #define REQUIRED_EXTENSIONS nonstreaming_only (TARGET_SIMD)
  ENTRY_STORE (vst1_mf8, mf8_scalar_ptr, mf8, UNSPEC_ST1)
  ENTRY_STORE (vst1q_mf8, mf8_scalar_ptr, mf8q, UNSPEC_ST1)
  
--- 325,337 ----
  #undef REQUIRED_EXTENSIONS
  
  // set_lane
! #define REQUIRED_EXTENSIONS nonstreaming_only (AARCH64_FL_SIMD)
  ENTRY_BINARY_LANE (vset_lane_mf8, mf8, mf8_scalar, mf8, UNSPEC_SET_LANE, QUIET)
  ENTRY_BINARY_LANE (vsetq_lane_mf8, mf8q, mf8_scalar, mf8q, UNSPEC_SET_LANE, QUIET)
  #undef REQUIRED_EXTENSIONS
  
  // st1
! #define REQUIRED_EXTENSIONS nonstreaming_only (AARCH64_FL_SIMD)
  ENTRY_STORE (vst1_mf8, mf8_scalar_ptr, mf8, UNSPEC_ST1)
  ENTRY_STORE (vst1q_mf8, mf8_scalar_ptr, mf8q, UNSPEC_ST1)
  
*************** ENTRY_STORE_LANE (vst1q_lane_mf8, mf8_sc
*** 340,346 ****
  #undef REQUIRED_EXTENSIONS
  
  // st<n>
! #define REQUIRED_EXTENSIONS nonstreaming_only (TARGET_SIMD)
  ENTRY_STORE (vst2_mf8, mf8_scalar_ptr, mf8x2, UNSPEC_ST2)
  ENTRY_STORE (vst2q_mf8, mf8_scalar_ptr, mf8qx2, UNSPEC_ST2)
  ENTRY_STORE (vst1_mf8_x2, mf8_scalar_ptr, mf8x2, UNSPEC_ST1x2)
--- 340,346 ----
  #undef REQUIRED_EXTENSIONS
  
  // st<n>
! #define REQUIRED_EXTENSIONS nonstreaming_only (AARCH64_FL_SIMD)
  ENTRY_STORE (vst2_mf8, mf8_scalar_ptr, mf8x2, UNSPEC_ST2)
  ENTRY_STORE (vst2q_mf8, mf8_scalar_ptr, mf8qx2, UNSPEC_ST2)
  ENTRY_STORE (vst1_mf8_x2, mf8_scalar_ptr, mf8x2, UNSPEC_ST1x2)
*************** ENTRY_STORE_LANE (vst4q_lane_mf8, mf8_sc
*** 364,370 ****
  #undef REQUIRED_EXTENSIONS
  
  // tbl<n>
! #define REQUIRED_EXTENSIONS nonstreaming_only (TARGET_SIMD)
  ENTRY_BINARY (vtbl1_mf8, mf8, mf8, u8, UNSPEC_TBL, QUIET)
  ENTRY_BINARY (vtbl2_mf8, mf8, mf8x2, u8, UNSPEC_TBL, QUIET)
  ENTRY_BINARY (vtbl3_mf8, mf8, mf8x3, u8, UNSPEC_TBL, QUIET)
--- 364,370 ----
  #undef REQUIRED_EXTENSIONS
  
  // tbl<n>
! #define REQUIRED_EXTENSIONS nonstreaming_only (AARCH64_FL_SIMD)
  ENTRY_BINARY (vtbl1_mf8, mf8, mf8, u8, UNSPEC_TBL, QUIET)
  ENTRY_BINARY (vtbl2_mf8, mf8, mf8x2, u8, UNSPEC_TBL, QUIET)
  ENTRY_BINARY (vtbl3_mf8, mf8, mf8x3, u8, UNSPEC_TBL, QUIET)
*************** ENTRY_BINARY (vqtbl4q_mf8, mf8q, mf8qx4,
*** 381,387 ****
  #undef REQUIRED_EXTENSIONS
  
  // tbx<n>
! #define REQUIRED_EXTENSIONS nonstreaming_only (TARGET_SIMD)
  ENTRY_TERNARY (vtbx1_mf8, mf8, mf8, mf8, u8, UNSPEC_TBX, QUIET)
  ENTRY_TERNARY (vtbx2_mf8, mf8, mf8, mf8x2, u8, UNSPEC_TBX, QUIET)
  ENTRY_TERNARY (vtbx3_mf8, mf8, mf8, mf8x3, u8, UNSPEC_TBX, QUIET)
--- 381,387 ----
  #undef REQUIRED_EXTENSIONS
  
  // tbx<n>
! #define REQUIRED_EXTENSIONS nonstreaming_only (AARCH64_FL_SIMD)
  ENTRY_TERNARY (vtbx1_mf8, mf8, mf8, mf8, u8, UNSPEC_TBX, QUIET)
  ENTRY_TERNARY (vtbx2_mf8, mf8, mf8, mf8x2, u8, UNSPEC_TBX, QUIET)
  ENTRY_TERNARY (vtbx3_mf8, mf8, mf8, mf8x3, u8, UNSPEC_TBX, QUIET)
*************** ENTRY_TERNARY (vqtbx4q_mf8, mf8q, mf8q,
*** 398,404 ****
  #undef REQUIRED_EXTENSIONS
  
  // trn<n>
! #define REQUIRED_EXTENSIONS nonstreaming_only (TARGET_SIMD)
  ENTRY_BINARY (vtrn1_mf8, mf8, mf8, mf8, UNSPEC_TRN1, QUIET)
  ENTRY_BINARY (vtrn1q_mf8, mf8q, mf8q, mf8q, UNSPEC_TRN1, QUIET)
  ENTRY_BINARY (vtrn2_mf8, mf8, mf8, mf8, UNSPEC_TRN2, QUIET)
--- 398,404 ----
  #undef REQUIRED_EXTENSIONS
  
  // trn<n>
! #define REQUIRED_EXTENSIONS nonstreaming_only (AARCH64_FL_SIMD)
  ENTRY_BINARY (vtrn1_mf8, mf8, mf8, mf8, UNSPEC_TRN1, QUIET)
  ENTRY_BINARY (vtrn1q_mf8, mf8q, mf8q, mf8q, UNSPEC_TRN1, QUIET)
  ENTRY_BINARY (vtrn2_mf8, mf8, mf8, mf8, UNSPEC_TRN2, QUIET)
*************** ENTRY_BINARY (vtrnq_mf8, mf8qx2, mf8q, m
*** 408,414 ****
  #undef REQUIRED_EXTENSIONS
  
  // uzp<n>
! #define REQUIRED_EXTENSIONS nonstreaming_only (TARGET_SIMD)
  ENTRY_BINARY (vuzp1_mf8, mf8, mf8, mf8, UNSPEC_UZP1, QUIET)
  ENTRY_BINARY (vuzp1q_mf8, mf8q, mf8q, mf8q, UNSPEC_UZP1, QUIET)
  ENTRY_BINARY (vuzp2_mf8, mf8, mf8, mf8, UNSPEC_UZP2, QUIET)
--- 408,414 ----
  #undef REQUIRED_EXTENSIONS
  
  // uzp<n>
! #define REQUIRED_EXTENSIONS nonstreaming_only (AARCH64_FL_SIMD)
  ENTRY_BINARY (vuzp1_mf8, mf8, mf8, mf8, UNSPEC_UZP1, QUIET)
  ENTRY_BINARY (vuzp1q_mf8, mf8q, mf8q, mf8q, UNSPEC_UZP1, QUIET)
  ENTRY_BINARY (vuzp2_mf8, mf8, mf8, mf8, UNSPEC_UZP2, QUIET)
*************** ENTRY_BINARY (vuzpq_mf8, mf8qx2, mf8q, m
*** 418,424 ****
  #undef REQUIRED_EXTENSIONS
  
  // zip<n>
! #define REQUIRED_EXTENSIONS nonstreaming_only (TARGET_SIMD)
  ENTRY_BINARY (vzip1_mf8, mf8, mf8, mf8, UNSPEC_ZIP1, QUIET)
  ENTRY_BINARY (vzip1q_mf8, mf8q, mf8q, mf8q, UNSPEC_ZIP1, QUIET)
  ENTRY_BINARY (vzip2_mf8, mf8, mf8, mf8, UNSPEC_ZIP2, QUIET)
--- 418,424 ----
  #undef REQUIRED_EXTENSIONS
  
  // zip<n>
! #define REQUIRED_EXTENSIONS nonstreaming_only (AARCH64_FL_SIMD)
  ENTRY_BINARY (vzip1_mf8, mf8, mf8, mf8, UNSPEC_ZIP1, QUIET)
  ENTRY_BINARY (vzip1q_mf8, mf8q, mf8q, mf8q, UNSPEC_ZIP1, QUIET)
  ENTRY_BINARY (vzip2_mf8, mf8, mf8, mf8, UNSPEC_ZIP2, QUIET)
diff -Nrcpad gcc-16-20260125/gcc/config/aarch64/aarch64-sve-builtins-base.cc gcc-16-20260201/gcc/config/aarch64/aarch64-sve-builtins-base.cc
*** gcc-16-20260125/gcc/config/aarch64/aarch64-sve-builtins-base.cc	Sun Jan 25 22:32:06 2026
--- gcc-16-20260201/gcc/config/aarch64/aarch64-sve-builtins-base.cc	Sun Feb  1 22:32:07 2026
*************** class svmul_impl : public rtx_code_funct
*** 2315,2325 ****
  {
  public:
    CONSTEXPR svmul_impl ()
!     : rtx_code_function (MULT, MULT, UNSPEC_COND_FMUL) {}
  
    gimple *
    fold (gimple_folder &f) const override
    {
      if (auto *res = f.fold_const_binary (MULT_EXPR))
        return res;
  
--- 2315,2332 ----
  {
  public:
    CONSTEXPR svmul_impl ()
!     : rtx_code_function (MULT, MULT, UNSPEC_COND_FMUL, UNSPEC_FMUL) {}
  
    gimple *
    fold (gimple_folder &f) const override
    {
+     /* The code below assumes that the function has 3 arguments (pg, rn, rm).
+        Unpredicated functions have only 2 arguments (rn, rm) so will cause the
+        code below to crash.  Also skip if it does not operate on integers,
+        since all the optimizations below are for integer multiplication.  */
+     if (!f.type_suffix (0).integer_p || f.pred == aarch64_sve::PRED_none)
+       return nullptr;
+ 
      if (auto *res = f.fold_const_binary (MULT_EXPR))
        return res;
  
diff -Nrcpad gcc-16-20260125/gcc/config/aarch64/aarch64-sve-builtins-sve2.def gcc-16-20260201/gcc/config/aarch64/aarch64-sve-builtins-sve2.def
*** gcc-16-20260125/gcc/config/aarch64/aarch64-sve-builtins-sve2.def	Sun Jan 25 22:32:06 2026
--- gcc-16-20260201/gcc/config/aarch64/aarch64-sve-builtins-sve2.def	Sun Feb  1 22:32:07 2026
*************** DEF_SVE_FUNCTION_GS_FPM (svmmla, mmla, s
*** 447,449 ****
--- 447,492 ----
  #define REQUIRED_EXTENSIONS nonstreaming_sve (AARCH64_FL_SVE_F16F32MM)
  DEF_SVE_FUNCTION (svmmla, mmla, cvt_f32_f16, none)
  #undef REQUIRED_EXTENSIONS
+ 
+ /*
+ - BFSCALE (predicated)
+   // Only if __ARM_FEATURE_SVE_BFSCALE != 0 && __ARM_FEATURE_SVE2 != 0
+   svbfloat16_t svscale[_bf16]_m (svbool_t pg, svbfloat16_t zdn, svint16_t zm);
+   svbfloat16_t svscale[_bf16]_x (svbool_t pg, svbfloat16_t zdn, svint16_t zm);
+   svbfloat16_t svscale[_bf16]_z (svbool_t pg, svbfloat16_t zdn, svint16_t zm);
+   svbfloat16_t svscale[_n_bf16]_m (svbool_t pg, svbfloat16_t zdn, int16_t zm);
+   svbfloat16_t svscale[_n_bf16]_x (svbool_t pg, svbfloat16_t zdn, int16_t zm);
+   svbfloat16_t svscale[_n_bf16]_z (svbool_t pg, svbfloat16_t zdn, int16_t zm);  */
+ #define REQUIRED_EXTENSIONS \
+   sve_and_sme (AARCH64_FL_SVE2 | AARCH64_FL_SVE_BFSCALE, \
+ 	       AARCH64_FL_SME2 | AARCH64_FL_SVE_BFSCALE)
+ DEF_SVE_FUNCTION (svscale, binary_int_opt_n, h_bfloat, mxz)
+ #undef REQUIRED_EXTENSIONS
+ 
+ /*
+ - BFSCALE (multiple vectors)
+   // Only if __ARM_FEATURE_SVE_BFSCALE != 0 && __ARM_FEATURE_SME2 != 0
+   svbfloat16x2_t svscale[_bf16_x2] (svbfloat16x2_t zdn, svint16x2_t zm) __arm_streaming;
+   svbfloat16x4_t svscale[_bf16_x4] (svbfloat16x4_t zdn, svint16x4_t zm) __arm_streaming;
+ 
+ - BFSCALE (multiple and single vector)
+   // Only if __ARM_FEATURE_SVE_BFSCALE != 0 && __ARM_FEATURE_SME2 != 0
+   svbfloat16x2_t svscale[_single_bf16_x2] (svbfloat16x2_t zn, svint16_t zm) __arm_streaming;
+   svbfloat16x4_t svscale[_single_bf16_x4] (svbfloat16x4_t zn, svint16_t zm) __arm_streaming;  */
+ #define REQUIRED_EXTENSIONS streaming_only (AARCH64_FL_SVE_BFSCALE | AARCH64_FL_SME2)
+ DEF_SVE_FUNCTION_GS (svscale, binary_int_opt_single_n, h_bfloat, x24, none)
+ #undef REQUIRED_EXTENSIONS
+ 
+ /*
+ - BFMUL (multiple vectors)
+   // Only if __ARM_FEATURE_SVE_BFSCALE != 0 && __ARM_FEATURE_SME2 != 0
+   svbfloat16x2_t svmul[_bf16_x2] (svbfloat16x2_t zdn, svbfloat16x2_t zm) __arm_streaming;
+   svbfloat16x4_t svmul[_bf16_x4] (svbfloat16x4_t zdn, svbfloat16x4_t zm) __arm_streaming;
+ 
+ - BFMUL (multiple and single vector)
+   // Only if __ARM_FEATURE_SVE_BFSCALE != 0 && __ARM_FEATURE_SME2 != 0
+   svbfloat16x2_t svmul[_single_bf16_x2] (svbfloat16x2_t zn, svbfloat16x2_t zm) __arm_streaming;
+   svbfloat16x4_t svmul[_single_bf16_x4] (svbfloat16x4_t zn, svbfloat16x4_t zm) __arm_streaming;  */
+ #define REQUIRED_EXTENSIONS streaming_only (AARCH64_FL_SVE_BFSCALE | AARCH64_FL_SME2)
+ DEF_SVE_FUNCTION_GS (svmul, binary_opt_single_n, h_bfloat, x24, none)
+ #undef REQUIRED_EXTENSIONS
diff -Nrcpad gcc-16-20260125/gcc/config/aarch64/aarch64-sve.md gcc-16-20260201/gcc/config/aarch64/aarch64-sve.md
*** gcc-16-20260125/gcc/config/aarch64/aarch64-sve.md	Sun Jan 25 22:32:06 2026
--- gcc-16-20260201/gcc/config/aarch64/aarch64-sve.md	Sun Feb  1 22:32:07 2026
***************
*** 5529,5534 ****
--- 5529,5535 ----
  ;; -------------------------------------------------------------------------
  ;; Includes:
  ;; - FSCALE
+ ;; - BFSCALE (SVE_BFSCALE)
  ;; - FTSMUL
  ;; - FTSSEL
  ;; -------------------------------------------------------------------------
***************
*** 5566,5580 ****
  (define_insn "@aarch64_pred_<optab><mode>"
    [(set (match_operand:SVE_FULL_F_SCALAR 0 "register_operand")
  	(unspec:SVE_FULL_F_SCALAR
! 	  [(match_operand:<VPRED> 1 "register_operand")
! 	   (match_operand:SI 4 "aarch64_sve_gp_strictness")
  	   (match_operand:SVE_FULL_F_SCALAR 2 "register_operand")
! 	   (match_operand:<V_INT_EQUIV> 3 "register_operand")]
  	  SVE_COND_FP_BINARY_INT))]
    "TARGET_SVE"
!   {@ [ cons: =0 , 1   , 2 , 3 ; attrs: movprfx ]
!      [ w        , Upl , 0 , w ; *              ] <sve_fp_op>\t%Z0.<Vetype>, %1/m, %Z0.<Vetype>, %Z3.<Vetype>
!      [ ?&w      , Upl , w , w ; yes            ] movprfx\t%Z0, %Z2\;<sve_fp_op>\t%Z0.<Vetype>, %1/m, %Z0.<Vetype>, %Z3.<Vetype>
    }
    [(set_attr "sve_type" "sve_fp_mul")]
  )
--- 5567,5581 ----
  (define_insn "@aarch64_pred_<optab><mode>"
    [(set (match_operand:SVE_FULL_F_SCALAR 0 "register_operand")
  	(unspec:SVE_FULL_F_SCALAR
! 	  [(match_operand:<VPRED>	    1 "register_operand")
! 	   (match_operand:SI		    4 "aarch64_sve_gp_strictness")
  	   (match_operand:SVE_FULL_F_SCALAR 2 "register_operand")
! 	   (match_operand:<V_INT_EQUIV>     3 "register_operand")]
  	  SVE_COND_FP_BINARY_INT))]
    "TARGET_SVE"
!   {@ [ cons: =0 , 1   , 2 , 3 ; attrs: movprfx	]
!      [ w	, Upl , 0 , w ; *		] <b><sve_fp_op>\t%Z0.<Vetype>, %1/m, %Z0.<Vetype>, %Z3.<Vetype>
!      [ ?&w	, Upl , w , w ; yes		] movprfx\t%Z0, %Z2\;<b><sve_fp_op>\t%Z0.<Vetype>, %1/m, %Z0.<Vetype>, %Z3.<Vetype>
    }
    [(set_attr "sve_type" "sve_fp_mul")]
  )
***************
*** 5582,5597 ****
  ;; Predicated floating-point binary operations with merging, taking an
  ;; integer as their second operand.
  (define_expand "@cond_<optab><mode>"
!   [(set (match_operand:SVE_FULL_F 0 "register_operand")
! 	(unspec:SVE_FULL_F
  	  [(match_operand:<VPRED> 1 "register_operand")
! 	   (unspec:SVE_FULL_F
  	     [(match_dup 1)
  	      (const_int SVE_STRICT_GP)
! 	      (match_operand:SVE_FULL_F 2 "register_operand")
! 	      (match_operand:<V_INT_EQUIV> 3 "register_operand")]
  	     SVE_COND_FP_BINARY_INT)
! 	   (match_operand:SVE_FULL_F 4 "aarch64_simd_reg_or_zero")]
  	  UNSPEC_SEL))]
    "TARGET_SVE"
  )
--- 5583,5598 ----
  ;; Predicated floating-point binary operations with merging, taking an
  ;; integer as their second operand.
  (define_expand "@cond_<optab><mode>"
!   [(set (match_operand:SVE_FULL_F_BFSCALE 0 "register_operand")
! 	(unspec:SVE_FULL_F_BFSCALE
  	  [(match_operand:<VPRED> 1 "register_operand")
! 	   (unspec:SVE_FULL_F_BFSCALE
  	     [(match_dup 1)
  	      (const_int SVE_STRICT_GP)
! 	      (match_operand:SVE_FULL_F_BFSCALE 2 "register_operand")
! 	      (match_operand:<V_INT_EQUIV>	3 "register_operand")]
  	     SVE_COND_FP_BINARY_INT)
! 	   (match_operand:SVE_FULL_F_BFSCALE 4 "aarch64_simd_reg_or_zero")]
  	  UNSPEC_SEL))]
    "TARGET_SVE"
  )
***************
*** 5599,5619 ****
  ;; Predicated floating-point binary operations that take an integer as their
  ;; second operand, with inactive lanes coming from the first operand.
  (define_insn_and_rewrite "*cond_<optab><mode>_2_relaxed"
!   [(set (match_operand:SVE_FULL_F 0 "register_operand")
! 	(unspec:SVE_FULL_F
  	  [(match_operand:<VPRED> 1 "register_operand")
! 	   (unspec:SVE_FULL_F
  	     [(match_operand 4)
  	      (const_int SVE_RELAXED_GP)
! 	      (match_operand:SVE_FULL_F 2 "register_operand")
  	      (match_operand:<V_INT_EQUIV> 3 "register_operand")]
  	     SVE_COND_FP_BINARY_INT)
  	   (match_dup 2)]
  	  UNSPEC_SEL))]
    "TARGET_SVE"
!   {@ [ cons: =0 , 1   , 2 , 3 ; attrs: movprfx ]
!      [ w        , Upl , 0 , w ; *              ] <sve_fp_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>
!      [ ?&w      , Upl , w , w ; yes            ] movprfx\t%0, %2\;<sve_fp_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>
    }
    "&& !rtx_equal_p (operands[1], operands[4])"
    {
--- 5600,5620 ----
  ;; Predicated floating-point binary operations that take an integer as their
  ;; second operand, with inactive lanes coming from the first operand.
  (define_insn_and_rewrite "*cond_<optab><mode>_2_relaxed"
!   [(set (match_operand:SVE_FULL_F_BFSCALE 0 "register_operand")
! 	(unspec:SVE_FULL_F_BFSCALE
  	  [(match_operand:<VPRED> 1 "register_operand")
! 	   (unspec:SVE_FULL_F_BFSCALE
  	     [(match_operand 4)
  	      (const_int SVE_RELAXED_GP)
! 	      (match_operand:SVE_FULL_F_BFSCALE 2 "register_operand")
  	      (match_operand:<V_INT_EQUIV> 3 "register_operand")]
  	     SVE_COND_FP_BINARY_INT)
  	   (match_dup 2)]
  	  UNSPEC_SEL))]
    "TARGET_SVE"
!   {@ [ cons: =0 , 1   , 2 , 3 ; attrs: movprfx	]
!      [ w	, Upl , 0 , w ; *		] <b><sve_fp_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>
!      [ ?&w	, Upl , w , w ; yes		] movprfx\t%0, %2\;<b><sve_fp_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>
    }
    "&& !rtx_equal_p (operands[1], operands[4])"
    {
***************
*** 5623,5643 ****
  )
  
  (define_insn "*cond_<optab><mode>_2_strict"
!   [(set (match_operand:SVE_FULL_F 0 "register_operand")
! 	(unspec:SVE_FULL_F
  	  [(match_operand:<VPRED> 1 "register_operand")
! 	   (unspec:SVE_FULL_F
  	     [(match_dup 1)
  	      (const_int SVE_STRICT_GP)
! 	      (match_operand:SVE_FULL_F 2 "register_operand")
  	      (match_operand:<V_INT_EQUIV> 3 "register_operand")]
  	     SVE_COND_FP_BINARY_INT)
  	   (match_dup 2)]
  	  UNSPEC_SEL))]
    "TARGET_SVE"
!   {@ [ cons: =0 , 1   , 2 , 3 ; attrs: movprfx ]
!      [ w        , Upl , 0 , w ; *              ] <sve_fp_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>
!      [ ?&w      , Upl , w , w ; yes            ] movprfx\t%0, %2\;<sve_fp_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>
    }
    [(set_attr "sve_type" "sve_fp_mul")]
  )
--- 5624,5644 ----
  )
  
  (define_insn "*cond_<optab><mode>_2_strict"
!   [(set (match_operand:SVE_FULL_F_BFSCALE 0 "register_operand")
! 	(unspec:SVE_FULL_F_BFSCALE
  	  [(match_operand:<VPRED> 1 "register_operand")
! 	   (unspec:SVE_FULL_F_BFSCALE
  	     [(match_dup 1)
  	      (const_int SVE_STRICT_GP)
! 	      (match_operand:SVE_FULL_F_BFSCALE 2 "register_operand")
  	      (match_operand:<V_INT_EQUIV> 3 "register_operand")]
  	     SVE_COND_FP_BINARY_INT)
  	   (match_dup 2)]
  	  UNSPEC_SEL))]
    "TARGET_SVE"
!   {@ [ cons: =0 , 1   , 2 , 3 ; attrs: movprfx	]
!      [ w	, Upl , 0 , w ; *		] <b><sve_fp_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>
!      [ ?&w	, Upl , w , w ; yes		] movprfx\t%0, %2\;<b><sve_fp_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>
    }
    [(set_attr "sve_type" "sve_fp_mul")]
  )
***************
*** 5646,5667 ****
  ;; their second operand, with the values of inactive lanes being distinct
  ;; from the other inputs.
  (define_insn_and_rewrite "*cond_<optab><mode>_any_relaxed"
!   [(set (match_operand:SVE_FULL_F 0 "register_operand")
! 	(unspec:SVE_FULL_F
  	  [(match_operand:<VPRED> 1 "register_operand")
! 	   (unspec:SVE_FULL_F
  	     [(match_operand 5)
  	      (const_int SVE_RELAXED_GP)
! 	      (match_operand:SVE_FULL_F 2 "register_operand")
  	      (match_operand:<V_INT_EQUIV> 3 "register_operand")]
  	     SVE_COND_FP_BINARY_INT)
! 	   (match_operand:SVE_FULL_F 4 "aarch64_simd_reg_or_zero")]
  	  UNSPEC_SEL))]
    "TARGET_SVE && !rtx_equal_p (operands[2], operands[4])"
    {@ [ cons: =0 , 1   , 2 , 3 , 4   ]
!      [ &w       , Upl , 0 , w , Dz  ] movprfx\t%0.<Vetype>, %1/z, %2.<Vetype>\;<sve_fp_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>
!      [ &w       , Upl , w , w , Dz  ] movprfx\t%0.<Vetype>, %1/z, %2.<Vetype>\;<sve_fp_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>
!      [ &w       , Upl , w , w , 0   ] movprfx\t%0.<Vetype>, %1/m, %2.<Vetype>\;<sve_fp_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>
       [ ?&w      , Upl , w , w , w   ] #
    }
    "&& 1"
--- 5647,5668 ----
  ;; their second operand, with the values of inactive lanes being distinct
  ;; from the other inputs.
  (define_insn_and_rewrite "*cond_<optab><mode>_any_relaxed"
!   [(set (match_operand:SVE_FULL_F_BFSCALE 0 "register_operand")
! 	(unspec:SVE_FULL_F_BFSCALE
  	  [(match_operand:<VPRED> 1 "register_operand")
! 	   (unspec:SVE_FULL_F_BFSCALE
  	     [(match_operand 5)
  	      (const_int SVE_RELAXED_GP)
! 	      (match_operand:SVE_FULL_F_BFSCALE 2 "register_operand")
  	      (match_operand:<V_INT_EQUIV> 3 "register_operand")]
  	     SVE_COND_FP_BINARY_INT)
! 	   (match_operand:SVE_FULL_F_BFSCALE 4 "aarch64_simd_reg_or_zero")]
  	  UNSPEC_SEL))]
    "TARGET_SVE && !rtx_equal_p (operands[2], operands[4])"
    {@ [ cons: =0 , 1   , 2 , 3 , 4   ]
!      [ &w       , Upl , 0 , w , Dz  ] movprfx\t%0.<Vetype>, %1/z, %2.<Vetype>\;<b><sve_fp_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>
!      [ &w       , Upl , w , w , Dz  ] movprfx\t%0.<Vetype>, %1/z, %2.<Vetype>\;<b><sve_fp_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>
!      [ &w       , Upl , w , w , 0   ] movprfx\t%0.<Vetype>, %1/m, %2.<Vetype>\;<b><sve_fp_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>
       [ ?&w      , Upl , w , w , w   ] #
    }
    "&& 1"
***************
*** 5684,5705 ****
  )
  
  (define_insn_and_rewrite "*cond_<optab><mode>_any_strict"
!   [(set (match_operand:SVE_FULL_F 0 "register_operand")
! 	(unspec:SVE_FULL_F
  	  [(match_operand:<VPRED> 1 "register_operand")
! 	   (unspec:SVE_FULL_F
  	     [(match_dup 1)
  	      (const_int SVE_STRICT_GP)
! 	      (match_operand:SVE_FULL_F 2 "register_operand")
! 	      (match_operand:<V_INT_EQUIV> 3 "register_operand")]
  	     SVE_COND_FP_BINARY_INT)
! 	   (match_operand:SVE_FULL_F 4 "aarch64_simd_reg_or_zero")]
  	  UNSPEC_SEL))]
    "TARGET_SVE && !rtx_equal_p (operands[2], operands[4])"
    {@ [ cons: =0 , 1   , 2 , 3 , 4   ]
!      [ &w       , Upl , 0 , w , Dz  ] movprfx\t%0.<Vetype>, %1/z, %2.<Vetype>\;<sve_fp_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>
!      [ &w       , Upl , w , w , Dz  ] movprfx\t%0.<Vetype>, %1/z, %2.<Vetype>\;<sve_fp_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>
!      [ &w       , Upl , w , w , 0   ] movprfx\t%0.<Vetype>, %1/m, %2.<Vetype>\;<sve_fp_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>
       [ ?&w      , Upl , w , w , w   ] #
    }
    "&& reload_completed
--- 5685,5706 ----
  )
  
  (define_insn_and_rewrite "*cond_<optab><mode>_any_strict"
!   [(set (match_operand:SVE_FULL_F_BFSCALE 0 "register_operand")
! 	(unspec:SVE_FULL_F_BFSCALE
  	  [(match_operand:<VPRED> 1 "register_operand")
! 	   (unspec:SVE_FULL_F_BFSCALE
  	     [(match_dup 1)
  	      (const_int SVE_STRICT_GP)
! 	      (match_operand:SVE_FULL_F_BFSCALE 2 "register_operand")
! 	      (match_operand:<V_INT_EQUIV>	3 "register_operand")]
  	     SVE_COND_FP_BINARY_INT)
! 	   (match_operand:SVE_FULL_F_BFSCALE    4 "aarch64_simd_reg_or_zero")]
  	  UNSPEC_SEL))]
    "TARGET_SVE && !rtx_equal_p (operands[2], operands[4])"
    {@ [ cons: =0 , 1   , 2 , 3 , 4   ]
!      [ &w       , Upl , 0 , w , Dz  ] movprfx\t%0.<Vetype>, %1/z, %2.<Vetype>\;<b><sve_fp_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>
!      [ &w       , Upl , w , w , Dz  ] movprfx\t%0.<Vetype>, %1/z, %2.<Vetype>\;<b><sve_fp_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>
!      [ &w       , Upl , w , w , 0   ] movprfx\t%0.<Vetype>, %1/m, %2.<Vetype>\;<b><sve_fp_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>
       [ ?&w      , Upl , w , w , w   ] #
    }
    "&& reload_completed
diff -Nrcpad gcc-16-20260125/gcc/config/aarch64/aarch64-sve2.md gcc-16-20260201/gcc/config/aarch64/aarch64-sve2.md
*** gcc-16-20260125/gcc/config/aarch64/aarch64-sve2.md	Sun Jan 25 22:32:06 2026
--- gcc-16-20260201/gcc/config/aarch64/aarch64-sve2.md	Sun Feb  1 22:32:07 2026
***************
*** 61,66 ****
--- 61,67 ----
  ;; ---- [FP] Non-widening bfloat16 arithmetic
  ;; ---- [FP] Clamp to minimum/maximum
  ;; ---- [FP] Scaling by powers of two
+ ;; ---- [FP] Multiplication
  ;;
  ;; == Uniform ternary arithmnetic
  ;; ---- [INT] General ternary arithmetic that maps to unspecs
***************
*** 1492,1517 ****
  ;; -------------------------------------------------------------------------
  ;; Includes the multiple and single vector and multiple vectors forms of
  ;; - FSCALE
  ;; -------------------------------------------------------------------------
  
  (define_insn "@aarch64_sve_fscale<mode>"
!   [(set (match_operand:SVE_Fx24_NOBF 0 "register_operand" "=Uw<vector_count>")
! 	(unspec:SVE_Fx24_NOBF
! 	  [(match_operand:SVE_Fx24_NOBF 1 "register_operand" "0")
  	   (match_operand:<SVSCALE_INTARG> 2 "register_operand" "Uw<vector_count>")]
  	  UNSPEC_FSCALE))]
!   "TARGET_STREAMING_SME2 && TARGET_FP8"
!   "fscale\t%0, %1, %2"
  )
  
  (define_insn "@aarch64_sve_single_fscale<mode>"
!   [(set (match_operand:SVE_Fx24_NOBF 0 "register_operand" "=Uw<vector_count>")
! 	(unspec:SVE_Fx24_NOBF
! 	  [(match_operand:SVE_Fx24_NOBF 1 "register_operand" "0")
  	   (match_operand:<SVSCALE_SINGLE_INTARG> 2 "register_operand" "x")]
  	  UNSPEC_FSCALE))]
!   "TARGET_STREAMING_SME2 && TARGET_FP8"
!   "fscale\t%0, %1, %2.<Vetype>"
  )
  
  ;; =========================================================================
--- 1493,1566 ----
  ;; -------------------------------------------------------------------------
  ;; Includes the multiple and single vector and multiple vectors forms of
  ;; - FSCALE
+ ;; - BFSCALE (SVE_BFSCALE)
  ;; -------------------------------------------------------------------------
  
+ ;; FSCALE / BFSCALE (multiple vectors)
+ ;; sv{b}floatNx2_t svscale[_{b}fN_x2] (sv{b}floatNx2_t zdn, svintNx2_t zm) __arm_streaming;
+ ;; sv{b}floatNx4_t svscale[_{b}fN_x4] (sv{b}floatNx4_t zdn, svintNx4_t zm) __arm_streaming;
+ ;; {B}FSCALE { <Zdn1>.T-<Zdn2>.T }, { <Zdn1>.T-<Zdn2>.T }, { <Zm1>.H-<Zm2>.T }
+ ;; {B}FSCALE { <Zdn1>.T-<Zdn4>.T }, { <Zdn1>.T-<Zdn4>.T }, { <Zm1>.H-<Zm4>.T }
  (define_insn "@aarch64_sve_fscale<mode>"
!   [(set (match_operand:SVE_Fx24_BFSCALE 0 "register_operand" "=Uw<vector_count>")
! 	(unspec:SVE_Fx24_BFSCALE
! 	  [(match_operand:SVE_Fx24_BFSCALE 1 "register_operand" "0")
  	   (match_operand:<SVSCALE_INTARG> 2 "register_operand" "Uw<vector_count>")]
  	  UNSPEC_FSCALE))]
!   "TARGET_STREAMING_SME2 && (<is_bf16> ? TARGET_SVE_BFSCALE : TARGET_FP8)"
!   "<b>fscale\t%0, %1, %2"
  )
  
+ ;; FSCALE / BFSCALE (multiple and single vector)
+ ;; sv{b}floatNx2_t svscale[_single_{b}fN_x2] (sv{b}floatNx2_t zdn, svintN_t zm) __arm_streaming;
+ ;; sv{b}floatNx4_t svscale[_single_{b}fN_x4] (sv{b}floatNx4_t zdn, svintN_t zm) __arm_streaming;
+ ;; {B}FSCALE { <Zdn1>.T-<Zdn2>.T }, { <Zdn1>.T-<Zdn2>.T }, <Zm1>.T
+ ;; {B}FSCALE { <Zdn1>.T-<Zdn4>.T }, { <Zdn1>.T-<Zdn4>.T }, <Zm1>.T
  (define_insn "@aarch64_sve_single_fscale<mode>"
!   [(set (match_operand:SVE_Fx24_BFSCALE 0 "register_operand" "=Uw<vector_count>")
! 	(unspec:SVE_Fx24_BFSCALE
! 	  [(match_operand:SVE_Fx24_BFSCALE	  1 "register_operand" "0")
  	   (match_operand:<SVSCALE_SINGLE_INTARG> 2 "register_operand" "x")]
  	  UNSPEC_FSCALE))]
!   "TARGET_STREAMING_SME2 && (<is_bf16> ? TARGET_SVE_BFSCALE : TARGET_FP8)"
!   "<b>fscale\t%0, %1, %2.<Vetype>"
! )
! 
! ;; -------------------------------------------------------------------------
! ;; ---- [FP] Multiplication
! ;; -------------------------------------------------------------------------
! ;; Includes the multiple and single vector and multiple vectors forms of
! ;; - BFMUL (SVE_BFSCALE)
! ;; -------------------------------------------------------------------------
! 
! ;; BFMUL (multiple vectors)
! ;; svbfloat16x2_t svmul[_bf16_x2](svbfloat16x2_t zd, svbfloat16x2_t zm) __arm_streaming;
! ;; svbfloat16x4_t svmul[_bf16_x4](svbfloat16x4_t zd, svbfloat16x4_t zm) __arm_streaming;
! ;; BFMUL { <Zd1>.H-<Zd2>.H }, { <Zn1>.H-<Zn2>.H }, { <Zm1>.H-<Zm2>.H }
! ;; BFMUL { <Zd1>.H-<Zd4>.H }, { <Zn1>.H-<Zn4>.H }, { <Zm1>.H-<Zm4>.H }
! (define_insn "@aarch64_sve_<optab><mode>"
!   [(set (match_operand:SVE_BFx24 0 "register_operand" "=Uw<vector_count>")
! 	(unspec:SVE_BFx24
! 	  [(match_operand:SVE_BFx24 1 "register_operand" "Uw<vector_count>")
! 	   (match_operand:SVE_BFx24 2 "register_operand" "Uw<vector_count>")]
! 	  SVE_FP_MUL))]
!   "TARGET_STREAMING_SME2 && TARGET_SVE_BFSCALE"
!   "bfmul\t%0, %1, %2"
! )
! 
! ;; BFMUL (multiple and single vector)
! ;; svbfloat16x2_t svmul[_single_bf16_x2](svbfloat16x2_t zd, svbfloat16_t zm) __arm_streaming;
! ;; svbfloat16x4_t svmul[_single_bf16_x4](svbfloat16x4_t zd, svbfloat16_t zm) __arm_streaming;
! ;; BFMUL { <Zd1>.H-<Zd2>.H }, { <Zn1>.H-<Zn2>.H }, <Zm>.H
! ;; BFMUL { <Zd1>.H-<Zd4>.H }, { <Zn1>.H-<Zn4>.H }, <Zm>.H
! (define_insn "@aarch64_sve_<optab><mode>_single"
!   [(set (match_operand:SVE_BFx24 0 "register_operand" "=Uw<vector_count>")
! 	(unspec:SVE_BFx24
! 	  [(match_operand:SVE_BFx24 1 "register_operand" "Uw<vector_count>")
! 	   (match_operand:<VSINGLE> 2 "register_operand" "x")]
! 	  SVE_FP_MUL))]
!   "TARGET_STREAMING_SME2 && TARGET_SVE_BFSCALE"
!   "bfmul\t%0, %1, %2.h"
  )
  
  ;; =========================================================================
***************
*** 4704,4707 ****
    }
    [(set_attr "sve_type" "sve_fp_mul")]
  )
- 
--- 4753,4755 ----
diff -Nrcpad gcc-16-20260125/gcc/config/aarch64/aarch64.cc gcc-16-20260201/gcc/config/aarch64/aarch64.cc
*** gcc-16-20260125/gcc/config/aarch64/aarch64.cc	Sun Jan 25 22:32:06 2026
--- gcc-16-20260201/gcc/config/aarch64/aarch64.cc	Sun Feb  1 22:32:07 2026
*************** aarch64_cannot_force_const_mem (machine_
*** 11145,11163 ****
  	|| aarch64_sme_vq_unspec_p (x, &factor))
        return true;
  
    poly_int64 offset;
    rtx base = strip_offset_and_salt (x, &offset);
!   if (SYMBOL_REF_P (base) || LABEL_REF_P (base))
!     {
!       /* We checked for POLY_INT_CST offsets above.  */
!       if (aarch64_classify_symbol (base, offset.to_constant ())
! 	  != SYMBOL_FORCE_TO_MEM)
! 	return true;
!       else
! 	/* Avoid generating a 64-bit relocation in ILP32; leave
! 	   to aarch64_expand_mov_immediate to handle it properly.  */
! 	return mode != ptr_mode;
!     }
  
    return aarch64_tls_referenced_p (x);
  }
--- 11145,11156 ----
  	|| aarch64_sme_vq_unspec_p (x, &factor))
        return true;
  
+   /* Only allow symbols in literal pools with the large model (non-PIC).  */
    poly_int64 offset;
    rtx base = strip_offset_and_salt (x, &offset);
!   if ((SYMBOL_REF_P (base) || LABEL_REF_P (base))
!       && aarch64_cmodel != AARCH64_CMODEL_LARGE)
!     return true;
  
    return aarch64_tls_referenced_p (x);
  }
*************** aarch64_select_rtx_section (machine_mode
*** 14312,14322 ****
  			    rtx x,
  			    unsigned HOST_WIDE_INT align)
  {
    if (aarch64_can_use_per_function_literal_pools_p ())
      return function_section (current_function_decl);
  
    /* When using anchors for constants use the readonly section.  */
!   if (known_le (GET_MODE_SIZE (mode), 8))
      return readonly_data_section;
  
    return default_elf_select_rtx_section (mode, x, align);
--- 14305,14318 ----
  			    rtx x,
  			    unsigned HOST_WIDE_INT align)
  {
+   /* Forcing special symbols into the .text section is not correct (PR123791).
+      This is only an issue with the large code model.  */
    if (aarch64_can_use_per_function_literal_pools_p ())
      return function_section (current_function_decl);
  
    /* When using anchors for constants use the readonly section.  */
!   if ((CONST_INT_P (x) || CONST_DOUBLE_P (x))
!       && known_le (GET_MODE_SIZE (mode), 8))
      return readonly_data_section;
  
    return default_elf_select_rtx_section (mode, x, align);
diff -Nrcpad gcc-16-20260125/gcc/config/aarch64/aarch64.h gcc-16-20260201/gcc/config/aarch64/aarch64.h
*** gcc-16-20260125/gcc/config/aarch64/aarch64.h	Sun Jan 25 22:32:06 2026
--- gcc-16-20260201/gcc/config/aarch64/aarch64.h	Sun Feb  1 22:32:07 2026
*************** constexpr auto AARCH64_FL_DEFAULT_ISA_MO
*** 385,390 ****
--- 385,391 ----
  #define TARGET_BF16_FP AARCH64_HAVE_ISA (BF16)
  #define TARGET_BF16_SIMD (TARGET_BF16_FP && TARGET_SIMD)
  #define TARGET_SVE_BF16 (TARGET_BF16_FP && TARGET_SVE)
+ #define TARGET_SVE_BFSCALE (AARCH64_HAVE_ISA (SVE_BFSCALE))
  
  /* PAUTH instructions are enabled through +pauth.  */
  #define TARGET_PAUTH AARCH64_HAVE_ISA (PAUTH)
diff -Nrcpad gcc-16-20260125/gcc/config/aarch64/aarch64.md gcc-16-20260201/gcc/config/aarch64/aarch64.md
*** gcc-16-20260125/gcc/config/aarch64/aarch64.md	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/config/aarch64/aarch64.md	Sun Feb  1 22:32:07 2026
***************
*** 6178,6184 ****
  	  (match_operand:GPI 1 "register_operand" "r")
  	  (minus:QI (match_operand 2 "const_int_operand" "n")
  		    (match_operand:QI 3 "register_operand" "r"))))]
!   "INTVAL (operands[2]) == GET_MODE_BITSIZE (<MODE>mode)"
    "#"
    "&& true"
    [(const_int 0)]
--- 6178,6185 ----
  	  (match_operand:GPI 1 "register_operand" "r")
  	  (minus:QI (match_operand 2 "const_int_operand" "n")
  		    (match_operand:QI 3 "register_operand" "r"))))]
!   "INTVAL (operands[2]) == GET_MODE_BITSIZE (<MODE>mode)
!    || INTVAL (operands[2]) == GET_MODE_BITSIZE (<MODE>mode) - 1"
    "#"
    "&& true"
    [(const_int 0)]
***************
*** 6188,6194 ****
      rtx tmp = (can_create_pseudo_p () ? gen_reg_rtx (SImode)
  	       : gen_lowpart (SImode, operands[0]));
  
!     emit_insn (gen_negsi2 (tmp, subreg_tmp));
  
      rtx and_op = gen_rtx_AND (SImode, tmp,
  			      GEN_INT (GET_MODE_BITSIZE (<MODE>mode) - 1));
--- 6189,6198 ----
      rtx tmp = (can_create_pseudo_p () ? gen_reg_rtx (SImode)
  	       : gen_lowpart (SImode, operands[0]));
  
!     if (INTVAL (operands[2]) == GET_MODE_BITSIZE (<MODE>mode))
!       emit_insn (gen_negsi2 (tmp, subreg_tmp));
!     else
!       emit_insn (gen_one_cmplsi2 (tmp, subreg_tmp));
  
      rtx and_op = gen_rtx_AND (SImode, tmp,
  			      GEN_INT (GET_MODE_BITSIZE (<MODE>mode) - 1));
diff -Nrcpad gcc-16-20260125/gcc/config/aarch64/iterators.md gcc-16-20260201/gcc/config/aarch64/iterators.md
*** gcc-16-20260125/gcc/config/aarch64/iterators.md	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/config/aarch64/iterators.md	Sun Feb  1 22:32:07 2026
***************
*** 501,510 ****
  (define_mode_iterator SVE_F [SVE_PARTIAL_F SVE_FULL_F])
  
  ;; Fully-packed SVE floating-point vector modes and their scalar equivalents.
! (define_mode_iterator SVE_FULL_F_SCALAR [SVE_FULL_F GPF_HF])
  
  (define_mode_iterator SVE_FULL_F_B16B16 [(VNx8BF "TARGET_SSVE_B16B16") SVE_FULL_F])
  
  (define_mode_iterator SVE_PARTIAL_F_B16B16 [(VNx2BF "TARGET_SSVE_B16B16")
  					    (VNx4BF "TARGET_SSVE_B16B16")
  					    SVE_PARTIAL_F])
--- 501,513 ----
  (define_mode_iterator SVE_F [SVE_PARTIAL_F SVE_FULL_F])
  
  ;; Fully-packed SVE floating-point vector modes and their scalar equivalents.
! (define_mode_iterator SVE_FULL_F_SCALAR [SVE_FULL_F GPF_HF (VNx8BF "TARGET_SVE_BFSCALE")])
  
  (define_mode_iterator SVE_FULL_F_B16B16 [(VNx8BF "TARGET_SSVE_B16B16") SVE_FULL_F])
  
+ (define_mode_iterator SVE_FULL_F_BFSCALE [SVE_FULL_F
+ 					 (VNx8BF "TARGET_SVE_BFSCALE")])
+ 
  (define_mode_iterator SVE_PARTIAL_F_B16B16 [(VNx2BF "TARGET_SSVE_B16B16")
  					    (VNx4BF "TARGET_SSVE_B16B16")
  					    SVE_PARTIAL_F])
***************
*** 746,755 ****
--- 749,766 ----
  (define_mode_iterator SVE_Fx24_NOBF [VNx16HF VNx8SF VNx4DF
  				     VNx32HF VNx16SF VNx8DF])
  
+ (define_mode_iterator SVE_Fx24_BFSCALE [
+ 	SVE_Fx24_NOBF
+ 	(VNx16BF "TARGET_SVE_BFSCALE") ;; bf16x2
+ 	(VNx32BF "TARGET_SVE_BFSCALE") ;; bf16x4
+ ])
+ 
  (define_mode_iterator SVE_Fx24 [(VNx16BF "TARGET_SSVE_B16B16")
  				(VNx32BF "TARGET_SSVE_B16B16")
  				SVE_Fx24_NOBF])
  
+ (define_mode_iterator SVE_BFx24 [VNx16BF VNx32BF])
+ 
  (define_mode_iterator SVE_SFx24 [VNx8SF VNx16SF])
  
  ;; The modes used to represent different ZA access sizes.
***************
*** 824,829 ****
--- 835,841 ----
      UNSPEC_FMAX		; Used in aarch64-simd.md.
      UNSPEC_FMAXNMV	; Used in aarch64-simd.md.
      UNSPEC_FMAXV	; Used in aarch64-simd.md.
+     UNSPEC_FMUL		; Used in aarch64-sve2.md.
      UNSPEC_FMIN		; Used in aarch64-simd.md.
      UNSPEC_FMINNMV	; Used in aarch64-simd.md.
      UNSPEC_FMINV	; Used in aarch64-simd.md.
***************
*** 2211,2216 ****
--- 2223,2230 ----
  			       (VNx16QI "VNx16QI")
  			       (VNx8HI  "VNx8HI") (VNx8HF "VNx8HI")
  			       (VNx8BF  "VNx8HI")
+ 			       (VNx16BF  "VNx16HI")
+ 			       (VNx32BF  "VNx32HI")
  			       (VNx4SI  "VNx4SI") (VNx4SF "VNx4SI")
  			       (VNx2DI  "VNx2DI") (VNx2DF "VNx2DI")
  			       (VNx8SF  "VNx8SI") (VNx16SF "VNx16SI")
***************
*** 2792,2808 ****
  				 (V8HI "vec") (V2SI "vec") (V4SI "vec")
  				 (V2DI "vec") (DI "offset")])
  
! (define_mode_attr b [(V4BF "b") (V4HF "") (V8BF "b") (V8HF "")
  		     (VNx2BF "b") (VNx2HF "") (VNx2SF "")
  		     (VNx4BF "b") (VNx4HF "") (VNx4SF "")
  		     (VNx8BF "b") (VNx8HF "") (VNx2DF "")
  		     (VNx16BF "b") (VNx16HF "") (VNx8SF "") (VNx4DF "")
  		     (VNx32BF "b") (VNx32HF "") (VNx16SF "") (VNx8DF "")])
  
! (define_mode_attr is_bf16 [(VNx2BF "true") (VNx4BF "true") (VNx8BF "true")
! 			   (VNx2HF "false") (VNx4HF "false") (VNx8HF "false")
! 			   (VNx2SF "false") (VNx4SF "false")
! 			   (VNx2DF "false")])
  
  (define_mode_attr aligned_operand [(VNx16QI "register_operand")
  				   (VNx8HI "register_operand")
--- 2806,2825 ----
  				 (V8HI "vec") (V2SI "vec") (V4SI "vec")
  				 (V2DI "vec") (DI "offset")])
  
! (define_mode_attr b [(BF "b") (HF "") (SF "") (DF "")
! 		     (V4BF "b") (V4HF "") (V8BF "b") (V8HF "")
  		     (VNx2BF "b") (VNx2HF "") (VNx2SF "")
  		     (VNx4BF "b") (VNx4HF "") (VNx4SF "")
  		     (VNx8BF "b") (VNx8HF "") (VNx2DF "")
  		     (VNx16BF "b") (VNx16HF "") (VNx8SF "") (VNx4DF "")
  		     (VNx32BF "b") (VNx32HF "") (VNx16SF "") (VNx8DF "")])
  
! (define_mode_attr is_bf16 [
! 	(VNx2BF "true")  (VNx4BF "true")  (VNx8BF "true")  (VNx16BF "true")  (VNx32BF "true")
! 	(VNx2HF "false") (VNx4HF "false") (VNx8HF "false") (VNx16HF "false") (VNx32HF "false")
! 	(VNx2SF "false") (VNx4SF "false") (VNx8SF "false") (VNx16SF "false")
! 	(VNx2DF "false") (VNx4DF "false") (VNx8DF "false")
! ])
  
  (define_mode_attr aligned_operand [(VNx16QI "register_operand")
  				   (VNx8HI "register_operand")
***************
*** 2829,2850 ****
  
  ;; Maps the output type of svscale to the corresponding int vector type in the
  ;; second argument.
! (define_mode_attr SVSCALE_SINGLE_INTARG [(VNx16HF "VNx8HI") ;; f16_x2 -> s16
! 					 (VNx32HF "VNx8HI") ;; f16_x4 -> s16
! 					 (VNx8SF "VNx4SI") ;; f32_x2 -> s32
! 					 (VNx16SF "VNx4SI") ;; f32_x4 -> s32
! 					 (VNx4DF "VNx2DI") ;; f64_x2 -> s64
! 					 (VNx8DF "VNx2DI") ;; f64_x4 -> s64
  ])
  
! (define_mode_attr SVSCALE_INTARG [(VNx16HF "VNx16HI") ;; f16_x2 -> s16x2
! 				  (VNx32HF "VNx32HI") ;; f16_x4 -> s16x4
! 				  (VNx8SF "VNx8SI") ;; f32_x2 -> s32_x2
! 				  (VNx16SF "VNx16SI") ;; f32_x4 -> s32_x4
! 				  (VNx4DF "VNx4DI") ;; f64_x2 -> s64_x2
! 				  (VNx8DF "VNx8DI") ;; f64_x4 -> s64_x4
  ])
  
  ;; -------------------------------------------------------------------
  ;; Code Iterators
  ;; -------------------------------------------------------------------
--- 2846,2874 ----
  
  ;; Maps the output type of svscale to the corresponding int vector type in the
  ;; second argument.
! (define_mode_attr SVSCALE_SINGLE_INTARG [
! 	(VNx16HF "VNx8HI") ;; f16_x2  -> s16
! 	(VNx32HF "VNx8HI") ;; f16_x4  -> s16
! 	(VNx16BF "VNx8HI") ;; bf16_x2 -> s16
! 	(VNx32BF "VNx8HI") ;; bf16_x4 -> s16
! 	(VNx8SF  "VNx4SI") ;; f32_x2  -> s32
! 	(VNx16SF "VNx4SI") ;; f32_x4  -> s32
! 	(VNx4DF  "VNx2DI") ;; f64_x2  -> s64
! 	(VNx8DF  "VNx2DI") ;; f64_x4  -> s64
  ])
  
! (define_mode_attr SVSCALE_INTARG [
! 	(VNx16HF "VNx16HI") ;; f16_x2  -> s16x2
! 	(VNx32HF "VNx32HI") ;; f16_x4  -> s16x4
! 	(VNx16BF "VNx16HI") ;; bf16_x2 -> s16x2
! 	(VNx32BF "VNx32HI") ;; bf16_x4 -> s16x4
! 	(VNx8SF  "VNx8SI")  ;; f32_x2  -> s32_x2
! 	(VNx16SF "VNx16SI") ;; f32_x4  -> s32_x4
! 	(VNx4DF  "VNx4DI")  ;; f64_x2  -> s64_x2
! 	(VNx8DF  "VNx8DI")  ;; f64_x4  -> s64_x4
  ])
  
+ 
  ;; -------------------------------------------------------------------
  ;; Code Iterators
  ;; -------------------------------------------------------------------
***************
*** 3644,3649 ****
--- 3668,3675 ----
  (define_int_iterator SVE_COND_FP_SUB [UNSPEC_COND_FSUB])
  (define_int_iterator SVE_COND_FP_MUL [UNSPEC_COND_FMUL])
  
+ (define_int_iterator SVE_FP_MUL [UNSPEC_FMUL])
+ 
  (define_int_iterator SVE_COND_FP_BINARY_I1 [UNSPEC_COND_FMAX
  					    UNSPEC_COND_FMAXNM
  					    UNSPEC_COND_FMIN
***************
*** 4205,4210 ****
--- 4231,4237 ----
  			(UNSPEC_FMINNMQV "fminnmqv")
  			(UNSPEC_FMINNMV "smin")
  			(UNSPEC_FMINV "smin_nan")
+ 			(UNSPEC_FMUL "fmul")
  		        (UNSPEC_SMUL_HIGHPART "smulh")
  		        (UNSPEC_UMUL_HIGHPART "umulh")
  			(UNSPEC_FMLA "fma")
diff -Nrcpad gcc-16-20260125/gcc/config/darwin-d.cc gcc-16-20260201/gcc/config/darwin-d.cc
*** gcc-16-20260125/gcc/config/darwin-d.cc	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/config/darwin-d.cc	Sun Feb  1 22:32:07 2026
*************** darwin_d_os_builtins (void)
*** 30,35 ****
--- 30,36 ----
  {
    d_add_builtin_version ("Posix");
    d_add_builtin_version ("OSX");
+   d_add_builtin_version ("Apple");
    d_add_builtin_version ("darwin");
  }
  
diff -Nrcpad gcc-16-20260125/gcc/config/darwin.h gcc-16-20260201/gcc/config/darwin.h
*** gcc-16-20260125/gcc/config/darwin.h	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/config/darwin.h	Sun Feb  1 22:32:07 2026
*************** extern GTY(()) section * darwin_sections
*** 1022,1027 ****
--- 1022,1033 ----
        sprintf (LABEL, "*%s%ld", "lTRAMP", (long)(NUM));\
      else if (strncmp ("LANCHOR", PREFIX, 7) == 0)	\
        sprintf (LABEL, "*%s%ld", "lANCHOR", (long)(NUM));\
+     else if (strlen (PREFIX) == 19 \
+ 	     && strncmp ("Lcontract_violation", PREFIX, 19) == 0)	\
+       sprintf (LABEL, "*%s%ld", "lcontract_violation", (long)(NUM));\
+     else if (strlen (PREFIX) == 13 \
+ 	     && strncmp ("Lsrc_loc_impl", PREFIX, 13) == 0)	\
+       sprintf (LABEL, "*%s%ld", "lsrc_loc_impl", (long)(NUM));\
      else						\
        sprintf (LABEL, "*%s%ld", PREFIX, (long)(NUM));	\
    } while (0)
diff -Nrcpad gcc-16-20260125/gcc/config/i386/i386.md gcc-16-20260201/gcc/config/i386/i386.md
*** gcc-16-20260125/gcc/config/i386/i386.md	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/config/i386/i386.md	Sun Feb  1 22:32:07 2026
***************
*** 18266,18289 ****
  	      (match_operand 2 "int248_register_operand" "c,r")) 0)))
     (clobber (reg:CC FLAGS_REG))]
    "ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)
!    && (INTVAL (operands[3]) & (<MODE_SIZE> * BITS_PER_UNIT - 1)) == 0
     && ix86_pre_reload_split ()"
    "#"
    "&& 1"
    [(parallel
-      [(set (match_dup 4)
- 	   (neg:QI (match_dup 2)))
-       (clobber (reg:CC FLAGS_REG))])
-    (parallel
       [(set (match_dup 0)
  	   (any_shift:SWI48 (match_dup 1)
  			    (match_dup 4)))
        (clobber (reg:CC FLAGS_REG))])]
  {
    operands[2] = force_reg (GET_MODE (operands[2]), operands[2]);
    operands[2] = gen_lowpart (QImode, operands[2]);
  
    operands[4] = gen_reg_rtx (QImode);
  }
    [(set_attr "isa" "*,bmi2")])
  
--- 18266,18292 ----
  	      (match_operand 2 "int248_register_operand" "c,r")) 0)))
     (clobber (reg:CC FLAGS_REG))]
    "ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)
!    && ((INTVAL (operands[3]) & (<MODE_SIZE> * BITS_PER_UNIT - 1)) == 0
!        || (INTVAL (operands[3]) & (<MODE_SIZE> * BITS_PER_UNIT - 1))
!           == <MODE_SIZE> * BITS_PER_UNIT - 1)
     && ix86_pre_reload_split ()"
    "#"
    "&& 1"
    [(parallel
       [(set (match_dup 0)
  	   (any_shift:SWI48 (match_dup 1)
  			    (match_dup 4)))
        (clobber (reg:CC FLAGS_REG))])]
  {
+   HOST_WIDE_INT cnt = INTVAL (operands[3]) & (<MODE_SIZE> * BITS_PER_UNIT - 1);
+ 
    operands[2] = force_reg (GET_MODE (operands[2]), operands[2]);
    operands[2] = gen_lowpart (QImode, operands[2]);
  
    operands[4] = gen_reg_rtx (QImode);
+ 
+   rtx (*insn)(rtx, rtx) = (cnt == 0) ? gen_negqi2 : gen_one_cmplqi2;
+   emit_insn (insn (operands[4], operands[2]));
  }
    [(set_attr "isa" "*,bmi2")])
  
***************
*** 18296,18315 ****
  	    (match_operand:QI 2 "register_operand" "c,r"))))
     (clobber (reg:CC FLAGS_REG))]
    "ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)
!    && (INTVAL (operands[3]) & (<MODE_SIZE> * BITS_PER_UNIT - 1)) == 0
     && ix86_pre_reload_split ()"
    "#"
    "&& 1"
    [(parallel
-      [(set (match_dup 4)
- 	   (neg:QI (match_dup 2)))
-       (clobber (reg:CC FLAGS_REG))])
-    (parallel
       [(set (match_dup 0)
  	   (any_shift:SWI48 (match_dup 1)
  			    (match_dup 4)))
        (clobber (reg:CC FLAGS_REG))])]
!   "operands[4] = gen_reg_rtx (QImode);"
    [(set_attr "isa" "*,bmi2")])
  
  (define_insn_and_split "*extend<dwi>2_doubleword_highpart"
--- 18299,18323 ----
  	    (match_operand:QI 2 "register_operand" "c,r"))))
     (clobber (reg:CC FLAGS_REG))]
    "ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)
!    && ((INTVAL (operands[3]) & (<MODE_SIZE> * BITS_PER_UNIT - 1)) == 0
!        || (INTVAL (operands[3]) & (<MODE_SIZE> * BITS_PER_UNIT - 1))
!           == <MODE_SIZE> * BITS_PER_UNIT - 1)
     && ix86_pre_reload_split ()"
    "#"
    "&& 1"
    [(parallel
       [(set (match_dup 0)
  	   (any_shift:SWI48 (match_dup 1)
  			    (match_dup 4)))
        (clobber (reg:CC FLAGS_REG))])]
! {
!   HOST_WIDE_INT cnt = INTVAL (operands[3]) & (<MODE_SIZE> * BITS_PER_UNIT - 1);
! 
!   operands[4] = gen_reg_rtx (QImode);
! 
!   rtx (*insn)(rtx, rtx) = (cnt == 0) ? gen_negqi2 : gen_one_cmplqi2;
!   emit_insn (insn (operands[4], operands[2]));
! }
    [(set_attr "isa" "*,bmi2")])
  
  (define_insn_and_split "*extend<dwi>2_doubleword_highpart"
diff -Nrcpad gcc-16-20260125/gcc/config/i386/sse.md gcc-16-20260201/gcc/config/i386/sse.md
*** gcc-16-20260125/gcc/config/i386/sse.md	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/config/i386/sse.md	Sun Feb  1 22:32:07 2026
***************
*** 24599,24605 ****
     (set_attr "prefix" "orig,orig,maybe_evex")
     (set_attr "mode" "TI")])
  
! (define_insn_and_split "*sse4_1_<code>v8qiv8hi2<mask_name>_2"
    [(set (match_operand:V8HI 0 "register_operand")
  	(any_extend:V8HI
  	  (vec_select:V8QI
--- 24599,24605 ----
     (set_attr "prefix" "orig,orig,maybe_evex")
     (set_attr "mode" "TI")])
  
! (define_insn_and_split "*sse4_1_<code>v8qiv8hi2_2"
    [(set (match_operand:V8HI 0 "register_operand")
  	(any_extend:V8HI
  	  (vec_select:V8QI
***************
*** 24611,24617 ****
  		       (const_int 2) (const_int 3)
  		       (const_int 4) (const_int 5)
  		       (const_int 6) (const_int 7)]))))]
!   "TARGET_SSE4_1 && <mask_avx512bw_condition> && <mask_avx512vl_condition>
     && ix86_pre_reload_split ()"
    "#"
    "&& 1"
--- 24611,24617 ----
  		       (const_int 2) (const_int 3)
  		       (const_int 4) (const_int 5)
  		       (const_int 6) (const_int 7)]))))]
!   "TARGET_SSE4_1
     && ix86_pre_reload_split ()"
    "#"
    "&& 1"
***************
*** 24619,24624 ****
--- 24619,24650 ----
  	(any_extend:V8HI (match_dup 1)))]
    "operands[1] = adjust_address_nv (operands[1], V8QImode, 0);")
  
+ (define_insn_and_split "*avx512vl_<code>v8qiv8hi2_mask_2"
+   [(set (match_operand:V8HI 0 "register_operand")
+ 	(vec_merge:V8HI
+ 	  (any_extend:V8HI
+ 	    (vec_select:V8QI
+ 	      (subreg:V16QI
+ 		(vec_concat:V2DI
+ 		  (match_operand:DI 1 "memory_operand")
+ 		  (const_int 0)) 0)
+ 	      (parallel [(const_int 0) (const_int 1)
+ 			 (const_int 2) (const_int 3)
+ 		         (const_int 4) (const_int 5)
+ 		         (const_int 6) (const_int 7)])))
+ 	  (match_operand:V8HI 2 "nonimm_or_0_operand")
+ 	  (match_operand:QI 3 "register_operand")))]
+   "TARGET_AVX512VL && TARGET_AVX512BW
+    && ix86_pre_reload_split ()"
+   "#"
+   "&& 1"
+   [(set (match_dup 0)
+ 	(vec_merge:V8HI
+ 	  (any_extend:V8HI (match_dup 1))
+ 	  (match_dup 2)
+ 	  (match_dup 3)))]
+   "operands[1] = adjust_address_nv (operands[1], V8QImode, 0);")
+ 
  (define_insn_and_split "*sse4_1_zero_extendv8qiv8hi2_3"
    [(set (match_operand:V16QI 0 "register_operand" "=Yr,*x,Yw")
  	(vec_select:V16QI
***************
*** 24751,24757 ****
     (set_attr "prefix" "maybe_evex")
     (set_attr "mode" "OI")])
  
! (define_insn_and_split "*avx2_<code>v8qiv8si2<mask_name>_2"
    [(set (match_operand:V8SI 0 "register_operand")
  	(any_extend:V8SI
  	  (vec_select:V8QI
--- 24777,24783 ----
     (set_attr "prefix" "maybe_evex")
     (set_attr "mode" "OI")])
  
! (define_insn_and_split "*avx2_<code>v8qiv8si2_2"
    [(set (match_operand:V8SI 0 "register_operand")
  	(any_extend:V8SI
  	  (vec_select:V8QI
***************
*** 24763,24769 ****
  		       (const_int 2) (const_int 3)
  		       (const_int 4) (const_int 5)
  		       (const_int 6) (const_int 7)]))))]
!   "TARGET_AVX2 && <mask_avx512vl_condition>
     && ix86_pre_reload_split ()"
    "#"
    "&& 1"
--- 24789,24795 ----
  		       (const_int 2) (const_int 3)
  		       (const_int 4) (const_int 5)
  		       (const_int 6) (const_int 7)]))))]
!   "TARGET_AVX2
     && ix86_pre_reload_split ()"
    "#"
    "&& 1"
***************
*** 24771,24776 ****
--- 24797,24829 ----
  	(any_extend:V8SI (match_dup 1)))]
    "operands[1] = adjust_address_nv (operands[1], V8QImode, 0);")
  
+ (define_insn_and_split "*avx512vl_<code>v8qiv8si2_mask_2"
+   [(set (match_operand:V8SI 0 "register_operand")
+ 	(vec_merge:V8SI
+ 	  (any_extend:V8SI
+ 	    (vec_select:V8QI
+ 	      (subreg:V16QI
+ 		(vec_concat:V2DI
+ 		  (match_operand:DI 1 "memory_operand")
+ 		  (const_int 0)) 0)
+ 	      (parallel [(const_int 0) (const_int 1)
+ 			 (const_int 2) (const_int 3)
+ 			 (const_int 4) (const_int 5)
+ 			 (const_int 6) (const_int 7)])))
+ 	  (match_operand:V8SI 2 "nonimm_or_0_operand")
+ 	  (match_operand:QI 3 "register_operand")))]
+   "TARGET_AVX512VL
+    && ix86_pre_reload_split ()"
+   "#"
+   "&& 1"
+   [(set (match_dup 0)
+ 	(vec_merge:V8SI
+ 	  (any_extend:V8SI (match_dup 1))
+ 	  (match_dup 2)
+ 	  (match_dup 3)))]
+   "operands[1] = adjust_address_nv (operands[1], V8QImode, 0);")
+ 
+ 
  (define_expand "<insn>v8qiv8si2"
    [(set (match_operand:V8SI 0 "register_operand")
  	(any_extend:V8SI
***************
*** 24814,24820 ****
     (set_attr "prefix" "orig,orig,maybe_evex")
     (set_attr "mode" "TI")])
  
! (define_insn_and_split "*sse4_1_<code>v4qiv4si2<mask_name>_2"
    [(set (match_operand:V4SI 0 "register_operand")
  	(any_extend:V4SI
  	  (vec_select:V4QI
--- 24867,24873 ----
     (set_attr "prefix" "orig,orig,maybe_evex")
     (set_attr "mode" "TI")])
  
! (define_insn_and_split "*sse4_1_<code>v4qiv4si2_2"
    [(set (match_operand:V4SI 0 "register_operand")
  	(any_extend:V4SI
  	  (vec_select:V4QI
***************
*** 24836,24841 ****
--- 24889,24923 ----
  	(any_extend:V4SI (match_dup 1)))]
    "operands[1] = adjust_address_nv (operands[1], V4QImode, 0);")
  
+ (define_insn_and_split "*avx512vl_<code>v4qiv4si2_mask_2"
+   [(set (match_operand:V4SI 0 "register_operand")
+ 	(vec_merge:V4SI
+ 	  (any_extend:V4SI
+ 	    (vec_select:V4QI
+ 	      (subreg:V16QI
+ 		(vec_merge:V4SI
+ 		  (vec_duplicate:V4SI
+ 		    (match_operand:SI 1 "memory_operand"))
+ 		  (const_vector:V4SI
+ 		    [(const_int 0) (const_int 0)
+ 		     (const_int 0) (const_int 0)])
+ 		  (const_int 1)) 0)
+ 	      (parallel [(const_int 0) (const_int 1)
+ 			 (const_int 2) (const_int 3)])))
+ 	  (match_operand:V4SI 2 "nonimm_or_0_operand")
+ 	  (match_operand:QI 3 "register_operand")))]
+   "TARGET_AVX512VL
+    && ix86_pre_reload_split ()"
+   "#"
+   "&& 1"
+   [(set (match_dup 0)
+ 	(vec_merge:V4SI
+ 	  (any_extend:V4SI (match_dup 1))
+ 	  (match_dup 2)
+ 	  (match_dup 3)))]
+   "operands[1] = adjust_address_nv (operands[1], V4QImode, 0);")
+ 
+ 
  (define_expand "<insn>v4qiv4si2"
    [(set (match_operand:V4SI 0 "register_operand")
  	(any_extend:V4SI
***************
*** 24987,24993 ****
     (set_attr "prefix" "orig,orig,maybe_evex")
     (set_attr "mode" "TI")])
  
! (define_insn_and_split "*sse4_1_<code>v4hiv4si2<mask_name>_2"
    [(set (match_operand:V4SI 0 "register_operand")
  	(any_extend:V4SI
  	  (vec_select:V4HI
--- 25069,25075 ----
     (set_attr "prefix" "orig,orig,maybe_evex")
     (set_attr "mode" "TI")])
  
! (define_insn_and_split "*sse4_1_<code>v4hiv4si2_2"
    [(set (match_operand:V4SI 0 "register_operand")
  	(any_extend:V4SI
  	  (vec_select:V4HI
***************
*** 24997,25003 ****
  		(const_int 0)) 0)
  	    (parallel [(const_int 0) (const_int 1)
  		       (const_int 2) (const_int 3)]))))]
!   "TARGET_SSE4_1 && <mask_avx512vl_condition>
     && ix86_pre_reload_split ()"
    "#"
    "&& 1"
--- 25079,25085 ----
  		(const_int 0)) 0)
  	    (parallel [(const_int 0) (const_int 1)
  		       (const_int 2) (const_int 3)]))))]
!   "TARGET_SSE4_1
     && ix86_pre_reload_split ()"
    "#"
    "&& 1"
***************
*** 25005,25010 ****
--- 25087,25117 ----
  	(any_extend:V4SI (match_dup 1)))]
    "operands[1] = adjust_address_nv (operands[1], V4HImode, 0);")
  
+ (define_insn_and_split "*avx512vl_<code>v4hiv4si2_mask_2"
+   [(set (match_operand:V4SI 0 "register_operand")
+ 	(vec_merge:V4SI
+ 	  (any_extend:V4SI
+ 	    (vec_select:V4HI
+ 	      (subreg:V8HI
+ 		(vec_concat:V2DI
+ 		  (match_operand:DI 1 "memory_operand")
+ 		  (const_int 0)) 0)
+ 	      (parallel [(const_int 0) (const_int 1)
+ 			 (const_int 2) (const_int 3)])))
+ 	  (match_operand:V4SI 2 "nonimm_or_0_operand")
+ 	  (match_operand:QI 3 "register_operand")))]
+   "TARGET_AVX512VL
+    && ix86_pre_reload_split ()"
+   "#"
+   "&& 1"
+   [(set (match_dup 0)
+ 	(vec_merge:V4SI
+ 	  (any_extend:V4SI (match_dup 1))
+ 	  (match_dup 2)
+ 	  (match_dup 3)))]
+   "operands[1] = adjust_address_nv (operands[1], V4HImode, 0);")
+ 
+ 
  (define_expand "<insn>v4hiv4si2"
    [(set (match_operand:V4SI 0 "register_operand")
  	(any_extend:V4SI
***************
*** 25115,25121 ****
     (set_attr "prefix" "evex")
     (set_attr "mode" "XI")])
  
! (define_insn_and_split "*avx512f_<code>v8qiv8di2<mask_name>_2"
    [(set (match_operand:V8DI 0 "register_operand")
  	(any_extend:V8DI
  	  (vec_select:V8QI
--- 25222,25228 ----
     (set_attr "prefix" "evex")
     (set_attr "mode" "XI")])
  
! (define_insn_and_split "*avx512f_<code>v8qiv8di2_2"
    [(set (match_operand:V8DI 0 "register_operand")
  	(any_extend:V8DI
  	  (vec_select:V8QI
***************
*** 25134,25139 ****
--- 25241,25272 ----
  	(any_extend:V8DI (match_dup 1)))]
    "operands[1] = adjust_address_nv (operands[1], V8QImode, 0);")
  
+ (define_insn_and_split "*avx512f_<code>v8qiv8di2_mask_2"
+   [(set (match_operand:V8DI 0 "register_operand")
+ 	(vec_merge:V8DI
+ 	  (any_extend:V8DI
+ 	    (vec_select:V8QI
+ 	      (subreg:V16QI
+ 		(vec_concat:V2DI
+ 		  (match_operand:DI 1 "memory_operand")
+ 		  (const_int 0)) 0)
+ 	      (parallel [(const_int 0) (const_int 1)
+ 			 (const_int 2) (const_int 3)
+ 		         (const_int 4) (const_int 5)
+ 		         (const_int 6) (const_int 7)])))
+ 	  (match_operand:V8DI 2 "nonimm_or_0_operand")
+ 	  (match_operand:QI 3 "register_operand")))]
+   "TARGET_AVX512F && ix86_pre_reload_split ()"
+   "#"
+   "&& 1"
+   [(set (match_dup 0)
+ 	(vec_merge:V8DI
+ 	  (any_extend:V8DI (match_dup 1))
+ 	  (match_dup 2)
+ 	  (match_dup 3)))]
+   "operands[1] = adjust_address_nv (operands[1], V8QImode, 0);")
+ 
+ 
  (define_expand "<insn>v8qiv8di2"
    [(set (match_operand:V8DI 0 "register_operand")
  	(any_extend:V8DI
***************
*** 25174,25180 ****
     (set_attr "prefix" "maybe_evex")
     (set_attr "mode" "OI")])
  
! (define_insn_and_split "*avx2_<code>v4qiv4di2<mask_name>_2"
    [(set (match_operand:V4DI 0 "register_operand")
  	(any_extend:V4DI
  	  (vec_select:V4QI
--- 25307,25313 ----
     (set_attr "prefix" "maybe_evex")
     (set_attr "mode" "OI")])
  
! (define_insn_and_split "*avx2_<code>v4qiv4di2_2"
    [(set (match_operand:V4DI 0 "register_operand")
  	(any_extend:V4DI
  	  (vec_select:V4QI
***************
*** 25188,25194 ****
  		(const_int 1)) 0)
  	    (parallel [(const_int 0) (const_int 1)
  		       (const_int 2) (const_int 3)]))))]
!   "TARGET_AVX2 && <mask_avx512vl_condition>
     && ix86_pre_reload_split ()"
    "#"
    "&& 1"
--- 25321,25327 ----
  		(const_int 1)) 0)
  	    (parallel [(const_int 0) (const_int 1)
  		       (const_int 2) (const_int 3)]))))]
!   "TARGET_AVX2
     && ix86_pre_reload_split ()"
    "#"
    "&& 1"
***************
*** 25196,25201 ****
--- 25329,25363 ----
  	(any_extend:V4DI (match_dup 1)))]
    "operands[1] = adjust_address_nv (operands[1], V4QImode, 0);")
  
+ (define_insn_and_split "*avx512vl_<code>v4qiv4di2_mask_2"
+   [(set (match_operand:V4DI 0 "register_operand")
+ 	(vec_merge:V4DI
+ 	  (any_extend:V4DI
+ 	    (vec_select:V4QI
+ 	      (subreg:V16QI
+ 		(vec_merge:V4SI
+ 		  (vec_duplicate:V4SI
+ 		    (match_operand:SI 1 "memory_operand"))
+ 		  (const_vector:V4SI
+ 		    [(const_int 0) (const_int 0)
+ 		     (const_int 0) (const_int 0)])
+ 		  (const_int 1)) 0)
+ 	      (parallel [(const_int 0) (const_int 1)
+ 			 (const_int 2) (const_int 3)])))
+ 	  (match_operand:V4DI 2 "nonimm_or_0_operand")
+ 	  (match_operand:QI 3 "register_operand")))]
+   "TARGET_AVX512VL
+    && ix86_pre_reload_split ()"
+   "#"
+   "&& 1"
+   [(set (match_dup 0)
+ 	(vec_merge:V4DI
+ 	  (any_extend:V4DI (match_dup 1))
+ 	  (match_dup 2)
+ 	  (match_dup 3)))]
+   "operands[1] = adjust_address_nv (operands[1], V4QImode, 0);")
+ 
+ 
  (define_expand "<insn>v4qiv4di2"
    [(set (match_operand:V4DI 0 "register_operand")
  	(any_extend:V4DI
***************
*** 25317,25323 ****
     (set_attr "prefix" "maybe_evex")
     (set_attr "mode" "OI")])
  
! (define_insn_and_split "*avx2_<code>v4hiv4di2<mask_name>_2"
    [(set (match_operand:V4DI 0 "register_operand")
  	(any_extend:V4DI
  	  (vec_select:V4HI
--- 25479,25485 ----
     (set_attr "prefix" "maybe_evex")
     (set_attr "mode" "OI")])
  
! (define_insn_and_split "*avx2_<code>v4hiv4di2_2"
    [(set (match_operand:V4DI 0 "register_operand")
  	(any_extend:V4DI
  	  (vec_select:V4HI
***************
*** 25327,25333 ****
  		(const_int 0)) 0)
  	    (parallel [(const_int 0) (const_int 1)
  		       (const_int 2) (const_int 3)]))))]
!   "TARGET_AVX2 && <mask_avx512vl_condition>
     && ix86_pre_reload_split ()"
    "#"
    "&& 1"
--- 25489,25495 ----
  		(const_int 0)) 0)
  	    (parallel [(const_int 0) (const_int 1)
  		       (const_int 2) (const_int 3)]))))]
!   "TARGET_AVX2
     && ix86_pre_reload_split ()"
    "#"
    "&& 1"
***************
*** 25335,25340 ****
--- 25497,25527 ----
  	(any_extend:V4DI (match_dup 1)))]
    "operands[1] = adjust_address_nv (operands[1], V4HImode, 0);")
  
+ (define_insn_and_split "*avx512vl_<code>v4hiv4di2_mask_2"
+   [(set (match_operand:V4DI 0 "register_operand")
+ 	(vec_merge:V4DI
+ 	  (any_extend:V4DI
+ 	    (vec_select:V4HI
+ 	      (subreg:V8HI
+ 		(vec_concat:V2DI
+ 		  (match_operand:DI 1 "memory_operand")
+ 		  (const_int 0)) 0)
+ 	      (parallel [(const_int 0) (const_int 1)
+ 		         (const_int 2) (const_int 3)])))
+ 	  (match_operand:V4DI 2 "nonimm_or_0_operand")
+ 	  (match_operand:QI 3 "register_operand")))]
+   "TARGET_AVX512VL
+    && ix86_pre_reload_split ()"
+   "#"
+   "&& 1"
+   [(set (match_dup 0)
+ 	(vec_merge:V4DI
+ 	  (any_extend:V4DI (match_dup 1))
+ 	  (match_dup 2)
+ 	  (match_dup 3)))]
+   "operands[1] = adjust_address_nv (operands[1], V4HImode, 0);")
+ 
+ 
  (define_expand "<insn>v4hiv4di2"
    [(set (match_operand:V4DI 0 "register_operand")
  	(any_extend:V4DI
***************
*** 25377,25383 ****
     (set_attr "prefix" "orig,orig,maybe_evex")
     (set_attr "mode" "TI")])
  
! (define_insn_and_split "*sse4_1_<code>v2hiv2di2<mask_name>_2"
    [(set (match_operand:V2DI 0 "register_operand")
  	(any_extend:V2DI
  	  (vec_select:V2HI
--- 25564,25570 ----
     (set_attr "prefix" "orig,orig,maybe_evex")
     (set_attr "mode" "TI")])
  
! (define_insn_and_split "*sse4_1_<code>v2hiv2di2_2"
    [(set (match_operand:V2DI 0 "register_operand")
  	(any_extend:V2DI
  	  (vec_select:V2HI
***************
*** 25390,25396 ****
  		    (const_int 0) (const_int 0)])
  		(const_int 1)) 0)
  	    (parallel [(const_int 0) (const_int 1)]))))]
!   "TARGET_SSE4_1 && <mask_avx512vl_condition>
     && ix86_pre_reload_split ()"
    "#"
    "&& 1"
--- 25577,25583 ----
  		    (const_int 0) (const_int 0)])
  		(const_int 1)) 0)
  	    (parallel [(const_int 0) (const_int 1)]))))]
!   "TARGET_SSE4_1
     && ix86_pre_reload_split ()"
    "#"
    "&& 1"
***************
*** 25398,25403 ****
--- 25585,25618 ----
  	(any_extend:V2DI (match_dup 1)))]
    "operands[1] = adjust_address_nv (operands[1], V2HImode, 0);")
  
+ (define_insn_and_split "*avx512vl_<code>v2hiv2di2_mask_2"
+   [(set (match_operand:V2DI 0 "register_operand")
+ 	(vec_merge:V2DI
+ 	  (any_extend:V2DI
+ 	    (vec_select:V2HI
+ 	      (subreg:V8HI
+ 		(vec_merge:V4SI
+ 		  (vec_duplicate:V4SI
+ 		    (match_operand:SI 1 "memory_operand"))
+ 		  (const_vector:V4SI
+ 		    [(const_int 0) (const_int 0)
+ 		     (const_int 0) (const_int 0)])
+ 		  (const_int 1)) 0)
+ 	      (parallel [(const_int 0) (const_int 1)])))
+ 	  (match_operand:V2DI 2 "nonimm_or_0_operand")
+ 	  (match_operand:QI 3 "register_operand")))]
+   "TARGET_AVX512VL
+    && ix86_pre_reload_split ()"
+   "#"
+   "&& 1"
+   [(set (match_dup 0)
+ 	(vec_merge:V2DI
+ 	  (any_extend:V2DI (match_dup 1))
+ 	  (match_dup 2)
+ 	  (match_dup 3)))]
+   "operands[1] = adjust_address_nv (operands[1], V2HImode, 0);")
+ 
+ 
  (define_expand "<insn>v2hiv2di2"
    [(set (match_operand:V2DI 0 "register_operand")
  	(any_extend:V2DI
***************
*** 25543,25549 ****
     (set_attr "prefix" "orig,orig,maybe_evex")
     (set_attr "mode" "TI")])
  
! (define_insn_and_split "*sse4_1_<code>v2siv2di2<mask_name>_2"
    [(set (match_operand:V2DI 0 "register_operand")
  	(any_extend:V2DI
  	  (vec_select:V2SI
--- 25758,25764 ----
     (set_attr "prefix" "orig,orig,maybe_evex")
     (set_attr "mode" "TI")])
  
! (define_insn_and_split "*sse4_1_<code>v2siv2di2_2"
    [(set (match_operand:V2DI 0 "register_operand")
  	(any_extend:V2DI
  	  (vec_select:V2SI
***************
*** 25552,25558 ****
  		(match_operand:DI 1 "memory_operand")
  		(const_int 0)) 0)
  	    (parallel [(const_int 0) (const_int 1)]))))]
!   "TARGET_SSE4_1 && <mask_avx512vl_condition>
     && ix86_pre_reload_split ()"
    "#"
    "&& 1"
--- 25767,25773 ----
  		(match_operand:DI 1 "memory_operand")
  		(const_int 0)) 0)
  	    (parallel [(const_int 0) (const_int 1)]))))]
!   "TARGET_SSE4_1
     && ix86_pre_reload_split ()"
    "#"
    "&& 1"
***************
*** 25560,25565 ****
--- 25775,25803 ----
  	(any_extend:V2DI (match_dup 1)))]
    "operands[1] = adjust_address_nv (operands[1], V2SImode, 0);")
  
+ (define_insn_and_split "*avx512vl_<code>v2siv2di2_mask_2"
+   [(set (match_operand:V2DI 0 "register_operand")
+ 	(vec_merge:V2DI
+ 	  (any_extend:V2DI
+ 	    (vec_select:V2SI
+ 	      (subreg:V4SI
+ 		(vec_concat:V2DI
+ 		  (match_operand:DI 1 "memory_operand")
+ 		  (const_int 0)) 0)
+ 	      (parallel [(const_int 0) (const_int 1)])))
+ 	  (match_operand:V2DI 2 "nonimm_or_0_operand")
+ 	  (match_operand:QI 3 "register_operand")))]
+   "TARGET_AVX512VL
+    && ix86_pre_reload_split ()"
+   "#"
+   "&& 1"
+   [(set (match_dup 0)
+ 	(vec_merge:V2DI
+ 	  (any_extend:V2DI (match_dup 1))
+ 	  (match_dup 2)
+ 	  (match_dup 3)))]
+   "operands[1] = adjust_address_nv (operands[1], V2SImode, 0);")
+ 
  (define_insn_and_split "*sse4_1_zero_extendv2siv2di2_3"
    [(set (match_operand:V4SI 0 "register_operand" "=Yr,*x,v")
  	(vec_select:V4SI
diff -Nrcpad gcc-16-20260125/gcc/config/loongarch/loongarch-builtins.cc gcc-16-20260201/gcc/config/loongarch/loongarch-builtins.cc
*** gcc-16-20260125/gcc/config/loongarch/loongarch-builtins.cc	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/config/loongarch/loongarch-builtins.cc	Sun Feb  1 22:32:07 2026
*************** static const struct loongarch_builtin_de
*** 1491,1500 ****
    LSX_BUILTIN (vfrintrp_d, LARCH_V2DF_FTYPE_V2DF),
    LSX_BUILTIN (vfrintrm_s, LARCH_V4SF_FTYPE_V4SF),
    LSX_BUILTIN (vfrintrm_d, LARCH_V2DF_FTYPE_V2DF),
!   LSX_NO_TARGET_BUILTIN (vstelm_b, LARCH_VOID_FTYPE_V16QI_CVPOINTER_SI_UQI),
!   LSX_NO_TARGET_BUILTIN (vstelm_h, LARCH_VOID_FTYPE_V8HI_CVPOINTER_SI_UQI),
!   LSX_NO_TARGET_BUILTIN (vstelm_w, LARCH_VOID_FTYPE_V4SI_CVPOINTER_SI_UQI),
!   LSX_NO_TARGET_BUILTIN (vstelm_d, LARCH_VOID_FTYPE_V2DI_CVPOINTER_SI_UQI),
    LSX_BUILTIN (vaddwev_d_w, LARCH_V2DI_FTYPE_V4SI_V4SI),
    LSX_BUILTIN (vaddwev_w_h, LARCH_V4SI_FTYPE_V8HI_V8HI),
    LSX_BUILTIN (vaddwev_h_b, LARCH_V8HI_FTYPE_V16QI_V16QI),
--- 1491,1500 ----
    LSX_BUILTIN (vfrintrp_d, LARCH_V2DF_FTYPE_V2DF),
    LSX_BUILTIN (vfrintrm_s, LARCH_V4SF_FTYPE_V4SF),
    LSX_BUILTIN (vfrintrm_d, LARCH_V2DF_FTYPE_V2DF),
!   LSX_NO_TARGET_BUILTIN (vstelm_b, LARCH_VOID_FTYPE_V16QI_VPOINTER_SI_UQI),
!   LSX_NO_TARGET_BUILTIN (vstelm_h, LARCH_VOID_FTYPE_V8HI_VPOINTER_SI_UQI),
!   LSX_NO_TARGET_BUILTIN (vstelm_w, LARCH_VOID_FTYPE_V4SI_VPOINTER_SI_UQI),
!   LSX_NO_TARGET_BUILTIN (vstelm_d, LARCH_VOID_FTYPE_V2DI_VPOINTER_SI_UQI),
    LSX_BUILTIN (vaddwev_d_w, LARCH_V2DI_FTYPE_V4SI_V4SI),
    LSX_BUILTIN (vaddwev_w_h, LARCH_V4SI_FTYPE_V8HI_V8HI),
    LSX_BUILTIN (vaddwev_h_b, LARCH_V8HI_FTYPE_V16QI_V16QI),
*************** static const struct loongarch_builtin_de
*** 1664,1670 ****
    LSX_BUILTIN (vssrarni_du_q, LARCH_UV2DI_FTYPE_UV2DI_V2DI_USI),
    LSX_BUILTIN (vpermi_w, LARCH_V4SI_FTYPE_V4SI_V4SI_USI),
    LSX_BUILTIN (vld, LARCH_V16QI_FTYPE_CVPOINTER_SI),
!   LSX_NO_TARGET_BUILTIN (vst, LARCH_VOID_FTYPE_V16QI_CVPOINTER_SI),
    LSX_BUILTIN (vssrlrn_b_h, LARCH_V16QI_FTYPE_V8HI_V8HI),
    LSX_BUILTIN (vssrlrn_h_w, LARCH_V8HI_FTYPE_V4SI_V4SI),
    LSX_BUILTIN (vssrlrn_w_d, LARCH_V4SI_FTYPE_V2DI_V2DI),
--- 1664,1670 ----
    LSX_BUILTIN (vssrarni_du_q, LARCH_UV2DI_FTYPE_UV2DI_V2DI_USI),
    LSX_BUILTIN (vpermi_w, LARCH_V4SI_FTYPE_V4SI_V4SI_USI),
    LSX_BUILTIN (vld, LARCH_V16QI_FTYPE_CVPOINTER_SI),
!   LSX_NO_TARGET_BUILTIN (vst, LARCH_VOID_FTYPE_V16QI_VPOINTER_SI),
    LSX_BUILTIN (vssrlrn_b_h, LARCH_V16QI_FTYPE_V8HI_V8HI),
    LSX_BUILTIN (vssrlrn_h_w, LARCH_V8HI_FTYPE_V4SI_V4SI),
    LSX_BUILTIN (vssrlrn_w_d, LARCH_V4SI_FTYPE_V2DI_V2DI),
*************** static const struct loongarch_builtin_de
*** 1675,1681 ****
    LSX_BUILTIN (vldi, LARCH_V2DI_FTYPE_HI),
    LSX_BUILTIN (vshuf_b, LARCH_V16QI_FTYPE_V16QI_V16QI_V16QI),
    LSX_BUILTIN (vldx, LARCH_V16QI_FTYPE_CVPOINTER_DI),
!   LSX_NO_TARGET_BUILTIN (vstx, LARCH_VOID_FTYPE_V16QI_CVPOINTER_DI),
    LSX_BUILTIN (vextl_qu_du, LARCH_UV2DI_FTYPE_UV2DI),
  
    /* Built-in functions for LASX */
--- 1675,1681 ----
    LSX_BUILTIN (vldi, LARCH_V2DI_FTYPE_HI),
    LSX_BUILTIN (vshuf_b, LARCH_V16QI_FTYPE_V16QI_V16QI_V16QI),
    LSX_BUILTIN (vldx, LARCH_V16QI_FTYPE_CVPOINTER_DI),
!   LSX_NO_TARGET_BUILTIN (vstx, LARCH_VOID_FTYPE_V16QI_VPOINTER_DI),
    LSX_BUILTIN (vextl_qu_du, LARCH_UV2DI_FTYPE_UV2DI),
  
    /* Built-in functions for LASX */
*************** static const struct loongarch_builtin_de
*** 2204,2214 ****
    LASX_BUILTIN (xvfrintrm_s, LARCH_V8SF_FTYPE_V8SF),
    LASX_BUILTIN (xvfrintrm_d, LARCH_V4DF_FTYPE_V4DF),
    LASX_BUILTIN (xvld, LARCH_V32QI_FTYPE_CVPOINTER_SI),
!   LASX_NO_TARGET_BUILTIN (xvst, LARCH_VOID_FTYPE_V32QI_CVPOINTER_SI),
!   LASX_NO_TARGET_BUILTIN (xvstelm_b, LARCH_VOID_FTYPE_V32QI_CVPOINTER_SI_UQI),
!   LASX_NO_TARGET_BUILTIN (xvstelm_h, LARCH_VOID_FTYPE_V16HI_CVPOINTER_SI_UQI),
!   LASX_NO_TARGET_BUILTIN (xvstelm_w, LARCH_VOID_FTYPE_V8SI_CVPOINTER_SI_UQI),
!   LASX_NO_TARGET_BUILTIN (xvstelm_d, LARCH_VOID_FTYPE_V4DI_CVPOINTER_SI_UQI),
    LASX_BUILTIN (xvinsve0_w, LARCH_V8SI_FTYPE_V8SI_V8SI_UQI),
    LASX_BUILTIN (xvinsve0_d, LARCH_V4DI_FTYPE_V4DI_V4DI_UQI),
    LASX_BUILTIN (xvpickve_w, LARCH_V8SI_FTYPE_V8SI_UQI),
--- 2204,2214 ----
    LASX_BUILTIN (xvfrintrm_s, LARCH_V8SF_FTYPE_V8SF),
    LASX_BUILTIN (xvfrintrm_d, LARCH_V4DF_FTYPE_V4DF),
    LASX_BUILTIN (xvld, LARCH_V32QI_FTYPE_CVPOINTER_SI),
!   LASX_NO_TARGET_BUILTIN (xvst, LARCH_VOID_FTYPE_V32QI_VPOINTER_SI),
!   LASX_NO_TARGET_BUILTIN (xvstelm_b, LARCH_VOID_FTYPE_V32QI_VPOINTER_SI_UQI),
!   LASX_NO_TARGET_BUILTIN (xvstelm_h, LARCH_VOID_FTYPE_V16HI_VPOINTER_SI_UQI),
!   LASX_NO_TARGET_BUILTIN (xvstelm_w, LARCH_VOID_FTYPE_V8SI_VPOINTER_SI_UQI),
!   LASX_NO_TARGET_BUILTIN (xvstelm_d, LARCH_VOID_FTYPE_V4DI_VPOINTER_SI_UQI),
    LASX_BUILTIN (xvinsve0_w, LARCH_V8SI_FTYPE_V8SI_V8SI_UQI),
    LASX_BUILTIN (xvinsve0_d, LARCH_V4DI_FTYPE_V4DI_V4DI_UQI),
    LASX_BUILTIN (xvpickve_w, LARCH_V8SI_FTYPE_V8SI_UQI),
*************** static const struct loongarch_builtin_de
*** 2224,2230 ****
    LASX_BUILTIN (xvorn_v, LARCH_UV32QI_FTYPE_UV32QI_UV32QI),
    LASX_BUILTIN (xvldi, LARCH_V4DI_FTYPE_HI),
    LASX_BUILTIN (xvldx, LARCH_V32QI_FTYPE_CVPOINTER_DI),
!   LASX_NO_TARGET_BUILTIN (xvstx, LARCH_VOID_FTYPE_V32QI_CVPOINTER_DI),
    LASX_BUILTIN (xvextl_qu_du, LARCH_UV4DI_FTYPE_UV4DI),
  
    /* LASX */
--- 2224,2230 ----
    LASX_BUILTIN (xvorn_v, LARCH_UV32QI_FTYPE_UV32QI_UV32QI),
    LASX_BUILTIN (xvldi, LARCH_V4DI_FTYPE_HI),
    LASX_BUILTIN (xvldx, LARCH_V32QI_FTYPE_CVPOINTER_DI),
!   LASX_NO_TARGET_BUILTIN (xvstx, LARCH_VOID_FTYPE_V32QI_VPOINTER_DI),
    LASX_BUILTIN (xvextl_qu_du, LARCH_UV4DI_FTYPE_UV4DI),
  
    /* LASX */
*************** loongarch_build_cvpointer_type (void)
*** 2492,2502 ****
--- 2492,2516 ----
    return cache;
  }
  
+ /* Return a type for 'volatile void *'.  */
+ 
+ static tree
+ loongarch_build_vpointer_type (void)
+ {
+   static tree cache;
+ 
+   if (cache == NULL_TREE)
+     cache = build_pointer_type (build_qualified_type (void_type_node,
+ 						      TYPE_QUAL_VOLATILE));
+   return cache;
+ }
+ 
  /* Source-level argument types.  */
  #define LARCH_ATYPE_VOID void_type_node
  #define LARCH_ATYPE_INT integer_type_node
  #define LARCH_ATYPE_POINTER ptr_type_node
  #define LARCH_ATYPE_CVPOINTER loongarch_build_cvpointer_type ()
+ #define LARCH_ATYPE_VPOINTER loongarch_build_vpointer_type ()
  #define LARCH_ATYPE_BOOLEAN boolean_type_node
  /* Standard mode-based argument types.  */
  #define LARCH_ATYPE_QI intQI_type_node
diff -Nrcpad gcc-16-20260125/gcc/config/loongarch/loongarch-ftypes.def gcc-16-20260201/gcc/config/loongarch/loongarch-ftypes.def
*** gcc-16-20260125/gcc/config/loongarch/loongarch-ftypes.def	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/config/loongarch/loongarch-ftypes.def	Sun Feb  1 22:32:07 2026
*************** DEF_LARCH_FTYPE (2, (V8QI, V4HI, V4HI))
*** 504,530 ****
  DEF_LARCH_FTYPE (1, (V8QI, V8QI))
  DEF_LARCH_FTYPE (2, (V8QI, V8QI, V8QI))
  
- DEF_LARCH_FTYPE (2, (VOID, SI, CVPOINTER))
  DEF_LARCH_FTYPE (2, (VOID, SI, SI))
  DEF_LARCH_FTYPE (2, (VOID, UQI, SI))
  DEF_LARCH_FTYPE (2, (VOID, USI, UQI))
  DEF_LARCH_FTYPE (1, (VOID, UHI))
! DEF_LARCH_FTYPE (3, (VOID, V16QI, CVPOINTER, SI))
! DEF_LARCH_FTYPE (3, (VOID, V16QI, CVPOINTER, DI))
! DEF_LARCH_FTYPE (3, (VOID, V32QI, CVPOINTER, SI))
! DEF_LARCH_FTYPE (3, (VOID, V32QI, CVPOINTER, DI))
  DEF_LARCH_FTYPE (3, (VOID, V4DF, POINTER, SI))
  DEF_LARCH_FTYPE (3, (VOID, V2DF, POINTER, SI))
- DEF_LARCH_FTYPE (3, (VOID, V2DI, CVPOINTER, SI))
- DEF_LARCH_FTYPE (3, (VOID, V4DI, CVPOINTER, SI))
  DEF_LARCH_FTYPE (2, (VOID, V2HI, V2HI))
  DEF_LARCH_FTYPE (2, (VOID, V4QI, V4QI))
  DEF_LARCH_FTYPE (3, (VOID, V4SF, POINTER, SI))
  DEF_LARCH_FTYPE (3, (VOID, V8SF, POINTER, SI))
- DEF_LARCH_FTYPE (3, (VOID, V4SI, CVPOINTER, SI))
- DEF_LARCH_FTYPE (3, (VOID, V8SI, CVPOINTER, SI))
- DEF_LARCH_FTYPE (3, (VOID, V8HI, CVPOINTER, SI))
- DEF_LARCH_FTYPE (3, (VOID, V16HI, CVPOINTER, SI))
  
  DEF_LARCH_FTYPE (1, (V16HI, V32QI))
  DEF_LARCH_FTYPE (1, (UV16HI, UV32QI))
--- 504,523 ----
  DEF_LARCH_FTYPE (1, (V8QI, V8QI))
  DEF_LARCH_FTYPE (2, (V8QI, V8QI, V8QI))
  
  DEF_LARCH_FTYPE (2, (VOID, SI, SI))
  DEF_LARCH_FTYPE (2, (VOID, UQI, SI))
  DEF_LARCH_FTYPE (2, (VOID, USI, UQI))
  DEF_LARCH_FTYPE (1, (VOID, UHI))
! DEF_LARCH_FTYPE (3, (VOID, V16QI, VPOINTER, SI))
! DEF_LARCH_FTYPE (3, (VOID, V16QI, VPOINTER, DI))
! DEF_LARCH_FTYPE (3, (VOID, V32QI, VPOINTER, SI))
! DEF_LARCH_FTYPE (3, (VOID, V32QI, VPOINTER, DI))
  DEF_LARCH_FTYPE (3, (VOID, V4DF, POINTER, SI))
  DEF_LARCH_FTYPE (3, (VOID, V2DF, POINTER, SI))
  DEF_LARCH_FTYPE (2, (VOID, V2HI, V2HI))
  DEF_LARCH_FTYPE (2, (VOID, V4QI, V4QI))
  DEF_LARCH_FTYPE (3, (VOID, V4SF, POINTER, SI))
  DEF_LARCH_FTYPE (3, (VOID, V8SF, POINTER, SI))
  
  DEF_LARCH_FTYPE (1, (V16HI, V32QI))
  DEF_LARCH_FTYPE (1, (UV16HI, UV32QI))
*************** DEF_LARCH_FTYPE (2, (V4DI, UQI, USI))
*** 619,637 ****
  DEF_LARCH_FTYPE (2, (V2DI, UQI, USI))
  DEF_LARCH_FTYPE (2, (V4DI, UQI, UQI))
  DEF_LARCH_FTYPE (2, (V2DI, UQI, UQI))
- DEF_LARCH_FTYPE (4, (VOID, SI, UQI, V16QI, CVPOINTER))
- DEF_LARCH_FTYPE (4, (VOID, SI, UQI, V8HI, CVPOINTER))
- DEF_LARCH_FTYPE (4, (VOID, SI, UQI, V4SI, CVPOINTER))
- DEF_LARCH_FTYPE (4, (VOID, SI, UQI, V2DI, CVPOINTER))
  DEF_LARCH_FTYPE (2, (V16QI, SI, CVPOINTER))
  DEF_LARCH_FTYPE (2, (V8HI, SI, CVPOINTER))
  DEF_LARCH_FTYPE (2, (V4SI, SI, CVPOINTER))
  DEF_LARCH_FTYPE (2, (V2DI, SI, CVPOINTER))
- DEF_LARCH_FTYPE (4, (VOID, V32QI, UQI, SI,  CVPOINTER))
- DEF_LARCH_FTYPE (4, (VOID, V16HI, UQI, SI, CVPOINTER))
- DEF_LARCH_FTYPE (4, (VOID, V8SI, UQI, SI, CVPOINTER))
- DEF_LARCH_FTYPE (4, (VOID, V4DI, UQI, SI, CVPOINTER))
- DEF_LARCH_FTYPE (3, (VOID, V32QI, SI,  CVPOINTER))
  DEF_LARCH_FTYPE (2, (V32QI, SI, CVPOINTER))
  DEF_LARCH_FTYPE (2, (V16HI, SI, CVPOINTER))
  DEF_LARCH_FTYPE (2, (V8SI, SI, CVPOINTER))
--- 612,621 ----
*************** DEF_LARCH_FTYPE(3,(V4DI,V4DI,UV16HI,V16H
*** 694,703 ****
  DEF_LARCH_FTYPE(2,(UV8SI,UV32QI,UV32QI))
  DEF_LARCH_FTYPE(2,(V8SI,UV32QI,V32QI))
  
! DEF_LARCH_FTYPE(4,(VOID,V16QI,CVPOINTER,SI,UQI))
! DEF_LARCH_FTYPE(4,(VOID,V8HI,CVPOINTER,SI,UQI))
! DEF_LARCH_FTYPE(4,(VOID,V4SI,CVPOINTER,SI,UQI))
! DEF_LARCH_FTYPE(4,(VOID,V2DI,CVPOINTER,SI,UQI))
  
  DEF_LARCH_FTYPE (2, (DI, V16QI, UQI))
  DEF_LARCH_FTYPE (2, (DI, V8HI, UQI))
--- 678,687 ----
  DEF_LARCH_FTYPE(2,(UV8SI,UV32QI,UV32QI))
  DEF_LARCH_FTYPE(2,(V8SI,UV32QI,V32QI))
  
! DEF_LARCH_FTYPE(4,(VOID,V16QI,VPOINTER,SI,UQI))
! DEF_LARCH_FTYPE(4,(VOID,V8HI,VPOINTER,SI,UQI))
! DEF_LARCH_FTYPE(4,(VOID,V4SI,VPOINTER,SI,UQI))
! DEF_LARCH_FTYPE(4,(VOID,V2DI,VPOINTER,SI,UQI))
  
  DEF_LARCH_FTYPE (2, (DI, V16QI, UQI))
  DEF_LARCH_FTYPE (2, (DI, V8HI, UQI))
*************** DEF_LARCH_FTYPE (3, (UV16HI, UV16HI, V16
*** 719,728 ****
  DEF_LARCH_FTYPE (3, (UV8SI, UV8SI, V8SI, USI))
  DEF_LARCH_FTYPE (3, (UV4DI, UV4DI, V4DI, USI))
  
! DEF_LARCH_FTYPE(4,(VOID,V32QI,CVPOINTER,SI,UQI))
! DEF_LARCH_FTYPE(4,(VOID,V16HI,CVPOINTER,SI,UQI))
! DEF_LARCH_FTYPE(4,(VOID,V8SI,CVPOINTER,SI,UQI))
! DEF_LARCH_FTYPE(4,(VOID,V4DI,CVPOINTER,SI,UQI))
  
  DEF_LARCH_FTYPE (1, (BOOLEAN,V16QI))
  DEF_LARCH_FTYPE(2,(V16QI,CVPOINTER,CVPOINTER))
--- 703,712 ----
  DEF_LARCH_FTYPE (3, (UV8SI, UV8SI, V8SI, USI))
  DEF_LARCH_FTYPE (3, (UV4DI, UV4DI, V4DI, USI))
  
! DEF_LARCH_FTYPE(4,(VOID,V32QI,VPOINTER,SI,UQI))
! DEF_LARCH_FTYPE(4,(VOID,V16HI,VPOINTER,SI,UQI))
! DEF_LARCH_FTYPE(4,(VOID,V8SI,VPOINTER,SI,UQI))
! DEF_LARCH_FTYPE(4,(VOID,V4DI,VPOINTER,SI,UQI))
  
  DEF_LARCH_FTYPE (1, (BOOLEAN,V16QI))
  DEF_LARCH_FTYPE(2,(V16QI,CVPOINTER,CVPOINTER))
diff -Nrcpad gcc-16-20260125/gcc/config/loongarch/loongarch.cc gcc-16-20260201/gcc/config/loongarch/loongarch.cc
*** gcc-16-20260125/gcc/config/loongarch/loongarch.cc	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/config/loongarch/loongarch.cc	Sun Feb  1 22:32:07 2026
*************** loongarch_expand_vector_init_same (rtx t
*** 10436,10442 ****
  	}
      }
  
!   temp = force_reg (imode, same);
  
    switch (vmode)
      {
--- 10436,10451 ----
  	}
      }
  
!   if (GET_CODE (same) == MEM && GET_MODE (same) != imode)
!     {
!       rtx reg_tmp = gen_reg_rtx (GET_MODE (same));
!       loongarch_emit_move (reg_tmp, same);
!       temp = lowpart_subreg (imode, reg_tmp, GET_MODE (reg_tmp));
!     }
!   else
!     temp = same;
! 
!   temp = force_reg (imode, temp);
  
    switch (vmode)
      {
diff -Nrcpad gcc-16-20260125/gcc/config/loongarch/loongarch.md gcc-16-20260201/gcc/config/loongarch/loongarch.md
*** gcc-16-20260125/gcc/config/loongarch/loongarch.md	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/config/loongarch/loongarch.md	Sun Feb  1 22:32:07 2026
***************
*** 2540,2546 ****
  (define_expand "movsf"
    [(set (match_operand:SF 0 "")
  	(match_operand:SF 1 ""))]
!   "TARGET_HARD_FLOAT"
  {
    if (loongarch_legitimize_move (SFmode, operands[0], operands[1]))
      DONE;
--- 2540,2546 ----
  (define_expand "movsf"
    [(set (match_operand:SF 0 "")
  	(match_operand:SF 1 ""))]
!   ""
  {
    if (loongarch_legitimize_move (SFmode, operands[0], operands[1]))
      DONE;
diff -Nrcpad gcc-16-20260125/gcc/config/picolibc-spec.h gcc-16-20260201/gcc/config/picolibc-spec.h
*** gcc-16-20260125/gcc/config/picolibc-spec.h	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/config/picolibc-spec.h	Sun Feb  1 22:32:07 2026
***************
*** 39,45 ****
   * Define vfscanf if --scanf is set
   */
  #define LIBC_LINK_SPEC							\
!   " %{!shared:%{!r:%{!T*: %:if-exists-then-else(%:find-file(" PICOLIBC_LD ") -T" PICOLIBC_LD ")}}}" \
    " %{-printf=*:--defsym=" USER_LABEL_PREFIX "vfprintf=" USER_LABEL_PREFIX "__%*_vfprintf}" \
    " %{-scanf=*:--defsym=" USER_LABEL_PREFIX "vfscanf=" USER_LABEL_PREFIX "__%*_vfscanf}"
  
--- 39,45 ----
   * Define vfscanf if --scanf is set
   */
  #define LIBC_LINK_SPEC							\
!   " %{!shared:%{!r:%{!T*: %:if-exists-then-else(%:find-file(" PICOLIBC_LD ") -T%:find-file(" PICOLIBC_LD "))}}}" \
    " %{-printf=*:--defsym=" USER_LABEL_PREFIX "vfprintf=" USER_LABEL_PREFIX "__%*_vfprintf}" \
    " %{-scanf=*:--defsym=" USER_LABEL_PREFIX "vfscanf=" USER_LABEL_PREFIX "__%*_vfscanf}"
  
diff -Nrcpad gcc-16-20260125/gcc/config/riscv/riscv-string.cc gcc-16-20260201/gcc/config/riscv/riscv-string.cc
*** gcc-16-20260125/gcc/config/riscv/riscv-string.cc	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/config/riscv/riscv-string.cc	Sun Feb  1 22:32:07 2026
*************** expand_rawmemchr (machine_mode mode, rtx
*** 1402,1411 ****
  		   riscv_vector::UNARY_OP, vlops);
  
    /* Read how far we read.  */
!   if (Pmode == SImode)
!     emit_insn (gen_read_vlsi (cnt));
!   else
!     emit_insn (gen_read_vldi_zero_extend (cnt));
  
    /* Compare needle with haystack and store in a mask.  */
    rtx eq = gen_rtx_EQ (mask_mode, gen_const_vec_duplicate (vmode, needle), vec);
--- 1402,1408 ----
  		   riscv_vector::UNARY_OP, vlops);
  
    /* Read how far we read.  */
!   emit_insn (gen_read_vl (Pmode, cnt));
  
    /* Compare needle with haystack and store in a mask.  */
    rtx eq = gen_rtx_EQ (mask_mode, gen_const_vec_duplicate (vmode, needle), vec);
*************** expand_strcmp (rtx result, rtx src1, rtx
*** 1520,1529 ****
      }
  
    /* Read the vl for the next pointer bump.  */
!   if (Pmode == SImode)
!     emit_insn (gen_read_vlsi (cnt));
!   else
!     emit_insn (gen_read_vldi_zero_extend (cnt));
  
    if (with_length)
      {
--- 1517,1523 ----
      }
  
    /* Read the vl for the next pointer bump.  */
!   emit_insn (gen_read_vl (Pmode, cnt));
  
    if (with_length)
      {
diff -Nrcpad gcc-16-20260125/gcc/config/riscv/riscv-vector-builtins-bases.cc gcc-16-20260201/gcc/config/riscv/riscv-vector-builtins-bases.cc
*** gcc-16-20260125/gcc/config/riscv/riscv-vector-builtins-bases.cc	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/config/riscv/riscv-vector-builtins-bases.cc	Sun Feb  1 22:32:07 2026
*************** public:
*** 1926,1935 ****
  
    rtx expand (function_expander &e) const override
    {
!     if (Pmode == SImode)
!       emit_insn (gen_read_vlsi (e.target));
!     else
!       emit_insn (gen_read_vldi_zero_extend (e.target));
      return e.target;
    }
  };
--- 1926,1932 ----
  
    rtx expand (function_expander &e) const override
    {
!     emit_insn (gen_read_vl (Pmode, e.target));
      return e.target;
    }
  };
diff -Nrcpad gcc-16-20260125/gcc/config/riscv/riscv-vector-builtins.cc gcc-16-20260201/gcc/config/riscv/riscv-vector-builtins.cc
*** gcc-16-20260125/gcc/config/riscv/riscv-vector-builtins.cc	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/config/riscv/riscv-vector-builtins.cc	Sun Feb  1 22:32:07 2026
*************** function_expander::use_fof_load_insn ()
*** 4912,4935 ****
    tree arg = CALL_EXPR_ARG (exp, vl_dest_arg);
  
    /* Use a regular FoF load if the user does not want to store VL.  */
!   insn_code icode = code_for_pred_fault_load (mode);
!   rtx result = generate_insn (icode);
! 
!   /* If user wants VL stored, emit a read_vl and store to memory.  */
!   if (!integer_zerop (arg))
      {
!       rtx vl_reg = gen_reg_rtx (Pmode);
!       if (Pmode == SImode)
! 	emit_insn (gen_read_vlsi (vl_reg));
!       else
! 	emit_insn (gen_read_vldi_zero_extend (vl_reg));
! 
!       rtx addr = expand_normal (arg);
!       rtx mem = gen_rtx_MEM (Pmode, memory_address (Pmode, addr));
!       emit_move_insn (mem, vl_reg);
      }
  
!   return result;
  }
  
  /* Use contiguous store INSN.  */
--- 4912,4935 ----
    tree arg = CALL_EXPR_ARG (exp, vl_dest_arg);
  
    /* Use a regular FoF load if the user does not want to store VL.  */
!   if (integer_zerop (arg))
      {
!       insn_code icode = code_for_pred_fault_load (mode);
!       return generate_insn (icode);
      }
  
!   /* The VL-setting FoF load writes the new VL to VL_REG.
!      Store it to memory.  */
!   rtx vl_reg = gen_reg_rtx (Pmode);
!   add_output_operand (Pmode, vl_reg);
!   insn_code icode = code_for_pred_fault_load_set_vl (mode, Pmode);
!   rtx res = generate_insn (icode);
! 
!   rtx addr = expand_normal (arg);
!   rtx mem = gen_rtx_MEM (Pmode, memory_address (Pmode, addr));
!   emit_move_insn (mem, vl_reg);
! 
!   return res;
  }
  
  /* Use contiguous store INSN.  */
diff -Nrcpad gcc-16-20260125/gcc/config/riscv/riscv-vsetvl.cc gcc-16-20260201/gcc/config/riscv/riscv-vsetvl.cc
*** gcc-16-20260125/gcc/config/riscv/riscv-vsetvl.cc	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/config/riscv/riscv-vsetvl.cc	Sun Feb  1 22:32:07 2026
*************** fault_first_load_p (rtx_insn *rinsn)
*** 291,296 ****
--- 291,377 ----
  	     || get_attr_type (rinsn) == TYPE_VLSEGDFF);
  }
  
+ /* Return the VL output register from a fault-only-first load with VL
+    output (pred_fault_load_set_vl pattern) if RINSN is such an insn
+    or NULL_RTX otherwise.
+    The pattern has: (set vl_output (unspec:P [(reg:SI VL_REGNUM)]
+ 					     UNSPEC_READ_VL))  */
+ static rtx
+ get_fof_set_vl_reg (rtx_insn *rinsn)
+ {
+   if (!fault_first_load_p (rinsn))
+     return NULL_RTX;
+ 
+   rtx pat = PATTERN (rinsn);
+   if (GET_CODE (pat) != PARALLEL)
+     return NULL_RTX;
+ 
+   if (XVECLEN (pat, 0) != 3)
+     return NULL_RTX;
+ 
+   rtx sub = XVECEXP (pat, 0, 2);
+   if (GET_CODE (sub) == SET
+       && GET_CODE (SET_SRC (sub)) == UNSPEC
+       && XINT (SET_SRC (sub), 1) == UNSPEC_READ_VL)
+     return SET_DEST (sub);
+ 
+   return NULL_RTX;
+ }
+ 
+ /* Initialize RTL SSA and related infrastructure for vsetvl analysis.  */
+ static void
+ init_rtl_ssa ()
+ {
+   calculate_dominance_info (CDI_DOMINATORS);
+   loop_optimizer_init (AVOID_CFG_MODIFICATIONS);
+   connect_infinite_loops_to_exit ();
+   df_analyze ();
+   crtl->ssa = new function_info (cfun);
+ }
+ 
+ /* Finalize RTL SSA and cleanup.  */
+ static void
+ finish_rtl_ssa ()
+ {
+   free_dominance_info (CDI_DOMINATORS);
+   loop_optimizer_finalize ();
+   if (crtl->ssa->perform_pending_updates ())
+     cleanup_cfg (0);
+   delete crtl->ssa;
+   crtl->ssa = nullptr;
+ }
+ 
+ /* Emit read_vl instructions after fault-only-first loads that have
+    a VL output register.
+    This needs to happen last, i.e. when we made the VL dataflow
+    explicit by inserting vsetvls.  */
+ 
+ static void
+ emit_fof_read_vls ()
+ {
+   basic_block bb;
+   rtx_insn *rinsn;
+ 
+   FOR_EACH_BB_FN (bb, cfun)
+     FOR_BB_INSNS (bb, rinsn)
+       {
+ 	if (!NONDEBUG_INSN_P (rinsn))
+ 	  continue;
+ 
+ 	rtx vl_dest = get_fof_set_vl_reg (rinsn);
+ 	if (!vl_dest)
+ 	  continue;
+ 
+ 	if (dump_file)
+ 	  fprintf (dump_file,
+ 		   "  Inserting read_vl after FoF insn %d into r%d\n",
+ 		   INSN_UID (rinsn), REGNO (vl_dest));
+ 
+ 	rtx read_vl_pat = gen_read_vl (Pmode, vl_dest);
+ 	emit_insn_after (read_vl_pat, rinsn);
+       }
+ }
+ 
  /* Return true if the instruction is read vl instruction.  */
  static bool
  read_vl_insn_p (rtx_insn *rinsn)
*************** public:
*** 1186,1191 ****
--- 1267,1279 ----
  		break;
  	      }
  	  }
+ 	/* If no csrr found but this is a _set_vl style fault-only-first
+ 	   load, use the insn itself as the VL source.
+ 	   If we have two identical vector configs that just differ in
+ 	   AVL and the AVL is just "modified" by a read_vl we
+ 	   can consider them equal and elide the second one.  */
+ 	if (!m_read_vl_insn && get_fof_set_vl_reg (insn->rtl ()))
+ 	  m_read_vl_insn = insn;
        }
    }
  
*************** public:
*** 2420,2432 ****
        m_avin (nullptr), m_avout (nullptr), m_kill (nullptr), m_antloc (nullptr),
        m_transp (nullptr), m_insert (nullptr), m_del (nullptr), m_edges (nullptr)
    {
!     /* Initialization of RTL_SSA.  */
!     calculate_dominance_info (CDI_DOMINATORS);
!     loop_optimizer_init (AVOID_CFG_MODIFICATIONS);
!     /* Create FAKE edges for infinite loops.  */
!     connect_infinite_loops_to_exit ();
!     df_analyze ();
!     crtl->ssa = new function_info (cfun);
      m_vector_block_infos.safe_grow_cleared (last_basic_block_for_fn (cfun));
      compute_probabilities ();
      m_unknown_info.set_unknown ();
--- 2508,2514 ----
        m_avin (nullptr), m_avout (nullptr), m_kill (nullptr), m_antloc (nullptr),
        m_transp (nullptr), m_insert (nullptr), m_del (nullptr), m_edges (nullptr)
    {
!     init_rtl_ssa ();
      m_vector_block_infos.safe_grow_cleared (last_basic_block_for_fn (cfun));
      compute_probabilities ();
      m_unknown_info.set_unknown ();
*************** public:
*** 2434,2445 ****
  
    void finish ()
    {
!     free_dominance_info (CDI_DOMINATORS);
!     loop_optimizer_finalize ();
!     if (crtl->ssa->perform_pending_updates ())
!       cleanup_cfg (0);
!     delete crtl->ssa;
!     crtl->ssa = nullptr;
  
      if (m_reg_def_loc)
        sbitmap_vector_free (m_reg_def_loc);
--- 2516,2522 ----
  
    void finish ()
    {
!     finish_rtl_ssa ();
  
      if (m_reg_def_loc)
        sbitmap_vector_free (m_reg_def_loc);
*************** pass_vsetvl::simple_vsetvl ()
*** 3608,3613 ****
--- 3685,3695 ----
  	    }
  	}
      }
+ 
+   if (dump_file)
+     fprintf (dump_file, "\nEmit missing read_vl()s for fault-only-first "
+ 	     "loads\n");
+   emit_fof_read_vls ();
  }
  
  /* Lazy vsetvl insertion for optimize > 0. */
*************** pass_vsetvl::lazy_vsetvl ()
*** 3656,3661 ****
--- 3738,3750 ----
  	     "\nPhase 4: Insert, modify and remove vsetvl insns.\n\n");
    pre.emit_vsetvl ();
  
+   /* Phase 4b: Emit read_vl for fault-only-first loads with VL output
+      register.  */
+   if (dump_file)
+     fprintf (dump_file, "\nPhase 4b: Emit missing read_vl()s for "
+ 	     "fault-only-first loads\n");
+   emit_fof_read_vls ();
+ 
    /* Phase 5: Cleanup */
    if (dump_file)
      fprintf (dump_file, "\nPhase 5: Cleanup\n\n");
diff -Nrcpad gcc-16-20260125/gcc/config/riscv/riscv.cc gcc-16-20260201/gcc/config/riscv/riscv.cc
*** gcc-16-20260125/gcc/config/riscv/riscv.cc	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/config/riscv/riscv.cc	Sun Feb  1 22:32:07 2026
*************** riscv_pass_fpr_pair (machine_mode mode,
*** 6448,6453 ****
--- 6448,6464 ----
  				   GEN_INT (offset2))));
  }
  
+ /* Return true if VLS mode MODE fits in general purpose registers per the
+    psABI.  The psABI allows aggregates up to 2 * XLEN bits to be passed in
+    GPRs.  */
+ 
+ static bool
+ riscv_vls_mode_fits_in_gprs_p (machine_mode mode)
+ {
+   return riscv_vls_mode_p (mode)
+ 	 && known_le (GET_MODE_SIZE (mode), 2 * UNITS_PER_WORD);
+ }
+ 
  static rtx
  riscv_pass_vls_aggregate_in_gpr (struct riscv_arg_info *info, machine_mode mode,
  				 unsigned gpr_base)
*************** riscv_pass_vls_aggregate_in_gpr (struct
*** 6460,6475 ****
    unsigned vls_size = GET_MODE_SIZE (mode).to_constant ();
    unsigned gpr_size =  GET_MODE_SIZE (Xmode);
  
!   if (IN_RANGE (vls_size, 0, gpr_size * 2))
      {
        count = riscv_v_vls_mode_aggregate_gpr_count (vls_size, gpr_size);
  
!       if (count + info->gpr_offset <= MAX_ARGS_IN_REGISTERS)
  	{
  	  regnum = gpr_base + info->gpr_offset;
  	  info->num_gprs = count;
  	  gpr_mode = riscv_v_vls_to_gpr_mode (vls_size);
  	}
      }
  
    if (!regnum)
--- 6471,6499 ----
    unsigned vls_size = GET_MODE_SIZE (mode).to_constant ();
    unsigned gpr_size =  GET_MODE_SIZE (Xmode);
  
!   if (riscv_vls_mode_fits_in_gprs_p (mode))
      {
        count = riscv_v_vls_mode_aggregate_gpr_count (vls_size, gpr_size);
+       unsigned gprs_left = MAX_ARGS_IN_REGISTERS - info->gpr_offset;
  
!       if (count <= gprs_left)
  	{
+ 	  /* Entire VLS fits in remaining GPRs.  */
  	  regnum = gpr_base + info->gpr_offset;
  	  info->num_gprs = count;
  	  gpr_mode = riscv_v_vls_to_gpr_mode (vls_size);
  	}
+       else if (gprs_left > 0)
+ 	{
+ 	  /* Per the psABI, split between GPRs and stack:
+ 	     "if only one register is available, the first XLEN bits are
+ 	     passed in a register and the remaining bits are passed on
+ 	     the stack."  */
+ 	  regnum = gpr_base + info->gpr_offset;
+ 	  info->num_gprs = gprs_left;
+ 	  info->stack_p = true;
+ 	  gpr_mode = Xmode;
+ 	}
      }
  
    if (!regnum)
*************** riscv_pass_aggregate_in_vr (struct riscv
*** 6816,6826 ****
  
  /* Fill INFO with information about a single argument, and return an RTL
     pattern to pass or return the argument. Return NULL_RTX if argument cannot
!    pass or return in registers, then the argument may be passed by reference or
!    through the stack or  .  CUM is the cumulative state for earlier arguments.
!    MODE is the mode of this argument and TYPE is its type (if known). NAMED is
!    true if this is a named (fixed) argument rather than a variable one. RETURN_P
!    is true if returning the argument, or false if passing the argument.  */
  
  static rtx
  riscv_get_arg_info (struct riscv_arg_info *info, const CUMULATIVE_ARGS *cum,
--- 6840,6851 ----
  
  /* Fill INFO with information about a single argument, and return an RTL
     pattern to pass or return the argument. Return NULL_RTX if argument cannot
!    pass or return in registers, then the argument may be passed by reference
!    or through the stack.  CUM is the cumulative state for earlier arguments.
!    MODE is the mode of this argument and TYPE is its type (if known).
!    NAMED is true if this is a named (fixed) argument rather than a variable
!    one.  RETURN_P is true if returning the argument, or false if passing
!    the argument.  */
  
  static rtx
  riscv_get_arg_info (struct riscv_arg_info *info, const CUMULATIVE_ARGS *cum,
*************** riscv_get_arg_info (struct riscv_arg_inf
*** 6836,6843 ****
    info->gpr_offset = cum->num_gprs;
    info->fpr_offset = cum->num_fprs;
  
!   /* Passed by reference when the scalable vector argument is anonymous.  */
!   if (riscv_vector_mode_p (mode) && !named)
      return NULL_RTX;
  
    if (named)
--- 6861,6870 ----
    info->gpr_offset = cum->num_gprs;
    info->fpr_offset = cum->num_fprs;
  
!   /* Passed by reference when the scalable vector argument is anonymous.
!      VLS modes <= 2*XLEN follow regular aggregate rules per the psABI.  */
!   if (riscv_vector_mode_p (mode) && !named
!       && !riscv_vls_mode_fits_in_gprs_p (mode))
      return NULL_RTX;
  
    if (named)
*************** riscv_get_arg_info (struct riscv_arg_inf
*** 6929,6941 ****
    if (!named && num_bytes != 0 && alignment > BITS_PER_WORD)
      info->gpr_offset += info->gpr_offset & 1;
  
!   /* Partition the argument between registers and stack.  */
!   info->num_fprs = 0;
!   info->num_gprs = MIN (num_words, MAX_ARGS_IN_REGISTERS - info->gpr_offset);
!   info->stack_p = (num_words - info->num_gprs) != 0;
  
!   if (info->num_gprs || return_p)
!     return gen_rtx_REG (mode, gpr_base + info->gpr_offset);
  
    return NULL_RTX;
  }
--- 6956,6974 ----
    if (!named && num_bytes != 0 && alignment > BITS_PER_WORD)
      info->gpr_offset += info->gpr_offset & 1;
  
!   if (riscv_vls_mode_p (mode))
!     return riscv_pass_vls_aggregate_in_gpr (info, mode, gpr_base);
!   else
!     {
!       /* Partition the argument between registers and stack.  */
!       info->num_fprs = 0;
!       info->num_gprs
! 	= MIN (num_words, MAX_ARGS_IN_REGISTERS - info->gpr_offset);
!       info->stack_p = (num_words - info->num_gprs) != 0;
  
!       if (info->num_gprs || return_p)
! 	return gen_rtx_REG (mode, gpr_base + info->gpr_offset);
!     }
  
    return NULL_RTX;
  }
*************** riscv_pass_by_reference (cumulative_args
*** 7065,7083 ****
        if (info.num_fprs)
  	return false;
  
-       /* Don't pass by reference if we can use general register(s) for vls.  */
-       if (info.num_gprs && riscv_vls_mode_p (arg.mode))
- 	return false;
- 
        /* Don't pass by reference if we can use vector register groups.  */
        if (info.num_vrs > 0 || info.num_mrs > 0)
  	return false;
      }
  
    /* Passed by reference when:
!      1. The scalable vector argument is anonymous.
!      2. Args cannot be passed through vector registers.  */
!   if (riscv_vector_mode_p (arg.mode))
      return true;
  
    /* Pass by reference if the data do not fit in two integer registers.  */
--- 7098,7114 ----
        if (info.num_fprs)
  	return false;
  
        /* Don't pass by reference if we can use vector register groups.  */
        if (info.num_vrs > 0 || info.num_mrs > 0)
  	return false;
      }
  
    /* Passed by reference when:
!       (1) The scalable vector argument is anonymous.
!       (2) Args cannot be passed through vector registers.
!      VLS modes <= 2*XLEN follow regular aggregate rules per the psABI.  */
!   if (riscv_vector_mode_p (arg.mode)
!       && !riscv_vls_mode_fits_in_gprs_p (arg.mode))
      return true;
  
    /* Pass by reference if the data do not fit in two integer registers.  */
diff -Nrcpad gcc-16-20260125/gcc/config/riscv/vector-iterators.md gcc-16-20260201/gcc/config/riscv/vector-iterators.md
*** gcc-16-20260125/gcc/config/riscv/vector-iterators.md	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/config/riscv/vector-iterators.md	Sun Feb  1 22:32:07 2026
***************
*** 79,84 ****
--- 79,85 ----
    UNSPEC_VCOMPRESS
    UNSPEC_VLEFF
    UNSPEC_MODIFY_VL
+   UNSPEC_READ_VL
  
    UNSPEC_VFFMA
  
diff -Nrcpad gcc-16-20260125/gcc/config/riscv/vector.md gcc-16-20260201/gcc/config/riscv/vector.md
*** gcc-16-20260125/gcc/config/riscv/vector.md	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/config/riscv/vector.md	Sun Feb  1 22:32:07 2026
***************
*** 8537,8557 ****
  ;; - 7.7. Unit-stride Fault-Only-First Loads
  ;; -------------------------------------------------------------------------------
  
! (define_insn "read_vlsi"
!   [(set (match_operand:SI 0 "register_operand" "=r")
! 	(reg:SI VL_REGNUM))]
    "TARGET_VECTOR"
    "csrr\t%0,vl"
    [(set_attr "type" "rdvl")
!    (set_attr "mode" "SI")])
! 
! (define_insn "read_vldi_zero_extend"
!   [(set (match_operand:DI 0 "register_operand" "=r")
! 	(zero_extend:DI (reg:SI VL_REGNUM)))]
!   "TARGET_VECTOR && TARGET_64BIT"
!   "csrr\t%0,vl"
!   [(set_attr "type" "rdvl")
!    (set_attr "mode" "DI")])
  
  (define_insn "@pred_fault_load<mode>"
    [(set (match_operand:V_VLS 0 "register_operand"              "=vd,    vd,    vr,    vr")
--- 8537,8549 ----
  ;; - 7.7. Unit-stride Fault-Only-First Loads
  ;; -------------------------------------------------------------------------------
  
! (define_insn "@read_vl<mode>"
!   [(set (match_operand:P 0 "register_operand" "=r")
! 	(unspec:P [(reg:SI VL_REGNUM)] UNSPEC_READ_VL))]
    "TARGET_VECTOR"
    "csrr\t%0,vl"
    [(set_attr "type" "rdvl")
!    (set_attr "mode" "<MODE>")])
  
  (define_insn "@pred_fault_load<mode>"
    [(set (match_operand:V_VLS 0 "register_operand"              "=vd,    vd,    vr,    vr")
***************
*** 8581,8586 ****
--- 8573,8608 ----
    [(set_attr "type" "vldff")
     (set_attr "mode" "<MODE>")])
  
+ (define_insn "@pred_fault_load_set_vl<V_VLS:mode><P:mode>"
+   [(set (match_operand:V_VLS 0 "register_operand"	       "=  vd,    vd,    vr,    vr")
+ 	(if_then_else:V_VLS
+ 	  (unspec:<V_VLS:VM>
+ 	    [(match_operand:<V_VLS:VM> 1 "vector_mask_operand" "   vm,    vm,   Wc1,   Wc1")
+ 	     (match_operand 4 "vector_length_operand"          "  rvl,   rvl,   rvl,   rvl")
+ 	     (match_operand 5 "const_int_operand"              "    i,     i,     i,     i")
+ 	     (match_operand 6 "const_int_operand"              "    i,     i,     i,     i")
+ 	     (match_operand 7 "const_int_operand"              "    i,     i,     i,     i")
+ 	     (reg:SI VL_REGNUM)
+ 	     (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
+ 	  (unspec:V_VLS
+ 	    [(match_operand:V_VLS 3 "memory_operand"           "    m,     m,     m,     m")] UNSPEC_VLEFF)
+ 	  (match_operand:V_VLS 2 "vector_merge_operand"        "   vu,     0,    vu,     0")))
+    (set (reg:SI VL_REGNUM)
+ 	  (unspec:SI
+ 	    [(if_then_else:V_VLS
+ 	       (unspec:<V_VLS:VM>
+ 		[(match_dup 1) (match_dup 4) (match_dup 5)
+ 		 (match_dup 6) (match_dup 7)
+ 		 (reg:SI VL_REGNUM) (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
+ 	       (unspec:V_VLS [(match_dup 3)] UNSPEC_VLEFF)
+ 	       (match_dup 2))] UNSPEC_MODIFY_VL))
+    (set (match_operand:P 8 "register_operand"		       "=   r,     r,     r,     r")
+ 	(unspec:P [(reg:SI VL_REGNUM)] UNSPEC_READ_VL))]
+   "TARGET_VECTOR"
+   "vle<sew>ff.v\t%0,%3%p1"
+   [(set_attr "type" "vldff")
+    (set_attr "mode" "<V_VLS:MODE>")])
+ 
  
  ;; -------------------------------------------------------------------------------
  ;; ---- Predicated Segment loads/stores
***************
*** 8698,8703 ****
--- 8720,8758 ----
    [(set_attr "type" "vlsegdff")
     (set_attr "mode" "<MODE>")])
  
+ (define_insn "@pred_fault_load_set_vl<VT:mode><P:mode>"
+   [(set (match_operand:VT 0 "register_operand"              "=  vr,    vr,    vd")
+ 	(if_then_else:VT
+ 	  (unspec:<VT:VM>
+ 	    [(match_operand:<VT:VM> 1 "vector_mask_operand" "vmWc1,   Wc1,    vm")
+ 	     (match_operand 4 "vector_length_operand"       "  rvl,   rvl,   rvl")
+ 	     (match_operand 5 "const_int_operand"           "    i,     i,     i")
+ 	     (match_operand 6 "const_int_operand"           "    i,     i,     i")
+ 	     (match_operand 7 "const_int_operand"           "    i,     i,     i")
+ 	     (reg:SI VL_REGNUM)
+ 	     (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
+ 	  (unspec:VT
+ 	    [(match_operand:VT 3 "memory_operand"	    "    m,     m,     m")
+ 	     (mem:BLK (scratch))] UNSPEC_VLEFF)
+ 	  (match_operand:VT 2 "vector_merge_operand"        "    0,    vu,    vu")))
+    (set (reg:SI VL_REGNUM)
+         (unspec:SI
+           [(if_then_else:VT
+ 	     (unspec:<VT:VM>
+ 	       [(match_dup 1) (match_dup 4) (match_dup 5)
+ 	        (match_dup 6) (match_dup 7)
+ 	        (reg:SI VL_REGNUM)
+ 	        (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
+ 	     (unspec:VT
+ 	        [(match_dup 3) (mem:BLK (scratch))] UNSPEC_VLEFF)
+ 	     (match_dup 2))] UNSPEC_MODIFY_VL))
+    (set (match_operand:P 8 "register_operand"		    "=   r,     r,     r")
+ 	(unspec:P [(reg:SI VL_REGNUM)] UNSPEC_READ_VL))]
+   "TARGET_VECTOR"
+   "vlseg<nf>e<sew>ff.v\t%0,%3%p1"
+   [(set_attr "type" "vlsegdff")
+    (set_attr "mode" "<VT:MODE>")])
+ 
  (define_insn "@pred_indexed_<order>load<V1T:mode><RATIO64I:mode>"
    [(set (match_operand:V1T 0 "register_operand"           "=&vr,  &vr")
  	(if_then_else:V1T
diff -Nrcpad gcc-16-20260125/gcc/configure gcc-16-20260201/gcc/configure
*** gcc-16-20260125/gcc/configure	Sun Jan 25 22:32:21 2026
--- gcc-16-20260201/gcc/configure	Sun Feb  1 22:32:20 2026
*************** cat >>confdefs.h <<_ACEOF
*** 13097,13102 ****
--- 13097,13117 ----
  _ACEOF
  
  
+ case "$target:$gnu_ld" in
+   *-*-solaris2*:no)
+     # While Solaris ld has -m32/-m64 it usually determines the ELF class
+     # from the input objects.
+     ;;
+   i?86-*-solaris2*:yes | x86_64-*-solaris2*:yes)
+     ld_32_opt=-melf_i386_sol2
+     ld_64_opt=-melf_x86_64_sol2
+     ;;
+   i?86-*-*:yes | x86_64-*-*:yes)
+     ld_32_opt=-melf_i386
+     ld_64_opt=-melf_x86_64
+     ;;
+ esac
+ 
  count=a
  for f in $host_xm_file; do
  	count=${count}x
*************** else
*** 21939,21945 ****
    lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
    lt_status=$lt_dlunknown
    cat > conftest.$ac_ext <<_LT_EOF
! #line 21942 "configure"
  #include "confdefs.h"
  
  #if HAVE_DLFCN_H
--- 21954,21960 ----
    lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
    lt_status=$lt_dlunknown
    cat > conftest.$ac_ext <<_LT_EOF
! #line 21957 "configure"
  #include "confdefs.h"
  
  #if HAVE_DLFCN_H
*************** else
*** 22045,22051 ****
    lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
    lt_status=$lt_dlunknown
    cat > conftest.$ac_ext <<_LT_EOF
! #line 22048 "configure"
  #include "confdefs.h"
  
  #if HAVE_DLFCN_H
--- 22060,22066 ----
    lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
    lt_status=$lt_dlunknown
    cat > conftest.$ac_ext <<_LT_EOF
! #line 22063 "configure"
  #include "confdefs.h"
  
  #if HAVE_DLFCN_H
*************** case "$ORIGINAL_AS_FOR_TARGET" in
*** 25470,25475 ****
--- 25485,25494 ----
   ;;
  esac
  
+ if $gcc_cv_as --help 2>&1 | grep -- --fatal-warnings > /dev/null; then
+   fw_as_opt=--fatal-warnings
+ fi
+ 
  default_ld=
  # Check whether --enable-ld was given.
  if test "${enable_ld+set}" = set; then :
*************** $as_echo_n "checking assembler flags...
*** 26092,26114 ****
  if ${gcc_cv_as_flags+:} false; then :
    $as_echo_n "(cached) " >&6
  else
!    case "$target" in
!   i[34567]86-*-linux*)
!         gcc_cv_as_flags=--32
!     ;;
!   x86_64-*-linux-gnux32)
!         gcc_cv_as_flags=--x32
      ;;
!   x86_64-*-linux*)
!         gcc_cv_as_flags=--64
      ;;
!   powerpc*-*-darwin*)
          gcc_cv_as_flags="-arch ppc"
      ;;
!   amdgcn*)
              gcc_cv_as_flags="--filetype=obj -triple=amdgcn--amdhsa"
      ;;
!   *)
      gcc_cv_as_flags=" "
      ;;
    esac
--- 26111,26151 ----
  if ${gcc_cv_as_flags+:} false; then :
    $as_echo_n "(cached) " >&6
  else
!    case "$target:$gas_flag" in
!   *-*-solaris2*:no)
!         case "$target" in
!       i?86-*-* | sparc-*-*)
! 	gcc_cv_as_flags=-m32
! 	;;
!       x86_64-*-* | sparcv9-*-* | sparc64-*-*)
! 	gcc_cv_as_flags=-m64
! 	;;
!     esac
!     as_32_opt=-m32
!     as_64_opt=-m64
      ;;
!   i?86-*-*:* | x86_64-*-*:* )
!         case "$target" in
!       i?86-*-*)
! 	gcc_cv_as_flags=--32
! 	;;
!       x86_64-*-linux-gnux32*)
! 	gcc_cv_as_flags=--x32
! 	;;
!       x86_64-*-linux*)
! 	gcc_cv_as_flags=--64
! 	;;
!     esac
!     as_32_opt=--32
!     as_64_opt=--64
      ;;
!   powerpc*-*-darwin*:*)
          gcc_cv_as_flags="-arch ppc"
      ;;
!   amdgcn*:*)
              gcc_cv_as_flags="--filetype=obj -triple=amdgcn--amdhsa"
      ;;
!   *:*)
      gcc_cv_as_flags=" "
      ;;
    esac
*************** else
*** 27091,27103 ****
        # No objdump, err on the side of caution.
        gcc_cv_as_cfi_directive=no
      else
-       if test x$gas = xyes; then
- 	as_32_opt="--32"
- 	as_64_opt="--64"
-       else
- 	as_32_opt="-m32"
- 	as_64_opt="-m64"
-       fi
        case "$target" in
  	sparc*-*-solaris2.*)
  	  # On Solaris/SPARC, .eh_frame sections should always be read-write.
--- 27128,27133 ----
*************** else
*** 27392,27398 ****
    if test x"$gcc_cv_as" != x; then
      $as_echo '.section foo1,"e"
    .byte 0,0,0,0' > conftest.s
!     if { ac_try='$gcc_cv_as $gcc_cv_as_flags --fatal-warnings -o conftest.o conftest.s >&5'
    { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
    (eval $ac_try) 2>&5
    ac_status=$?
--- 27422,27428 ----
    if test x"$gcc_cv_as" != x; then
      $as_echo '.section foo1,"e"
    .byte 0,0,0,0' > conftest.s
!     if { ac_try='$gcc_cv_as $gcc_cv_as_flags $fw_as_opt -o conftest.o conftest.s >&5'
    { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
    (eval $ac_try) 2>&5
    ac_status=$?
*************** else
*** 27479,27485 ****
    if test x"$gcc_cv_as" != x; then
      $as_echo '.section .foo,"awR",%progbits
  .byte 0' > conftest.s
!     if { ac_try='$gcc_cv_as $gcc_cv_as_flags --fatal-warnings -o conftest.o conftest.s >&5'
    { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
    (eval $ac_try) 2>&5
    ac_status=$?
--- 27509,27515 ----
    if test x"$gcc_cv_as" != x; then
      $as_echo '.section .foo,"awR",%progbits
  .byte 0' > conftest.s
!     if { ac_try='$gcc_cv_as $gcc_cv_as_flags $fw_as_opt -o conftest.o conftest.s >&5'
    { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
    (eval $ac_try) 2>&5
    ac_status=$?
*************** else
*** 27527,27533 ****
  .byte 0
  .section __patchable_function_entries,"awo",%progbits,.foo
  .byte 0' > conftest.s
!     if { ac_try='$gcc_cv_as $gcc_cv_as_flags --fatal-warnings -o conftest.o conftest.s >&5'
    { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
    (eval $ac_try) 2>&5
    ac_status=$?
--- 27557,27563 ----
  .byte 0
  .section __patchable_function_entries,"awo",%progbits,.foo
  .byte 0' > conftest.s
!     if { ac_try='$gcc_cv_as $gcc_cv_as_flags $fw_as_opt -o conftest.o conftest.s >&5'
    { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
    (eval $ac_try) 2>&5
    ac_status=$?
*************** else
*** 27562,27568 ****
    gcc_cv_as_shf_merge=no
    if test x"$gcc_cv_as" != x; then
      $as_echo '.section .rodata.str, "aMS", @progbits, 1' > conftest.s
!     if { ac_try='$gcc_cv_as $gcc_cv_as_flags --fatal-warnings -o conftest.o conftest.s >&5'
    { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
    (eval $ac_try) 2>&5
    ac_status=$?
--- 27592,27598 ----
    gcc_cv_as_shf_merge=no
    if test x"$gcc_cv_as" != x; then
      $as_echo '.section .rodata.str, "aMS", @progbits, 1' > conftest.s
!     if { ac_try='$gcc_cv_as $gcc_cv_as_flags $fw_as_opt -o conftest.o conftest.s >&5'
    { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
    (eval $ac_try) 2>&5
    ac_status=$?
*************** else
*** 27590,27596 ****
    gcc_cv_as_shf_merge_percent=no
    if test x"$gcc_cv_as" != x; then
      $as_echo '.section .rodata.str, "aMS", %progbits, 1' > conftest.s
!     if { ac_try='$gcc_cv_as $gcc_cv_as_flags --fatal-warnings -o conftest.o conftest.s >&5'
    { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
    (eval $ac_try) 2>&5
    ac_status=$?
--- 27620,27626 ----
    gcc_cv_as_shf_merge_percent=no
    if test x"$gcc_cv_as" != x; then
      $as_echo '.section .rodata.str, "aMS", %progbits, 1' > conftest.s
!     if { ac_try='$gcc_cv_as $gcc_cv_as_flags $fw_as_opt -o conftest.o conftest.s >&5'
    { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
    (eval $ac_try) 2>&5
    ac_status=$?
*************** else
*** 27625,27631 ****
    gcc_cv_as_comdat_group=no
    if test x"$gcc_cv_as" != x; then
      $as_echo '.section .text,"axG",@progbits,.foo,comdat' > conftest.s
!     if { ac_try='$gcc_cv_as $gcc_cv_as_flags --fatal-warnings -o conftest.o conftest.s >&5'
    { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
    (eval $ac_try) 2>&5
    ac_status=$?
--- 27655,27661 ----
    gcc_cv_as_comdat_group=no
    if test x"$gcc_cv_as" != x; then
      $as_echo '.section .text,"axG",@progbits,.foo,comdat' > conftest.s
!     if { ac_try='$gcc_cv_as $gcc_cv_as_flags $fw_as_opt -o conftest.o conftest.s >&5'
    { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
    (eval $ac_try) 2>&5
    ac_status=$?
*************** else
*** 27656,27662 ****
    gcc_cv_as_comdat_group_percent=no
    if test x"$gcc_cv_as" != x; then
      $as_echo '.section .text,"axG",%progbits,.foo,comdat' > conftest.s
!     if { ac_try='$gcc_cv_as $gcc_cv_as_flags --fatal-warnings -o conftest.o conftest.s >&5'
    { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
    (eval $ac_try) 2>&5
    ac_status=$?
--- 27686,27692 ----
    gcc_cv_as_comdat_group_percent=no
    if test x"$gcc_cv_as" != x; then
      $as_echo '.section .text,"axG",%progbits,.foo,comdat' > conftest.s
!     if { ac_try='$gcc_cv_as $gcc_cv_as_flags $fw_as_opt -o conftest.o conftest.s >&5'
    { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
    (eval $ac_try) 2>&5
    ac_status=$?
*************** foo:	.long	25
*** 27891,27897 ****
  	ldah	$2,foo($29)			!tprelhi
  	lda	$3,foo($2)			!tprello
  	lda	$4,foo($29)			!tprel'
- 	tls_as_opt=--fatal-warnings
  	;;
    arc*-*-*)
      conftest_s='
--- 27921,27926 ----
*************** x:      .long   25
*** 27904,27910 ****
          .text
  	move.d x:IE,$r10
  	nop'
- 	tls_as_opt=--fatal-warnings
  	;;
    frv*-*-*)
      conftest_s='
--- 27933,27938 ----
*************** foo:	.long	25
*** 27938,27944 ****
  	mfctl %cr27,%t1
  	addil LR%foo-$tls_leoff$,%t1
  	ldo RR%foo-$tls_leoff$(%r1),%t2'
- 	tls_as_opt=--fatal-warnings
  	;;
    arm*-*-*)
      conftest_s='
--- 27966,27971 ----
*************** foo:	.long	25
*** 27951,27985 ****
  .word foo(tlsldm)
  .word foo(tlsldo)'
  	;;
!   i[34567]86-*-* | x86_64-*-*)
!     case "$target" in
!       i[34567]86-*-solaris2.* | x86_64-*-solaris2.*)
! 	on_solaris=yes
!         ;;
!       *)
! 	on_solaris=no
! 	;;
!     esac
!     if test x$on_solaris = xyes && test x$gas_flag = xno; then
!       conftest_s='
! 	.section .tdata,"awt",@progbits'
!       tls_section_flag=t
  
  $as_echo "#define TLS_SECTION_ASM_FLAG 't'" >>confdefs.h
  
!     else
!       conftest_s='
! 	.section ".tdata","awT",@progbits'
!       tls_section_flag=T
!       tls_as_opt="--fatal-warnings"
!     fi
      case "$target" in
!       i[34567]86-*-*)
! 	if test x$on_solaris = xyes; then
! 	  case $gas_flag in
! 	    yes) tls_as_opt="$tls_as_opt --32" ;;
! 	  esac
! 	fi
  	conftest_s="$conftest_s
  foo:	.long	25
  	.text
--- 27978,28000 ----
  .word foo(tlsldm)
  .word foo(tlsldo)'
  	;;
!   i?86-*-* | x86_64-*-*)
!     case "$target:$gas_flag" in
!       i?86-*-solaris2*:no | x86_64-*-solaris2*:no)
! 	tls_section_flag=t
  
  $as_echo "#define TLS_SECTION_ASM_FLAG 't'" >>confdefs.h
  
! 	;;
!       *:*)
! 	tls_section_flag=T
! 	;;
!     esac
!     conftest_s='
!       .section .tdata,"aw'$tls_section_flag'",@progbits'
      case "$target" in
!       i?86-*-*)
! 	tls_as_opt="$tls_as_opt $as_32_opt"
  	conftest_s="$conftest_s
  foo:	.long	25
  	.text
*************** foo:	.long	25
*** 27996,28007 ****
  	leal	foo@ntpoff(%ecx), %eax"
  	;;
        x86_64-*-*)
! 	if test x$on_solaris = xyes; then
! 	  case $gas_flag in
! 	    yes) tls_as_opt="$tls_as_opt --64" ;;
! 	    no)	 tls_as_opt="$tls_as_opt -xarch=amd64" ;;
! 	  esac
! 	fi
  	conftest_s="$conftest_s
  foo:	.long	25
  	.text
--- 28011,28017 ----
  	leal	foo@ntpoff(%ecx), %eax"
  	;;
        x86_64-*-*)
! 	tls_as_opt="$as_64_opt"
  	conftest_s="$conftest_s
  foo:	.long	25
  	.text
*************** foo:	.long	25
*** 28011,28017 ****
  	leaq	foo@dtpoff(%rax), %rdx
  	movq	foo@gottpoff(%rip), %rax
  	movq	\$foo@tpoff, %rax"
!         ;;
      esac
      ;;
    ia64-*-*)
--- 28021,28027 ----
  	leaq	foo@dtpoff(%rax), %rdx
  	movq	foo@gottpoff(%rip), %rax
  	movq	\$foo@tpoff, %rax"
! 	;;
      esac
      ;;
    ia64-*-*)
*************** foo:	data8	25
*** 28028,28034 ****
  	addl	r20 = @tprel(foo#), gp
  	adds	r22 = @tprel(foo#), r13
  	movl	r24 = @tprel(foo#)'
- 	tls_as_opt=--fatal-warnings
  	;;
    loongarch*-*-*)
      conftest_s='
--- 28038,28043 ----
*************** x:	.word 2
*** 28039,28045 ****
  	bl __tls_get_addr'
  	tls_first_major=0
  	tls_first_minor=0
- 	tls_as_opt='--fatal-warnings'
  	;;
    microblaze*-*-*)
      conftest_s='
--- 28048,28053 ----
*************** x:
*** 28049,28055 ****
  	.text
  	addik r5,r20,x@TLSGD
  	addik r5,r20,x@TLSLDM'
- 	tls_as_opt='--fatal-warnings'
  	;;
    mips*-*-*)
      conftest_s='
--- 28057,28062 ----
*************** x:
*** 28064,28070 ****
  	lw $4, %gottprel(x)($28)
  	lui $4, %tprel_hi(x)
  	addiu $4, $4, %tprel_lo(x)'
! 	tls_as_opt='-32 --fatal-warnings'
  	;;
    m68k-*-*)
      conftest_s='
--- 28071,28077 ----
  	lw $4, %gottprel(x)($28)
  	lui $4, %tprel_hi(x)
  	addiu $4, $4, %tprel_lo(x)'
! 	tls_as_opt='-32'
  	;;
    m68k-*-*)
      conftest_s='
*************** foo:
*** 28078,28084 ****
  	move.l x@TLSLDO(%a5),%a0
  	move.l x@TLSIE(%a5),%a0
  	move.l x@TLSLE(%a5),%a0'
- 	tls_as_opt='--fatal-warnings'
  	;;
    aarch64*-*-*)
      conftest_s='
--- 28085,28090 ----
*************** foo:	.long	25
*** 28089,28095 ****
  	add   x0, x0, #:tlsgd_lo12:x
          bl    __tls_get_addr
  	nop'
- 	tls_as_opt='--fatal-warnings'
  	;;
    or1k*-*-*)
      conftest_s='
--- 28095,28100 ----
*************** foo:	.long	25
*** 28099,28105 ****
  	l.movhi	r3, tpoffha(foo)
  	l.add	r3, r3, r10
  	l.lwz	r4, tpofflo(foo)(r3)'
-     tls_as_opt=--fatal-warnings
      ;;
    powerpc-ibm-aix*)
      conftest_s='
--- 28104,28109 ----
*************** x3:	.space 8
*** 28147,28153 ****
  	add 9,9,3
  	bl .__tls_get_addr
  	nop'
! 	tls_as_opt="-a64 --fatal-warnings"
  	;;
    powerpc*-*-*)
      conftest_s='
--- 28151,28157 ----
  	add 9,9,3
  	bl .__tls_get_addr
  	nop'
! 	tls_as_opt="-a64"
  	;;
    powerpc*-*-*)
      conftest_s='
*************** x3:	.space 4
*** 28171,28177 ****
  	addi 9,2,x1@tprel
  	addis 9,2,x2@tprel@ha
  	addi 9,9,x2@tprel@l'
! 	tls_as_opt="-a32 --fatal-warnings"
  	;;
    riscv*-*-*)
      conftest_s='
--- 28175,28181 ----
  	addi 9,2,x1@tprel
  	addis 9,2,x2@tprel@ha
  	addi 9,9,x2@tprel@l'
! 	tls_as_opt="-a32"
  	;;
    riscv*-*-*)
      conftest_s='
*************** x:	.word 2
*** 28180,28186 ****
  	.text
  	la.tls.gd a0,x
          call __tls_get_addr'
- 	tls_as_opt='--fatal-warnings'
  	;;
    s390-*-*)
      conftest_s='
--- 28184,28189 ----
*************** foo:	.long	25
*** 28197,28203 ****
  	l	%r1,0(%r1):tls_load:foo
  	bas	%r14,0(%r1,%r13):tls_gdcall:foo
  	bas	%r14,0(%r1,%r13):tls_ldcall:foo'
! 	tls_as_opt="-m31 --fatal-warnings"
  	;;
    s390x-*-*)
      conftest_s='
--- 28200,28206 ----
  	l	%r1,0(%r1):tls_load:foo
  	bas	%r14,0(%r1,%r13):tls_gdcall:foo
  	bas	%r14,0(%r1,%r13):tls_ldcall:foo'
! 	tls_as_opt="-m31"
  	;;
    s390x-*-*)
      conftest_s='
*************** foo:	.long	25
*** 28213,28219 ****
  	larl	%r1,foo@INDNTPOFF
  	brasl	%r14,__tls_get_offset@PLT:tls_gdcall:foo
  	brasl	%r14,__tls_get_offset@PLT:tls_ldcall:foo'
! 	tls_as_opt="-m64 -Aesame --fatal-warnings"
  	;;
    sh-*-* | sh[123456789lbe]*-*-*)
      conftest_s='
--- 28216,28222 ----
  	larl	%r1,foo@INDNTPOFF
  	brasl	%r14,__tls_get_offset@PLT:tls_gdcall:foo
  	brasl	%r14,__tls_get_offset@PLT:tls_ldcall:foo'
! 	tls_as_opt="-m64 -Aesame"
  	;;
    sh-*-* | sh[123456789lbe]*-*-*)
      conftest_s='
*************** foo:	.long	25
*** 28225,28249 ****
  	.long	foo@DTPOFF
  	.long	foo@GOTTPOFF
  	.long	foo@TPOFF'
- 	tls_as_opt=--fatal-warnings
  	;;
    sparc*-*-*)
!     case "$target" in
!       sparc*-sun-solaris2.*)
! 	on_solaris=yes
  	;;
!       *)
! 	on_solaris=no
  	;;
      esac
!     if test x$on_solaris = xyes && test x$gas_flag = xno; then
!       conftest_s='
! 	.section ".tdata",#alloc,#write,#tls'
!     else
!       conftest_s='
! 	.section ".tdata","awT",@progbits'
! 	tls_as_opt="-32 --fatal-warnings"
!     fi
      conftest_s="$conftest_s
  foo:	.long	25
  	.text
--- 28228,28246 ----
  	.long	foo@DTPOFF
  	.long	foo@GOTTPOFF
  	.long	foo@TPOFF'
  	;;
    sparc*-*-*)
!     case "$target:$gas_flag" in
!       sparc*-sun-solaris2.*:no)
! 	conftest_s='
! 	.section ".tdata",#alloc,#write,#tls'
  	;;
!        *:*)
! 	 conftest_s='
! 	.section ".tdata","awT",@progbits'
  	;;
      esac
!     tls_as_opt=$as_32_opt
      conftest_s="$conftest_s
  foo:	.long	25
  	.text
*************** else
*** 28292,28298 ****
    gcc_cv_as_tls=no
    if test x"$gcc_cv_as" != x; then
      $as_echo "$conftest_s" > conftest.s
!     if { ac_try='$gcc_cv_as $gcc_cv_as_flags $tls_as_opt -o conftest.o conftest.s >&5'
    { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
    (eval $ac_try) 2>&5
    ac_status=$?
--- 28289,28295 ----
    gcc_cv_as_tls=no
    if test x"$gcc_cv_as" != x; then
      $as_echo "$conftest_s" > conftest.s
!     if { ac_try='$gcc_cv_as $gcc_cv_as_flags $tls_as_opt $fw_as_opt -o conftest.o conftest.s >&5'
    { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
    (eval $ac_try) 2>&5
    ac_status=$?
*************** else
*** 29569,29575 ****
    gcc_cv_as_section_has_align=no
    if test x"$gcc_cv_as" != x; then
      $as_echo '.section lto_test,"dr0"' > conftest.s
!     if { ac_try='$gcc_cv_as $gcc_cv_as_flags -fatal-warnings -o conftest.o conftest.s >&5'
    { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
    (eval $ac_try) 2>&5
    ac_status=$?
--- 29566,29572 ----
    gcc_cv_as_section_has_align=no
    if test x"$gcc_cv_as" != x; then
      $as_echo '.section lto_test,"dr0"' > conftest.s
!     if { ac_try='$gcc_cv_as $gcc_cv_as_flags $fw_as_opt -o conftest.o conftest.s >&5'
    { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
    (eval $ac_try) 2>&5
    ac_status=$?
*************** $as_echo "#define HAVE_AS_IX86_UD2 1" >>
*** 30034,30050 ****
  fi
  
  
-     # Enforce 32-bit output with gas and gld.
-     if test x$gas = xyes; then
-       as_ix86_gas_32_opt="--32"
-     fi
-     if test x$gnu_ld = xyes; then
-       case $target in
- 	*-*-solaris2*) ld_ix86_gld_32_opt="-melf_i386_sol2" ;;
- 	*)             ld_ix86_gld_32_opt="-melf_i386" ;;
-       esac
-     fi
- 
      { $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler for R_386_TLS_GD_PLT reloc" >&5
  $as_echo_n "checking assembler for R_386_TLS_GD_PLT reloc... " >&6; }
  if ${gcc_cv_as_ix86_tlsgdplt+:} false; then :
--- 30031,30036 ----
*************** else
*** 30053,30059 ****
    gcc_cv_as_ix86_tlsgdplt=no
    if test x"$gcc_cv_as" != x; then
      $as_echo 'call    tls_gd@tlsgdplt' > conftest.s
!     if { ac_try='$gcc_cv_as $gcc_cv_as_flags $as_ix86_gas_32_opt -o conftest.o conftest.s >&5'
    { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
    (eval $ac_try) 2>&5
    ac_status=$?
--- 30039,30045 ----
    gcc_cv_as_ix86_tlsgdplt=no
    if test x"$gcc_cv_as" != x; then
      $as_echo 'call    tls_gd@tlsgdplt' > conftest.s
!     if { ac_try='$gcc_cv_as $gcc_cv_as_flags $as_32_opt -o conftest.o conftest.s >&5'
    { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
    (eval $ac_try) 2>&5
    ac_status=$?
*************** else
*** 30061,30067 ****
    test $ac_status = 0; }; }
      then
  	if test x$gcc_cv_ld != x \
! 	 && $gcc_cv_ld $ld_ix86_gld_32_opt -o conftest conftest.o -G > /dev/null 2>&1; then
  	   gcc_cv_as_ix86_tlsgdplt=yes
  	 fi
  	 rm -f conftest
--- 30047,30053 ----
    test $ac_status = 0; }; }
      then
  	if test x$gcc_cv_ld != x \
! 	 && $gcc_cv_ld $ld_32_opt -o conftest conftest.o -G > /dev/null 2>&1; then
  	   gcc_cv_as_ix86_tlsgdplt=yes
  	 fi
  	 rm -f conftest
*************** else
*** 30095,30101 ****
    gcc_cv_as_ix86_tlsldmplt=no
    if test x"$gcc_cv_as" != x; then
      $as_echo "$conftest_s" > conftest.s
!     if { ac_try='$gcc_cv_as $gcc_cv_as_flags $as_ix86_gas_32_opt -o conftest.o conftest.s >&5'
    { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
    (eval $ac_try) 2>&5
    ac_status=$?
--- 30081,30087 ----
    gcc_cv_as_ix86_tlsldmplt=no
    if test x"$gcc_cv_as" != x; then
      $as_echo "$conftest_s" > conftest.s
!     if { ac_try='$gcc_cv_as $gcc_cv_as_flags $as_32_opt -o conftest.o conftest.s >&5'
    { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
    (eval $ac_try) 2>&5
    ac_status=$?
*************** else
*** 30103,30109 ****
    test $ac_status = 0; }; }
      then
  	if test x$gcc_cv_ld != x \
! 	 && $gcc_cv_ld $ld_ix86_gld_32_opt -o conftest conftest.o -G > /dev/null 2>&1; then
  	   gcc_cv_as_ix86_tlsldmplt=yes
  	 fi
  	 rm -f conftest
--- 30089,30095 ----
    test $ac_status = 0; }; }
      then
  	if test x$gcc_cv_ld != x \
! 	 && $gcc_cv_ld $ld_32_opt -o conftest conftest.o -G > /dev/null 2>&1; then
  	   gcc_cv_as_ix86_tlsldmplt=yes
  	 fi
  	 rm -f conftest
*************** else
*** 30143,30149 ****
    gcc_cv_as_ix86_tlsldm=no
    if test x"$gcc_cv_as" != x; then
      $as_echo "$conftest_s" > conftest.s
!     if { ac_try='$gcc_cv_as $gcc_cv_as_flags $as_ix86_gas_32_opt -o conftest.o conftest.s >&5'
    { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
    (eval $ac_try) 2>&5
    ac_status=$?
--- 30129,30135 ----
    gcc_cv_as_ix86_tlsldm=no
    if test x"$gcc_cv_as" != x; then
      $as_echo "$conftest_s" > conftest.s
!     if { ac_try='$gcc_cv_as $gcc_cv_as_flags $as_32_opt -o conftest.o conftest.s >&5'
    { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
    (eval $ac_try) 2>&5
    ac_status=$?
*************** else
*** 30151,30157 ****
    test $ac_status = 0; }; }
      then
  	if test x$gcc_cv_ld != x && test x$gcc_cv_objdump != x \
! 	    && $gcc_cv_ld $ld_ix86_gld_32_opt -o conftest conftest.o $ld_tls_libs -lc > /dev/null 2>&1; then
  	   if $gcc_cv_objdump -d conftest 2>/dev/null | grep nop > /dev/null \
  	      || dis conftest 2>/dev/null | grep nop > /dev/null; then
  	     gcc_cv_as_ix86_tlsldm=yes
--- 30137,30143 ----
    test $ac_status = 0; }; }
      then
  	if test x$gcc_cv_ld != x && test x$gcc_cv_objdump != x \
! 	    && $gcc_cv_ld $ld_32_opt -o conftest conftest.o $ld_tls_libs -lc > /dev/null 2>&1; then
  	   if $gcc_cv_objdump -d conftest 2>/dev/null | grep nop > /dev/null \
  	      || dis conftest 2>/dev/null | grep nop > /dev/null; then
  	     gcc_cv_as_ix86_tlsldm=yes
*************** else
*** 30192,30198 ****
    gcc_cv_as_ix86_got32x=no
    if test x"$gcc_cv_as" != x; then
      $as_echo "$conftest_s" > conftest.s
!     if { ac_try='$gcc_cv_as $gcc_cv_as_flags $as_ix86_gas_32_opt -o conftest.o conftest.s >&5'
    { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
    (eval $ac_try) 2>&5
    ac_status=$?
--- 30178,30184 ----
    gcc_cv_as_ix86_got32x=no
    if test x"$gcc_cv_as" != x; then
      $as_echo "$conftest_s" > conftest.s
!     if { ac_try='$gcc_cv_as $gcc_cv_as_flags $as_32_opt -o conftest.o conftest.s >&5'
    { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
    (eval $ac_try) 2>&5
    ac_status=$?
*************** else
*** 30203,30209 ****
  	    && test x$gcc_cv_readelf != x \
  	    && $gcc_cv_readelf --relocs --wide conftest.o 2>&1 \
  	       | grep R_386_GOT32X > /dev/null 2>&1 \
! 	    && $gcc_cv_ld $ld_ix86_gld_32_opt -o conftest conftest.o > /dev/null 2>&1; then
  	   if $gcc_cv_objdump -dw conftest 2>&1 \
  	      | grep 0xffffff > /dev/null 2>&1; then
  	     gcc_cv_as_ix86_got32x=no
--- 30189,30195 ----
  	    && test x$gcc_cv_readelf != x \
  	    && $gcc_cv_readelf --relocs --wide conftest.o 2>&1 \
  	       | grep R_386_GOT32X > /dev/null 2>&1 \
! 	    && $gcc_cv_ld $ld_32_opt -o conftest conftest.o > /dev/null 2>&1; then
  	   if $gcc_cv_objdump -dw conftest 2>&1 \
  	      | grep 0xffffff > /dev/null 2>&1; then
  	     gcc_cv_as_ix86_got32x=no
*************** _ACEOF
*** 30231,30246 ****
  
      # Check if gas and gld support "addq %r23,foo@GOTTPOFF(%rip), %r15"
      # with R_X86_64_CODE_6_GOTTPOFF relocation.
-     if test x$gnu_ld = xyes; then
-       case $target in
- 	*-*-solaris2*) ld_ix86_gld_64_opt="-melf_x86_64_sol2" ;;
- 	*)             ld_ix86_gld_64_opt="-melf_x86_64" ;;
-       esac
-     fi
-     # Enforce 64-bit output with gas and gld.
-     if test x$gas = xyes; then
-       as_ix86_gas_64_opt="--64"
-     fi
      conftest_s='
  	.text
  	.globl	_start
--- 30217,30222 ----
*************** else
*** 30259,30265 ****
    gcc_cv_as_x86_64_code_6_gottpoff=no
    if test x"$gcc_cv_as" != x; then
      $as_echo "$conftest_s" > conftest.s
!     if { ac_try='$gcc_cv_as $gcc_cv_as_flags $as_ix86_gas_64_opt -o conftest.o conftest.s >&5'
    { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
    (eval $ac_try) 2>&5
    ac_status=$?
--- 30235,30241 ----
    gcc_cv_as_x86_64_code_6_gottpoff=no
    if test x"$gcc_cv_as" != x; then
      $as_echo "$conftest_s" > conftest.s
!     if { ac_try='$gcc_cv_as $gcc_cv_as_flags $as_64_opt -o conftest.o conftest.s >&5'
    { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
    (eval $ac_try) 2>&5
    ac_status=$?
*************** else
*** 30270,30276 ****
  	    && test x$gcc_cv_readelf != x \
  	    && $gcc_cv_readelf --relocs --wide conftest.o 2>&1 \
  	       | grep R_X86_64_CODE_6_GOTTPOFF > /dev/null 2>&1 \
! 	    && $gcc_cv_ld $ld_ix86_gld_64_opt -o conftest conftest.o > /dev/null 2>&1; then
  	   if $gcc_cv_objdump -dw conftest 2>&1 \
  	      | grep "add \+\$0xf\+8,%r23,%r15" > /dev/null 2>&1; then
  	     gcc_cv_as_x86_64_code_6_gottpoff=yes
--- 30246,30252 ----
  	    && test x$gcc_cv_readelf != x \
  	    && $gcc_cv_readelf --relocs --wide conftest.o 2>&1 \
  	       | grep R_X86_64_CODE_6_GOTTPOFF > /dev/null 2>&1 \
! 	    && $gcc_cv_ld $ld_64_opt -o conftest conftest.o > /dev/null 2>&1; then
  	   if $gcc_cv_objdump -dw conftest 2>&1 \
  	      | grep "add \+\$0xf\+8,%r23,%r15" > /dev/null 2>&1; then
  	     gcc_cv_as_x86_64_code_6_gottpoff=yes
*************** else
*** 30308,30314 ****
  	nop
  	.data
  	.long .L0@GOTOFF' > conftest.s
!     if { ac_try='$gcc_cv_as $gcc_cv_as_flags $as_ix86_gas_32_opt -o conftest.o conftest.s >&5'
    { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
    (eval $ac_try) 2>&5
    ac_status=$?
--- 30284,30290 ----
  	nop
  	.data
  	.long .L0@GOTOFF' > conftest.s
!     if { ac_try='$gcc_cv_as $gcc_cv_as_flags $as_32_opt -o conftest.o conftest.s >&5'
    { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
    (eval $ac_try) 2>&5
    ac_status=$?
*************** else
*** 30359,30365 ****
    gcc_cv_as_ix86_tls_get_addr_via_got=no
    if test x"$gcc_cv_as" != x; then
      $as_echo "$conftest_s" > conftest.s
!     if { ac_try='$gcc_cv_as $gcc_cv_as_flags $as_ix86_gas_32_opt -o conftest.o conftest.s >&5'
    { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
    (eval $ac_try) 2>&5
    ac_status=$?
--- 30335,30341 ----
    gcc_cv_as_ix86_tls_get_addr_via_got=no
    if test x"$gcc_cv_as" != x; then
      $as_echo "$conftest_s" > conftest.s
!     if { ac_try='$gcc_cv_as $gcc_cv_as_flags $as_32_opt -o conftest.o conftest.s >&5'
    { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
    (eval $ac_try) 2>&5
    ac_status=$?
*************** else
*** 30367,30373 ****
    test $ac_status = 0; }; }
      then
  	if test x$gcc_cv_ld != x \
! 	    && $gcc_cv_ld $ld_ix86_gld_32_opt -o conftest conftest.o > /dev/null 2>&1; then
  	   gcc_cv_as_ix86_tls_get_addr_via_got=yes
  	 fi
  	 rm -f conftest
--- 30343,30349 ----
    test $ac_status = 0; }; }
      then
  	if test x$gcc_cv_ld != x \
! 	    && $gcc_cv_ld $ld_32_opt -o conftest conftest.o > /dev/null 2>&1; then
  	   gcc_cv_as_ix86_tls_get_addr_via_got=yes
  	 fi
  	 rm -f conftest
*************** else
*** 30679,30685 ****
    gcc_cv_as_powerpc_entry_markers=no
    if test x"$gcc_cv_as" != x; then
      $as_echo ' .reloc .,R_PPC64_ENTRY; nop' > conftest.s
!     if { ac_try='$gcc_cv_as $gcc_cv_as_flags -a64 --fatal-warnings -o conftest.o conftest.s >&5'
    { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
    (eval $ac_try) 2>&5
    ac_status=$?
--- 30655,30661 ----
    gcc_cv_as_powerpc_entry_markers=no
    if test x"$gcc_cv_as" != x; then
      $as_echo ' .reloc .,R_PPC64_ENTRY; nop' > conftest.s
!     if { ac_try='$gcc_cv_as $gcc_cv_as_flags -a64 $fw_as_opt -o conftest.o conftest.s >&5'
    { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
    (eval $ac_try) 2>&5
    ac_status=$?
*************** else
*** 30711,30717 ****
    gcc_cv_as_powerpc_pltseq_markers=no
    if test x"$gcc_cv_as" != x; then
      $as_echo ' .reloc .,R_PPC_PLTSEQ; nop' > conftest.s
!     if { ac_try='$gcc_cv_as $gcc_cv_as_flags -a32 --fatal-warnings -o conftest.o conftest.s >&5'
    { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
    (eval $ac_try) 2>&5
    ac_status=$?
--- 30687,30693 ----
    gcc_cv_as_powerpc_pltseq_markers=no
    if test x"$gcc_cv_as" != x; then
      $as_echo ' .reloc .,R_PPC_PLTSEQ; nop' > conftest.s
!     if { ac_try='$gcc_cv_as $gcc_cv_as_flags -a32 $fw_as_opt -o conftest.o conftest.s >&5'
    { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
    (eval $ac_try) 2>&5
    ac_status=$?
*************** else
*** 30996,31002 ****
    gcc_cv_as_micromips_support=no
    if test x"$gcc_cv_as" != x; then
      $as_echo '.set micromips' > conftest.s
!     if { ac_try='$gcc_cv_as $gcc_cv_as_flags --fatal-warnings -o conftest.o conftest.s >&5'
    { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
    (eval $ac_try) 2>&5
    ac_status=$?
--- 30972,30978 ----
    gcc_cv_as_micromips_support=no
    if test x"$gcc_cv_as" != x; then
      $as_echo '.set micromips' > conftest.s
!     if { ac_try='$gcc_cv_as $gcc_cv_as_flags $fw_as_opt -o conftest.o conftest.s >&5'
    { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
    (eval $ac_try) 2>&5
    ac_status=$?
*************** else
*** 31625,31631 ****
         nop
         .endr
         beq $a0,$a1,a' > conftest.s
!     if { ac_try='$gcc_cv_as $gcc_cv_as_flags --fatal-warnings -o conftest.o conftest.s >&5'
    { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
    (eval $ac_try) 2>&5
    ac_status=$?
--- 31601,31607 ----
         nop
         .endr
         beq $a0,$a1,a' > conftest.s
!     if { ac_try='$gcc_cv_as $gcc_cv_as_flags $fw_as_opt -o conftest.o conftest.s >&5'
    { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
    (eval $ac_try) 2>&5
    ac_status=$?
*************** main:
*** 32898,32907 ****
  ptr:
  	.quad	a_glob
  EOF
!       if $gcc_cv_as --64 -o conftest1.o conftest1.s > /dev/null 2>&1 \
!          && $gcc_cv_ld -shared -melf_x86_64 -o conftest1.so conftest1.o > /dev/null 2>&1 \
!          && $gcc_cv_as --64 -o conftest2.o conftest2.s > /dev/null 2>&1 \
!          && $gcc_cv_ld -pie -melf_x86_64 -o conftest conftest2.o conftest1.so > /dev/null 2>&1; then
          gcc_cv_ld_pie_copyreloc=yes
        fi
        rm -f conftest conftest1.so conftest1.o conftest2.o conftest1.s conftest2.s
--- 32874,32883 ----
  ptr:
  	.quad	a_glob
  EOF
!       if $gcc_cv_as $as_64_opt -o conftest1.o conftest1.s > /dev/null 2>&1 \
!          && $gcc_cv_ld -shared $ld_64_opt -o conftest1.so conftest1.o > /dev/null 2>&1 \
!          && $gcc_cv_as $as_64_opt -o conftest2.o conftest2.s > /dev/null 2>&1 \
!          && $gcc_cv_ld -pie $ld_64_opt -o conftest conftest2.o conftest1.so > /dev/null 2>&1; then
          gcc_cv_ld_pie_copyreloc=yes
        fi
        rm -f conftest conftest1.so conftest1.o conftest2.o conftest1.s conftest2.s
diff -Nrcpad gcc-16-20260125/gcc/configure.ac gcc-16-20260201/gcc/configure.ac
*** gcc-16-20260125/gcc/configure.ac	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/configure.ac	Sun Feb  1 22:32:07 2026
*************** AC_DEFINE_UNQUOTED(HAVE_GNU_LD, $gnu_ld_
*** 2023,2028 ****
--- 2023,2043 ----
  gnu_as_bool=`if test x"$gas" = x"yes"; then echo 1; else echo 0; fi`
  AC_DEFINE_UNQUOTED(HAVE_GNU_AS, $gnu_as_bool, [Define to 1 if using GNU as.])
  
+ case "$target:$gnu_ld" in
+   *-*-solaris2*:no)
+     # While Solaris ld has -m32/-m64 it usually determines the ELF class
+     # from the input objects.
+     ;;
+   i?86-*-solaris2*:yes | x86_64-*-solaris2*:yes)
+     ld_32_opt=-melf_i386_sol2
+     ld_64_opt=-melf_x86_64_sol2
+     ;;
+   i?86-*-*:yes | x86_64-*-*:yes)
+     ld_32_opt=-melf_i386
+     ld_64_opt=-melf_x86_64
+     ;;
+ esac
+ 
  count=a
  for f in $host_xm_file; do
  	count=${count}x
*************** case "$ORIGINAL_AS_FOR_TARGET" in
*** 2730,2735 ****
--- 2745,2754 ----
    *) AC_CONFIG_FILES(as:exec-tool.in, [chmod +x as]) ;;
  esac 
  
+ if $gcc_cv_as --help 2>&1 | grep -- --fatal-warnings > /dev/null; then
+   fw_as_opt=--fatal-warnings
+ fi
+ 
  default_ld=
  AC_ARG_ENABLE(ld,
  [[  --enable-ld[=ARG]       build ld [ARG={default,yes,no}]]],
*************** gcc_GAS_CHECK_FEATURE([cfi directives],
*** 3445,3457 ****
        # No objdump, err on the side of caution.
        gcc_cv_as_cfi_directive=no
      else
-       if test x$gas = xyes; then
- 	as_32_opt="--32"
- 	as_64_opt="--64"
-       else
- 	as_32_opt="-m32"
- 	as_64_opt="-m64"
-       fi
        case "$target" in
  	sparc*-*-solaris2.*)
  	  # On Solaris/SPARC, .eh_frame sections should always be read-write.
--- 3464,3469 ----
*************** fi
*** 3621,3627 ****
  # Test if the assembler supports the section flag 'e' or #exclude for
  # specifying an excluded section.
  gcc_GAS_CHECK_FEATURE([section exclude flag], gcc_cv_as_section_exclude_e,
!  [--fatal-warnings],
   [.section foo1,"e"
    .byte 0,0,0,0])
  if test $gcc_cv_as_section_exclude_e = no; then
--- 3633,3639 ----
  # Test if the assembler supports the section flag 'e' or #exclude for
  # specifying an excluded section.
  gcc_GAS_CHECK_FEATURE([section exclude flag], gcc_cv_as_section_exclude_e,
!  [$fw_as_opt],
   [.section foo1,"e"
    .byte 0,0,0,0])
  if test $gcc_cv_as_section_exclude_e = no; then
*************** case "${target}" in
*** 3657,3663 ****
      ;;
    *)
      gcc_GAS_CHECK_FEATURE([section 'R' flag], gcc_cv_as_shf_gnu_retain,
!       [--fatal-warnings],
        [.section .foo,"awR",%progbits
  .byte 0])
      ;;
--- 3669,3675 ----
      ;;
    *)
      gcc_GAS_CHECK_FEATURE([section 'R' flag], gcc_cv_as_shf_gnu_retain,
!       [$fw_as_opt],
        [.section .foo,"awR",%progbits
  .byte 0])
      ;;
*************** case "${target}" in
*** 3677,3683 ****
      ;;
    *)
      gcc_GAS_CHECK_FEATURE([section 'o' flag], gcc_cv_as_section_link_order,
!       [--fatal-warnings],
        [.section .foo,"a"
  .byte 0
  .section __patchable_function_entries,"awo",%progbits,.foo
--- 3689,3695 ----
      ;;
    *)
      gcc_GAS_CHECK_FEATURE([section 'o' flag], gcc_cv_as_section_link_order,
!       [$fw_as_opt],
        [.section .foo,"a"
  .byte 0
  .section __patchable_function_entries,"awo",%progbits,.foo
*************** AC_DEFINE_UNQUOTED(HAVE_GAS_SECTION_LINK
*** 3689,3700 ****
    [Define 0/1 if your assembler supports 'o' flag in .section directive.])
  
  gcc_GAS_CHECK_FEATURE(section merging support, gcc_cv_as_shf_merge,
!  [--fatal-warnings],
   [.section .rodata.str, "aMS", @progbits, 1])
  if test $gcc_cv_as_shf_merge = no; then
    gcc_GAS_CHECK_FEATURE(section merging support (%progbits),
      gcc_cv_as_shf_merge_percent,
!     [--fatal-warnings],
      [.section .rodata.str, "aMS", %progbits, 1])
  fi
  AC_DEFINE_UNQUOTED(HAVE_GAS_SHF_MERGE,
--- 3701,3712 ----
    [Define 0/1 if your assembler supports 'o' flag in .section directive.])
  
  gcc_GAS_CHECK_FEATURE(section merging support, gcc_cv_as_shf_merge,
!  [$fw_as_opt],
   [.section .rodata.str, "aMS", @progbits, 1])
  if test $gcc_cv_as_shf_merge = no; then
    gcc_GAS_CHECK_FEATURE(section merging support (%progbits),
      gcc_cv_as_shf_merge_percent,
!     [$fw_as_opt],
      [.section .rodata.str, "aMS", %progbits, 1])
  fi
  AC_DEFINE_UNQUOTED(HAVE_GAS_SHF_MERGE,
*************** AC_DEFINE_UNQUOTED(HAVE_GAS_SHF_MERGE,
*** 3704,3710 ****
  
  gcc_GAS_CHECK_FEATURE([COMDAT group support (GNU as)],
   gcc_cv_as_comdat_group,
!  [--fatal-warnings],
   [.section .text,"axG",@progbits,.foo,comdat])
  if test $gcc_cv_as_comdat_group = yes; then
    gcc_cv_as_comdat_group_percent=no
--- 3716,3722 ----
  
  gcc_GAS_CHECK_FEATURE([COMDAT group support (GNU as)],
   gcc_cv_as_comdat_group,
!  [$fw_as_opt],
   [.section .text,"axG",@progbits,.foo,comdat])
  if test $gcc_cv_as_comdat_group = yes; then
    gcc_cv_as_comdat_group_percent=no
*************** if test $gcc_cv_as_comdat_group = yes; t
*** 3712,3718 ****
  else
   gcc_GAS_CHECK_FEATURE([COMDAT group support (GNU as, %type)],
     gcc_cv_as_comdat_group_percent,
!    [--fatal-warnings],
     [.section .text,"axG",%progbits,.foo,comdat])
   if test $gcc_cv_as_comdat_group_percent = yes; then
     gcc_cv_as_comdat_group_group=no
--- 3724,3730 ----
  else
   gcc_GAS_CHECK_FEATURE([COMDAT group support (GNU as, %type)],
     gcc_cv_as_comdat_group_percent,
!    [$fw_as_opt],
     [.section .text,"axG",%progbits,.foo,comdat])
   if test $gcc_cv_as_comdat_group_percent = yes; then
     gcc_cv_as_comdat_group_group=no
*************** foo:	.long	25
*** 3852,3858 ****
  	ldah	$2,foo($29)			!tprelhi
  	lda	$3,foo($2)			!tprello
  	lda	$4,foo($29)			!tprel'
- 	tls_as_opt=--fatal-warnings
  	;;
    arc*-*-*)
      conftest_s='
--- 3864,3869 ----
*************** x:      .long   25
*** 3865,3871 ****
          .text
  	move.d x:IE,$r10
  	nop'
- 	tls_as_opt=--fatal-warnings
  	;;
    frv*-*-*)
      conftest_s='
--- 3876,3881 ----
*************** foo:	.long	25
*** 3899,3905 ****
  	mfctl %cr27,%t1 		
  	addil LR%foo-$tls_leoff$,%t1
  	ldo RR%foo-$tls_leoff$(%r1),%t2'
- 	tls_as_opt=--fatal-warnings
  	;;
    arm*-*-*)
      conftest_s='
--- 3909,3914 ----
*************** foo:	.long	25
*** 3912,3947 ****
  .word foo(tlsldm)
  .word foo(tlsldo)'
  	;;
!   i[34567]86-*-* | x86_64-*-*)
!     case "$target" in
!       i[34567]86-*-solaris2.* | x86_64-*-solaris2.*)
! 	on_solaris=yes
!         ;;
!       *)
! 	on_solaris=no
! 	;;
!     esac
!     if test x$on_solaris = xyes && test x$gas_flag = xno; then
!       conftest_s='
! 	.section .tdata,"awt",@progbits'
!       tls_section_flag=t
  changequote([,])dnl
!       AC_DEFINE(TLS_SECTION_ASM_FLAG, 't',
  [Define to the flag used to mark TLS sections if the default (`T') doesn't work.])
  changequote(,)dnl
!     else
!       conftest_s='
! 	.section ".tdata","awT",@progbits'
!       tls_section_flag=T
!       tls_as_opt="--fatal-warnings"
!     fi
      case "$target" in
!       i[34567]86-*-*)
! 	if test x$on_solaris = xyes; then
! 	  case $gas_flag in
! 	    yes) tls_as_opt="$tls_as_opt --32" ;;
! 	  esac
! 	fi
  	conftest_s="$conftest_s
  foo:	.long	25
  	.text
--- 3921,3944 ----
  .word foo(tlsldm)
  .word foo(tlsldo)'
  	;;
!   i?86-*-* | x86_64-*-*)
!     case "$target:$gas_flag" in
!       i?86-*-solaris2*:no | x86_64-*-solaris2*:no)
! 	tls_section_flag=t
  changequote([,])dnl
! 	AC_DEFINE(TLS_SECTION_ASM_FLAG, 't',
  [Define to the flag used to mark TLS sections if the default (`T') doesn't work.])
  changequote(,)dnl
! 	;;
!       *:*)
! 	tls_section_flag=T
! 	;;
!     esac
!     conftest_s='
!       .section .tdata,"aw'$tls_section_flag'",@progbits'
      case "$target" in
!       i?86-*-*)
! 	tls_as_opt="$tls_as_opt $as_32_opt"
  	conftest_s="$conftest_s
  foo:	.long	25
  	.text
*************** foo:	.long	25
*** 3958,3969 ****
  	leal	foo@ntpoff(%ecx), %eax"
  	;;
        x86_64-*-*)
! 	if test x$on_solaris = xyes; then
! 	  case $gas_flag in
! 	    yes) tls_as_opt="$tls_as_opt --64" ;;
! 	    no)	 tls_as_opt="$tls_as_opt -xarch=amd64" ;;
! 	  esac	  
! 	fi
  	conftest_s="$conftest_s
  foo:	.long	25
  	.text
--- 3955,3961 ----
  	leal	foo@ntpoff(%ecx), %eax"
  	;;
        x86_64-*-*)
! 	tls_as_opt="$as_64_opt"
  	conftest_s="$conftest_s
  foo:	.long	25
  	.text
*************** foo:	.long	25
*** 3973,3979 ****
  	leaq	foo@dtpoff(%rax), %rdx
  	movq	foo@gottpoff(%rip), %rax
  	movq	\$foo@tpoff, %rax"
!         ;;
      esac
      ;;
    ia64-*-*)
--- 3965,3971 ----
  	leaq	foo@dtpoff(%rax), %rdx
  	movq	foo@gottpoff(%rip), %rax
  	movq	\$foo@tpoff, %rax"
! 	;;
      esac
      ;;
    ia64-*-*)
*************** foo:	data8	25
*** 3990,3996 ****
  	addl	r20 = @tprel(foo#), gp
  	adds	r22 = @tprel(foo#), r13
  	movl	r24 = @tprel(foo#)'
- 	tls_as_opt=--fatal-warnings
  	;;
    loongarch*-*-*)
      conftest_s='
--- 3982,3987 ----
*************** x:	.word 2
*** 4001,4007 ****
  	bl __tls_get_addr'
  	tls_first_major=0
  	tls_first_minor=0
- 	tls_as_opt='--fatal-warnings'
  	;;
    microblaze*-*-*)
      conftest_s='
--- 3992,3997 ----
*************** x:
*** 4011,4017 ****
  	.text
  	addik r5,r20,x@TLSGD
  	addik r5,r20,x@TLSLDM'
- 	tls_as_opt='--fatal-warnings'
  	;;
    mips*-*-*)
      conftest_s='
--- 4001,4006 ----
*************** x:
*** 4026,4032 ****
  	lw $4, %gottprel(x)($28)
  	lui $4, %tprel_hi(x)
  	addiu $4, $4, %tprel_lo(x)'
! 	tls_as_opt='-32 --fatal-warnings'
  	;;
    m68k-*-*)
      conftest_s='
--- 4015,4021 ----
  	lw $4, %gottprel(x)($28)
  	lui $4, %tprel_hi(x)
  	addiu $4, $4, %tprel_lo(x)'
! 	tls_as_opt='-32'
  	;;
    m68k-*-*)
      conftest_s='
*************** foo:
*** 4040,4046 ****
  	move.l x@TLSLDO(%a5),%a0
  	move.l x@TLSIE(%a5),%a0
  	move.l x@TLSLE(%a5),%a0'
- 	tls_as_opt='--fatal-warnings'
  	;;
    aarch64*-*-*)
      conftest_s='
--- 4029,4034 ----
*************** foo:	.long	25
*** 4051,4057 ****
  	add   x0, x0, #:tlsgd_lo12:x
          bl    __tls_get_addr
  	nop'
- 	tls_as_opt='--fatal-warnings'
  	;;
    or1k*-*-*)
      conftest_s='
--- 4039,4044 ----
*************** foo:	.long	25
*** 4061,4067 ****
  	l.movhi	r3, tpoffha(foo)
  	l.add	r3, r3, r10
  	l.lwz	r4, tpofflo(foo)(r3)'
-     tls_as_opt=--fatal-warnings
      ;;
    powerpc-ibm-aix*)
      conftest_s='
--- 4048,4053 ----
*************** x3:	.space 8
*** 4109,4115 ****
  	add 9,9,3
  	bl .__tls_get_addr
  	nop'
! 	tls_as_opt="-a64 --fatal-warnings"
  	;;
    powerpc*-*-*)
      conftest_s='
--- 4095,4101 ----
  	add 9,9,3
  	bl .__tls_get_addr
  	nop'
! 	tls_as_opt="-a64"
  	;;
    powerpc*-*-*)
      conftest_s='
*************** x3:	.space 4
*** 4133,4139 ****
  	addi 9,2,x1@tprel
  	addis 9,2,x2@tprel@ha
  	addi 9,9,x2@tprel@l'
! 	tls_as_opt="-a32 --fatal-warnings"
  	;;
    riscv*-*-*)
      conftest_s='
--- 4119,4125 ----
  	addi 9,2,x1@tprel
  	addis 9,2,x2@tprel@ha
  	addi 9,9,x2@tprel@l'
! 	tls_as_opt="-a32"
  	;;
    riscv*-*-*)
      conftest_s='
*************** x:	.word 2
*** 4142,4148 ****
  	.text
  	la.tls.gd a0,x
          call __tls_get_addr'
- 	tls_as_opt='--fatal-warnings'
  	;;
    s390-*-*)
      conftest_s='
--- 4128,4133 ----
*************** foo:	.long	25
*** 4159,4165 ****
  	l	%r1,0(%r1):tls_load:foo
  	bas	%r14,0(%r1,%r13):tls_gdcall:foo
  	bas	%r14,0(%r1,%r13):tls_ldcall:foo'
! 	tls_as_opt="-m31 --fatal-warnings"
  	;;
    s390x-*-*)
      conftest_s='
--- 4144,4150 ----
  	l	%r1,0(%r1):tls_load:foo
  	bas	%r14,0(%r1,%r13):tls_gdcall:foo
  	bas	%r14,0(%r1,%r13):tls_ldcall:foo'
! 	tls_as_opt="-m31"
  	;;
    s390x-*-*)
      conftest_s='
*************** foo:	.long	25
*** 4175,4181 ****
  	larl	%r1,foo@INDNTPOFF
  	brasl	%r14,__tls_get_offset@PLT:tls_gdcall:foo
  	brasl	%r14,__tls_get_offset@PLT:tls_ldcall:foo'
! 	tls_as_opt="-m64 -Aesame --fatal-warnings"
  	;;
    sh-*-* | sh[123456789lbe]*-*-*)
      conftest_s='
--- 4160,4166 ----
  	larl	%r1,foo@INDNTPOFF
  	brasl	%r14,__tls_get_offset@PLT:tls_gdcall:foo
  	brasl	%r14,__tls_get_offset@PLT:tls_ldcall:foo'
! 	tls_as_opt="-m64 -Aesame"
  	;;
    sh-*-* | sh[123456789lbe]*-*-*)
      conftest_s='
*************** foo:	.long	25
*** 4187,4211 ****
  	.long	foo@DTPOFF
  	.long	foo@GOTTPOFF
  	.long	foo@TPOFF'
- 	tls_as_opt=--fatal-warnings
  	;;
    sparc*-*-*)
!     case "$target" in
!       sparc*-sun-solaris2.*)
! 	on_solaris=yes
  	;;
!       *)
! 	on_solaris=no
  	;;
      esac
!     if test x$on_solaris = xyes && test x$gas_flag = xno; then
!       conftest_s='
! 	.section ".tdata",#alloc,#write,#tls'
!     else
!       conftest_s='
! 	.section ".tdata","awT",@progbits'
! 	tls_as_opt="-32 --fatal-warnings"
!     fi
      conftest_s="$conftest_s
  foo:	.long	25
  	.text
--- 4172,4190 ----
  	.long	foo@DTPOFF
  	.long	foo@GOTTPOFF
  	.long	foo@TPOFF'
  	;;
    sparc*-*-*)
!     case "$target:$gas_flag" in
!       sparc*-sun-solaris2.*:no)
! 	conftest_s='
! 	.section ".tdata",#alloc,#write,#tls'
  	;;
!        *:*)
! 	 conftest_s='
! 	.section ".tdata","awT",@progbits'
  	;;
      esac
!     tls_as_opt=$as_32_opt
      conftest_s="$conftest_s
  foo:	.long	25
  	.text
*************** elif test -z "$conftest_s"; then
*** 4248,4254 ****
    : # If we don't have a check, assume no support.
  else
    gcc_GAS_CHECK_FEATURE(thread-local storage support, gcc_cv_as_tls,
!   [$tls_as_opt], [$conftest_s],,
    [set_have_as_tls=yes])
  fi
  case $target_os in
--- 4227,4233 ----
    : # If we don't have a check, assume no support.
  else
    gcc_GAS_CHECK_FEATURE(thread-local storage support, gcc_cv_as_tls,
!   [$tls_as_opt $fw_as_opt], [$conftest_s],,
    [set_have_as_tls=yes])
  fi
  case $target_os in
*************** foo:	nop
*** 4890,4896 ****
  	# but normally only after installation, so we warn but don't fail the
  	# configure if LTO is enabled but the assembler does not support it.
  	gcc_GAS_CHECK_FEATURE([.section with alignment], gcc_cv_as_section_has_align,
! 	  -fatal-warnings,[.section lto_test,"dr0"])
  	if test x$gcc_cv_as_section_has_align != xyes; then
  	  case ",$enable_languages," in
  	    *,lto,*)
--- 4869,4875 ----
  	# but normally only after installation, so we warn but don't fail the
  	# configure if LTO is enabled but the assembler does not support it.
  	gcc_GAS_CHECK_FEATURE([.section with alignment], gcc_cv_as_section_has_align,
! 	  $fw_as_opt,[.section lto_test,"dr0"])
  	if test x$gcc_cv_as_section_has_align != xyes; then
  	  case ",$enable_languages," in
  	    *,lto,*)
*************** foo:	nop
*** 4998,5020 ****
        [AC_DEFINE(HAVE_AS_IX86_UD2, 1,
  	[Define if your assembler supports the 'ud2' mnemonic.])])
  
-     # Enforce 32-bit output with gas and gld.
-     if test x$gas = xyes; then
-       as_ix86_gas_32_opt="--32"
-     fi
-     if test x$gnu_ld = xyes; then
-       case $target in
- 	*-*-solaris2*) ld_ix86_gld_32_opt="-melf_i386_sol2" ;;
- 	*)             ld_ix86_gld_32_opt="-melf_i386" ;;
-       esac
-     fi
- 
      gcc_GAS_CHECK_FEATURE([R_386_TLS_GD_PLT reloc],
          gcc_cv_as_ix86_tlsgdplt,
! 	[$as_ix86_gas_32_opt],
  	[call    tls_gd@tlsgdplt],
  	[if test x$gcc_cv_ld != x \
! 	 && $gcc_cv_ld $ld_ix86_gld_32_opt -o conftest conftest.o -G > /dev/null 2>&1; then
  	   gcc_cv_as_ix86_tlsgdplt=yes
  	 fi
  	 rm -f conftest],
--- 4977,4988 ----
        [AC_DEFINE(HAVE_AS_IX86_UD2, 1,
  	[Define if your assembler supports the 'ud2' mnemonic.])])
  
      gcc_GAS_CHECK_FEATURE([R_386_TLS_GD_PLT reloc],
          gcc_cv_as_ix86_tlsgdplt,
! 	[$as_32_opt],
  	[call    tls_gd@tlsgdplt],
  	[if test x$gcc_cv_ld != x \
! 	 && $gcc_cv_ld $ld_32_opt -o conftest conftest.o -G > /dev/null 2>&1; then
  	   gcc_cv_as_ix86_tlsgdplt=yes
  	 fi
  	 rm -f conftest],
*************** tls_ld:
*** 5029,5038 ****
  
      gcc_GAS_CHECK_FEATURE([R_386_TLS_LDM_PLT reloc],
          gcc_cv_as_ix86_tlsldmplt,
! 	[$as_ix86_gas_32_opt],
  	[$conftest_s],
  	[if test x$gcc_cv_ld != x \
! 	 && $gcc_cv_ld $ld_ix86_gld_32_opt -o conftest conftest.o -G > /dev/null 2>&1; then
  	   gcc_cv_as_ix86_tlsldmplt=yes
  	 fi
  	 rm -f conftest])
--- 4997,5006 ----
  
      gcc_GAS_CHECK_FEATURE([R_386_TLS_LDM_PLT reloc],
          gcc_cv_as_ix86_tlsldmplt,
! 	[$as_32_opt],
  	[$conftest_s],
  	[if test x$gcc_cv_ld != x \
! 	 && $gcc_cv_ld $ld_32_opt -o conftest conftest.o -G > /dev/null 2>&1; then
  	   gcc_cv_as_ix86_tlsldmplt=yes
  	 fi
  	 rm -f conftest])
*************** _start:
*** 5053,5062 ****
  value:'
      gcc_GAS_CHECK_FEATURE([R_386_TLS_LDM reloc],
          gcc_cv_as_ix86_tlsldm,
! 	[$as_ix86_gas_32_opt],
  	[$conftest_s],
  	[if test x$gcc_cv_ld != x && test x$gcc_cv_objdump != x \
! 	    && $gcc_cv_ld $ld_ix86_gld_32_opt -o conftest conftest.o $ld_tls_libs -lc > /dev/null 2>&1; then
  	   if $gcc_cv_objdump -d conftest 2>/dev/null | grep nop > /dev/null \
  	      || dis conftest 2>/dev/null | grep nop > /dev/null; then
  	     gcc_cv_as_ix86_tlsldm=yes
--- 5021,5030 ----
  value:'
      gcc_GAS_CHECK_FEATURE([R_386_TLS_LDM reloc],
          gcc_cv_as_ix86_tlsldm,
! 	[$as_32_opt],
  	[$conftest_s],
  	[if test x$gcc_cv_ld != x && test x$gcc_cv_objdump != x \
! 	    && $gcc_cv_ld $ld_32_opt -o conftest conftest.o $ld_tls_libs -lc > /dev/null 2>&1; then
  	   if $gcc_cv_objdump -d conftest 2>/dev/null | grep nop > /dev/null \
  	      || dis conftest 2>/dev/null | grep nop > /dev/null; then
  	     gcc_cv_as_ix86_tlsldm=yes
*************** _start:
*** 5078,5090 ****
  	 jmp *_start@GOT'
      gcc_GAS_CHECK_FEATURE([R_386_GOT32X reloc],
          gcc_cv_as_ix86_got32x,
! 	[$as_ix86_gas_32_opt],
  	[$conftest_s],
  	[if test x$gcc_cv_ld != x && test x$gcc_cv_objdump != x \
  	    && test x$gcc_cv_readelf != x \
  	    && $gcc_cv_readelf --relocs --wide conftest.o 2>&1 \
  	       | grep R_386_GOT32X > /dev/null 2>&1 \
! 	    && $gcc_cv_ld $ld_ix86_gld_32_opt -o conftest conftest.o > /dev/null 2>&1; then
  	   if $gcc_cv_objdump -dw conftest 2>&1 \
  	      | grep 0xffffff > /dev/null 2>&1; then
  	     gcc_cv_as_ix86_got32x=no
--- 5046,5058 ----
  	 jmp *_start@GOT'
      gcc_GAS_CHECK_FEATURE([R_386_GOT32X reloc],
          gcc_cv_as_ix86_got32x,
! 	[$as_32_opt],
  	[$conftest_s],
  	[if test x$gcc_cv_ld != x && test x$gcc_cv_objdump != x \
  	    && test x$gcc_cv_readelf != x \
  	    && $gcc_cv_readelf --relocs --wide conftest.o 2>&1 \
  	       | grep R_386_GOT32X > /dev/null 2>&1 \
! 	    && $gcc_cv_ld $ld_32_opt -o conftest conftest.o > /dev/null 2>&1; then
  	   if $gcc_cv_objdump -dw conftest 2>&1 \
  	      | grep 0xffffff > /dev/null 2>&1; then
  	     gcc_cv_as_ix86_got32x=no
*************** _start:
*** 5099,5114 ****
  
      # Check if gas and gld support "addq %r23,foo@GOTTPOFF(%rip), %r15"
      # with R_X86_64_CODE_6_GOTTPOFF relocation.
-     if test x$gnu_ld = xyes; then
-       case $target in
- 	*-*-solaris2*) ld_ix86_gld_64_opt="-melf_x86_64_sol2" ;;
- 	*)             ld_ix86_gld_64_opt="-melf_x86_64" ;;
-       esac
-     fi
-     # Enforce 64-bit output with gas and gld.
-     if test x$gas = xyes; then
-       as_ix86_gas_64_opt="--64"
-     fi
      conftest_s='
  	.text
  	.globl	_start
--- 5067,5072 ----
*************** foo:
*** 5121,5133 ****
  	.quad 0'
      gcc_GAS_CHECK_FEATURE([R_X86_64_CODE_6_GOTTPOFF reloc],
  	gcc_cv_as_x86_64_code_6_gottpoff,
! 	[$as_ix86_gas_64_opt],
  	[$conftest_s],
  	[if test x$gcc_cv_ld != x && test x$gcc_cv_objdump != x \
  	    && test x$gcc_cv_readelf != x \
  	    && $gcc_cv_readelf --relocs --wide conftest.o 2>&1 \
  	       | grep R_X86_64_CODE_6_GOTTPOFF > /dev/null 2>&1 \
! 	    && $gcc_cv_ld $ld_ix86_gld_64_opt -o conftest conftest.o > /dev/null 2>&1; then
  	   if $gcc_cv_objdump -dw conftest 2>&1 \
  	      | grep "add \+\$0xf\+8,%r23,%r15" > /dev/null 2>&1; then
  	     gcc_cv_as_x86_64_code_6_gottpoff=yes
--- 5079,5091 ----
  	.quad 0'
      gcc_GAS_CHECK_FEATURE([R_X86_64_CODE_6_GOTTPOFF reloc],
  	gcc_cv_as_x86_64_code_6_gottpoff,
! 	[$as_64_opt],
  	[$conftest_s],
  	[if test x$gcc_cv_ld != x && test x$gcc_cv_objdump != x \
  	    && test x$gcc_cv_readelf != x \
  	    && $gcc_cv_readelf --relocs --wide conftest.o 2>&1 \
  	       | grep R_X86_64_CODE_6_GOTTPOFF > /dev/null 2>&1 \
! 	    && $gcc_cv_ld $ld_64_opt -o conftest conftest.o > /dev/null 2>&1; then
  	   if $gcc_cv_objdump -dw conftest 2>&1 \
  	      | grep "add \+\$0xf\+8,%r23,%r15" > /dev/null 2>&1; then
  	     gcc_cv_as_x86_64_code_6_gottpoff=yes
*************** foo:
*** 5142,5148 ****
  
      gcc_GAS_CHECK_FEATURE([GOTOFF in data],
        gcc_cv_as_ix86_gotoff_in_data,
!       [$as_ix86_gas_32_opt],
  [	.text
  .L0:
  	nop
--- 5100,5106 ----
  
      gcc_GAS_CHECK_FEATURE([GOTOFF in data],
        gcc_cv_as_ix86_gotoff_in_data,
!       [$as_32_opt],
  [	.text
  .L0:
  	nop
*************** gd:
*** 5172,5181 ****
  	.byte 0'
      gcc_GAS_CHECK_FEATURE([calling ___tls_get_addr via GOT],
          gcc_cv_as_ix86_tls_get_addr_via_got,
! 	[$as_ix86_gas_32_opt],
  	[$conftest_s],
  	[if test x$gcc_cv_ld != x \
! 	    && $gcc_cv_ld $ld_ix86_gld_32_opt -o conftest conftest.o > /dev/null 2>&1; then
  	   gcc_cv_as_ix86_tls_get_addr_via_got=yes
  	 fi
  	 rm -f conftest])
--- 5130,5139 ----
  	.byte 0'
      gcc_GAS_CHECK_FEATURE([calling ___tls_get_addr via GOT],
          gcc_cv_as_ix86_tls_get_addr_via_got,
! 	[$as_32_opt],
  	[$conftest_s],
  	[if test x$gcc_cv_ld != x \
! 	    && $gcc_cv_ld $ld_32_opt -o conftest conftest.o > /dev/null 2>&1; then
  	   gcc_cv_as_ix86_tls_get_addr_via_got=yes
  	 fi
  	 rm -f conftest])
*************** LCF0:
*** 5287,5299 ****
  	  [Define if your assembler supports .gnu_attribute.])])
  
      gcc_GAS_CHECK_FEATURE([prologue entry point marker support],
!       gcc_cv_as_powerpc_entry_markers,-a64 --fatal-warnings,
        [ .reloc .,R_PPC64_ENTRY; nop],,
        [AC_DEFINE(HAVE_AS_ENTRY_MARKERS, 1,
  	  [Define if your assembler supports the R_PPC64_ENTRY relocation.])])
  
      gcc_GAS_CHECK_FEATURE([plt sequence marker support],
!       gcc_cv_as_powerpc_pltseq_markers,-a32 --fatal-warnings,
        [ .reloc .,R_PPC_PLTSEQ; nop],,
        [AC_DEFINE(HAVE_AS_PLTSEQ, 1,
  	  [Define if your assembler supports R_PPC*_PLTSEQ relocations.])])
--- 5245,5257 ----
  	  [Define if your assembler supports .gnu_attribute.])])
  
      gcc_GAS_CHECK_FEATURE([prologue entry point marker support],
!       gcc_cv_as_powerpc_entry_markers,-a64 $fw_as_opt,
        [ .reloc .,R_PPC64_ENTRY; nop],,
        [AC_DEFINE(HAVE_AS_ENTRY_MARKERS, 1,
  	  [Define if your assembler supports the R_PPC64_ENTRY relocation.])])
  
      gcc_GAS_CHECK_FEATURE([plt sequence marker support],
!       gcc_cv_as_powerpc_pltseq_markers,-a32 $fw_as_opt,
        [ .reloc .,R_PPC_PLTSEQ; nop],,
        [AC_DEFINE(HAVE_AS_PLTSEQ, 1,
  	  [Define if your assembler supports R_PPC*_PLTSEQ relocations.])])
*************** LCF0:
*** 5369,5375 ****
      fi
  
      gcc_GAS_CHECK_FEATURE([.micromips support],
!       gcc_cv_as_micromips_support,[--fatal-warnings],
        [.set micromips],,
        [AC_DEFINE(HAVE_GAS_MICROMIPS, 1,
            [Define if your assembler supports the .set micromips directive])])
--- 5327,5333 ----
      fi
  
      gcc_GAS_CHECK_FEATURE([.micromips support],
!       gcc_cv_as_micromips_support,[$fw_as_opt],
        [.set micromips],,
        [AC_DEFINE(HAVE_GAS_MICROMIPS, 1,
            [Define if your assembler supports the .set micromips directive])])
*************** x:
*** 5570,5576 ****
  		[Define if your assembler supports -mrelax option.])])
      gcc_GAS_CHECK_FEATURE([conditional branch relaxation support],
        gcc_cv_as_loongarch_cond_branch_relax,
!       [--fatal-warnings],
        [a:
         .rept 32769
         nop
--- 5528,5534 ----
  		[Define if your assembler supports -mrelax option.])])
      gcc_GAS_CHECK_FEATURE([conditional branch relaxation support],
        gcc_cv_as_loongarch_cond_branch_relax,
!       [$fw_as_opt],
        [a:
         .rept 32769
         nop
*************** main:
*** 6217,6226 ****
  ptr:
  	.quad	a_glob
  EOF
!       if $gcc_cv_as --64 -o conftest1.o conftest1.s > /dev/null 2>&1 \
!          && $gcc_cv_ld -shared -melf_x86_64 -o conftest1.so conftest1.o > /dev/null 2>&1 \
!          && $gcc_cv_as --64 -o conftest2.o conftest2.s > /dev/null 2>&1 \
!          && $gcc_cv_ld -pie -melf_x86_64 -o conftest conftest2.o conftest1.so > /dev/null 2>&1; then
          gcc_cv_ld_pie_copyreloc=yes
        fi
        rm -f conftest conftest1.so conftest1.o conftest2.o conftest1.s conftest2.s
--- 6175,6184 ----
  ptr:
  	.quad	a_glob
  EOF
!       if $gcc_cv_as $as_64_opt -o conftest1.o conftest1.s > /dev/null 2>&1 \
!          && $gcc_cv_ld -shared $ld_64_opt -o conftest1.so conftest1.o > /dev/null 2>&1 \
!          && $gcc_cv_as $as_64_opt -o conftest2.o conftest2.s > /dev/null 2>&1 \
!          && $gcc_cv_ld -pie $ld_64_opt -o conftest conftest2.o conftest1.so > /dev/null 2>&1; then
          gcc_cv_ld_pie_copyreloc=yes
        fi
        rm -f conftest conftest1.so conftest1.o conftest2.o conftest1.s conftest2.s
diff -Nrcpad gcc-16-20260125/gcc/cp/ChangeLog gcc-16-20260201/gcc/cp/ChangeLog
*** gcc-16-20260125/gcc/cp/ChangeLog	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/cp/ChangeLog	Sun Feb  1 22:32:07 2026
***************
*** 1,3 ****
--- 1,452 ----
+ 2026-01-31  Nathaniel Shead  <nathanieloshead@gmail.com>
+ 
+ 	PR c++/123557
+ 	PR c++/123738
+ 	* cp-gimplify.cc (cp_fold_maybe_rvalue): Call
+ 	cp_fold_non_odr_use_1 before recursing cp_fold.
+ 	(cp_fold): Pass op0 to cp_fold_non_odr_use_1 when folding a
+ 	reference.  Reapply set_target_expr_eliding on the initializing
+ 	expression of an INIT_EXPR.
+ 
+ 2026-01-31  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR c++/123825
+ 	* cp-tree.h (merge_decl_arguments): Declare.
+ 	* decl.cc (duplicate_decls): Outline DECL_ARGUMENTS handling
+ 	into ...
+ 	(merge_decl_arguments): ... new function.
+ 	* name-lookup.cc (push_local_extern_decl_alias): Call
+ 	merge_decl_arguments.  Don't copy just the first PARM_DECL when
+ 	creating a new alias FUNCTION_DECL.
+ 
+ 2026-01-31  Jason Merrill  <jason@redhat.com>
+ 	    Nathaniel Shead  <nathanieloshead@gmail.com>
+ 
+ 	PR c++/122785
+ 	* decl.cc (maybe_commonize_var): Don't check consteval_only_p.
+ 	(make_rtl_for_nonlocal_decl): Undo make_decl_one_only for
+ 	consteval-only variables.
+ 
+ 2026-01-30  Patrick Palka  <ppalka@redhat.com>
+ 
+ 	PR c++/123845
+ 	PR libstdc++/114865
+ 	* constexpr.cc (build_data_member_initialization): Remove
+ 	C++11-specific recognition of MODIFY_EXPR.
+ 	(check_constexpr_ctor_body): Relax error diagnostic to a
+ 	pedwarn and don't clear DECL_DECLARED_CONSTEXPR_P upon
+ 	error.  Return true if complaining.
+ 
+ 2026-01-30  Marek Polacek  <polacek@redhat.com>
+ 
+ 	* reflect.cc (eval_define_aggregate): Also give an error when
+ 	TYPE_BEING_DEFINED is true for the first argument.  Remove code
+ 	that did the same.
+ 
+ 2026-01-30  Marek Polacek  <polacek@redhat.com>
+ 
+ 	* reflect.cc (eval_can_substitute): Check undeduced_auto_decl after
+ 	resolve_nondeduced_context_or_error.
+ 
+ 2026-01-29  Marek Polacek  <polacek@redhat.com>
+ 
+ 	* reflect.cc (eval_has_template_arguments): Return immediately after
+ 	checking alias_template_specialization_p.
+ 
+ 2026-01-29  Marek Polacek  <polacek@redhat.com>
+ 
+ 	* reflect.cc (eval_type_trait): Assert that finish_trait_expr didn't
+ 	return error_mark_node.
+ 
+ 2026-01-29  Marek Polacek  <polacek@redhat.com>
+ 
+ 	* reflect.cc (class_members_of): Adjust comment.
+ 	(splice): Give an error if the expression doesn't evaluate to
+ 	a REFLECT_EXPR_P.
+ 
+ 2026-01-29  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR c++/123866
+ 	* reflect.cc (eval_annotations_of): Use maybe_get_first_fn.
+ 
+ 2026-01-29  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	* cp-tree.h (build_range_temp): Implement CWG3131 - Value
+ 	categories and types for the range in iterable expansion statements.
+ 	Add bool argument defaulted to false.
+ 	* parser.cc (build_range_temp): Add expansion_stmt_p argument,
+ 	if true build const decltype(auto) __for_range = range_expr instead of
+ 	auto &&__for_range = range_expr.
+ 	(cp_build_range_for_decls): For expansion stmts build __for_range as
+ 	static constexpr decltype(auto) __for_range = (range_expr);
+ 	rather than static constexpr auto &&__for_range = range_expr;.
+ 
+ 2026-01-28  Andrew Pinski  <andrew.pinski@oss.qualcomm.com>
+ 
+ 	PR c++/102846
+ 	PR c/102846
+ 	* name-lookup.cc (lookup_name_fuzzy): Lookup function-like macro and
+ 	notify of misuse there.
+ 
+ 2026-01-28  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR c++/102613
+ 	* parser.cc: Implement C++23 P2246R1 - Character encoding of
+ 	diagnostic text.
+ 	(cp_parser_parenthesized_expression_list): For std attribute
+ 	argument where the first argument is CPP_STRING, ensure the
+ 	string is not translated.
+ 	* semantics.cc: Include c-family/c-pragma.h.
+ 	(cexpr_str::extract): Use cpp_translate_string to translate
+ 	string from ordinary literal encoding to SOURCE_CHARSET.
+ 
+ 2026-01-28  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	* pt.cc (finish_expansion_stmt): Implement part of CWG3044.
+ 	Add to begin decltype(begin - begin){i} with std::ptrdiff_t
+ 	i instead of just i.
+ 
+ 2026-01-28  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR c/101312
+ 	* cp-tree.h (cxx_build_lang_qualified_type): Declare.
+ 	* cp-objcp-common.h (LANG_HOOKS_COPY_LANG_QUALIFIERS): Remove.
+ 	(LANG_HOOKS_BUILD_LANG_QUALIFIED_TYPE): Define.
+ 	* tree.cc (cxx_build_lang_qualified_type): New function.
+ 
+ 2026-01-28  Alex Yesmanchyk  <aliaksandr.yesmanchyk@gmail.com>
+ 	    Jason Merrill  <jason@redhat.com>
+ 
+ 	PR c++/38612
+ 	* typeck2.cc (build_m_component_ref): Improve class mismatch
+ 	diagnostic.
+ 
+ 2026-01-28  vspefs  <vspefs@protonmail.com>
+ 
+ 	* module.cc (trees_out::type_node): Add case for SPLICE_SCOPE.
+ 	(trees_in::tree_node): Add case for SPLICE_SCOPE.
+ 
+ 2026-01-28  Lucas Chollet  <lucas.chollet@free.fr>
+ 	    Jason Merrill  <jason@redhat.com>
+ 
+ 	PR c++/114450
+ 	* lambda.cc (generic_lambda_fn_p): Handle null argument.
+ 	* semantics.cc (finish_id_expression_1): Check for generic lambda.
+ 
+ 2026-01-28  Johannes Altmanninger  <aclopte@gmail.com>
+ 	    Jason Merrill  <jason@redhat.com>
+ 
+ 	* typeck.cc (cp_build_array_ref): Suppress unused-value
+ 	warning for implicit comma expression.
+ 
+ 2026-01-28  Nina Ranns  <dinka.ranns@gmail.com>
+ 	    Iain Sandoe  <iain@sandoe.co.uk>
+ 	    Ville Voutilainen  <ville.voutilainen@gmail.com>
+ 
+ 	* call.cc (build_cxx_call): Where enabled, wrap calls to
+ 	functions with contract specifiers.
+ 	* contracts.cc (enum contract_match_kind): Move to contracts
+ 	header.
+ 	(build_contract_condition_function): Copy caller-side wrapper
+ 	state.
+ 	(set_contract_wrapper_function, get_contract_wrapper_function,
+ 	get_orig_func_for_wrapper, contracts_fixup_cdtorname,
+ 	build_contract_wrapper_function,
+ 	get_or_create_contract_wrapper_function): New.
+ 	(start_function_contracts): Handle caller-side wrappers.
+ 	(maybe_apply_function_contracts): Likewise.
+ 	(copy_and_remap_contracts): Likewise.
+ 	(should_contract_wrap_call, maybe_contract_wrap_call,
+ 	define_contract_wrapper_func, emit_contract_wrapper_func): New.
+ 	(finish_function_contracts): Handle caller-side wrappers.
+ 	(get_src_loc_impl_ptr): Likewise.
+ 	* contracts.h (DECL_IS_WRAPPER_FN_P): New.
+ 	(enum contract_match_kind): Moved from contracts.cc.
+ 	(copy_and_remap_contracts): Allow selection on the specific
+ 	contract kind.
+ 	(maybe_contract_wrap_call, emit_contract_wrapper_func): New.
+ 	(set_decl_contracts): Delete dead code.
+ 	* cp-tree.h (struct lang_decl_fn): Add wrapper function bit.
+ 	(DECL_CONTRACT_WRAPPER): New.
+ 	* decl2.cc (c_parse_final_cleanups): Emit wrappers.
+ 
+ 2026-01-28  Nina Ranns  <dinka.ranns@gmail.com>
+ 	    Iain Sandoe  <iain@sandoe.co.uk>
+ 	    Ville Voutilainen  <ville.voutilainen@gmail.com>
+ 
+ 	* contracts.cc (handle_contracts_p): Check that we are
+ 	handling an original function, not an outlined check.
+ 	(set_precondition_function, set_postcondition_function,
+ 	get_orig_for_outlined, contracts_fixup_name,
+ 	build_contract_condition_function,
+ 	build_precondition_function, build_postcondition_function,
+ 	build_contract_function_decls): New.
+ 	(start_function_contracts): Update for the case that we
+ 	outline the contract checks.
+ 	(build_arg_list, build_thunk_like_call,
+ 	add_pre_condition_fn_call,
+ 	get_postcondition_result_parameter,
+ 	add_post_condition_fn_call): New.
+ 	(apply_preconditions): Allow outlined checks.
+ 	(apply_postconditions): Likewise.
+ 	(get_precondition_function, get_postcondition_function,
+ 	set_contract_functions, remap_and_emit_conditions,
+ 	finish_function_contracts): New.
+ 	(get_src_loc_impl_ptr): Handle outlined checks.
+ 	(build_contract_check): Likewise.
+ 	* contracts.h (DECL_PRE_FN, DECL_POST_FN,
+ 	DECL_IS_PRE_FN_P, DECL_IS_POST_FN_P,
+ 	get_precondition_function, get_postcondition_function,
+ 	get_orig_for_outlined, finish_function_contracts,
+ 	set_contract_functions): New.
+ 	* cp-tree.h (enum lang_contract_helper): New.
+ 	(struct lang_decl_fn): Add contract helper enum.
+ 	(CONTRACT_HELPER): New.
+ 	(mangle_decl_string): New.
+ 	* decl.cc (finish_function): Emit outlined checks when
+ 	in use.
+ 	* module.cc (trees_out::fn_parms_init): Stream pre and post
+ 	outlined checks.
+ 	(trees_in::fn_parms_init): Reload pre and post outlined checks.
+ 	(check_mergeable_decl): Handle pre and post outlined functions.
+ 	(module_state_config::get_dialect): Add contracts dialect.
+ 
+ 2026-01-28  Nina Ranns  <dinka.ranns@gmail.com>
+ 	    Iain Sandoe  <iain@sandoe.co.uk>
+ 
+ 	* contracts.cc (view_as_const, constify_contract_access,
+ 	set_parm_used_in_post, check_param_in_postcondition,
+ 	parm_used_in_post_p, check_postconditions_in_redecl): New.
+ 	(check_redecl_contract): Handle constification.
+ 	* contracts.h (constify_contract_access, view_as_const,
+ 	contract_const_wrapper_p, strip_contract_const_wrapper): New.
+ 	* cp-tree.h: Update tree flag usage comment.
+ 	* lambda.cc (build_capture_proxy): Handle constification.
+ 	* parser.cc (cp_parser_late_contract_condition, cp_parser_contract_assert,
+ 	cp_parser_function_contract_specifier): Likewise.
+ 	* pt.cc (tsubst_function_decl, tsubst_expr): Likewise.
+ 	* semantics.cc (finish_id_expression_1, finish_decltype_type): Likewise.
+ 
+ 2026-01-28  Nina Ranns  <dinka.ranns@gmail.com>
+ 	    Iain Sandoe  <iain@sandoe.co.uk>
+ 
+ 	* contracts.cc (__tu_terminate_wrapper): New.
+ 	(build_terminate_wrapper): New.
+ 	(declare_terminate_wrapper): New.
+ 	(maybe_emit_violation_handler_wrappers): Build a no-ipa wrapper
+ 	for terminating contract violations if required.
+ 
+ 2026-01-28  Iain Sandoe  <iain@sandoe.co.uk>
+ 	    Nina Ranns  <dinka.ranns@gmail.com>
+ 	    Ville Voutilainen  <ville.voutilainen@gmail.com>
+ 
+ 	* class.cc (check_for_override): Diagnose attemtps to add contracts to
+ 	virtual functions.
+ 	* constexpr.cc (cxx_eval_builtin_function_call): Handle
+ 	observable_checkpoints emitted for contracts.
+ 	(cxx_eval_constant_expression): Check we do not see contract assertions
+ 	here...
+ 	(potential_constant_expression_1): ... but that we do here.
+ 	* contracts.cc: Implement base C++26 P2600R14 contracts.
+ 	* contracts.h: Likewise.
+ 	* cp-gimplify.cc (cp_genericize_r): Lower contract assertions to control
+ 	flow and calls (where required) to the violation handler.
+ 	(fold_builtin_source_location): Use revised source_location impl.
+ 	constructor.
+ 	(build_source_location_impl): Split out the core of the constructor of
+ 	source_location so that it can be re-used from the contracts code.
+ 	* cp-tree.def (ASSERTION_STMT, PRECONDITION_STMT,
+ 	POSTCONDITION_STMT): Revise to allow space for specifying a semantic,
+ 	an assertion kind, and (where required) a source location.
+ 	* cp-tree.h (enum cp_tree_index, builtin_contract_violation_type): Add
+ 	the contract violation object type.
+ 	(struct saved_scope): Add a contracts class pointer.
+ 	(processing_postcondition, contract_class_ptr): New.
+ 	(struct cp_declarator): Add contract_specifiers.
+ 	(build_call_a_1): New.
+ 	(build_source_location_impl): New.
+ 	* decl.cc (duplicate_decls): Check function contract specifiers on
+ 	redeclarations.  Handle contract specifiers on instantiations.
+ 	(cxx_init_decl_processing): Initialise the terminate function since
+ 	this can be called from contracts even when exception processing is
+ 	disabled.  Build the contract violation object layout.
+ 	(start_decl): Handle checking contract postcondition identifiers.
+ 	(grokfndecl): Handle function contract specifiers.
+ 	(grokdeclarator): Likewise.
+ 	(start_preparsed_function): Start function contracts where needed.
+ 	(finish_function): Emit contract specifier AST corresponding to the
+ 	checked contracts.
+ 	* decl2.cc (c_parse_final_cleanups): Emit helpers for contract
+ 	violation handler calls.
+ 	* lex.cc (cxx_init): Add keyword warning for contract_assert.
+ 	* parser.cc (make_call_declarator): Add contract specifiers.
+ 	(unparsed_contracts): New.
+ 	(cp_parser_lambda_introducer): Allow contract specifier lambdas to have
+ 	a capture default.
+ 	(cp_parser_lambda_declarator_opt): Parse function contract specifiers.
+ 	(make_dummy_lambda_op): Account for contract specifiers in declarator.
+ 	(cp_parser_lambda_body): We have to ensure that deferred contracts are
+ 	parsed before we finish the lambda.
+ 	(cp_parser_statement): Handle contract_assert and diagnostics for
+ 	misplaced pre and post conditions.
+ 	(attr_chainon): Make this defensive against being passed a missing
+ 	attribute list.
+ 	(cp_parser_using_directive): Use attr_chainon instead of chainon.
+ 	(contract_attribute_p): New.
+ 	(cp_parser_init_declarator): Handle contract specifier names in
+ 	attributes.
+ 	(cp_parser_direct_declarator): Rename attrs to std_attrs for these.
+ 	(cp_parser_type_specifier_seq): Allow for function contract specifiers.
+ 	(cp_parser_class_specifier): Handle deferred parsing for function
+ 	contract specifiers
+ 	(cp_next_tokens_can_be_contract_attribute_p): True if this can be
+ 	a function contract specifier (which appear in the same position
+ 	as the attribute variant).
+ 	(cp_next_tokens_can_be_std_attribute_p): Allow for contracts.
+ 	(cp_nth_tokens_can_be_std_attribute_p): Likewise.
+ 	(cp_next_tokens_can_be_attribute_p): Likewise.
+ 	(cp_parser_late_contract_condition, cp_parser_late_contracts,
+ 	cp_parser_contract_assert, cp_parser_function_contract_specifier,
+ 	cp_parser_function_contract_specifier_seq): New.
+ 	(cp_parser_skip_std_attribute_spec_seq): Handle contracts case.
+ 	(cp_parser_skip_attributes_opt): Likewise.
+ 	(cp_parser_save_default_args): Handle unparsed contract specs.
+ 	* pt.cc (check_explicit_specialization): Handle removing contract
+ 	specifiers from instances.
+ 	(tsubst_contract, tsubst_contract_attribute,
+ 	tsubst_contract_attributes): New.
+ 	(tsubst_function_decl): Set contract specs. on substituted func.
+ 	(tsubst_stmt): Handle contract_assert.
+ 	(tsubst_expr): Allow for uses of postcondition uses of parm names.
+ 	(regenerate_decl_from_template): Handle function contract specs.
+ 	* semantics.cc (set_one_cleanup_loc): Add a location to
+ 	postcondition specifiers.
+ 	(finish_non_static_data_member): Diagnose bad uses of members
+ 	in contract specifiers.
+ 	(finish_this_expr): Diagnose invalid use of this in contract
+ 	specifiers.
+ 	(process_outer_var_ref): Allow use of params in contract specs.
+ 	(finish_id_expression_1): Likewise.
+ 	(apply_deduced_return_type): Maybe update postconditions when
+ 	the return type is changed.
+ 	* tree.cc (cp_tree_equal): Handle special cases when comparing
+ 	contracts.
+ 
+ 2026-01-28  Iain Sandoe  <iain@sandoe.co.uk>
+ 
+ 	* cp-tree.h (processing_contract_condition): New.
+ 	* name-lookup.cc (cp_binding_level_descriptor): Add contract scope.
+ 	(begin_scope): Likewise.
+ 	* name-lookup.h (enum scope_kind): Add sk_contract.
+ 
+ 2026-01-28  Iain Sandoe  <iain@sandoe.co.uk>
+ 	    Nina Ranns  <dinka.ranns@gmail.com>
+ 
+ 	* contracts.cc: Remove all C++2a contracts code.
+ 	* contracts.h: Likewise.
+ 	* coroutines.cc (coro_build_actor_or_destroy_function): Remove
+ 	unused contracts references.
+ 	* cp-gimplify.cc (cp_genericize_r): Remove C++2a contracts
+ 	implementation.
+ 	* cp-objcp-common.cc (cp_handle_option): Likewise.
+ 	* cp-tree.h: Remove C++2a contracts code.
+ 	* decl.cc: Likewise.
+ 	* decl2.cc: Likewise.
+ 	* mangle.cc: Likewise.
+ 	* module.cc: Likewise.
+ 	* parser.cc: Likewise.
+ 	* pt.cc: Likewise.
+ 	* search.cc: Likewise.
+ 	* semantics.cc: Likewise.
+ 	* tree.cc: Likewise.
+ 	* constexpr.cc: Likewise.
+ 
+ 2026-01-27  Nathaniel Shead  <nathanieloshead@gmail.com>
+ 
+ 	PR c++/122609
+ 	PR c++/101140
+ 	* cp-tree.h (visible_from_instantiation_origination): Declare.
+ 	* module.cc: (orig_decl_for_instantiation): New function.
+ 	(path_of_instantiation): Use it.
+ 	(visible_from_instantiation_origination): New function.
+ 	* name-lookup.cc (name_lookup::search_namespace_only): Also find
+ 	names visible at the point the instantiation originated.
+ 
+ 2026-01-27  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	* cp-gimplify.cc (immediate_escalating_function_p): Implement
+ 	CWG3153 - Immediate-escalating defaulted comparison.  Don't check
+ 	special_memfn_p for sfk_none for DECL_DEFAULTED_FNs.
+ 	* decl.cc (grokfndecl): Similarly for initialized == SD_DEFAULTED
+ 	fns.
+ 
+ 2026-01-27  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR c++/123404
+ 	* decl.cc (grokfndecl): Replace bool deletedp argument with
+ 	int initialized.  Test initialized == SD_DELETED instead of deletedp.
+ 	Don't call check_consteval_only_fn for defaulted special member fns.
+ 	(grokdeclarator): Pass initialized rather than
+ 	initialized == SD_DELETED to grokfndecl.
+ 
+ 2026-01-27  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR c++/123578
+ 	* tree.cc (cxx_printable_name_internal): Call lang_decl_name before
+ 	finding the slot to cache it in and repeat search in the cache
+ 	after the call.
+ 
+ 2026-01-27  Patrick Palka  <ppalka@redhat.com>
+ 
+ 	PR c++/123676
+ 	* pt.cc (tsubst_pack_expansion): Relax unsubsituted_packs
+ 	assert to allow !processing_template_decl when args is
+ 	NULL_TREE.
+ 
+ 2026-01-27  Patrick Palka  <ppalka@redhat.com>
+ 
+ 	PR c++/122494
+ 	PR c++/123814
+ 	* constexpr.cc (cxx_eval_outermost_constant_expr): Clear
+ 	uid_sensitive_constexpr_evaluation_value when mce_true.
+ 
+ 2026-01-26  Marek Polacek  <polacek@redhat.com>
+ 
+ 	* reflect.cc (check_splice_expr): Check if process_outer_var_ref
+ 	returned a capture, and give an error if so.
+ 
+ 2026-01-26  Marek Polacek  <polacek@redhat.com>
+ 
+ 	* parser.cc (cp_parser_type_specifier): Adjust comment.
+ 	(cp_parser_type_id_1): Simplify setting of type_alias_p.
+ 	Use nullptr instead of NULL.
+ 
+ 2026-01-26  Marek Polacek  <polacek@redhat.com>
+ 
+ 	PR c++/123620
+ 	* reflect.cc (can_extract_member_or_function_p): Also check
+ 	fnptr_conv_p.
+ 	(extract_member_or_function): Call perform_implicit_conversion.
+ 
+ 2026-01-26  Nathaniel Shead  <nathanieloshead@gmail.com>
+ 
+ 	PR c++/123663
+ 	PR c++/123354
+ 	* name-lookup.cc (struct local_state_t): New flag has_cfun.
+ 	(local_state_t::save_and_clear): Set has_cfun, call
+ 	push_function_context iff there's a cfun to save.
+ 	(local_state_t::restore): call pop_function_context if
+ 	has_cfun is set.
+ 	(maybe_push_to_top_level): Delegte push_function_context to
+ 	local_state_t::save_and_clear.
+ 	(maybe_pop_from_top_level): Delegate pop_function_context to
+ 	local_state_t::restore.
+ 
+ 2026-01-25  Iain Sandoe  <iain@sandoe.co.uk>
+ 
+ 	* cp-gimplify.cc (cp_genericize_r): Do not mark STATEMENT_LISTs
+ 	as visited.
+ 
  2026-01-24  Jakub Jelinek  <jakub@redhat.com>
  
  	PR c++/123737
diff -Nrcpad gcc-16-20260125/gcc/cp/call.cc gcc-16-20260201/gcc/cp/call.cc
*** gcc-16-20260125/gcc/cp/call.cc	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/cp/call.cc	Sun Feb  1 22:32:07 2026
*************** along with GCC; see the file COPYING3.
*** 45,50 ****
--- 45,51 ----
  #include "c-family/c-type-mismatch.h"
  #include "tristate.h"
  #include "tree-pretty-print-markup.h"
+ #include "contracts.h" // maybe_contract_wrap_call
  
  /* The various kinds of conversion.  */
  
*************** implicit_conversion_error (location_t lo
*** 4932,4938 ****
  	   && !CP_AGGREGATE_TYPE_P (type))
      error_at (loc, "designated initializers cannot be used with a "
  	      "non-aggregate type %qT", type);
!   else 
      {
        auto_diagnostic_group d;
        if (is_stub_object (expr))
--- 4933,4939 ----
  	   && !CP_AGGREGATE_TYPE_P (type))
      error_at (loc, "designated initializers cannot be used with a "
  	      "non-aggregate type %qT", type);
!   else
      {
        auto_diagnostic_group d;
        if (is_stub_object (expr))
*************** build_cxx_call (tree fn, int nargs, tree
*** 11577,11583 ****
      }
  
    if (VOID_TYPE_P (TREE_TYPE (fn)))
!     return fn;
  
    /* 5.2.2/11: If a function call is a prvalue of object type: if the
       function call is either the operand of a decltype-specifier or the
--- 11578,11584 ----
      }
  
    if (VOID_TYPE_P (TREE_TYPE (fn)))
!     return maybe_contract_wrap_call (fndecl, fn);
  
    /* 5.2.2/11: If a function call is a prvalue of object type: if the
       function call is either the operand of a decltype-specifier or the
*************** build_cxx_call (tree fn, int nargs, tree
*** 11589,11594 ****
--- 11590,11596 ----
        fn = require_complete_type (fn, complain);
        if (fn == error_mark_node)
  	return error_mark_node;
+       fn = maybe_contract_wrap_call (fndecl, fn);
  
        if (MAYBE_CLASS_TYPE_P (TREE_TYPE (fn)))
  	{
*************** build_cxx_call (tree fn, int nargs, tree
*** 11596,11601 ****
--- 11598,11605 ----
  	  maybe_warn_parm_abi (TREE_TYPE (fn), loc);
  	}
      }
+   else
+     fn = maybe_contract_wrap_call (fndecl, fn);
    return convert_from_reference (fn);
  }
  
diff -Nrcpad gcc-16-20260125/gcc/cp/class.cc gcc-16-20260201/gcc/cp/class.cc
*** gcc-16-20260125/gcc/cp/class.cc	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/cp/class.cc	Sun Feb  1 22:32:07 2026
*************** along with GCC; see the file COPYING3.
*** 37,42 ****
--- 37,43 ----
  #include "gimplify.h"
  #include "intl.h"
  #include "asan.h"
+ #include "contracts.h"
  
  /* Id for dumping the class hierarchy.  */
  int class_dump_id;
*************** check_for_override (tree decl, tree ctyp
*** 3254,3259 ****
--- 3255,3264 ----
  
        if (DECL_DESTRUCTOR_P (decl))
  	TYPE_HAS_NONTRIVIAL_DESTRUCTOR (ctype) = true;
+ 
+       if (DECL_HAS_CONTRACTS_P (decl))
+ 	error_at (DECL_SOURCE_LOCATION (decl),
+ 		  "contracts cannot be added to virtual functions");
      }
    else if (DECL_FINAL_P (decl))
      error ("%q+#D marked %<final%>, but is not virtual", decl);
diff -Nrcpad gcc-16-20260125/gcc/cp/constexpr.cc gcc-16-20260201/gcc/cp/constexpr.cc
*** gcc-16-20260125/gcc/cp/constexpr.cc	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/cp/constexpr.cc	Sun Feb  1 22:32:07 2026
*************** build_data_member_initialization (tree t
*** 412,422 ****
      }
    if (TREE_CODE (t) == CONVERT_EXPR)
      t = TREE_OPERAND (t, 0);
!   if (TREE_CODE (t) == INIT_EXPR
!       /* vptr initialization shows up as a MODIFY_EXPR.  In C++14 we only
! 	 use what this function builds for cx_check_missing_mem_inits, and
! 	 assignment in the ctor body doesn't count.  */
!       || (cxx_dialect < cxx14 && TREE_CODE (t) == MODIFY_EXPR))
      {
        member = TREE_OPERAND (t, 0);
        init = break_out_target_exprs (TREE_OPERAND (t, 1));
--- 412,418 ----
      }
    if (TREE_CODE (t) == CONVERT_EXPR)
      t = TREE_OPERAND (t, 0);
!   if (TREE_CODE (t) == INIT_EXPR)
      {
        member = TREE_OPERAND (t, 0);
        init = break_out_target_exprs (TREE_OPERAND (t, 1));
*************** check_constexpr_ctor_body (tree last, tr
*** 578,588 ****
    else if (list != last
  	   && !check_constexpr_ctor_body_1 (last, list))
      ok = false;
!   if (!ok)
      {
!       if (complain)
! 	error ("%<constexpr%> constructor does not have empty body");
!       DECL_DECLARED_CONSTEXPR_P (current_function_decl) = false;
      }
    return ok;
  }
--- 574,584 ----
    else if (list != last
  	   && !check_constexpr_ctor_body_1 (last, list))
      ok = false;
!   if (!ok && complain)
      {
!       pedwarn (input_location, OPT_Wc__14_extensions,
! 	       "%<constexpr%> constructor does not have empty body");
!       ok = true;
      }
    return ok;
  }
*************** public:
*** 1207,1212 ****
--- 1203,1214 ----
    unsigned heap_dealloc_count;
    /* Number of uncaught exceptions.  */
    unsigned uncaught_exceptions;
+   /* A contract statement that failed or was not constant, we only store the
+      first one that fails.  */
+   tree contract_statement;
+   /* [basic.contract.eval]/7.3 if this expression would otherwise be constant
+      then a non-const contract makes the program ill-formed.  */
+   bool contract_condition_non_const;
    /* Some metafunctions aren't dependent just on their arguments, but also
       on various other dependencies, e.g. has_identifier on a function parameter
       reflection can change depending on further declarations of corresponding
*************** public:
*** 1222,1228 ****
    constexpr_global_ctx ()
      : constexpr_ops_count (0), cleanups (NULL), modifiable (nullptr),
        consteval_block (NULL_TREE), heap_dealloc_count (0),
!       uncaught_exceptions (0), metafns_called (false) {}
  
    bool is_outside_lifetime (tree t)
    {
--- 1224,1231 ----
    constexpr_global_ctx ()
      : constexpr_ops_count (0), cleanups (NULL), modifiable (nullptr),
        consteval_block (NULL_TREE), heap_dealloc_count (0),
!       uncaught_exceptions (0), contract_statement (NULL_TREE),
!       contract_condition_non_const (false), metafns_called (false) {}
  
    bool is_outside_lifetime (tree t)
    {
*************** cxx_eval_builtin_function_call (const co
*** 2393,2398 ****
--- 2396,2402 ----
  	break;
        case BUILT_IN_ASAN_POINTER_COMPARE:
        case BUILT_IN_ASAN_POINTER_SUBTRACT:
+       case BUILT_IN_OBSERVABLE_CHKPT:
  	/* These builtins shall be ignored during constant expression
  	   evaluation.  */
  	return void_node;
*************** cxx_eval_constant_expression (const cons
*** 10326,10341 ****
      case PRECONDITION_STMT:
      case POSTCONDITION_STMT:
        {
! 	if (contract_ignored_p (t))
  	  break;
  
! 	if (!cxx_eval_assert (ctx, CONTRACT_CONDITION (t),
! 			      G_("contract predicate is false in "
! 				 "constant expression"),
! 			      EXPR_LOCATION (t), contract_evaluated_p (t),
! 			      non_constant_p, overflow_p))
! 	  *non_constant_p = true;
! 	r = void_node;
        }
        break;
  
--- 10330,10374 ----
      case PRECONDITION_STMT:
      case POSTCONDITION_STMT:
        {
! 	r = void_node;
! 	/* Only record the first fail, and do not go further is the semantic
! 	   is 'ignore'.  */
! 	if (*non_constant_p || ctx->global->contract_statement
! 	    || contract_ignored_p (t))
  	  break;
  
! 	tree cond = CONTRACT_CONDITION (t);
!  	if (!potential_rvalue_constant_expression (cond))
!  	  {
!  	    ctx->global->contract_statement = t;
!  	    ctx->global->contract_condition_non_const = true;
!  	    break;
! 	  }
! 
! 	/* We need to evaluate and stash the result of this here, since whether
! 	   it needs to be reported (and how) depends on whether the containing
! 	   expression is otherwise const.  */
! 	bool ctrct_non_const_p = false;
! 	bool ctrct_overflow_p = false;
! 	tree jmp_target = NULL_TREE;
! 	constexpr_ctx new_ctx = *ctx;
! 	new_ctx.quiet = true;
! 	/* Avoid modification of existing values.  */
! 	modifiable_tracker ms (new_ctx.global);
! 	tree eval =
! 	  cxx_eval_constant_expression (&new_ctx, cond, vc_prvalue,
! 					&ctrct_non_const_p,
! 					&ctrct_overflow_p, &jmp_target);
! 	/* Not a constant.  */
! 	if (ctrct_non_const_p)
!  	  {
!  	    ctx->global->contract_statement = t;
!  	    ctx->global->contract_condition_non_const = true;
!  	    break;
! 	  }
! 	/* Constant, but check failed.  */
! 	if (integer_zerop (eval))
! 	  ctx->global->contract_statement = t;
        }
        break;
  
*************** mark_non_constant (tree t)
*** 10561,10566 ****
--- 10594,10634 ----
    return t;
  }
  
+ /* If we have a successful constant evaluation, now check whether there is
+    a failed or non-constant contract that would invalidate this.  */
+ 
+ static bool
+ check_for_failed_contracts (constexpr_global_ctx *global_ctx)
+ {
+   if (!flag_contracts || !global_ctx->contract_statement)
+     return false;
+ 
+   location_t loc = EXPR_LOCATION (global_ctx->contract_statement);
+   enum diagnostics::kind kind;
+   bool error = false;
+   /* [intro.compliance.general]/2.3.4. */
+   /* [basic.contract.eval]/8. */
+   if (contract_terminating_p (global_ctx->contract_statement))
+     {
+       kind = diagnostics::kind::error;
+       error = true;
+     }
+   else
+     kind = diagnostics::kind::warning;
+ 
+   /* [basic.contract.eval]/7.3 */
+   if (global_ctx->contract_condition_non_const)
+     {
+       emit_diagnostic (kind, loc, 0, "contract condition is not constant");
+       return error;
+     }
+ 
+   /* Otherwise, the evaluation was const, but determined to be false.  */
+   emit_diagnostic (kind, loc, 0,
+ 		   "contract predicate is false in constant expression");
+   return error;
+ }
+ 
  /* ALLOW_NON_CONSTANT is false if T is required to be a constant expression.
     STRICT has the same sense as for constant_value_1: true if we only allow
     conforming C++ constant expressions, or false if we want a constant value
*************** cxx_eval_outermost_constant_expr (tree t
*** 10708,10713 ****
--- 10776,10792 ----
  	r = TARGET_EXPR_INITIAL (r);
      }
  
+   /* uid_sensitive_constexpr_evaluation_value restricts warning-dependent
+      constexpr evaluation to avoid unnecessary template instantiation, and is
+      always done with mce_unknown.  But due to gaps in the restriction logic
+      we may still end up taking an evaluation path that in turn requires
+      manifestly constant evaluation, and such evaluation must not be
+      restricted since it likely has semantic consequences.
+      TODO: Remove/replace the mechanism in GCC 17.  */
+   auto uids = make_temp_override (uid_sensitive_constexpr_evaluation_value);
+   if (ctx.manifestly_const_eval == mce_true)
+     uid_sensitive_constexpr_evaluation_value = false;
+ 
    auto_vec<tree, 16> cleanups;
    global_ctx.cleanups = &cleanups;
  
*************** cxx_eval_outermost_constant_expr (tree t
*** 10909,10915 ****
  
    if (constexpr_dtor)
      {
!       DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (object) = true;
        return r;
      }
  
--- 10988,10997 ----
  
    if (constexpr_dtor)
      {
!       if (check_for_failed_contracts (&global_ctx))
! 	r = mark_non_constant (r);
!       else
!         DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (object) = true;
        return r;
      }
  
*************** cxx_eval_outermost_constant_expr (tree t
*** 10959,10964 ****
--- 11041,11048 ----
    if (location_t loc = EXPR_LOCATION (t))
      protected_set_expr_location (r, loc);
  
+   if (check_for_failed_contracts (&global_ctx))
+     r = mark_non_constant (r);
    return r;
  }
  
*************** potential_constant_expression_1 (tree t,
*** 12721,12729 ****
      case ASSERTION_STMT:
      case PRECONDITION_STMT:
      case POSTCONDITION_STMT:
!       if (!checked_contract_p (get_contract_semantic (t)))
! 	return true;
!       return RECUR (CONTRACT_CONDITION (t), rval);
  
      case LABEL_EXPR:
        t = LABEL_EXPR_LABEL (t);
--- 12805,12813 ----
      case ASSERTION_STMT:
      case PRECONDITION_STMT:
      case POSTCONDITION_STMT:
!       /* Contracts are not supposed to alter this; we have to check that this
! 	 is not violated at a later time.  */
!       return true;
  
      case LABEL_EXPR:
        t = LABEL_EXPR_LABEL (t);
diff -Nrcpad gcc-16-20260125/gcc/cp/contracts.cc gcc-16-20260201/gcc/cp/contracts.cc
*** gcc-16-20260125/gcc/cp/contracts.cc	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/cp/contracts.cc	Sun Feb  1 22:32:07 2026
***************
*** 1,6 ****
! /* Definitions for C++ contract levels
     Copyright (C) 2020-2026 Free Software Foundation, Inc.
!    Contributed by Jeff Chapman II (jchapman@lock3software.com)
  
  This file is part of GCC.
  
--- 1,12 ----
! /* C++ contracts.
! 
     Copyright (C) 2020-2026 Free Software Foundation, Inc.
!    Originally by Jeff Chapman II (jchapman@lock3software.com) for proposed
!    C++20 contracts.
!    Rewritten for C++26 contracts by:
!      Nina Ranns (dinka.ranns@googlemail.com)
!      Iain Sandoe (iain@sandoe.co.uk)
!      Ville Voutilainen (ville.voutilainen@gmail.com).
  
  This file is part of GCC.
  
*************** You should have received a copy of the G
*** 18,1010 ****
  along with GCC; see the file COPYING3.  If not see
  <http://www.gnu.org/licenses/>.  */
  
! /* Design Notes
! 
!    A function is called a "guarded" function if it has pre or post contract
!    attributes. A contract is considered an "active" contract if runtime code is
!    needed for the contract under the current contract configuration.
  
!    pre and post contract attributes are parsed and stored in DECL_ATTRIBUTES.
!    assert contracts are parsed and wrapped in statements. When genericizing, all
!    active and assumed contracts are transformed into an if block. An observed
!    contract:
  
!      [[ pre: v > 0 ]]
  
!    is transformed into:
  
!      if (!(v > 0)) {
!        handle_contract_violation(__pseudo_contract_violation{
! 	 5, // line_number,
! 	 "main.cpp", // file_name,
! 	 "fun", // function_name,
! 	 "v > 0", // comment,
! 	 "default", // assertion_level,
! 	 "default", // assertion_role,
! 	 maybe_continue, // continuation_mode
!        });
!        terminate (); // if never_continue
!      }
  
!    We use an internal type with the same layout as contract_violation rather
!    than try to define the latter internally and somehow deal with its actual
!    definition in a TU that includes <contract>.
  
!    ??? is it worth factoring out the calls to handle_contract_violation and
!    terminate into a local function?
  
!    Assumed contracts use the same implementation as C++23 [[assume]].
  
!    Parsing of pre and post contract conditions need to be deferred when the
!    contracts are attached to a member function. The postcondition identifier
!    cannot be used before the deduced return type of an auto function is used,
!    except when used in a defining declaration in which case they conditions are
!    fully parsed once the body is finished (see cpp2a/contracts-deduced{1,2}.C).
  
!    A list of pre and post contracts can either be repeated in their entirety or
!    completely absent in subsequent declarations. If contract lists appear on two
!    matching declarations, their contracts have to be equivalent. In general this
!    means that anything before the colon have to be token equivalent and the
!    condition must be cp_tree_equal (primarily to allow for parameter renaming).
  
!    Contracts on overrides must match those present on (all of) the overridee(s).
  
!    Template specializations may have their own contracts. If no contracts are
!    specified on the initial specialization they're assumed to be the same as
!    the primary template. Specialization redeclarations must then match either
!    the primary template (if they were unspecified originally), or those
!    specified on the specialization.
  
  
!    For non-cdtors two functions are generated for ease of implementation and to
!    avoid some cases where code bloat may occurr. These are the DECL_PRE_FN and
!    DECL_POST_FN. Each handles checking either the set of pre or post contracts
!    of a guarded function.
  
!      int fun(int v)
!        [[ pre: v > 0 ]]
!        [[ post r: r < 0 ]]
!      {
!        return -v;
!      }
  
!    We implement the checking as follows:
  
!    For functions with no post-conditions we wrap the original function body as
!    follows:
  
!    {
!       handle_pre_condition_checking ();
!       original_function_body ();
!    }
  
!    This implements the intent that the preconditions are processed after the
!    function parameters are initialised but before any other actions.
  
!    For functions with post-conditions:
  
!    if (preconditions_exist)
!      handle_pre_condition_checking ();
!    try
!      {
!        original_function_body ();
!      }
!    finally
!      {
!        handle_post_condition_checking ();
!      }
!    else [only if the function is not marked noexcept(true) ]
!      {
!        ;
!      }
  
!    In this, post-conditions [that might apply to the return value etc.] are
!    evaluated on every non-exceptional edge out of the function.
  
!    FIXME outlining contract checks into separate functions was motivated
!    partly by wanting to call the postcondition function at each return
!    statement, which we no longer do; at this point outlining doesn't seem to
!    have any advantage over emitting the contracts directly in the function
!    body.
  
!    More helpful for optimization might be to make the contracts a wrapper
!    function that could be inlined into the caller, the callee, or both.  */
  
! #include "config.h"
! #include "system.h"
! #include "coretypes.h"
! #include "cp-tree.h"
! #include "stringpool.h"
! #include "diagnostic.h"
! #include "options.h"
! #include "contracts.h"
! #include "tree.h"
! #include "tree-inline.h"
! #include "attribs.h"
! #include "tree-iterator.h"
! #include "print-tree.h"
! #include "stor-layout.h"
! #include "intl.h"
! #include "cgraph.h"
  
! const int max_custom_roles = 32;
! static contract_role contract_build_roles[max_custom_roles] = {
! };
  
! bool valid_configs[CCS_MAYBE + 1][CCS_MAYBE + 1] = {
!   { 0, 0, 0, 0, 0, },
!   { 0, 1, 0, 0, 0, },
!   { 0, 1, 1, 1, 1, },
!   { 0, 1, 1, 1, 1, },
!   { 0, 1, 0, 0, 1, },
! };
  
! static void
! validate_contract_role (contract_role *role)
  {
!   gcc_assert (role);
!   if (!unchecked_contract_p (role->axiom_semantic))
!     error ("axiom contract semantic must be %<assume%> or %<ignore%>");
  
!   if (!valid_configs[role->default_semantic][role->audit_semantic] )
!     warning (0, "the %<audit%> semantic should be at least as strong as "
! 		"the %<default%> semantic");
! }
  
! static contract_semantic
! lookup_concrete_semantic (const char *name)
! {
!   if (strcmp (name, "ignore") == 0)
!     return CCS_IGNORE;
!   if (strcmp (name, "assume") == 0)
!     return CCS_ASSUME;
!   if (strcmp (name, "check_never_continue") == 0
!       || strcmp (name, "never") == 0
!       || strcmp (name, "abort") == 0)
!     return CCS_NEVER;
!   if (strcmp (name, "check_maybe_continue") == 0
!       || strcmp (name, "maybe") == 0)
!     return CCS_MAYBE;
!   error ("'%s' is not a valid explicit concrete semantic", name);
!   return CCS_INVALID;
  }
  
! /* Compare role and name up to either the NUL terminator or the first
!    occurrence of colon.  */
  
  static bool
! role_name_equal (const char *role, const char *name)
  {
!   size_t role_len = strcspn (role, ":");
!   size_t name_len = strcspn (name, ":");
!   if (role_len != name_len)
!     return false;
!   return strncmp (role, name, role_len) == 0;
  }
  
  static bool
! role_name_equal (contract_role *role, const char *name)
  {
!   if (role->name == NULL)
!     return false;
!   return role_name_equal (role->name, name);
  }
  
! static void setup_default_contract_role (bool update = true);
  
! static contract_role *
! get_contract_role (const char *name)
  {
!   for (int i = 0; i < max_custom_roles; ++i)
!     {
!       contract_role *potential = contract_build_roles + i;
!       if (role_name_equal (potential, name))
! 	return potential;
!     }
!   if (role_name_equal (name, "default") || role_name_equal (name, "review"))
      {
!       setup_default_contract_role (false);
!       return get_contract_role (name);
      }
!   return NULL;
  }
  
! static contract_role *
! add_contract_role (const char *name,
! 		   contract_semantic des,
! 		   contract_semantic aus,
! 		   contract_semantic axs,
! 		   bool update = true)
  {
!   for (int i = 0; i < max_custom_roles; ++i)
!     {
!       contract_role *potential = contract_build_roles + i;
!       if (potential->name != NULL
! 	  && !role_name_equal (potential, name))
! 	continue;
!       if (potential->name != NULL && !update)
! 	return potential;
!       potential->name = name;
!       potential->default_semantic = des;
!       potential->audit_semantic = aus;
!       potential->axiom_semantic = axs;
!       return potential;
!     }
!   return NULL;
  }
  
! enum contract_build_level { OFF, DEFAULT, AUDIT };
! static bool flag_contract_continuation_mode = false;
! static bool flag_contract_assumption_mode = true;
! static int flag_contract_build_level = DEFAULT;
  
! static bool contracts_p1332_default = false, contracts_p1332_review = false,
!   contracts_std = false, contracts_p1429 = false;
  
! static contract_semantic
! get_concrete_check ()
  {
!   return flag_contract_continuation_mode ? CCS_MAYBE : CCS_NEVER;
  }
  
! static contract_semantic
! get_concrete_axiom_semantic ()
  {
!   return flag_contract_assumption_mode ? CCS_ASSUME : CCS_IGNORE;
  }
  
! static void
! setup_default_contract_role (bool update)
  {
!   contract_semantic check = get_concrete_check ();
!   contract_semantic axiom = get_concrete_axiom_semantic ();
!   switch (flag_contract_build_level)
!     {
!       case OFF:
! 	add_contract_role ("default", CCS_IGNORE, CCS_IGNORE, axiom, update);
! 	add_contract_role ("review", CCS_IGNORE, CCS_IGNORE, CCS_IGNORE, update);
! 	break;
!       case DEFAULT:
! 	add_contract_role ("default", check, CCS_IGNORE, axiom, update);
! 	add_contract_role ("review", check, CCS_IGNORE, CCS_IGNORE, update);
! 	break;
!       case AUDIT:
! 	add_contract_role ("default", check, check, axiom, update);
! 	add_contract_role ("review", check, check, CCS_IGNORE, update);
! 	break;
!     }
  }
  
! contract_semantic
! map_contract_semantic (const char *ident)
  {
!   if (strcmp (ident, "ignore") == 0)
!     return CCS_IGNORE;
!   else if (strcmp (ident, "assume") == 0)
!     return CCS_ASSUME;
!   else if (strcmp (ident, "check_never_continue") == 0)
!     return CCS_NEVER;
!   else if (strcmp (ident, "check_maybe_continue") == 0)
!     return CCS_MAYBE;
!   return CCS_INVALID;
  }
  
! contract_level
! map_contract_level (const char *ident)
  {
!   if (strcmp (ident, "default") == 0)
!     return CONTRACT_DEFAULT;
!   else if (strcmp (ident, "audit") == 0)
!     return CONTRACT_AUDIT;
!   else if (strcmp (ident, "axiom") == 0)
!     return CONTRACT_AXIOM;
!   return CONTRACT_INVALID;
  }
  
  
! void
! handle_OPT_fcontract_build_level_ (const char *arg)
  {
!   if (contracts_p1332_default || contracts_p1332_review || contracts_p1429)
      {
!       error ("%<-fcontract-build-level=%> cannot be mixed with p1332/p1429");
!       return;
      }
-   else
-     contracts_std = true;
  
!   if (strcmp (arg, "off") == 0)
!     flag_contract_build_level = OFF;
!   else if (strcmp (arg, "default") == 0)
!     flag_contract_build_level = DEFAULT;
!   else if (strcmp (arg, "audit") == 0)
!     flag_contract_build_level = AUDIT;
!   else
!     error ("%<-fcontract-build-level=%> must be off|default|audit");
  
!   setup_default_contract_role ();
  }
  
! void
! handle_OPT_fcontract_assumption_mode_ (const char *arg)
  {
!   if (contracts_p1332_default || contracts_p1332_review || contracts_p1429)
      {
!       error ("%<-fcontract-assumption-mode=%> cannot be mixed with p1332/p1429");
!       return;
      }
-   else
-     contracts_std = true;
  
!   if (strcmp (arg, "on") == 0)
!     flag_contract_assumption_mode = true;
!   else if (strcmp (arg, "off") == 0)
!     flag_contract_assumption_mode = false;
!   else
!     error ("%<-fcontract-assumption-mode=%> must be %<on%> or %<off%>");
  
!   setup_default_contract_role ();
  }
  
! void
! handle_OPT_fcontract_continuation_mode_ (const char *arg)
  {
!   if (contracts_p1332_default || contracts_p1332_review || contracts_p1429)
      {
!       error ("%<-fcontract-continuation-mode=%> cannot be mixed with p1332/p1429");
!       return;
      }
-   else
-     contracts_std = true;
  
!   if (strcmp (arg, "on") == 0)
!     flag_contract_continuation_mode = true;
!   else if (strcmp (arg, "off") == 0)
!     flag_contract_continuation_mode = false;
!   else
!     error ("%<-fcontract-continuation-mode=%> must be %<on%> or %<off%>");
  
!   setup_default_contract_role ();
  }
  
! void
! handle_OPT_fcontract_role_ (const char *arg)
  {
!   const char *name = arg;
!   const char *vals = strchr (name, ':');
!   if (vals == NULL)
      {
!       error ("%<-fcontract-role=%> must be in the form role:semantics");
!       return;
      }
  
!   contract_semantic dess = CCS_INVALID, auss = CCS_INVALID, axss = CCS_INVALID;
!   char *des = NULL, *aus = NULL, *axs = NULL;
!   des = xstrdup (vals + 1);
  
!   aus = strchr (des, ',');
!   if (aus == NULL)
!     {
!       error ("%<-fcontract-role=%> semantics must include default,audit,axiom values");
!       goto validate;
!     }
!   *aus = '\0'; // null terminate des
!   aus = aus + 1; // move past null
  
!   axs = strchr (aus, ',');
!   if (axs == NULL)
!     {
!       error ("%<-fcontract-role=%> semantics must include default,audit,axiom values");
!       goto validate;
!     }
!   *axs = '\0'; // null terminate aus
!   axs = axs + 1; // move past null
  
!   dess = lookup_concrete_semantic (des);
!   auss = lookup_concrete_semantic (aus);
!   axss = lookup_concrete_semantic (axs);
! validate:
!   free (des);
!   if (dess == CCS_INVALID || auss == CCS_INVALID || axss == CCS_INVALID)
!     return;
  
!   bool is_defalult_role = role_name_equal (name, "default");
!   bool is_review_role = role_name_equal (name, "review");
!   bool is_std_role = is_defalult_role || is_review_role;
!   if ((contracts_std && is_std_role) || (contracts_p1429 && is_defalult_role))
!     {
!       error ("%<-fcontract-role=%> cannot be mixed with std/p1429 contract flags");
!       return;
!     }
!   else if (is_std_role)
!     {
!       contracts_p1332_default |= is_defalult_role;
!       contracts_p1332_review |= is_review_role;
!     }
  
!   contract_role *role = add_contract_role (name, dess, auss, axss);
  
!   if (role == NULL)
!     {
!       // TODO: not enough space?
!       error ("%<-fcontract-level=%> too many custom roles");
!       return;
!     }
!   else
!     validate_contract_role (role);
  }
  
  void
! handle_OPT_fcontract_semantic_ (const char *arg)
  {
!   if (!strchr (arg, ':'))
      {
!       error ("%<-fcontract-semantic=%> must be in the form level:semantic");
!       return;
!     }
  
!   if (contracts_std || contracts_p1332_default)
!     {
!       error ("%<-fcontract-semantic=%> cannot be mixed with std/p1332 contract flags");
!       return;
      }
!   contracts_p1429 = true;
  
!   contract_role *role = get_contract_role ("default");
!   if (!role)
      {
!       error ("%<-fcontract-semantic=%> cannot find default role");
!       return;
      }
  
!   const char *semantic = strchr (arg, ':') + 1;
!   contract_semantic sem = lookup_concrete_semantic (semantic);
!   if (sem == CCS_INVALID)
!     return;
  
!   if (strncmp ("default:", arg, 8) == 0)
!     role->default_semantic = sem;
!   else if (strncmp ("audit:", arg, 6) == 0)
!     role->audit_semantic = sem;
!   else if (strncmp ("axiom:", arg, 6) == 0)
!     role->axiom_semantic = sem;
!   else
!     error ("%<-fcontract-semantic=%> level must be default, audit, or axiom");
!   validate_contract_role (role);
  }
  
! /* Returns the default role.  */
  
! static contract_role *
! get_default_contract_role ()
  {
!   return get_contract_role ("default");
  }
  
! /* Convert a contract CONFIG into a contract_mode.  */
  
! static contract_mode
! contract_config_to_mode (tree config)
  {
!   if (config == NULL_TREE)
!     return contract_mode (CONTRACT_DEFAULT, get_default_contract_role ());
  
!   /* TREE_LIST has TREE_VALUE is a level and TREE_PURPOSE is role.  */
!   if (TREE_CODE (config) == TREE_LIST)
      {
!       contract_role *role = NULL;
!       if (TREE_PURPOSE (config))
! 	role = get_contract_role (IDENTIFIER_POINTER (TREE_PURPOSE (config)));
!       if (!role)
! 	role = get_default_contract_role ();
  
!       contract_level level =
! 	map_contract_level (IDENTIFIER_POINTER (TREE_VALUE (config)));
!       return contract_mode (level, role);
      }
  
!   /* Literal semantic.  */
!   gcc_assert (TREE_CODE (config) == IDENTIFIER_NODE);
!   contract_semantic semantic =
!     map_contract_semantic (IDENTIFIER_POINTER (config));
!   return contract_mode (semantic);
! }
  
! /* Convert a contract's config into a concrete semantic using the current
!    contract semantic mapping.  */
  
! static contract_semantic
! compute_concrete_semantic (tree contract)
! {
!   contract_mode mode = contract_config_to_mode (CONTRACT_MODE (contract));
!   /* Compute the concrete semantic for the contract.  */
!   if (!flag_contract_mode)
!     /* If contracts are off, treat all contracts as ignore.  */
!     return CCS_IGNORE;
!   else if (mode.kind == contract_mode::cm_invalid)
!     return CCS_INVALID;
!   else if (mode.kind == contract_mode::cm_explicit)
!     return mode.get_semantic ();
    else
      {
!       gcc_assert (mode.get_role ());
!       gcc_assert (mode.get_level () != CONTRACT_INVALID);
!       contract_level level = mode.get_level ();
!       contract_role *role = mode.get_role ();
!       if (level == CONTRACT_DEFAULT)
! 	return role->default_semantic;
!       else if (level == CONTRACT_AUDIT)
! 	return role->audit_semantic;
!       else if (level == CONTRACT_AXIOM)
! 	return role->axiom_semantic;
      }
!   gcc_assert (false);
  }
  
! /* Return true if any contract in CONTRACT_ATTRs is not yet parsed.  */
  
! bool
! contract_any_deferred_p (tree contract_attr)
  {
!   for (; contract_attr; contract_attr = CONTRACT_CHAIN (contract_attr))
!     if (CONTRACT_CONDITION_DEFERRED_P (CONTRACT_STATEMENT (contract_attr)))
!       return true;
!   return false;
  }
  
! /* Returns true if all attributes are contracts.  */
  
! bool
! all_attributes_are_contracts_p (tree attributes)
  {
!   for (; attributes; attributes = TREE_CHAIN (attributes))
!     if (!cxx_contract_attribute_p (attributes))
!       return false;
!   return true;
  }
  
! /* Mark most of a contract as being invalid.  */
  
! tree
! invalidate_contract (tree t)
  {
!   if (TREE_CODE (t) == POSTCONDITION_STMT && POSTCONDITION_IDENTIFIER (t))
!     POSTCONDITION_IDENTIFIER (t) = error_mark_node;
!   CONTRACT_CONDITION (t) = error_mark_node;
!   CONTRACT_COMMENT (t) = error_mark_node;
!   return t;
  }
  
! /* Returns an invented parameter declration of the form 'TYPE ID' for the
!    purpose of parsing the postcondition.
  
!    We use a PARM_DECL instead of a VAR_DECL so that tsubst forces a lookup
!    in local specializations when we instantiate these things later.  */
  
! tree
! make_postcondition_variable (cp_expr id, tree type)
! {
!   if (id == error_mark_node)
!     return id;
  
!   tree decl = build_lang_decl (PARM_DECL, id, type);
!   DECL_ARTIFICIAL (decl) = true;
!   DECL_SOURCE_LOCATION (decl) = id.get_location ();
  
!   pushdecl (decl);
!   return decl;
  }
  
! /* As above, except that the type is unknown.  */
  
! tree
! make_postcondition_variable (cp_expr id)
  {
!   return make_postcondition_variable (id, make_auto ());
  }
  
! /* Check that the TYPE is valid for a named postcondition variable. Emit a
!    diagnostic if it is not.  Returns TRUE if the result is OK and false
!    otherwise.  */
  
! bool
! check_postcondition_result (tree decl, tree type, location_t loc)
  {
!   /* Do not be confused by targetm.cxx.cdtor_return_this ();
!      conceptually, cdtors have no return value.  */
!   if (VOID_TYPE_P (type)
!       || DECL_CONSTRUCTOR_P (decl)
!       || DECL_DESTRUCTOR_P (decl))
!     {
!       error_at (loc,
! 		DECL_CONSTRUCTOR_P (decl)
! 		? G_("constructor does not return a value to test")
! 		: DECL_DESTRUCTOR_P (decl)
! 		? G_("destructor does not return a value to test")
! 		: G_("function does not return a value to test"));
!       return false;
!     }
! 
!   return true;
  }
  
! /* Instantiate each postcondition with the return type to finalize the
!    attribute.  */
  
! void
! rebuild_postconditions (tree decl)
  {
!   tree type = TREE_TYPE (TREE_TYPE (decl));
!   tree attributes = DECL_CONTRACTS (decl);
  
!   for (; attributes ; attributes = TREE_CHAIN (attributes))
!     {
!       if (!cxx_contract_attribute_p (attributes))
! 	continue;
!       tree contract = TREE_VALUE (TREE_VALUE (attributes));
!       if (TREE_CODE (contract) != POSTCONDITION_STMT)
! 	continue;
!       tree condition = CONTRACT_CONDITION (contract);
  
!       /* If any conditions are deferred, they're all deferred.  Note that
! 	 we don't have to instantiate postconditions in that case because
! 	 the type is available through the declaration.  */
!       if (TREE_CODE (condition) == DEFERRED_PARSE)
! 	return;
  
!       tree oldvar = POSTCONDITION_IDENTIFIER (contract);
!       if (!oldvar)
! 	continue;
  
!       /* Always update the context of the result variable so that it can
! 	 be remapped by remap_contracts.  */
!       DECL_CONTEXT (oldvar) = decl;
  
!       /* If the return type is undeduced, defer until later.  */
!       if (TREE_CODE (type) == TEMPLATE_TYPE_PARM)
! 	return;
  
!       /* Check the postcondition variable.  */
!       location_t loc = DECL_SOURCE_LOCATION (oldvar);
!       if (!check_postcondition_result (decl, type, loc))
  	{
! 	  invalidate_contract (contract);
! 	  continue;
  	}
  
!       /* "Instantiate" the result variable using the known type.  Also update
! 	  the context so the inliner will actually remap this the parameter when
! 	  generating contract checks.  */
!       tree newvar = copy_node (oldvar);
!       TREE_TYPE (newvar) = type;
  
!       /* Make parameters and result available for substitution.  */
!       local_specialization_stack stack (lss_copy);
!       for (tree t = DECL_ARGUMENTS (decl); t != NULL_TREE; t = TREE_CHAIN (t))
! 	register_local_identity (t);
!       register_local_specialization (newvar, oldvar);
  
!       ++processing_contract_condition;
!       condition = tsubst_expr (condition, make_tree_vec (0),
! 			       tf_warning_or_error, decl);
!       --processing_contract_condition;
  
!       /* Update the contract condition and result.  */
!       POSTCONDITION_IDENTIFIER (contract) = newvar;
!       CONTRACT_CONDITION (contract) = finish_contract_condition (condition);
!     }
  }
  
  static tree
! build_comment (cp_expr condition)
  {
!   /* Try to get the actual source text for the condition; if that fails pretty
!      print the resulting tree.  */
!   char *str = get_source_text_between (global_dc->get_file_cache (),
! 				       condition.get_start (),
! 				       condition.get_finish ());
!   if (!str)
      {
!       /* FIXME cases where we end up here
! 	 #line macro usage (oof)
! 	 contracts10.C
! 	 contracts11.C  */
!       const char *str = expr_to_string (condition);
!       return build_string_literal (strlen (str) + 1, str);
      }
! 
!   tree t = build_string_literal (strlen (str) + 1, str);
!   free (str);
!   return t;
  }
  
! /* Build a contract statement.  */
! 
! tree
! grok_contract (tree attribute, tree mode, tree result, cp_expr condition,
! 	       location_t loc)
  {
!   if (condition == error_mark_node)
!     return error_mark_node;
  
!   tree_code code;
!   if (is_attribute_p ("assert", attribute))
!     code = ASSERTION_STMT;
!   else if (is_attribute_p ("pre", attribute))
!     code = PRECONDITION_STMT;
!   else if (is_attribute_p ("post", attribute))
!     code = POSTCONDITION_STMT;
!   else
!     gcc_unreachable ();
  
!   /* Build the contract. The condition is added later.  In the case that
!      the contract is deferred, result an plain identifier, not a result
!      variable.  */
!   tree contract;
!   tree type = void_type_node;
!   if (code != POSTCONDITION_STMT)
!     contract = build3_loc (loc, code, type, mode, NULL_TREE, NULL_TREE);
!   else
!     contract = build4_loc (loc, code, type, mode, NULL_TREE, NULL_TREE, result);
  
!   /* Determine the concrete semantic.  */
!   set_contract_semantic (contract, compute_concrete_semantic (contract));
  
!   /* If the contract is deferred, don't do anything with the condition.  */
!   if (TREE_CODE (condition) == DEFERRED_PARSE)
!     {
!       CONTRACT_CONDITION (contract) = condition;
!       return contract;
!     }
  
!   /* Generate the comment from the original condition.  */
!   CONTRACT_COMMENT (contract) = build_comment (condition);
  
!   /* The condition is converted to bool.  */
!   condition = finish_contract_condition (condition);
  
!   if (condition == error_mark_node)
!     return error_mark_node;
  
!   CONTRACT_CONDITION (contract) = condition;
  
!   return contract;
  }
  
! /* Build the contract attribute specifier where IDENTIFIER is one of 'pre',
!    'post' or 'assert' and CONTRACT is the underlying statement.  */
! tree
! finish_contract_attribute (tree identifier, tree contract)
  {
!   if (contract == error_mark_node)
!     return error_mark_node;
  
!   tree attribute = build_tree_list (build_tree_list (NULL_TREE, identifier),
! 				    build_tree_list (NULL_TREE, contract));
  
!   /* Mark the attribute as dependent if the condition is dependent.
  
!      TODO: I'm not sure this is strictly necessary. It's going to be marked as
!      such by a subroutine of cplus_decl_attributes. */
!   tree condition = CONTRACT_CONDITION (contract);
!   if (TREE_CODE (condition) == DEFERRED_PARSE
!       || value_dependent_expression_p (condition))
!     ATTR_IS_DEPENDENT (attribute) = true;
  
!   return attribute;
  }
  
! /* Update condition of a late-parsed contract and postcondition variable,
!    if any.  */
  
! void
! update_late_contract (tree contract, tree result, tree condition)
  {
!   if (TREE_CODE (contract) == POSTCONDITION_STMT)
!     POSTCONDITION_IDENTIFIER (contract) = result;
  
!   /* Generate the comment from the original condition.  */
!   CONTRACT_COMMENT (contract) = build_comment (condition);
  
!   /* The condition is converted to bool.  */
!   condition = finish_contract_condition (condition);
!   CONTRACT_CONDITION (contract) = condition;
  }
  
! /* Return TRUE iff ATTR has been parsed by the front-end as a c++2a contract
!    attribute. */
  
! bool
! cxx_contract_attribute_p (const_tree attr)
  {
!   if (attr == NULL_TREE
!       || TREE_CODE (attr) != TREE_LIST)
!     return false;
  
!   if (!TREE_PURPOSE (attr) || TREE_CODE (TREE_PURPOSE (attr)) != TREE_LIST)
!     return false;
!   if (!TREE_VALUE (attr) || TREE_CODE (TREE_VALUE (attr)) != TREE_LIST)
!     return false;
!   if (!TREE_VALUE (TREE_VALUE (attr)))
!     return false;
  
!   return (TREE_CODE (TREE_VALUE (TREE_VALUE (attr))) == PRECONDITION_STMT
!       || TREE_CODE (TREE_VALUE (TREE_VALUE (attr))) == POSTCONDITION_STMT
!       || TREE_CODE (TREE_VALUE (TREE_VALUE (attr))) == ASSERTION_STMT);
  }
  
! /* True if ATTR is an assertion.  */
  
! bool
! cp_contract_assertion_p (const_tree attr)
  {
!   /* This is only an assertion if it is a valid cxx contract attribute and the
!      statement is an ASSERTION_STMT.  */
!   return cxx_contract_attribute_p (attr)
!     && TREE_CODE (CONTRACT_STATEMENT (attr)) == ASSERTION_STMT;
  }
  
! /* Remove all c++2a style contract attributes from the DECL_ATTRIBUTEs of the
!    FUNCTION_DECL FNDECL.  */
  
! void
! remove_contract_attributes (tree fndecl)
  {
!   if (!flag_contracts)
!     return;
  
!   tree list = NULL_TREE;
!   for (tree p = DECL_ATTRIBUTES (fndecl); p; p = TREE_CHAIN (p))
!     if (!cxx_contract_attribute_p (p))
!       {
! 	tree nl = copy_node (p);
! 	TREE_CHAIN (nl) = list;
! 	list = nl;
!       }
!   DECL_ATTRIBUTES (fndecl) = nreverse (list);
  }
  
! static tree find_first_non_contract (tree attributes)
  {
!   tree head = attributes;
!   tree p = find_contract (attributes);
  
!   /* There are no contracts.  */
!   if (!p)
!     return head;
  
!   /* There are leading contracts.  */
!   if (p == head)
!     {
!       while (cxx_contract_attribute_p (p))
! 	p = TREE_CHAIN (p);
!       head = p;
!     }
  
!   return head;
  }
  
! /* Remove contracts from ATTRIBUTES.  */
  
! tree splice_out_contracts (tree attributes)
  {
!   tree head = find_first_non_contract (attributes);
!   if (!head)
!     return NULL_TREE;
  
!   /* Splice out remaining contracts.  */
!   tree p = TREE_CHAIN (head);
!   tree q = head;
!   while (p)
!     {
!       if (cxx_contract_attribute_p (p))
! 	{
! 	  /* Skip a sequence of contracts and then link q to the next
! 	     non-contract attribute.  */
! 	  do
! 	    p = TREE_CHAIN (p);
! 	  while (cxx_contract_attribute_p (p));
! 	  TREE_CHAIN (q) = p;
! 	}
!       else
! 	p = TREE_CHAIN (p);
!     }
  
!   return head;
  }
  
! /* Copy contract attributes from NEWDECL onto the attribute list of OLDDECL.  */
  
! void copy_contract_attributes (tree olddecl, tree newdecl)
  {
!   tree attrs = NULL_TREE;
!   for (tree c = DECL_CONTRACTS (newdecl); c; c = TREE_CHAIN (c))
      {
!       if (!cxx_contract_attribute_p (c))
! 	continue;
!       attrs = tree_cons (TREE_PURPOSE (c), TREE_VALUE (c), attrs);
      }
-   attrs = chainon (DECL_ATTRIBUTES (olddecl), nreverse (attrs));
-   DECL_ATTRIBUTES (olddecl) = attrs;
- 
-   /* And update DECL_CONTEXT of the postcondition result identifier.  */
-   rebuild_postconditions (olddecl);
  }
  
! /* Returns the parameter corresponding to the return value of a guarded
!    function D.  Returns NULL_TREE if D has no postconditions or is void.  */
  
! static tree
! get_postcondition_result_parameter (tree d)
  {
!   if (!d || d == error_mark_node)
!     return NULL_TREE;
  
!   if (VOID_TYPE_P (TREE_TYPE (TREE_TYPE (d))))
!     return NULL_TREE;
  
!   tree post = DECL_POST_FN (d);
!   if (!post || post == error_mark_node)
!     return NULL_TREE;
  
!   for (tree arg = DECL_ARGUMENTS (post); arg; arg = TREE_CHAIN (arg))
!     if (!TREE_CHAIN (arg))
!       return arg;
  
!   return NULL_TREE;
! }
  
  
! /* For use with the tree inliner. This preserves non-mapped local variables,
!    such as postcondition result variables, during remapping.  */
  
! static tree
! retain_decl (tree decl, copy_body_data *)
! {
!   return decl;
  }
  
  /* Rewrite the condition of contract in place, so that references to SRC's
     parameters are updated to refer to DST's parameters. The postcondition
     result variable is left unchanged.
  
-    This, along with remap_contracts, are subroutines of duplicate_decls.
     When declarations are merged, we sometimes need to update contracts to
     refer to new parameters.
  
!    If DUPLICATE_P is true, this is called by duplicate_decls to rewrite contacts
!    in terms of a new set of parameters. In this case, we can retain local
!    variables appearing in the contract because the contract is not being
!    prepared for insertion into a new function. Importantly, this preserves the
!    references to postcondition results, which are not replaced during merging.
! 
!    If false, we're preparing to emit the contract condition into the body
!    of a new function, so we need to make copies of all local variables
!    appearing in the contract (e.g., if it includes a lambda expression). Note
!    that in this case, postcondition results are mapped to the last parameter
!    of DST.
! 
!    This is also used to reuse a parent type's contracts on virtual methods.  */
  
  static void
  remap_contract (tree src, tree dst, tree contract, bool duplicate_p)
--- 24,1410 ----
  along with GCC; see the file COPYING3.  If not see
  <http://www.gnu.org/licenses/>.  */
  
! #include "config.h"
! #include "system.h"
! #include "coretypes.h"
! #include "cp-tree.h"
! #include "stringpool.h"
! #include "diagnostic.h"
! #include "options.h"
! #include "contracts.h"
! #include "tree.h"
! #include "tree-inline.h"
! #include "attribs.h"
! #include "tree-iterator.h"
! #include "print-tree.h"
! #include "stor-layout.h"
! #include "intl.h"
! #include "cgraph.h"
! #include "opts.h"
! #include "output.h"
  
! /*  Design notes.
  
!   There are three phases:
!     1. Parsing and semantic checks.
!        Most of the code for this is in the parser, with helpers provided here.
!     2. Emitting contract assertion AST nodes into function bodies.
!        This is initiated from "finish_function ()"
!     3. Lowering the contract assertion AST nodes to control flow, constant
!        data and calls to the violation handler.
!        This is initiated from "cp_genericize ()".
  
!   The organisation of the code in this file is intended to follow those three
!   phases where possible.
  
!   Contract Assertion State
!   ========================
  
!   contract_assert () does not require any special handling and can be
!   represented directly by AST inserted in the function body.
  
!   'pre' and 'post' function contract specifiers require most of the special
!   handling, since they must be tracked across re-declarations of functions and
!   there are contraints on how such specifiers may change in these cases.
  
!   The contracts specification identifies a "first declaration" of any given
!   function - which is the first encountered when parsing a given TU.
!   Subsequent re-declarations may not add or change the function contract
!   specifiers from any introduced on this first declaration.  It is, however,
!   permitted to omit specifiers on re-declarations.
  
!   Since the implementation of GCC's (re-)declarations is a destructive merge
!   we need to keep some state on the side to determine whether the re-declaration
!   rules are met.  In this current design we have chosen not to add another tree
!   to each function decl but, instead, keep a map from function decl to contract
!   specifier state.  In this state we record the 'first declaration' specifiers
!   which are used to validate re-declaration(s) and to report the initial state
!   in diagnostics.
  
!   We need (for example) to compare
!     pre ( x > 2 ) equal to
!     pre ( z > 2 ) when x and z refer to the same function parameter in a
!     re-declaration.
  
!   The mechanism used to determine if two contracts are the same is to compare
!   the folded trees.  This makes use of current compiler machinery, rather than
!   constructing some new AST comparison scheme.  However, it does introduce an
!   additional complexity in that we need to defer such comparison until parsing
!   is complete - and function contract specifiers in class declarations must be
!   deferred parses, since it is also permitted for specifiers to refer to class
!   members.
  
!   When we encounter a definition, the parameter names in a function decl are
!   re-written to match those of the definition (thus the expected names will
!   appear in debug information etc).  At this point, we also need to re-map
!   any function parameter names that appear in function contract specifiers
!   to agree with those of the definition - although we intend to keep the
!   'first declaration' record consistent for diagnostics.
  
+   Since we shared some code from the C++2a contracts implementation, pre and
+   post specifiers are represented by chains of attributes, where the payload
+   of the attribute is an AST node.  However during the parse, these are not
+   inserted into the function bodies, but kept in the decl-keyed state described
+   above.  A future improvement planned here is to store the specifiers using a
+   tree vec instead of the attribute list.
  
!   Emitting contract AST
!   =====================
  
!   When we reach `finish_function ()` and therefore are committed to potentially
!   emitting code for an instance, we build a new variant of the function body
!   with the pre-condition AST inserted before the user's function body, and the
!   post condition AST (if any) linked into the function return.
  
!   Lowering the contract assertion AST
!   ===================================
  
!   In all cases (pre, post, contract_assert) the AST node is lowered to control
!   flow and (potentially) calls to the violation handler and/or termination.
!   This is done during `cp_genericize ()`.  In the current implementation, the
!   decision on the control flow is made on the basis of the setting of a command-
!   line flag that determines a TU-wide contract evaluation semantic, which has
!   the following initial set of behaviours:
  
!     'ignore'	    : contract assertion AST is lowered to 'nothing',
! 		      i.e. omitted.
!     'enforce'	    : contract assertion AST is lowered to a check, if this
! 		      fails a violation handler is called, followed by
! 		      std::terminate().
!     'quick_enforce' : contract assertion AST is lowered to a check, if this
! 		      fails, std::terminate () is called.
!     'observe'	    : contract assertion AST is lowered to a check, if this
! 		      fails, a violation handler is called, the code then
! 		      continues.
  
!   In each case, the "check" might be a simple 'if' (when it is determined that
!   the assertion condition does not throw) or the condition evaluation will be
!   wrapped in a try-catch block that treats any exception thrown when evaluating
!   the check as equivalent to a failed check.  It is noted in the violation data
!   object whether a check failed because of an exception raised in evaluation.
  
!   At present, a simple (but potentially space-inefficient) scheme is used to
!   store constant data objects that represent the read-only data for the
!   violation.  The exact form of this is subject to revision as it represents
!   ABI that must be agreed between implementations (as of this point, that
!   discussion is not yet concluded).  */
  
! /* Contract matching.  */
  
! bool comparing_contracts;
  
! /* True if the contract is valid.  */
  
! static bool
! contract_valid_p (tree contract)
! {
!   return CONTRACT_CONDITION (contract) != error_mark_node;
! }
  
! /* True if the contract specifier is valid.  */
  
! static bool
! contract_specifier_valid_p (tree contract)
! {
!   return contract_valid_p (TREE_VALUE (TREE_VALUE (contract)));
! }
  
! /* Compare the contract conditions of OLD_CONTRACT and NEW_CONTRACT.
!    Returns false if the conditions are equivalent, and true otherwise.  */
  
! static bool
! mismatched_contracts_p (tree old_contract, tree new_contract)
  {
!   /* Different kinds of contracts do not match.  */
!   if (TREE_CODE (old_contract) != TREE_CODE (new_contract))
!     {
!       auto_diagnostic_group d;
!       error_at (EXPR_LOCATION (new_contract),
! 		"mismatched contract specifier in declaration");
!       inform (EXPR_LOCATION (old_contract), "previous contract here");
!       return true;
!     }
  
!   /* A deferred contract tentatively matches.  */
!   if (CONTRACT_CONDITION_DEFERRED_P (new_contract))
!     return false;
  
!   /* Compare the conditions of the contracts.  */
!   tree t1 = cp_fully_fold_init (CONTRACT_CONDITION (old_contract));
!   tree t2 = cp_fully_fold_init (CONTRACT_CONDITION (new_contract));
! 
!   /* Compare the contracts. */
! 
!   bool saved_comparing_contracts = comparing_contracts;
!   comparing_contracts = true;
!   bool matching_p = cp_tree_equal (t1, t2);
!   comparing_contracts = saved_comparing_contracts;
! 
!   if (!matching_p)
!     {
!       auto_diagnostic_group d;
!       error_at (EXPR_LOCATION (CONTRACT_CONDITION (new_contract)),
! 		"mismatched contract condition in declaration");
!       inform (EXPR_LOCATION (CONTRACT_CONDITION (old_contract)),
! 	      "previous contract here");
!       return true;
!     }
! 
!   return false;
  }
  
! /* Compare the contract specifiers of OLDDECL and NEWDECL. Returns true
!    if the contracts match, and false if they differ.  */
  
  static bool
! match_contract_specifiers (location_t oldloc, tree old_contracts,
! 			   location_t newloc, tree new_contracts)
  {
!   /* Contracts only match if they are both specified.  */
!   if (!old_contracts || !new_contracts)
!     return true;
! 
!   /* Compare each contract in turn.  */
!   while (old_contracts && new_contracts)
!     {
!       /* If either contract is ill-formed, skip the rest of the comparison,
! 	 since we've already diagnosed an error.  */
!       if (!contract_specifier_valid_p (new_contracts)
! 	  || !contract_specifier_valid_p (old_contracts))
! 	return false;
! 
!       if (mismatched_contracts_p (CONTRACT_STATEMENT (old_contracts),
! 				  CONTRACT_STATEMENT (new_contracts)))
! 	return false;
!       old_contracts = TREE_CHAIN (old_contracts);
!       new_contracts = TREE_CHAIN (new_contracts);
!     }
! 
!   /* If we didn't compare all specifiers, the contracts don't match.  */
!   if (old_contracts || new_contracts)
!     {
!       auto_diagnostic_group d;
!       error_at (newloc,
! 		"declaration has a different number of contracts than "
! 		"previously declared");
!       inform (oldloc,
! 	      new_contracts
! 	      ? "previous declaration with fewer contracts here"
! 	      : "previous declaration with more contracts here");
!       return false;
!     }
! 
!   return true;
  }
  
+ /* Return true if CONTRACT is checked or assumed under the current build
+    configuration. */
+ 
  static bool
! contract_active_p (tree contract)
  {
!   return get_evaluation_semantic (contract) != CES_IGNORE;
  }
  
! /* True if FNDECL has any checked or assumed contracts whose TREE_CODE is
!    C.  */
  
! static bool
! has_active_contract_condition (tree fndecl, tree_code c)
  {
!   tree as = get_fn_contract_specifiers (fndecl);
!   for (; as != NULL_TREE; as = TREE_CHAIN (as))
      {
!       tree contract = TREE_VALUE (TREE_VALUE (as));
!       if (TREE_CODE (contract) == c && contract_active_p (contract))
! 	return true;
      }
!   return false;
  }
  
! /* True if FNDECL has any checked or assumed preconditions.  */
! 
! static bool
! has_active_preconditions (tree fndecl)
  {
!   return has_active_contract_condition (fndecl, PRECONDITION_STMT);
  }
  
! /* True if FNDECL has any checked or assumed postconditions.  */
  
! static bool
! has_active_postconditions (tree fndecl)
! {
!   return has_active_contract_condition (fndecl, POSTCONDITION_STMT);
! }
  
! /* Return true if any contract in the CONTRACT list is checked or assumed
!    under the current build configuration.  */
! 
! static bool
! contract_any_active_p (tree fndecl)
  {
!   tree as = get_fn_contract_specifiers (fndecl);
!   for (; as; as = TREE_CHAIN (as))
!     if (contract_active_p (TREE_VALUE (TREE_VALUE (as))))
!       return true;
!   return false;
  }
  
! /* Return true if any contract in CONTRACTS is not yet parsed.  */
! 
! bool
! contract_any_deferred_p (tree contracts)
  {
!   for (; contracts; contracts = TREE_CHAIN (contracts))
!     if (CONTRACT_CONDITION_DEFERRED_P (CONTRACT_STATEMENT (contracts)))
!       return true;
!   return false;
  }
  
! /* Returns true if function decl FNDECL has contracts and we need to
!    process them for the purposes of either building caller or definition
!    contract checks.
!    This function does not take into account whether caller or definition
!    side checking is enabled. Those checks will be done from the calling
!    function which will be able to determine whether it is doing caller
!    or definition contract handling.  */
! 
! static bool
! handle_contracts_p (tree fndecl)
  {
!   return (flag_contracts
! 	  && !processing_template_decl
! 	  && (CONTRACT_HELPER (fndecl) == ldf_contract_none)
! 	  && contract_any_active_p (fndecl));
  }
  
! /* For use with the tree inliner. This preserves non-mapped local variables,
!    such as postcondition result variables, during remapping.  */
! 
! static tree
! retain_decl (tree decl, copy_body_data *)
  {
!   return decl;
  }
  
! /* Lookup a name in std::, or inject it.  */
! 
! static tree
! lookup_std_type (tree name_id)
  {
!   tree res_type = lookup_qualified_name
!     (std_node, name_id, LOOK_want::TYPE | LOOK_want::HIDDEN_FRIEND);
! 
!   if (TREE_CODE (res_type) == TYPE_DECL)
!     res_type = TREE_TYPE (res_type);
!   else
!     {
!       push_nested_namespace (std_node);
!       res_type = make_class_type (RECORD_TYPE);
!       create_implicit_typedef (name_id, res_type);
!       DECL_SOURCE_LOCATION (TYPE_NAME (res_type)) = BUILTINS_LOCATION;
!       DECL_CONTEXT (TYPE_NAME (res_type)) = current_namespace;
!       pushdecl_namespace_level (TYPE_NAME (res_type), /*hidden*/true);
!       pop_nested_namespace (std_node);
!     }
!   return res_type;
  }
  
+ /* Get constract_assertion_kind of the specified contract. Used when building
+   contract_violation object.  */
  
! static contract_assertion_kind
! get_contract_assertion_kind (tree contract)
  {
!   if (CONTRACT_ASSERTION_KIND (contract))
      {
!       tree s = CONTRACT_ASSERTION_KIND (contract);
!       tree i = (TREE_CODE (s) == INTEGER_CST) ? s
! 					      : DECL_INITIAL (STRIP_NOPS (s));
!       gcc_checking_assert (!type_dependent_expression_p (s) && i);
!       return (contract_assertion_kind) tree_to_uhwi (i);
      }
  
!   switch (TREE_CODE (contract))
!   {
!     case ASSERTION_STMT:	return CAK_ASSERT;
!     case PRECONDITION_STMT:	return CAK_PRE;
!     case POSTCONDITION_STMT:	return CAK_POST;
!     default: break;
!   }
  
!   gcc_unreachable ();
  }
  
! /* Get contract_evaluation_semantic of the specified contract.  */
! 
! contract_evaluation_semantic
! get_evaluation_semantic (const_tree contract)
  {
!   if (CONTRACT_EVALUATION_SEMANTIC (contract))
      {
!       tree s = CONTRACT_EVALUATION_SEMANTIC (contract);
!       tree i = (TREE_CODE (s) == INTEGER_CST) ? s
! 					      : DECL_INITIAL (STRIP_NOPS (s));
!       gcc_checking_assert (!type_dependent_expression_p (s) && i);
!       switch (contract_evaluation_semantic ev =
! 	      (contract_evaluation_semantic) tree_to_uhwi (i))
! 	{
! 	/* This needs to be kept in step with any added semantics.  */
! 	case CES_IGNORE:
! 	case CES_OBSERVE:
! 	case CES_ENFORCE:
! 	case CES_QUICK:
! 	  return ev;
! 	default:
! 	  break;
! 	}
      }
  
!   gcc_unreachable ();
! }
  
! /* Get location of the last contract in the CONTRACTS tree chain.  */
! 
! static location_t
! get_contract_end_loc (tree contracts)
! {
!   tree last = NULL_TREE;
!   for (tree a = contracts; a; a = TREE_CHAIN (a))
!     last = a;
!   gcc_checking_assert (last);
!   last = CONTRACT_STATEMENT (last);
!   return EXPR_LOCATION (last);
  }
  
! struct GTY(()) contract_decl
  {
!   tree contract_specifiers;
!   location_t note_loc;
! };
! 
! static GTY(()) hash_map<tree, contract_decl> *contract_decl_map;
! 
! /* Converts a contract condition to bool and ensures it has a location.  */
! 
! tree
! finish_contract_condition (cp_expr condition)
! {
!   if (!condition || error_operand_p (condition))
!     return condition;
! 
!   /* Ensure we have the condition location saved in case we later need to
!      emit a conversion error during template instantiation and wouldn't
!      otherwise have it.  This differs from maybe_wrap_with_location in that
!      it allows wrappers on EXCEPTIONAL_CLASS_P which includes CONSTRUCTORs.  */
!   if (!CAN_HAVE_LOCATION_P (condition)
!       && condition.get_location () != UNKNOWN_LOCATION)
      {
!       tree_code code
! 	= (((CONSTANT_CLASS_P (condition) && TREE_CODE (condition) != STRING_CST)
! 	    || (TREE_CODE (condition) == CONST_DECL && !TREE_STATIC (condition)))
! 	  ? NON_LVALUE_EXPR : VIEW_CONVERT_EXPR);
!       condition = build1_loc (condition.get_location (), code,
! 			      TREE_TYPE (condition), condition);
!       EXPR_LOCATION_WRAPPER_P (condition) = true;
      }
  
!   if (type_dependent_expression_p (condition))
!     return condition;
  
!   return condition_conversion (condition);
  }
  
! /* Wrap the DECL into VIEW_CONVERT_EXPR representing const qualified version
!    of the declaration.  */
! 
! tree
! view_as_const (tree decl)
  {
!   if (!contract_const_wrapper_p (decl))
      {
!       tree ctype = TREE_TYPE (decl);
!       location_t loc =
! 	  EXPR_P (decl) ? EXPR_LOCATION (decl) : DECL_SOURCE_LOCATION (decl);
!       ctype = cp_build_qualified_type (ctype, (cp_type_quals (ctype)
! 					       | TYPE_QUAL_CONST));
!       decl = build1 (VIEW_CONVERT_EXPR, ctype, decl);
!       SET_EXPR_LOCATION (decl, loc);
!       /* Mark the VCE as contract const wrapper.  */
!       CONST_WRAPPER_P (decl) = true;
      }
+   return decl;
+ }
  
! /* Constify access to DECL from within the contract condition.  */
  
! tree
! constify_contract_access (tree decl)
! {
!   /* We check if we have a variable, a parameter, a variable of reference type,
!    * or a parameter of reference type
!    */
!   if (!TREE_READONLY (decl)
!       && (VAR_P (decl)
! 	  || (TREE_CODE (decl) == PARM_DECL)
! 	  || (REFERENCE_REF_P (decl)
! 	      && (VAR_P (TREE_OPERAND (decl, 0))
! 		  || (TREE_CODE (TREE_OPERAND (decl, 0)) == PARM_DECL)
! 		  || (TREE_CODE (TREE_OPERAND (decl, 0))
! 		      == TEMPLATE_PARM_INDEX)))))
!     decl = view_as_const (decl);
  
!   return decl;
! }
  
! /* Indicate that PARM_DECL DECL is ODR used in a postcondition.  */
  
! static void
! set_parm_used_in_post (tree decl, bool constify = true)
! {
!   gcc_checking_assert (TREE_CODE (decl) == PARM_DECL);
!   DECL_LANG_FLAG_4 (decl) = constify;
! }
  
! /* Test if PARM_DECL is ODR used in a postcondition.  */
  
! static bool
! parm_used_in_post_p (const_tree decl)
! {
!   /* Check if this parameter is odr used within a function's postcondition  */
!   return ((TREE_CODE (decl) == PARM_DECL) && DECL_LANG_FLAG_4 (decl));
  }
  
+ /* If declaration DECL is a PARM_DECL and it appears in a postcondition, then
+    check that it is not a non-const by-value param. LOCATION is where the
+    expression was found and is used for diagnostic purposes.  */
+ 
  void
! check_param_in_postcondition (tree decl, location_t location)
  {
!   if (processing_postcondition
!       && TREE_CODE (decl) == PARM_DECL
!       /* TREE_CODE (decl) == PARM_DECL only holds for non-reference
! 	 parameters.  */
!       && !cp_unevaluated_operand
!       /* Return value parameter has DECL_ARTIFICIAL flag set. The flag
! 	 presence of the flag should be sufficient to distinguish the
! 	 return value parameter in this context.  */
!       && !(DECL_ARTIFICIAL (decl)))
      {
!       set_parm_used_in_post (decl);
  
!       if (!dependent_type_p (TREE_TYPE (decl))
! 	  && !CP_TYPE_CONST_P (TREE_TYPE (decl)))
! 	{
! 	  error_at (location,
! 		    "a value parameter used in a postcondition must be const");
! 	  inform (DECL_SOURCE_LOCATION (decl), "parameter declared here");
! 	}
      }
! }
  
! /* Check if parameters used in postconditions are const qualified on
!    a redeclaration that does not specify contracts or on an instantiation
!    of a function template.  */
! 
! void
! check_postconditions_in_redecl (tree olddecl, tree newdecl)
! {
!   tree contract_spec = get_fn_contract_specifiers (olddecl);
!   if (!contract_spec)
!     return;
! 
!   tree t1 = FUNCTION_FIRST_USER_PARM (olddecl);
!   tree t2 = FUNCTION_FIRST_USER_PARM (newdecl);
! 
!   for (; t1 && t1 != void_list_node;
!   t1 = TREE_CHAIN (t1), t2 = TREE_CHAIN (t2))
      {
!       if (parm_used_in_post_p (t1))
! 	{
! 	  set_parm_used_in_post (t2);
! 	  if (!dependent_type_p (TREE_TYPE (t2))
! 	      && !CP_TYPE_CONST_P (TREE_TYPE (t2))
! 	      && !TREE_READONLY (t2))
! 	    {
! 	      error_at (DECL_SOURCE_LOCATION (t2),
! 	      "value parameter %qE used in a postcondition must be const", t2);
! 	      inform (DECL_SOURCE_LOCATION (olddecl),
! 	      "previous declaration here");
! 	    }
! 	}
      }
+ }
  
! /* Map from FUNCTION_DECL to a FUNCTION_DECL for either the PRE_FN or POST_FN.
!    These are used to parse contract conditions and are called inside the body
!    of the guarded function.  */
! static GTY(()) hash_map<tree, tree> *decl_pre_fn;
! static GTY(()) hash_map<tree, tree> *decl_post_fn;
  
! /* Given a pre or post function decl (for an outlined check function) return
!    the decl for the function for which the outlined checks are being
!    performed.  */
! static GTY(()) hash_map<tree, tree> *orig_from_outlined;
! 
! /* Makes PRE the precondition function for FNDECL.  */
! 
! static void
! set_precondition_function (tree fndecl, tree pre)
! {
!   gcc_assert (pre);
!   hash_map_maybe_create<hm_ggc> (decl_pre_fn);
!   gcc_checking_assert (!decl_pre_fn->get (fndecl));
!   decl_pre_fn->put (fndecl, pre);
! 
!   hash_map_maybe_create<hm_ggc> (orig_from_outlined);
!   gcc_checking_assert (!orig_from_outlined->get (pre));
!   orig_from_outlined->put (pre, fndecl);
  }
  
! /* Makes POST the postcondition function for FNDECL.  */
  
! static void
! set_postcondition_function (tree fndecl, tree post)
  {
!   gcc_checking_assert (post);
!   hash_map_maybe_create<hm_ggc> (decl_post_fn);
!   gcc_checking_assert (!decl_post_fn->get (fndecl));
!   decl_post_fn->put (fndecl, post);
! 
!   hash_map_maybe_create<hm_ggc> (orig_from_outlined);
!   gcc_checking_assert (!orig_from_outlined->get (post));
!   orig_from_outlined->put (post, fndecl);
  }
  
! /* For a given pre or post condition function, find the checked function.  */
! tree
! get_orig_for_outlined (tree fndecl)
! {
!   gcc_checking_assert (fndecl);
!   tree *result = hash_map_safe_get (orig_from_outlined, fndecl);
!   return result ? *result : NULL_TREE ;
! }
  
! /* For a given function OLD_FN set suitable names for NEW_FN (which is an
!    outlined contract check) usually by appending '.pre' or '.post'.
! 
!    For functions with special meaning names (i.e. main and cdtors) we need to
!    make special provisions and therefore handle all the contracts function
!    name changes here, rather than requiring a separate update to mangle.cc.
! 
!    PRE specifies if we need an identifier for a pre or post contract check.  */
! 
! static void
! contracts_fixup_names (tree new_fn, tree old_fn, bool pre, bool wrapper)
  {
!   bool cdtor = DECL_CXX_CONSTRUCTOR_P (old_fn)
! 	       || DECL_CXX_DESTRUCTOR_P (old_fn);
!   const char *fname = IDENTIFIER_POINTER (DECL_NAME (old_fn));
!   const char *append = wrapper ? "contract_wrapper"
! 			       : (pre ? "pre" : "post");
!   size_t len = strlen (fname);
!   /* Cdtor names have a space at the end.  We need to remove that space
!      when forming the new identifier.  */
!   char *nn = xasprintf ("%.*s%s%s",
! 			cdtor ? (int)len-1 : int(len),
! 			fname,
! 			JOIN_STR,
! 			append);
!   DECL_NAME (new_fn) = get_identifier (nn);
!   free (nn);
  
!   /* Now do the mangled version.  */
!   fname = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (old_fn));
!   nn = xasprintf ("%s%s%s", fname, JOIN_STR, append);
!   SET_DECL_ASSEMBLER_NAME (new_fn, get_identifier (nn));
!   free (nn);
! }
! 
! /* Build a declaration for the pre- or postcondition of a guarded FNDECL.  */
! 
! static tree
! build_contract_condition_function (tree fndecl, bool pre)
! {
!   if (error_operand_p (fndecl))
!     return error_mark_node;
! 
!   /* Start the copy.  */
!   tree fn = copy_decl (fndecl);
! 
!   /* Don't propagate declaration attributes to the checking function,
!      including the original contracts.  */
!   DECL_ATTRIBUTES (fn) = NULL_TREE;
! 
!   /* If requested, disable optimisation of checking functions; this can, in
!      some cases, prevent UB from eliding the checks themselves.  */
!   if (flag_contract_disable_optimized_checks)
!     DECL_ATTRIBUTES (fn)
!       = tree_cons (get_identifier ("optimize"),
! 		   build_tree_list (NULL_TREE, build_string (3, "-O0")),
! 		   NULL_TREE);
! 
!   /* Now parse and add any internal representation of these attrs to the
!      decl.  */
!   if (DECL_ATTRIBUTES (fn))
!     cplus_decl_attributes (&fn, DECL_ATTRIBUTES (fn), 0);
! 
!   /* A possible later optimization may delete unused args to prevent extra arg
!      passing.  */
!   /* Handle the args list.  */
!   tree arg_types = NULL_TREE;
!   tree *last = &arg_types;
!   for (tree arg_type = TYPE_ARG_TYPES (TREE_TYPE (fn));
!       arg_type && arg_type != void_list_node;
!       arg_type = TREE_CHAIN (arg_type))
      {
!       if (DECL_IOBJ_MEMBER_FUNCTION_P (fndecl)
! 	  && TYPE_ARG_TYPES (TREE_TYPE (fn)) == arg_type)
!       continue;
!       *last = build_tree_list (TREE_PURPOSE (arg_type), TREE_VALUE (arg_type));
!       last = &TREE_CHAIN (*last);
!     }
  
!   /* Copy the function parameters, if present.  Disable warnings for them.  */
!   DECL_ARGUMENTS (fn) = NULL_TREE;
!   if (DECL_ARGUMENTS (fndecl))
!     {
!       tree *last_a = &DECL_ARGUMENTS (fn);
!       for (tree p = DECL_ARGUMENTS (fndecl); p; p = TREE_CHAIN (p))
! 	{
! 	  *last_a = copy_decl (p);
! 	  suppress_warning (*last_a);
! 	  DECL_CONTEXT (*last_a) = fn;
! 	  last_a = &TREE_CHAIN (*last_a);
! 	}
      }
  
!   tree orig_fn_value_type = TREE_TYPE (TREE_TYPE (fn));
!   if (!pre && !VOID_TYPE_P (orig_fn_value_type))
!     {
!       /* For post contracts that deal with a non-void function, append a
! 	 parameter to pass the return value.  */
!       tree name = get_identifier ("__r");
!       tree parm = build_lang_decl (PARM_DECL, name, orig_fn_value_type);
!       DECL_CONTEXT (parm) = fn;
!       DECL_ARTIFICIAL (parm) = true;
!       suppress_warning (parm);
!       DECL_ARGUMENTS (fn) = chainon (DECL_ARGUMENTS (fn), parm);
!       *last = build_tree_list (NULL_TREE, orig_fn_value_type);
!       last = &TREE_CHAIN (*last);
!     }
  
!   *last = void_list_node;
  
!   tree adjusted_type = NULL_TREE;
! 
!   /* The handlers are void fns.  */
!   if (DECL_IOBJ_MEMBER_FUNCTION_P (fndecl))
!     adjusted_type = build_method_type_directly (DECL_CONTEXT (fndecl),
! 						void_type_node,
! 						arg_types);
    else
+     adjusted_type = build_function_type (void_type_node, arg_types);
+ 
+   /* If the original function is noexcept, build a noexcept function.  */
+   if (flag_exceptions && type_noexcept_p (TREE_TYPE (fndecl)))
+     adjusted_type = build_exception_variant (adjusted_type, noexcept_true_spec);
+ 
+   TREE_TYPE (fn) = adjusted_type;
+   DECL_RESULT (fn) = NULL_TREE; /* Let the start function code fill it in.  */
+ 
+   /* The contract check functions are never a cdtor, nor virtual.  */
+   DECL_CXX_DESTRUCTOR_P (fn) = DECL_CXX_CONSTRUCTOR_P (fn) = 0;
+   DECL_VIRTUAL_P (fn) = false;
+ 
+   /* Append .pre / .post to a usable name for the original function.  */
+   contracts_fixup_names (fn, fndecl, pre, /*wrapper*/false);
+ 
+   DECL_INITIAL (fn) = NULL_TREE;
+   CONTRACT_HELPER (fn) = pre ? ldf_contract_pre : ldf_contract_post;
+   /* We might have a pre/post for a wrapper.  */
+   DECL_CONTRACT_WRAPPER (fn) = DECL_CONTRACT_WRAPPER (fndecl);
+ 
+   /* Make these functions internal if we can, i.e. if the guarded function is
+      not vague linkage, or if we can put them in a comdat group with the
+      guarded function.  */
+   if (!DECL_WEAK (fndecl) || HAVE_COMDAT_GROUP)
      {
!       TREE_PUBLIC (fn) = false;
!       DECL_EXTERNAL (fn) = false;
!       DECL_WEAK (fn) = false;
!       DECL_COMDAT (fn) = false;
! 
!       /* We may not have set the comdat group on the guarded function yet.
! 	 If we haven't, we'll add this to the same group in comdat_linkage
! 	 later.  Otherwise, add it to the same comdat group now.  */
!       if (DECL_ONE_ONLY (fndecl))
! 	{
! 	  symtab_node *n = symtab_node::get (fndecl);
! 	  cgraph_node::get_create (fn)->add_to_same_comdat_group (n);
! 	}
! 
      }
! 
!   DECL_INTERFACE_KNOWN (fn) = true;
!   DECL_ARTIFICIAL (fn) = true;
!   suppress_warning (fn);
! 
!   return fn;
  }
  
! /* Build the precondition checking function for FNDECL.  */
  
! static tree
! build_precondition_function (tree fndecl)
  {
!   if (!has_active_preconditions (fndecl))
!     return NULL_TREE;
! 
!   return build_contract_condition_function (fndecl, /*pre=*/true);
  }
  
! /* Build the postcondition checking function for FNDECL.  If the return
!    type is undeduced, don't build the function yet.  We do that in
!    apply_deduced_return_type.  */
  
! static tree
! build_postcondition_function (tree fndecl)
  {
!   if (!has_active_postconditions (fndecl))
!     return NULL_TREE;
! 
!   tree type = TREE_TYPE (TREE_TYPE (fndecl));
!   if (is_auto (type))
!     return NULL_TREE;
! 
!   return build_contract_condition_function (fndecl, /*pre=*/false);
  }
  
! /* If we're outlining the contract, build the functions to do the
!    precondition and postcondition checks, and associate them with
!    the function decl FNDECL.
!  */
  
! static void
! build_contract_function_decls (tree fndecl)
  {
!   /* Build the pre/post functions (or not).  */
!   if (!get_precondition_function (fndecl))
!     if (tree pre = build_precondition_function (fndecl))
!       set_precondition_function (fndecl, pre);
! 
!   if (!get_postcondition_function (fndecl))
!     if (tree post = build_postcondition_function (fndecl))
!       set_postcondition_function (fndecl, post);
  }
  
! /* Map from FUNCTION_DECL to a FUNCTION_DECL for contract wrapper.  */
  
! static GTY(()) hash_map<tree, tree> *decl_wrapper_fn = nullptr;
  
! /* Map from the function decl of a wrapper to the function that it wraps.  */
  
! static GTY(()) hash_map<tree, tree> *decl_for_wrapper = nullptr;
  
! /* Makes wrapper the precondition function for FNDECL.  */
! 
! static void
! set_contract_wrapper_function (tree fndecl, tree wrapper)
! {
!   gcc_checking_assert (wrapper && fndecl);
!   hash_map_maybe_create<hm_ggc> (decl_wrapper_fn);
!   gcc_checking_assert (decl_wrapper_fn && !decl_wrapper_fn->get (fndecl));
!   decl_wrapper_fn->put (fndecl, wrapper);
! 
!   /* We need to know the wrapped function when composing the diagnostic.  */
!   hash_map_maybe_create<hm_ggc> (decl_for_wrapper);
!   gcc_checking_assert (decl_for_wrapper && !decl_for_wrapper->get (wrapper));
!   decl_for_wrapper->put (wrapper, fndecl);
  }
  
! /* Returns the wrapper function decl for FNDECL, or null if not set.  */
  
! static tree
! get_contract_wrapper_function (tree fndecl)
  {
!   gcc_checking_assert (fndecl);
!   tree *result = hash_map_safe_get (decl_wrapper_fn, fndecl);
!   return result ? *result : NULL_TREE;
  }
  
! /* Given a wrapper function WRAPPER, find the original function decl.  */
  
! static tree
! get_orig_func_for_wrapper (tree wrapper)
  {
!   gcc_checking_assert (wrapper);
!   tree *result = hash_map_safe_get (decl_for_wrapper, wrapper);
!   return result ? *result : NULL_TREE;
  }
  
! /* Build a declaration for the contract wrapper of a caller FNDECL.
!    We're making a caller side contract check wrapper. For caller side contract
!    checks, postconditions are only checked if check_post is true.
!    Defer the attachment of the contracts to this function until the callee
!    is non-dependent, or we get cases where the conditions can be non-dependent
!    but still need tsubst-ing.  */
  
! static tree
! build_contract_wrapper_function (tree fndecl)
  {
!   if (error_operand_p (fndecl))
!     return error_mark_node;
  
!   /* We should not be trying to build wrappers for templates or functions that
!      are still dependent.  */
!   gcc_checking_assert (!processing_template_decl
! 		       && !TYPE_DEPENDENT_P (TREE_TYPE (fndecl)));
  
!   location_t loc = DECL_SOURCE_LOCATION (fndecl);
  
!   /* Fill in the names later.  */
!   tree wrapdecl
!     = build_lang_decl_loc (loc, FUNCTION_DECL, NULL_TREE, TREE_TYPE (fndecl));
  
!   /* Put the wrapper in the same context as the callee.  */
!   DECL_CONTEXT (wrapdecl) = DECL_CONTEXT (fndecl);
  
!   /* This declaration is a contract wrapper function.  */
!   DECL_CONTRACT_WRAPPER (wrapdecl) = true;
  
!   contracts_fixup_names (wrapdecl, fndecl, /*pre*/false, /*wrapper*/true);
! 
!   DECL_SOURCE_LOCATION (wrapdecl) = loc;
!   /* The declaration was implicitly generated by the compiler.  */
!   DECL_ARTIFICIAL (wrapdecl) = true;
!   /* Declaration, no definition yet.  */
!   DECL_INITIAL (wrapdecl) = NULL_TREE;
! 
!   /* Let the start function code fill in the result decl.  */
!   DECL_RESULT (wrapdecl) = NULL_TREE;
! 
!   /* Copy the function parameters, if present.  Suppress (e.g. unused)
!      warnings on them.  */
!   DECL_ARGUMENTS (wrapdecl) = NULL_TREE;
!   if (tree p = DECL_ARGUMENTS (fndecl))
!     {
!       tree *last_a = &DECL_ARGUMENTS (wrapdecl);
!       for (; p; p = TREE_CHAIN (p))
  	{
! 	  *last_a = copy_decl (p);
! 	  suppress_warning (*last_a);
! 	  DECL_CONTEXT (*last_a) = wrapdecl;
! 	  last_a = &TREE_CHAIN (*last_a);
  	}
+     }
  
!   /* Copy selected attributes from the original function.  */
!   TREE_USED (wrapdecl) = TREE_USED (fndecl);
  
!   /* Copy any alignment added.  */
!   if (DECL_ALIGN (fndecl))
!     SET_DECL_ALIGN (wrapdecl, DECL_ALIGN (fndecl));
!   DECL_USER_ALIGN (wrapdecl) = DECL_USER_ALIGN (fndecl);
  
!   /* Make this function internal.  */
!   TREE_PUBLIC (wrapdecl) = false;
!   DECL_EXTERNAL (wrapdecl) = false;
!   DECL_WEAK (wrapdecl) = false;
  
!   /* We know this is an internal function.  */
!   DECL_INTERFACE_KNOWN (wrapdecl) = true;
!   return wrapdecl;
  }
  
  static tree
! get_or_create_contract_wrapper_function (tree fndecl)
  {
!   tree wrapdecl = get_contract_wrapper_function (fndecl);
!   if (!wrapdecl)
      {
!       wrapdecl = build_contract_wrapper_function (fndecl);
!       set_contract_wrapper_function (fndecl, wrapdecl);
      }
!   return wrapdecl;
  }
  
! void
! start_function_contracts (tree fndecl)
  {
!   if (error_operand_p (fndecl))
!     return;
  
!   if (!handle_contracts_p (fndecl))
!     return;
  
!   /* If this is not a client side check and definition side checks are
!      disabled, do nothing.  */
!   if (!flag_contracts_definition_check
!       && !DECL_CONTRACT_WRAPPER (fndecl))
!     return;
  
!   /* Check that the postcondition result name, if any, does not shadow a
!      function parameter.  */
!   for (tree ca = get_fn_contract_specifiers (fndecl); ca; ca = TREE_CHAIN (ca))
!     if (POSTCONDITION_P (CONTRACT_STATEMENT (ca)))
!       if (tree id = POSTCONDITION_IDENTIFIER (CONTRACT_STATEMENT (ca)))
! 	{
! 	  if (id == error_mark_node)
! 	    {
! 	      CONTRACT_CONDITION (CONTRACT_STATEMENT (ca)) = error_mark_node;
! 	      continue;
! 	    }
! 	  tree r_name = tree_strip_any_location_wrapper (id);
! 	  if (TREE_CODE (id) == PARM_DECL)
! 	    r_name = DECL_NAME (id);
! 	  gcc_checking_assert (r_name && TREE_CODE (r_name) == IDENTIFIER_NODE);
! 	  tree seen = lookup_name (r_name);
! 	  if (seen
! 	      && TREE_CODE (seen) == PARM_DECL
! 	      && DECL_CONTEXT (seen) == fndecl)
! 	    {
! 		auto_diagnostic_group d;
! 		location_t id_l = location_wrapper_p (id)
! 				  ? EXPR_LOCATION (id)
! 				  : DECL_SOURCE_LOCATION (id);
! 		location_t co_l = EXPR_LOCATION (CONTRACT_STATEMENT (ca));
! 		if (id_l != UNKNOWN_LOCATION)
! 		  co_l = make_location (id_l, co_l, co_l);
! 		error_at (co_l, "contract postcondition result name shadows a"
! 			  " function parameter");
! 		inform (DECL_SOURCE_LOCATION (seen),
! 			"parameter declared here");
! 		POSTCONDITION_IDENTIFIER (CONTRACT_STATEMENT (ca))
! 		  = error_mark_node;
! 		CONTRACT_CONDITION (CONTRACT_STATEMENT (ca)) = error_mark_node;
! 	    }
! 	}
  
!   /* If we are expanding contract assertions inline then no need to declare
!      the outline function decls.  */
!   if (!flag_contract_checks_outlined)
!     return;
  
!   /* Contracts may have just been added without a chance to parse them, though
!      we still need the PRE_FN available to generate a call to it.  */
!   /* Do we already have declarations generated ? */
!   if (!DECL_PRE_FN (fndecl) && !DECL_POST_FN (fndecl))
!     build_contract_function_decls (fndecl);
! }
  
! void
! maybe_update_postconditions (tree fndecl)
! {
!   /* Update any postconditions and the postcondition checking function
!      as needed.  If there are postconditions, we'll use those to rewrite
!      return statements to check postconditions.  */
!   if (has_active_postconditions (fndecl))
!     {
!       rebuild_postconditions (fndecl);
!       tree post = build_postcondition_function (fndecl);
!       set_postcondition_function (fndecl, post);
!     }
! }
  
! /* Build and return an argument list containing all the parameters of the
!    (presumably guarded) function decl FNDECL.  This can be used to forward
!    all of FNDECL arguments to a function taking the same list of arguments
!    -- namely the unchecked form of FNDECL.
  
!    We use CALL_FROM_THUNK_P instead of forward_parm for forwarding
!    semantics.  */
  
! static vec<tree, va_gc> *
! build_arg_list (tree fndecl)
! {
!   vec<tree, va_gc> *args = make_tree_vector ();
!   for (tree t = DECL_ARGUMENTS (fndecl); t; t = DECL_CHAIN (t))
!     vec_safe_push (args, t);
!   return args;
  }
  
! /* Build and return a thunk like call to FUNC from CALLER using the supplied
!    arguments.  The call is like a thunk call in the fact that we do not
!    want to create additional copies of the arguments.  We can not simply reuse
!    the thunk machinery as it does more than we want.  More specifically, we
!    don't want to mark the calling function as `DECL_THUNK_P` for this
!    particular purpose, we only want the special treatment for the parameters
!    of the call we are about to generate.  We temporarily mark the calling
!    function as DECL_THUNK_P so build_call_a does the right thing.  */
! 
! static tree
! build_thunk_like_call (tree func, int n, tree *argarray)
  {
!   bool old_decl_thunk_p = DECL_THUNK_P (current_function_decl);
!   LANG_DECL_FN_CHECK (current_function_decl)->thunk_p  = true;
  
!   tree call = build_call_a (func, n, argarray);
  
!   /* Revert the `DECL_THUNK_P` flag.  */
!   LANG_DECL_FN_CHECK (current_function_decl)->thunk_p = old_decl_thunk_p;
  
!   /* Mark the call as a thunk call to allow for correct gimplification
!    of the arguments.  */
!   CALL_FROM_THUNK_P (call) = true;
  
!   return call;
  }
  
! /* If we have a precondition function and it's valid, call it.  */
  
! static void
! add_pre_condition_fn_call (tree fndecl)
  {
!   /* If we're starting a guarded function with valid contracts, we need to
!      insert a call to the pre function.  */
!   gcc_checking_assert (DECL_PRE_FN (fndecl)
! 		       && DECL_PRE_FN (fndecl) != error_mark_node);
  
!   releasing_vec args = build_arg_list (fndecl);
!   tree call = build_thunk_like_call (DECL_PRE_FN (fndecl),
! 				     args->length (), args->address ());
  
!   finish_expr_stmt (call);
  }
  
! /* Returns the parameter corresponding to the return value of a guarded
!    function FNDECL.  Returns NULL_TREE if FNDECL has no postconditions or
!    is void.  */
  
! static tree
! get_postcondition_result_parameter (tree fndecl)
  {
!   if (!fndecl || fndecl == error_mark_node)
!     return NULL_TREE;
  
!   if (VOID_TYPE_P (TREE_TYPE (TREE_TYPE (fndecl))))
!     return NULL_TREE;
  
!   tree post = DECL_POST_FN (fndecl);
!   if (!post || post == error_mark_node)
!     return NULL_TREE;
! 
!   /* The last param is the return value.  */
!   return tree_last (DECL_ARGUMENTS (post));
  }
  
! /* Build and add a call to the post-condition checking function, when that
!    is in use.  */
  
! static void
! add_post_condition_fn_call (tree fndecl)
  {
!   gcc_checking_assert (DECL_POST_FN (fndecl)
! 		       && DECL_POST_FN (fndecl) != error_mark_node);
! 
!   releasing_vec args = build_arg_list (fndecl);
!   if (get_postcondition_result_parameter (fndecl))
!     vec_safe_push (args, DECL_RESULT (fndecl));
!   tree call = build_thunk_like_call (DECL_POST_FN (fndecl),
! 				     args->length (), args->address ());
!   finish_expr_stmt (call);
  }
  
! /* Copy (possibly a sub-set of) contracts from CONTRACTS on FNDECL.  */
  
! static tree
! copy_contracts_list (tree contracts, tree fndecl,
! 		     contract_match_kind remap_kind = cmk_all)
  {
!   tree last = NULL_TREE, new_contracts = NULL_TREE;
!   for (; contracts; contracts = TREE_CHAIN (contracts))
!     {
!       if ((remap_kind == cmk_pre
! 	   && (TREE_CODE (CONTRACT_STATEMENT (contracts))
! 	       == POSTCONDITION_STMT))
! 	  || (remap_kind == cmk_post
! 	      && (TREE_CODE (CONTRACT_STATEMENT (contracts))
! 		  == PRECONDITION_STMT)))
! 	continue;
  
!       tree c = copy_node (contracts);
!       TREE_VALUE (c) = build_tree_list (TREE_PURPOSE (TREE_VALUE (c)),
! 					copy_node (CONTRACT_STATEMENT (c)));
! 
!       copy_body_data id;
!       hash_map<tree, tree> decl_map;
! 
!       memset (&id, 0, sizeof (id));
! 
!       id.src_fn = fndecl;
!       id.dst_fn = fndecl;
!       id.src_cfun = DECL_STRUCT_FUNCTION (fndecl);
!       id.decl_map = &decl_map;
! 
!       id.copy_decl = retain_decl;
! 
!       id.transform_call_graph_edges = CB_CGE_DUPLICATE;
!       id.transform_new_cfg = false;
!       id.transform_return_to_modify = false;
!       id.transform_parameter = true;
! 
!       /* Make sure not to unshare trees behind the front-end's back
! 	 since front-end specific mechanisms may rely on sharing.  */
!       id.regimplify = false;
!       id.do_not_unshare = true;
!       id.do_not_fold = true;
! 
!       /* We're not inside any EH region.  */
!       id.eh_lp_nr = 0;
!       walk_tree (&CONTRACT_CONDITION (CONTRACT_STATEMENT (c)),
! 				      copy_tree_body_r, &id, NULL);
! 
! 
!       CONTRACT_COMMENT (CONTRACT_STATEMENT (c))
! 	= copy_node (CONTRACT_COMMENT (CONTRACT_STATEMENT (c)));
! 
!       chainon (last, c);
!       last = c;
!       if (!new_contracts)
! 	new_contracts = c;
!     }
!   return new_contracts;
  }
  
! /* Returns a copy of FNDECL contracts. This is used when emiting a contract.
!  If we were to emit the original contract tree, any folding of the contract
!  condition would affect the original contract too. The original contract
!  tree needs to be preserved in case it is used to apply to a different
!  function (for inheritance or wrapping reasons). */
! 
! static tree
! copy_contracts (tree fndecl, contract_match_kind remap_kind = cmk_all)
  {
!   tree contracts = get_fn_contract_specifiers (fndecl);
!   return copy_contracts_list (contracts, fndecl, remap_kind);
! }
  
! /* Add the contract statement CONTRACT to the current block if valid.  */
  
! static bool
! emit_contract_statement (tree contract)
! {
!   /* Only add valid contracts.  */
!   if (contract == error_mark_node
!       || CONTRACT_CONDITION (contract) == error_mark_node)
!     return false;
  
!   if (get_evaluation_semantic (contract) == CES_INVALID)
!     return false;
! 
!   add_stmt (contract);
!   return true;
  }
  
! /* Generate the statement for the given contract by adding the contract
!    statement to the current block. Returns the next contract in the chain.  */
  
! static tree
! emit_contract (tree contract)
  {
!   gcc_assert (TREE_CODE (contract) == TREE_LIST);
  
!   emit_contract_statement (CONTRACT_STATEMENT (contract));
  
!   return TREE_CHAIN (contract);
  }
  
! /* Add a call or a direct evaluation of the pre checks.  */
  
! static void
! apply_preconditions (tree fndecl)
  {
!   if (flag_contract_checks_outlined)
!     add_pre_condition_fn_call (fndecl);
!   else
!   {
!     tree contract_copy = copy_contracts (fndecl, cmk_pre);
!     for (; contract_copy; contract_copy = TREE_CHAIN (contract_copy))
!       emit_contract (contract_copy);
!   }
! }
! 
! /* Add a call or a direct evaluation of the post checks.  */
! 
! static void
! apply_postconditions (tree fndecl)
! {
!   if (flag_contract_checks_outlined)
!     add_post_condition_fn_call (fndecl);
!   else
      {
!       tree contract_copy = copy_contracts (fndecl, cmk_post);
!       for (; contract_copy; contract_copy = TREE_CHAIN (contract_copy))
! 	emit_contract (contract_copy);
      }
  }
  
! /* Add contract handling to the function in FNDECL.
  
!    When we have only pre-conditions, this simply prepends a call (or a direct
!    evaluation, for cdtors) to the existing function body.
! 
!    When we have post conditions we build a try-finally block.
!    If the function might throw then the handler in the try-finally is an
!    EH_ELSE expression, where the post condition check is applied to the
!    non-exceptional path, and an empty statement is added to the EH path.  If
!    the function has a non-throwing eh spec, then the handler is simply the
!    post-condition checker.  */
! 
! void
! maybe_apply_function_contracts (tree fndecl)
  {
!   if (!handle_contracts_p (fndecl))
!     /* We did nothing and the original function body statement list will be
!        popped by our caller.  */
!     return;
  
!   /* If this is not a client side check and definition side checks are
!      disabled, do nothing.  */
!   if (!flag_contracts_definition_check
!       && !DECL_CONTRACT_WRAPPER (fndecl))
!     return;
  
!   bool do_pre = has_active_preconditions (fndecl);
!   bool do_post = has_active_postconditions (fndecl);
!   /* We should not have reached here with nothing to do... */
!   gcc_checking_assert (do_pre || do_post);
  
!   /* If the function is noexcept, the user's written body will be wrapped in a
!      MUST_NOT_THROW expression.  In that case we leave the MUST_NOT_THROW in
!      place and do our replacement inside it.  */
!   tree fnbody;
!   if (TYPE_NOEXCEPT_P (TREE_TYPE (fndecl)))
!     {
!       tree m_n_t_expr = expr_first (DECL_SAVED_TREE (fndecl));
!       gcc_checking_assert (TREE_CODE (m_n_t_expr) == MUST_NOT_THROW_EXPR);
!       fnbody = TREE_OPERAND (m_n_t_expr, 0);
!       TREE_OPERAND (m_n_t_expr, 0) = push_stmt_list ();
!     }
!   else
!     {
!       fnbody = DECL_SAVED_TREE (fndecl);
!       DECL_SAVED_TREE (fndecl) = push_stmt_list ();
!     }
  
!   /* Now add the pre and post conditions to the existing function body.
!      This copies the approach used for function try blocks.  */
!   tree compound_stmt = begin_compound_stmt (0);
!   current_binding_level->artificial = true;
  
+   /* Do not add locations for the synthesised code.  */
+   location_t loc = UNKNOWN_LOCATION;
  
!   /* For other cases, we call a function to process the check.  */
  
!   /* If we have a pre, but not a post, then just emit that and we are done.  */
!   if (!do_post)
!     {
!       apply_preconditions (fndecl);
!       add_stmt (fnbody);
!       finish_compound_stmt (compound_stmt);
!       return;
!     }
! 
!   if (do_pre)
!     /* Add a precondition call, if we have one. */
!     apply_preconditions (fndecl);
!   tree try_fin = build_stmt (loc, TRY_FINALLY_EXPR, fnbody, NULL_TREE);
!   add_stmt (try_fin);
!   TREE_OPERAND (try_fin, 1) = push_stmt_list ();
!   /* If we have exceptions, and a function that might throw, then add
!      an EH_ELSE clause that allows the exception to propagate upwards
!      without encountering the post-condition checks.  */
!   if (flag_exceptions && !type_noexcept_p (TREE_TYPE (fndecl)))
!     {
!       tree eh_else = build_stmt (loc, EH_ELSE_EXPR, NULL_TREE, NULL_TREE);
!       add_stmt (eh_else);
!       TREE_OPERAND (eh_else, 0) = push_stmt_list ();
!       apply_postconditions (fndecl);
!       TREE_OPERAND (eh_else, 0) = pop_stmt_list (TREE_OPERAND (eh_else, 0));
!       TREE_OPERAND (eh_else, 1) = void_node;
!     }
!   else
!     apply_postconditions (fndecl);
!   TREE_OPERAND (try_fin, 1) = pop_stmt_list (TREE_OPERAND (try_fin, 1));
!   finish_compound_stmt (compound_stmt);
!   /* The DECL_SAVED_TREE stmt list will be popped by our caller.  */
  }
  
  /* Rewrite the condition of contract in place, so that references to SRC's
     parameters are updated to refer to DST's parameters. The postcondition
     result variable is left unchanged.
  
     When declarations are merged, we sometimes need to update contracts to
     refer to new parameters.
  
!    If DUPLICATE_P is true, this is called by duplicate_decls to rewrite
!    contracts in terms of a new set of parameters.  This also preserves the
!    references to postcondition results, which are not replaced during
!    merging.  */
  
  static void
  remap_contract (tree src, tree dst, tree contract, bool duplicate_p)
*************** remap_contract (tree src, tree dst, tree
*** 1038,1049 ****
    bool do_remap = false;
  
    /* Insert parameter remappings.  */
!   if (TREE_CODE (src) == FUNCTION_DECL)
!     src = DECL_ARGUMENTS (src);
!   if (TREE_CODE (dst) == FUNCTION_DECL)
!     dst = DECL_ARGUMENTS (dst);
  
!   for (tree sp = src, dp = dst;
         sp || dp;
         sp = DECL_CHAIN (sp), dp = DECL_CHAIN (dp))
      {
--- 1438,1450 ----
    bool do_remap = false;
  
    /* Insert parameter remappings.  */
!   gcc_checking_assert (TREE_CODE (src) == FUNCTION_DECL);
!   gcc_checking_assert (TREE_CODE (dst) == FUNCTION_DECL);
  
!   int src_num_artificial_args = num_artificial_parms_for (src);
!   int dst_num_artificial_args = num_artificial_parms_for (dst);
! 
!   for (tree sp = DECL_ARGUMENTS (src), dp = DECL_ARGUMENTS (dst);
         sp || dp;
         sp = DECL_CHAIN (sp), dp = DECL_CHAIN (dp))
      {
*************** remap_contract (tree src, tree dst, tree
*** 1067,1727 ****
  
        insert_decl_map (&id, sp, dp);
        do_remap = true;
      }
    if (!do_remap)
      return;
  
    walk_tree (&CONTRACT_CONDITION (contract), copy_tree_body_r, &id, NULL);
  }
  
! /* Rewrite any references to SRC's PARM_DECLs to the corresponding PARM_DECL in
!    DST in all of the contract attributes in CONTRACTS by calling remap_contract
!    on each.
! 
!    This is used for two purposes: to rewrite contract attributes during
!    duplicate_decls, and to prepare contracts for emission into a function's
!    respective precondition and postcondition functions. DUPLICATE_P is used
!    to determine the context in which this function is called. See above for
!    the behavior described by this flag.  */
  
! void
! remap_contracts (tree src, tree dst, tree contracts, bool duplicate_p)
  {
!   for (tree attr = contracts; attr; attr = CONTRACT_CHAIN (attr))
      {
!       if (!cxx_contract_attribute_p (attr))
  	continue;
!       tree contract = CONTRACT_STATEMENT (attr);
!       if (TREE_CODE (CONTRACT_CONDITION (contract)) != DEFERRED_PARSE)
! 	remap_contract (src, dst, contract, duplicate_p);
      }
  }
  
! /* Helper to replace references to dummy this parameters with references to
!    the first argument of the FUNCTION_DECL DATA.  */
  
! static tree
! remap_dummy_this_1 (tree *tp, int *, void *data)
  {
!   if (!is_this_parameter (*tp))
!     return NULL_TREE;
!   tree fn = (tree)data;
!   *tp = DECL_ARGUMENTS (fn);
!   return NULL_TREE;
  }
  
! /* Replace all references to dummy this parameters in EXPR with references to
!    the first argument of the FUNCTION_DECL FN.  */
  
! static void
! remap_dummy_this (tree fn, tree *expr)
  {
!   walk_tree (expr, remap_dummy_this_1, fn, NULL);
  }
  
! /* Contract matching.  */
  
! /* True if the contract is valid.  */
  
! static bool
! contract_valid_p (tree contract)
  {
!   return CONTRACT_CONDITION (contract) != error_mark_node;
  }
  
! /* True if the contract attribute is valid.  */
  
! static bool
! contract_attribute_valid_p (tree attribute)
  {
!   return contract_valid_p (TREE_VALUE (TREE_VALUE (attribute)));
  }
  
! /* Compare the contract conditions of OLD_ATTR and NEW_ATTR. Returns false
!    if the conditions are equivalent, and true otherwise.  */
  
! static bool
! check_for_mismatched_contracts (tree old_attr, tree new_attr,
! 			       contract_matching_context ctx)
  {
!   tree old_contract = CONTRACT_STATEMENT (old_attr);
!   tree new_contract = CONTRACT_STATEMENT (new_attr);
  
!   /* Different kinds of contracts do not match.  */
!   if (TREE_CODE (old_contract) != TREE_CODE (new_contract))
!     {
!       auto_diagnostic_group d;
!       error_at (EXPR_LOCATION (new_contract),
! 		ctx == cmc_declaration
! 		? "mismatched contract attribute in declaration"
! 		: "mismatched contract attribute in override");
!       inform (EXPR_LOCATION (old_contract), "previous contract here");
!       return true;
!     }
  
!   /* A deferred contract tentatively matches.  */
!   if (CONTRACT_CONDITION_DEFERRED_P (new_contract))
!     return false;
  
!   /* Compare the conditions of the contracts.  We fold immediately to avoid
!      issues comparing contracts on overrides that use parameters -- see
!      contracts-pre3.  */
!   tree t1 = cp_fully_fold_init (CONTRACT_CONDITION (old_contract));
!   tree t2 = cp_fully_fold_init (CONTRACT_CONDITION (new_contract));
  
!   /* Compare the contracts. The fold doesn't eliminate conversions to members.
!      Set the comparing_override_contracts flag to ensure that references
!      through 'this' are equal if they designate the same member, regardless of
!      the path those members.  */
!   bool saved_comparing_contracts = comparing_override_contracts;
!   comparing_override_contracts = (ctx == cmc_override);
!   bool matching_p = cp_tree_equal (t1, t2);
!   comparing_override_contracts = saved_comparing_contracts;
  
!   if (!matching_p)
      {
        auto_diagnostic_group d;
!       error_at (EXPR_LOCATION (CONTRACT_CONDITION (new_contract)),
! 		ctx == cmc_declaration
! 		? "mismatched contract condition in declaration"
! 		: "mismatched contract condition in override");
!       inform (EXPR_LOCATION (CONTRACT_CONDITION (old_contract)),
! 	      "previous contract here");
!       return true;
      }
  
!   return false;
  }
  
! /* Compare the contract attributes of OLDDECL and NEWDECL. Returns true
!    if the contracts match, and false if they differ.  */
  
! bool
! match_contract_conditions (location_t oldloc, tree old_attrs,
! 			   location_t newloc, tree new_attrs,
! 			   contract_matching_context ctx)
  {
!   /* Contracts only match if they are both specified.  */
!   if (!old_attrs || !new_attrs)
!     return true;
  
!   /* Compare each contract in turn.  */
!   while (old_attrs && new_attrs)
!     {
!       /* If either contract is ill-formed, skip the rest of the comparison,
! 	 since we've already diagnosed an error.  */
!       if (!contract_attribute_valid_p (new_attrs)
! 	  || !contract_attribute_valid_p (old_attrs))
! 	return false;
  
!       if (check_for_mismatched_contracts (old_attrs, new_attrs, ctx))
! 	return false;
!       old_attrs = CONTRACT_CHAIN (old_attrs);
!       new_attrs = CONTRACT_CHAIN (new_attrs);
      }
  
!   /* If we didn't compare all attributes, the contracts don't match.  */
!   if (old_attrs || new_attrs)
      {
!       auto_diagnostic_group d;
!       error_at (newloc,
! 		ctx == cmc_declaration
! 		? "declaration has a different number of contracts than "
! 		  "previously declared"
! 		: "override has a different number of contracts than "
! 		  "previously declared");
!       inform (oldloc,
! 	      new_attrs
! 	      ? "original declaration with fewer contracts here"
! 	      : "original declaration with more contracts here");
!       return false;
      }
- 
-   return true;
  }
  
! /* Deferred contract mapping.
  
!    This is used to compare late-parsed contracts on overrides with their
!    base class functions.
  
-    TODO: It seems like this could be replaced by a simple list that maps from
-    overrides to their base functions. It's not clear that we really need
-    a map to a function + a list of contracts.   */
  
! /* Map from FNDECL to a tree list of contracts that have not been matched or
!    diagnosed yet.  The TREE_PURPOSE is the basefn we're overriding, and the
!    TREE_VALUE is the list of contract attrs for BASEFN.  */
  
! static hash_map<tree_decl_hash, tree> pending_guarded_decls;
  
! void
! defer_guarded_contract_match (tree fndecl, tree fn, tree contracts)
  {
!   if (!pending_guarded_decls.get (fndecl))
!     {
!       pending_guarded_decls.put (fndecl, build_tree_list (fn, contracts));
!       return;
!     }
!   for (tree pending = *pending_guarded_decls.get (fndecl);
!       pending;
!       pending = TREE_CHAIN (pending))
!     {
!       if (TREE_VALUE (pending) == contracts)
! 	return;
!       if (TREE_CHAIN (pending) == NULL_TREE)
! 	TREE_CHAIN (pending) = build_tree_list (fn, contracts);
!     }
  }
  
! /* If the FUNCTION_DECL DECL has any contracts that had their matching
!    deferred earlier, do that checking now.  */
  
! void
! match_deferred_contracts (tree decl)
  {
!   tree *tp = pending_guarded_decls.get (decl);
!   if (!tp)
!     return;
  
!   gcc_assert(!contract_any_deferred_p (DECL_CONTRACTS (decl)));
  
!   processing_template_decl_sentinel ptds;
!   processing_template_decl = uses_template_parms (decl);
  
!   /* Do late contract matching.  */
!   for (tree pending = *tp; pending; pending = TREE_CHAIN (pending))
!     {
!       tree new_contracts = TREE_VALUE (pending);
!       location_t new_loc = CONTRACT_SOURCE_LOCATION (new_contracts);
!       tree old_contracts = DECL_CONTRACTS (decl);
!       location_t old_loc = CONTRACT_SOURCE_LOCATION (old_contracts);
!       tree base = TREE_PURPOSE (pending);
!       match_contract_conditions (new_loc, new_contracts,
! 				 old_loc, old_contracts,
! 				 base ? cmc_override : cmc_declaration);
!     }
  
!   /* Clear out deferred match list so we don't check it twice.  */
!   pending_guarded_decls.remove (decl);
  }
  
! /* Map from FUNCTION_DECL to a FUNCTION_DECL for either the PRE_FN or POST_FN.
!    These are used to parse contract conditions and are called inside the body
!    of the guarded function.  */
! static GTY(()) hash_map<tree, tree> *decl_pre_fn;
! static GTY(()) hash_map<tree, tree> *decl_post_fn;
  
! /* Returns the precondition funtion for D, or null if not set.  */
  
  tree
! get_precondition_function (tree d)
  {
!   hash_map_maybe_create<hm_ggc> (decl_pre_fn);
!   tree *result = decl_pre_fn->get (d);
!   return result ? *result : NULL_TREE;
  }
  
! /* Returns the postcondition funtion for D, or null if not set.  */
  
  tree
! get_postcondition_function (tree d)
  {
!   hash_map_maybe_create<hm_ggc> (decl_post_fn);
!   tree *result = decl_post_fn->get (d);
!   return result ? *result : NULL_TREE;
  }
  
! /* Makes PRE the precondition function for D.  */
  
! void
! set_precondition_function (tree d, tree pre)
  {
!   gcc_assert (pre);
!   hash_map_maybe_create<hm_ggc> (decl_pre_fn);
!   gcc_assert (!decl_pre_fn->get (d));
!   decl_pre_fn->put (d, pre);
  }
  
! /* Makes POST the postcondition function for D.  */
  
! void
! set_postcondition_function (tree d, tree post)
  {
!   gcc_assert (post);
!   hash_map_maybe_create<hm_ggc> (decl_post_fn);
!   gcc_assert (!decl_post_fn->get (d));
!   decl_post_fn->put (d, post);
  }
  
! /* Set the PRE and POST functions for D.  Note that PRE and POST can be
!    null in this case. If so the functions are not recorded.  */
  
  void
! set_contract_functions (tree d, tree pre, tree post)
  {
!   if (pre)
!     set_precondition_function (d, pre);
!   if (post)
!     set_postcondition_function (d, post);
! }
  
! /* Return a copy of the FUNCTION_DECL IDECL with its own unshared
!    PARM_DECL and DECL_ATTRIBUTEs.  */
  
! static tree
! copy_fn_decl (tree idecl)
! {
!   tree decl = copy_decl (idecl);
!   DECL_ATTRIBUTES (decl) = copy_list (DECL_ATTRIBUTES (idecl));
  
!   if (DECL_RESULT (idecl))
      {
!       DECL_RESULT (decl) = copy_decl (DECL_RESULT (idecl));
!       DECL_CONTEXT (DECL_RESULT (decl)) = decl;
!     }
!   if (!DECL_ARGUMENTS (idecl) || VOID_TYPE_P (DECL_ARGUMENTS (idecl)))
!     return decl;
  
!   tree last = DECL_ARGUMENTS (decl) = copy_decl (DECL_ARGUMENTS (decl));
!   DECL_CONTEXT (last) = decl;
!   for (tree p = TREE_CHAIN (DECL_ARGUMENTS (idecl)); p; p = TREE_CHAIN (p))
!     {
!       if (VOID_TYPE_P (p))
  	{
! 	  TREE_CHAIN (last) = void_list_node;
! 	  break;
  	}
!       last = TREE_CHAIN (last) = copy_decl (p);
!       DECL_CONTEXT (last) = decl;
      }
-   return decl;
  }
  
! /* Build a declaration for the pre- or postcondition of a guarded FNDECL.  */
  
  static tree
! build_contract_condition_function (tree fndecl, bool pre)
  {
!   if (TREE_TYPE (fndecl) == error_mark_node)
!     return error_mark_node;
!   if (DECL_IOBJ_MEMBER_FUNCTION_P (fndecl)
!       && !TYPE_METHOD_BASETYPE (TREE_TYPE (fndecl)))
!     return error_mark_node;
  
!   /* Create and rename the unchecked function and give an internal name.  */
!   tree fn = copy_fn_decl (fndecl);
!   DECL_RESULT (fn) = NULL_TREE;
!   tree value_type = pre ? void_type_node : TREE_TYPE (TREE_TYPE (fn));
  
!   /* Don't propagate declaration attributes to the checking function,
!      including the original contracts.  */
!   DECL_ATTRIBUTES (fn) = NULL_TREE;
  
!   tree arg_types = NULL_TREE;
!   tree *last = &arg_types;
  
!   /* FIXME will later optimizations delete unused args to prevent extra arg
!      passing? do we care? */
!   tree class_type = NULL_TREE;
!   for (tree arg_type = TYPE_ARG_TYPES (TREE_TYPE (fn));
!       arg_type && arg_type != void_list_node;
!       arg_type = TREE_CHAIN (arg_type))
      {
!       if (DECL_IOBJ_MEMBER_FUNCTION_P (fndecl)
! 	  && TYPE_ARG_TYPES (TREE_TYPE (fn)) == arg_type)
!       {
! 	class_type = TREE_TYPE (TREE_VALUE (arg_type));
! 	continue;
!       }
!       *last = build_tree_list (TREE_PURPOSE (arg_type), TREE_VALUE (arg_type));
!       last = &TREE_CHAIN (*last);
      }
  
!   if (pre || VOID_TYPE_P (value_type))
!     *last = void_list_node;
    else
      {
!       tree name = get_identifier ("__r");
!       tree parm = build_lang_decl (PARM_DECL, name, value_type);
!       DECL_CONTEXT (parm) = fn;
!       DECL_ARTIFICIAL (parm) = true;
!       DECL_ARGUMENTS (fn) = chainon (DECL_ARGUMENTS (fn), parm);
! 
!       *last = build_tree_list (NULL_TREE, value_type);
!       TREE_CHAIN (*last) = void_list_node;
! 
!       /* The handler is a void return.  */
!       value_type = void_type_node;
      }
  
!   TREE_TYPE (fn) = build_function_type (value_type, arg_types);
!   if (DECL_IOBJ_MEMBER_FUNCTION_P (fndecl))
!     TREE_TYPE (fn) = build_method_type (class_type, TREE_TYPE (fn));
! 
!   DECL_NAME (fn) = copy_node (DECL_NAME (fn));
!   DECL_INITIAL (fn) = error_mark_node;
!   DECL_ABSTRACT_ORIGIN (fn) = fndecl;
  
!   IDENTIFIER_VIRTUAL_P (DECL_NAME (fn)) = false;
!   DECL_VIRTUAL_P (fn) = false;
  
!   /* Make these functions internal if we can, i.e. if the guarded function is
!      not vague linkage, or if we can put them in a comdat group with the
!      guarded function.  */
!   if (!DECL_WEAK (fndecl) || HAVE_COMDAT_GROUP)
      {
!       TREE_PUBLIC (fn) = false;
!       DECL_EXTERNAL (fn) = false;
!       DECL_WEAK (fn) = false;
!       DECL_COMDAT (fn) = false;
  
!       /* We may not have set the comdat group on the guarded function yet.
! 	 If we haven't, we'll add this to the same group in comdat_linkage
! 	 later.  Otherwise, add it to the same comdat group now.  */
!       if (DECL_ONE_ONLY (fndecl))
! 	{
! 	  symtab_node *n = symtab_node::get (fndecl);
! 	  cgraph_node::get_create (fn)->add_to_same_comdat_group (n);
! 	}
  
!       DECL_INTERFACE_KNOWN (fn) = true;
!     }
  
!   DECL_ARTIFICIAL (fn) = true;
  
!   /* Update various inline related declaration properties.  */
!   //DECL_DECLARED_INLINE_P (fn) = true;
!   DECL_DISREGARD_INLINE_LIMITS (fn) = true;
!   TREE_NO_WARNING (fn) = 1;
  
!   return fn;
  }
  
! /* Return true if CONTRACT is checked or assumed under the current build
!    configuration. */
  
! bool
! contract_active_p (tree contract)
  {
!   return get_contract_semantic (contract) != CCS_IGNORE;
! }
  
! static bool
! has_active_contract_condition (tree d, tree_code c)
! {
!   for (tree as = DECL_CONTRACTS (d) ; as != NULL_TREE; as = CONTRACT_CHAIN (as))
!     {
!       tree contract = TREE_VALUE (TREE_VALUE (as));
!       if (TREE_CODE (contract) == c && contract_active_p (contract))
! 	return true;
!     }
!   return false;
  }
  
! /* True if D has any checked or assumed preconditions.  */
  
! static bool
! has_active_preconditions (tree d)
  {
!   return has_active_contract_condition (d, PRECONDITION_STMT);
  }
  
! /* True if D has any checked or assumed postconditions.  */
  
! static bool
! has_active_postconditions (tree d)
  {
!   return has_active_contract_condition (d, POSTCONDITION_STMT);
  }
  
! /* Return true if any contract in the CONTRACT list is checked or assumed
!    under the current build configuration. */
  
! bool
! contract_any_active_p (tree contract)
  {
!   for (; contract != NULL_TREE; contract = CONTRACT_CHAIN (contract))
!     if (contract_active_p (TREE_VALUE (TREE_VALUE (contract))))
!       return true;
!   return false;
  }
  
! /* Do we need to mess with contracts for DECL1?  */
  
! static bool
! handle_contracts_p (tree decl1)
  {
!   return (flag_contracts
! 	  && !processing_template_decl
! 	  && DECL_ABSTRACT_ORIGIN (decl1) == NULL_TREE
! 	  && contract_any_active_p (DECL_CONTRACTS (decl1)));
  }
  
- /* Should we break out DECL1's pre/post contracts into separate functions?
-    FIXME I'd like this to default to 0, but that will need an overhaul to the
-    return identifier handling to just refer to the RESULT_DECL.  */
  
! static bool
! outline_contracts_p (tree decl1)
  {
!   return (!DECL_CONSTRUCTOR_P (decl1)
! 	  && !DECL_DESTRUCTOR_P (decl1));
  }
  
! /* Build the precondition checking function for D.  */
  
! static tree
! build_precondition_function (tree d)
  {
!   if (!has_active_preconditions (d))
!     return NULL_TREE;
  
!   return build_contract_condition_function (d, /*pre=*/true);
  }
  
! /* Build the postcondition checking function for D. If the return
!    type is undeduced, don't build the function yet. We do that in
!    apply_deduced_return_type.  */
  
! static tree
! build_postcondition_function (tree d)
  {
!   if (!has_active_postconditions (d))
!     return NULL_TREE;
  
!   tree type = TREE_TYPE (TREE_TYPE (d));
!   if (is_auto (type))
!     return NULL_TREE;
  
!   return build_contract_condition_function (d, /*pre=*/false);
  }
  
  static void
! build_contract_function_decls (tree d)
  {
!   /* Constructors and destructors have their contracts inserted inline.  */
!   if (!outline_contracts_p (d))
      return;
  
!   /* Build the pre/post functions (or not).  */
!   tree pre = build_precondition_function (d);
!   tree post = build_postcondition_function (d);
!   set_contract_functions (d, pre, post);
  }
  
! static const char *
! get_contract_level_name (tree contract)
! {
!   if (CONTRACT_LITERAL_MODE_P (contract))
!     return "";
!   if (tree mode = CONTRACT_MODE (contract))
!     if (tree level = TREE_VALUE (mode))
!       return IDENTIFIER_POINTER (level);
!   return "default";
! }
  
! static const char *
! get_contract_role_name (tree contract)
  {
!   if (CONTRACT_LITERAL_MODE_P (contract))
!     return "";
!   if (tree mode = CONTRACT_MODE (contract))
!     if (tree role = TREE_PURPOSE (mode))
!       return IDENTIFIER_POINTER (role);
!   return "default";
  }
  
! /* Build a layout-compatible internal version of std::contract_violation.  */
  
! static tree
! get_pseudo_contract_violation_type ()
  {
!   if (!pseudo_contract_violation_type)
!     {
!       /* Must match <contract>:
! 	 class contract_violation {
! 	   const char* _M_file;
! 	   const char* _M_function;
! 	   const char* _M_comment;
! 	   const char* _M_level;
! 	   const char* _M_role;
! 	   uint_least32_t _M_line;
! 	   signed char _M_continue;
! 	 If this changes, also update the initializer in
! 	 build_contract_violation.  */
!       struct field_info { tree type; const char* name; };
!       const field_info info[] = {
! 	{ const_string_type_node, "_M_file" },
! 	{ const_string_type_node, "_M_function" },
! 	{ const_string_type_node, "_M_comment" },
! 	{ const_string_type_node, "_M_level" },
! 	{ const_string_type_node, "_M_role" },
! 	{ uint_least32_type_node, "_M_line" },
! 	{ signed_char_type_node, "_M_continue" }
!       };
!       tree fields = NULL_TREE;
!       for (const field_info& i : info)
! 	{
! 	  /* finish_builtin_struct wants fieldss chained in reverse.  */
! 	  tree next = build_decl (BUILTINS_LOCATION, FIELD_DECL,
! 				  get_identifier (i.name), i.type);
! 	  DECL_CHAIN (next) = fields;
! 	  fields = next;
! 	}
!       iloc_sentinel ils (input_location);
!       input_location = BUILTINS_LOCATION;
!       pseudo_contract_violation_type = make_class_type (RECORD_TYPE);
!       finish_builtin_struct (pseudo_contract_violation_type,
! 			     "__pseudo_contract_violation",
! 			     fields, NULL_TREE);
!       CLASSTYPE_AS_BASE (pseudo_contract_violation_type)
! 	= pseudo_contract_violation_type;
!       DECL_CONTEXT (TYPE_NAME (pseudo_contract_violation_type))
! 	= FROB_CONTEXT (global_namespace);
!       TREE_PUBLIC (TYPE_NAME (pseudo_contract_violation_type)) = true;
!       CLASSTYPE_LITERAL_P (pseudo_contract_violation_type) = true;
!       CLASSTYPE_LAZY_COPY_CTOR (pseudo_contract_violation_type) = true;
!       xref_basetypes (pseudo_contract_violation_type, /*bases=*/NULL_TREE);
!       pseudo_contract_violation_type
! 	= cp_build_qualified_type (pseudo_contract_violation_type,
! 				   TYPE_QUAL_CONST);
!     }
!   return pseudo_contract_violation_type;
  }
  
! /* Return a VAR_DECL to pass to handle_contract_violation.  */
  
  static tree
! build_contract_violation (tree contract, contract_continuation cmode)
  {
!   expanded_location loc = expand_location (EXPR_LOCATION (contract));
!   const char *function = fndecl_name (DECL_ORIGIN (current_function_decl));
!   const char *level = get_contract_level_name (contract);
!   const char *role = get_contract_role_name (contract);
  
!   /* Must match the type layout in get_pseudo_contract_violation_type.  */
!   tree ctor = build_constructor_va
!     (init_list_type_node, 7,
!      NULL_TREE, build_string_literal (loc.file),
!      NULL_TREE, build_string_literal (function),
!      NULL_TREE, CONTRACT_COMMENT (contract),
!      NULL_TREE, build_string_literal (level),
!      NULL_TREE, build_string_literal (role),
!      NULL_TREE, build_int_cst (uint_least32_type_node, loc.line),
!      NULL_TREE, build_int_cst (signed_char_type_node, cmode));
  
!   ctor = finish_compound_literal (get_pseudo_contract_violation_type (),
! 				  ctor, tf_none);
!   protected_set_expr_location (ctor, EXPR_LOCATION (contract));
!   return ctor;
  }
  
! /* Return handle_contract_violation(), declaring it if needed.  */
  
  static tree
  declare_handle_contract_violation ()
  {
    tree fnname = get_identifier ("handle_contract_violation");
    tree viol_name = get_identifier ("contract_violation");
    tree l = lookup_qualified_name (global_namespace, fnname,
--- 1468,2423 ----
  
        insert_decl_map (&id, sp, dp);
        do_remap = true;
+ 
+       /* First artificial arg is *this. We want to remap that.  However, we
+ 	 want to skip _in_charge param and __vtt_parm.  Do so now.  */
+       if (src_num_artificial_args > 0)
+ 	{
+ 	  while (--src_num_artificial_args,src_num_artificial_args > 0)
+ 	    sp = DECL_CHAIN (sp);
+ 	}
+       if (dst_num_artificial_args > 0)
+ 	{
+ 	  while (--dst_num_artificial_args,dst_num_artificial_args > 0)
+ 	    dp = DECL_CHAIN (dp);
+ 	}
      }
+ 
    if (!do_remap)
      return;
  
    walk_tree (&CONTRACT_CONDITION (contract), copy_tree_body_r, &id, NULL);
  }
  
! /* Returns a copy of SOURCE contracts where any references to SOURCE's
!    PARM_DECLs have been rewritten to the corresponding PARM_DECL in DEST.  */
  
! tree
! copy_and_remap_contracts (tree dest, tree source,
! 			  contract_match_kind remap_kind)
  {
!   tree last = NULL_TREE, contracts_copy= NULL_TREE;
!   tree contracts = get_fn_contract_specifiers (source);
!   for (; contracts; contracts = TREE_CHAIN (contracts))
      {
!       if ((remap_kind == cmk_pre
! 	   && (TREE_CODE (CONTRACT_STATEMENT (contracts))
! 	       == POSTCONDITION_STMT))
! 	  || (remap_kind == cmk_post
! 	      && (TREE_CODE (CONTRACT_STATEMENT (contracts))
! 		  == PRECONDITION_STMT)))
  	continue;
! 
!       /* The first part is copying of the legacy attribute layout - eventually
! 	 this will go away.  */
!       tree c = copy_node (contracts);
!       TREE_VALUE (c) = build_tree_list (TREE_PURPOSE (TREE_VALUE (c)),
! 					copy_node (CONTRACT_STATEMENT (c)));
!       /* This is the copied contract statement.  */
!       tree stmt = CONTRACT_STATEMENT (c);
! 
!       /* If we have an erroneous postcondition identifier, we also mark the
! 	 condition as invalid so only need to check that.  */
!       if (CONTRACT_CONDITION (stmt) != error_mark_node)
! 	remap_contract (source, dest, stmt, /*duplicate_p=*/true);
! 
!       if (TREE_CODE (stmt) == POSTCONDITION_STMT)
! 	{
! 	  /* If we have a postcondition return value placeholder, then
! 	     ensure the copied one has the correct context.  */
! 	  tree var = POSTCONDITION_IDENTIFIER (stmt);
! 	  if (var && var != error_mark_node)
! 	    DECL_CONTEXT (var) = dest;
! 	}
! 
!       if (CONTRACT_COMMENT (stmt) != error_mark_node)
! 	CONTRACT_COMMENT (stmt) = copy_node (CONTRACT_COMMENT (stmt));
! 
!       chainon (last, c);
!       last = c;
!       if (!contracts_copy)
! 	contracts_copy = c;
      }
+ 
+   return contracts_copy;
  }
  
! /* Set the (maybe) parsed contract specifier LIST for DECL.  */
  
! void
! set_fn_contract_specifiers (tree decl, tree list)
  {
!   if (!decl || error_operand_p (decl))
!     return;
! 
!   bool existed = false;
!   contract_decl& rd
!     = hash_map_safe_get_or_insert<hm_ggc> (contract_decl_map, decl, &existed);
!   if (!existed)
!     {
!       /* This is the first time we encountered this decl, save the location
! 	 for error messages.  This will ensure all error messages refer to the
! 	 contracts used for the function.  */
!       location_t decl_loc = DECL_SOURCE_LOCATION (decl);
!       location_t cont_end = decl_loc;
!       if (list)
! 	cont_end = get_contract_end_loc (list);
!       rd.note_loc = make_location (decl_loc, decl_loc, cont_end);
!     }
!   rd.contract_specifiers = list;
  }
  
! /* Update the entry for DECL in the map of contract specifiers with the
!   contracts in LIST. */
  
! void
! update_fn_contract_specifiers (tree decl, tree list)
  {
!   if (!decl || error_operand_p (decl))
!     return;
! 
!   bool existed = false;
!   contract_decl& rd
!     = hash_map_safe_get_or_insert<hm_ggc> (contract_decl_map, decl, &existed);
!   gcc_checking_assert (existed);
! 
!   /* We should only get here when we parse deferred contracts.  */
!   gcc_checking_assert (!contract_any_deferred_p (list));
! 
!   rd.contract_specifiers = list;
  }
  
! /* When a decl is about to be removed, then we need to release its content and
!    then take it out of the map.  */
  
! void
! remove_decl_with_fn_contracts_specifiers (tree decl)
! {
!   if (contract_decl *p = hash_map_safe_get (contract_decl_map, decl))
!     {
!       p->contract_specifiers = NULL_TREE;
!       contract_decl_map->remove (decl);
!     }
! }
  
! /* If this function has contract specifiers, then remove them, but leave the
!    function registered.  */
! 
! void
! remove_fn_contract_specifiers (tree decl)
  {
!   if (contract_decl *p = hash_map_safe_get (contract_decl_map, decl))
!     {
!       p->contract_specifiers = NULL_TREE;
!     }
  }
  
! /* Get the contract specifier list for this DECL if there is one.  */
  
! tree
! get_fn_contract_specifiers (tree decl)
  {
!   if (contract_decl *p = hash_map_safe_get (contract_decl_map, decl))
!     return p->contract_specifiers;
!   return NULL_TREE;
  }
  
! /* A subroutine of duplicate_decls. Diagnose issues in the redeclaration of
!    guarded functions.  */
  
! void
! check_redecl_contract (tree newdecl, tree olddecl)
  {
!   if (!flag_contracts)
!     return;
  
!   if (TREE_CODE (newdecl) == TEMPLATE_DECL)
!     newdecl = DECL_TEMPLATE_RESULT (newdecl);
!   if (TREE_CODE (olddecl) == TEMPLATE_DECL)
!     olddecl = DECL_TEMPLATE_RESULT (olddecl);
  
!   tree new_contracts = get_fn_contract_specifiers (newdecl);
!   tree old_contracts = get_fn_contract_specifiers (olddecl);
  
!   if (!old_contracts && !new_contracts)
!     return;
  
!   /* We should always be comparing with the 'first' declaration which should
!    have been recorded already (if it has contract specifiers).  However
!    if the new decl is trying to add contracts, that is an error and we do
!    not want to create a map entry yet.  */
!   contract_decl *rdp = hash_map_safe_get (contract_decl_map, olddecl);
!   gcc_checking_assert(rdp || !old_contracts);
  
!   location_t new_loc = DECL_SOURCE_LOCATION (newdecl);
!   if (new_contracts && !old_contracts)
      {
        auto_diagnostic_group d;
!       /* If a re-declaration has contracts, they must be the same as those
!        that appear on the first declaration seen (they cannot be added).  */
!       location_t cont_end = get_contract_end_loc (new_contracts);
!       cont_end = make_location (new_loc, new_loc, cont_end);
!       error_at (cont_end, "declaration adds contracts to %q#D", olddecl);
!       inform (DECL_SOURCE_LOCATION (olddecl), "first declared here");
!       return;
      }
  
!   if (old_contracts && !new_contracts)
!     /* We allow re-declarations to omit contracts declared on the initial decl.
!        In fact, this is required if the conditions contain lambdas.  Check if
!        all the parameters are correctly const qualified. */
!     check_postconditions_in_redecl (olddecl, newdecl);
!   else if (old_contracts && new_contracts
! 	   && !contract_any_deferred_p (old_contracts)
! 	   && contract_any_deferred_p (new_contracts)
! 	   && DECL_UNIQUE_FRIEND_P (newdecl))
!     {
!       /* Put the defered contracts on the olddecl so we parse it when
! 	 we can.  */
!       set_fn_contract_specifiers (olddecl, old_contracts);
!     }
!   else if (contract_any_deferred_p (old_contracts)
! 	   || contract_any_deferred_p (new_contracts))
!     {
!       /* TODO: ignore these and figure out how to process them later.  */
!       /* Note that a friend declaration has deferred contracts, but the
! 	 declaration of the same function outside the class definition
! 	 doesn't.  */
!     }
!   else
!     {
!       gcc_checking_assert (old_contracts);
!       location_t cont_end = get_contract_end_loc (new_contracts);
!       cont_end = make_location (new_loc, new_loc, cont_end);
!       /* We have two sets - they should match or we issue a diagnostic.  */
!       match_contract_specifiers (rdp->note_loc, old_contracts,
! 				 cont_end, new_contracts);
!     }
! 
!   return;
  }
  
! /* Update the contracts of DEST to match the argument names from contracts
!   of SRC. When we merge two declarations in duplicate_decls, we preserve the
!   arguments from the new declaration, if the new declaration is a
!   definition. We need to update the contracts accordingly.  */
  
! void
! update_contract_arguments (tree srcdecl, tree destdecl)
  {
!   tree src_contracts = get_fn_contract_specifiers (srcdecl);
!   tree dest_contracts = get_fn_contract_specifiers (destdecl);
  
!   if (!src_contracts && !dest_contracts)
!     return;
  
!   /* Check if src even has contracts. It is possible that a redeclaration
!     does not have contracts. Is this is the case, first apply contracts
!     to src.  */
!   if (!src_contracts)
!     {
!       if (contract_any_deferred_p (dest_contracts))
! 	{
! 	  set_fn_contract_specifiers (srcdecl, dest_contracts);
! 	  /* Nothing more to do here.  */
! 	  return;
! 	}
!       else
! 	set_fn_contract_specifiers
! 	  (srcdecl, copy_and_remap_contracts (srcdecl, destdecl));
      }
  
!   /* For deferred contracts, we currently copy the tokens from the redeclaration
!     onto the decl that will be preserved. This is not ideal because the
!     redeclaration may have erroneous contracts.
!     For non deferred contracts we currently do copy and remap, which is doing
!     more than we need.  */
!   if (contract_any_deferred_p (src_contracts))
!     set_fn_contract_specifiers (destdecl, src_contracts);
!   else
      {
!       /* Temporarily rename the arguments to get the right mapping.  */
!       tree tmp_arguments = DECL_ARGUMENTS (destdecl);
!       DECL_ARGUMENTS (destdecl) = DECL_ARGUMENTS (srcdecl);
!       set_fn_contract_specifiers (destdecl,
! 				  copy_and_remap_contracts (destdecl, srcdecl));
!       DECL_ARGUMENTS (destdecl) = tmp_arguments;
      }
  }
  
! /* Checks if a contract check wrapper is needed for fndecl.  */
  
! static bool
! should_contract_wrap_call (bool do_pre, bool do_post)
! {
!   /* Only if the target function actually has any contracts.  */
!   if (!do_pre && !do_post)
!     return false;
  
  
!   return ((flag_contract_client_check > 1)
! 	  || ((flag_contract_client_check > 0)
! 	      && do_pre));
! }
  
! /* Possibly replace call with a call to a wrapper function which
!    will do the contracts check required around a CALL to FNDECL.  */
  
! tree
! maybe_contract_wrap_call (tree fndecl, tree call)
  {
!   /* We can be called from build_cxx_call without a known callee.  */
!   if (!fndecl)
!     return call;
! 
!   if (error_operand_p (fndecl) || !call || call == error_mark_node)
!     return error_mark_node;
! 
!   if (!handle_contracts_p (fndecl))
!     return call;
! 
!   bool do_pre = has_active_preconditions (fndecl);
!   bool do_post = has_active_postconditions (fndecl);
! 
!   /* Check if we need a wrapper.  */
!   if (!should_contract_wrap_call (do_pre, do_post))
!     return call;
! 
!   /* Build the declaration of the wrapper, if we need to.  */
!   tree wrapdecl = get_or_create_contract_wrapper_function (fndecl);
! 
!   unsigned nargs = call_expr_nargs (call);
!   vec<tree, va_gc> *argwrap;
!   vec_alloc (argwrap, nargs);
! 
!   tree arg;
!   call_expr_arg_iterator iter;
!   FOR_EACH_CALL_EXPR_ARG (arg, iter, call)
!     argwrap->quick_push (arg);
! 
!   tree wrapcall = build_call_expr_loc_vec (DECL_SOURCE_LOCATION (wrapdecl),
! 					   wrapdecl, argwrap);
! 
!   return wrapcall;
  }
  
! /* Map traversal callback to define a wrapper function.
!    This generates code for client-side contract check wrappers and the
!    noexcept wrapper around the contract violation handler.  */
  
! bool
! define_contract_wrapper_func (const tree& fndecl, const tree& wrapdecl, void*)
  {
!   /* If we already built this function on a previous pass, then do nothing.  */
!   if (DECL_INITIAL (wrapdecl) && DECL_INITIAL (wrapdecl) != error_mark_node)
!     return true;
  
!   gcc_checking_assert (!DECL_HAS_CONTRACTS_P (wrapdecl));
!   /* We check postconditions if postcondition checks are enabled for clients.
!     We should not get here unless there are some checks to make.  */
!   bool check_post = flag_contract_client_check > 1;
!   /* For wrappers on CDTORs we need to refer to the original contracts,
!      when the wrapper is around a clone.  */
!   set_fn_contract_specifiers ( wrapdecl,
! 		      copy_and_remap_contracts (wrapdecl, DECL_ORIGIN (fndecl),
! 						check_post? cmk_all : cmk_pre));
  
!   start_preparsed_function (wrapdecl, /*DECL_ATTRIBUTES*/NULL_TREE,
! 			    SF_DEFAULT | SF_PRE_PARSED);
!   tree body = begin_function_body ();
!   tree compound_stmt = begin_compound_stmt (BCS_FN_BODY);
  
!   vec<tree, va_gc> * args = build_arg_list (wrapdecl);
  
!   /* We do not support contracts on virtual functions yet.  */
!   gcc_checking_assert (!DECL_IOBJ_MEMBER_FUNCTION_P (fndecl)
! 		       || !DECL_VIRTUAL_P (fndecl));
! 
!   tree call = build_thunk_like_call (fndecl, args->length (), args->address ());
! 
!   finish_return_stmt (call);
! 
!   finish_compound_stmt (compound_stmt);
!   finish_function_body (body);
!   expand_or_defer_fn (finish_function (/*inline_p=*/false));
!   return true;
  }
  
! /* If any wrapper functions have been declared, emit their definition.
!    This might be called multiple times, as we instantiate functions. When
!    the processing here adds more wrappers, then flag to the caller that
!    possible additional instantiations should be considered.
!    Once instantiations are complete, this will be called with done == true.  */
  
! bool
! emit_contract_wrapper_func (bool done)
! {
!   if (!decl_wrapper_fn || decl_wrapper_fn->is_empty ())
!     return false;
!   size_t start_elements = decl_wrapper_fn->elements ();
!   decl_wrapper_fn->traverse<void *, define_contract_wrapper_func>(NULL);
!   bool more = decl_wrapper_fn->elements () > start_elements;
!   if (done)
!     decl_wrapper_fn->empty ();
!   gcc_checking_assert (!done || !more);
!   return more;
! }
! 
! /* Mark most of a contract as being invalid.  */
  
  tree
! invalidate_contract (tree contract)
  {
!   if (TREE_CODE (contract) == POSTCONDITION_STMT
!       && POSTCONDITION_IDENTIFIER (contract))
!     POSTCONDITION_IDENTIFIER (contract) = error_mark_node;
!   CONTRACT_CONDITION (contract) = error_mark_node;
!   CONTRACT_COMMENT (contract) = error_mark_node;
!   return contract;
  }
  
! /* Returns an invented parameter declaration of the form 'TYPE ID' for the
!    purpose of parsing the postcondition.
! 
!    We use a PARM_DECL instead of a VAR_DECL so that tsubst forces a lookup
!    in local specializations when we instantiate these things later.  */
  
  tree
! make_postcondition_variable (cp_expr id, tree type)
  {
!   if (id == error_mark_node)
!     return id;
!   gcc_checking_assert (scope_chain && scope_chain->bindings
! 		       && scope_chain->bindings->kind == sk_contract);
! 
!   tree decl = build_lang_decl (PARM_DECL, id, type);
!   DECL_ARTIFICIAL (decl) = true;
!   DECL_SOURCE_LOCATION (decl) = id.get_location ();
!   return pushdecl (decl);
  }
  
! /* As above, except that the type is unknown.  */
  
! tree
! make_postcondition_variable (cp_expr id)
  {
!   return make_postcondition_variable (id, make_auto ());
  }
  
! /* Check that the TYPE is valid for a named postcondition variable on
!    function decl FNDECL. Emit a diagnostic if it is not.  Returns TRUE if
!    the result is OK and false otherwise.  */
  
! bool
! check_postcondition_result (tree fndecl, tree type, location_t loc)
  {
!   /* Do not be confused by targetm.cxx.cdtor_return_this ();
!      conceptually, cdtors have no return value.  */
!   if (VOID_TYPE_P (type)
!       || DECL_CONSTRUCTOR_P (fndecl)
!       || DECL_DESTRUCTOR_P (fndecl))
!     {
!       error_at (loc,
! 		DECL_CONSTRUCTOR_P (fndecl)
! 		? G_("constructor does not return a value to test")
! 		: DECL_DESTRUCTOR_P (fndecl)
! 		? G_("destructor does not return a value to test")
! 		: G_("function does not return a value to test"));
!       return false;
!     }
! 
!   return true;
  }
  
! /* Instantiate each postcondition with the return type to finalize the
!    contract specifiers on a function decl FNDECL.  */
  
  void
! rebuild_postconditions (tree fndecl)
  {
!   if (!fndecl || fndecl == error_mark_node)
!     return;
  
!   tree type = TREE_TYPE (TREE_TYPE (fndecl));
  
!   /* If the return type is undeduced, defer until later.  */
!   if (TREE_CODE (type) == TEMPLATE_TYPE_PARM)
!     return;
  
!   tree contract_spec = get_fn_contract_specifiers (fndecl);
!   for (; contract_spec ; contract_spec = TREE_CHAIN (contract_spec))
      {
!       tree contract = TREE_VALUE (TREE_VALUE (contract_spec));
!       if (TREE_CODE (contract) != POSTCONDITION_STMT)
! 	continue;
!       tree condition = CONTRACT_CONDITION (contract);
!       if (!condition || condition == error_mark_node)
! 	continue;
  
!       /* If any conditions are deferred, they're all deferred.  Note that
! 	 we don't have to instantiate postconditions in that case because
! 	 the type is available through the declaration.  */
!       if (TREE_CODE (condition) == DEFERRED_PARSE)
! 	return;
! 
!       tree oldvar = POSTCONDITION_IDENTIFIER (contract);
!       if (!oldvar)
! 	continue;
! 
!       gcc_checking_assert (!DECL_CONTEXT (oldvar)
! 			   || DECL_CONTEXT (oldvar) == fndecl);
!       DECL_CONTEXT (oldvar) = fndecl;
! 
!       /* Check the postcondition variable.  */
!       location_t loc = DECL_SOURCE_LOCATION (oldvar);
!       if (!check_postcondition_result (fndecl, type, loc))
  	{
! 	  invalidate_contract (contract);
! 	  continue;
  	}
! 
!       /* "Instantiate" the result variable using the known type.  */
!       tree newvar = copy_node (oldvar);
!       TREE_TYPE (newvar) = type;
! 
!       /* Make parameters and result available for substitution.  */
!       local_specialization_stack stack (lss_copy);
!       for (tree t = DECL_ARGUMENTS (fndecl); t != NULL_TREE; t = TREE_CHAIN (t))
! 	register_local_identity (t);
!       register_local_specialization (newvar, oldvar);
! 
!       begin_scope (sk_contract, fndecl);
!       bool old_pc = processing_postcondition;
!       processing_postcondition = true;
! 
!       condition = tsubst_expr (condition, make_tree_vec (0),
! 			       tf_warning_or_error, fndecl);
! 
!       /* Update the contract condition and result.  */
!       POSTCONDITION_IDENTIFIER (contract) = newvar;
!       CONTRACT_CONDITION (contract) = finish_contract_condition (condition);
!       processing_postcondition = old_pc;
!       gcc_checking_assert (scope_chain && scope_chain->bindings
! 			   && scope_chain->bindings->kind == sk_contract);
!       pop_bindings_and_leave_scope ();
      }
  }
  
! /* Make a string of the contract condition, if it is available.  */
  
  static tree
! build_comment (cp_expr condition)
  {
!   /* Try to get the actual source text for the condition; if that fails pretty
!      print the resulting tree.  */
!   char *str = get_source_text_between (global_dc->get_file_cache (),
! 				       condition.get_start (),
! 				       condition.get_finish ());
!   if (!str)
!     {
!       const char *str = expr_to_string (condition);
!       return build_string_literal (strlen (str) + 1, str);
!     }
  
!   tree t = build_string_literal (strlen (str) + 1, str);
!   free (str);
!   return t;
! }
  
! /* Build a contract statement.  */
  
! tree
! grok_contract (tree contract_spec, tree mode, tree result, cp_expr condition,
! 	       location_t loc)
! {
!   if (condition == error_mark_node)
!     return error_mark_node;
  
!   tree_code code;
!   contract_assertion_kind kind = CAK_INVALID;
!   if (id_equal (contract_spec, "contract_assert"))
      {
!       code = ASSERTION_STMT;
!       kind = CAK_ASSERT;
!     }
!   else if (id_equal (contract_spec, "pre"))
!     {
!       code = PRECONDITION_STMT;
!       kind = CAK_PRE;
!     }
!   else if (id_equal (contract_spec,"post"))
!     {
!       code = POSTCONDITION_STMT;
!       kind = CAK_POST;
      }
+   else
+     gcc_unreachable ();
  
!   /* Build the contract. The condition is added later.  In the case that
!      the contract is deferred, result an plain identifier, not a result
!      variable.  */
!   tree contract;
!   if (code != POSTCONDITION_STMT)
!     contract = build5_loc (loc, code, void_type_node, mode,
! 			   NULL_TREE, NULL_TREE, NULL_TREE, NULL_TREE);
    else
      {
!       contract = build_nt (code, mode, NULL_TREE, NULL_TREE,
! 			   NULL_TREE, NULL_TREE, result);
!       TREE_TYPE (contract) = void_type_node;
!       SET_EXPR_LOCATION (contract, loc);
      }
  
!   /* Determine the assertion kind.  */
!   CONTRACT_ASSERTION_KIND (contract) = build_int_cst (uint16_type_node, kind);
  
!   /* Determine the evaluation semantic.  This is now an override, so that if
!      not set we will get the default (currently enforce).  */
!   CONTRACT_EVALUATION_SEMANTIC (contract)
!     = build_int_cst (uint16_type_node, (uint16_t)
! 		     flag_contract_evaluation_semantic);
  
!   /* If the contract is deferred, don't do anything with the condition.  */
!   if (TREE_CODE (condition) == DEFERRED_PARSE)
      {
!       CONTRACT_CONDITION (contract) = condition;
!       return contract;
!     }
  
!   /* Generate the comment from the original condition.  */
!   CONTRACT_COMMENT (contract) = build_comment (condition);
  
!   /* The condition is converted to bool.  */
!   condition = finish_contract_condition (condition);
  
!   if (condition == error_mark_node)
!     return error_mark_node;
  
!   CONTRACT_CONDITION (contract) = condition;
  
!   return contract;
  }
  
! /* Build the contract specifier where IDENTIFIER is one of 'pre',
!    'post' or 'assert' and CONTRACT is the underlying statement.  */
  
! tree
! finish_contract_specifier (tree identifier, tree contract)
  {
!   if (contract == error_mark_node)
!     return error_mark_node;
  
!   tree contract_spec = build_tree_list (build_tree_list (NULL_TREE, identifier),
! 					build_tree_list (NULL_TREE, contract));
! 
!   /* Mark the contract as dependent if the condition is dependent.  */
!   tree condition = CONTRACT_CONDITION (contract);
!   if (TREE_CODE (condition) != DEFERRED_PARSE
!       && value_dependent_expression_p (condition))
!     ATTR_IS_DEPENDENT (contract_spec) = true;
! 
!   return contract_spec;
  }
  
! /* Update condition of a late-parsed contract and postcondition variable,
!    if any.  */
  
! void
! update_late_contract (tree contract, tree result, cp_expr condition)
  {
!   if (TREE_CODE (contract) == POSTCONDITION_STMT)
!     POSTCONDITION_IDENTIFIER (contract) = result;
! 
!   /* Generate the comment from the original condition.  */
!   CONTRACT_COMMENT (contract) = build_comment (condition);
! 
!   /* The condition is converted to bool.  */
!   condition = finish_contract_condition (condition);
!   CONTRACT_CONDITION (contract) = condition;
  }
  
! /* Returns the precondition funtion for FNDECL, or null if not set.  */
  
! tree
! get_precondition_function (tree fndecl)
  {
!   gcc_checking_assert (fndecl);
!   tree *result = hash_map_safe_get (decl_pre_fn, fndecl);
!   return result ? *result : NULL_TREE;
  }
  
! /* Returns the postcondition funtion for FNDECL, or null if not set.  */
  
! tree
! get_postcondition_function (tree fndecl)
  {
!   gcc_checking_assert (fndecl);
!   tree *result = hash_map_safe_get (decl_post_fn, fndecl);
!   return result ? *result : NULL_TREE;
  }
  
! /* Set the PRE and POST functions for FNDECL.  Note that PRE and POST can
!    be null in this case.  If so the functions are not recorded.  Used by the
!    modules code.  */
  
! void
! set_contract_functions (tree fndecl, tree pre, tree post)
  {
!   if (pre)
!     set_precondition_function (fndecl, pre);
! 
!   if (post)
!     set_postcondition_function (fndecl, post);
  }
  
  
! /* We're compiling the pre/postcondition function CONDFN; remap any FN
!    contracts that match CODE and emit them.  */
! 
! static void
! remap_and_emit_conditions (tree fn, tree condfn, tree_code code)
  {
!   gcc_assert (code == PRECONDITION_STMT || code == POSTCONDITION_STMT);
!   tree contract_spec = get_fn_contract_specifiers (fn);
!   for (; contract_spec; contract_spec = TREE_CHAIN (contract_spec))
!     {
!       tree contract = CONTRACT_STATEMENT (contract_spec);
!       if (TREE_CODE (contract) == code)
! 	{
! 	  contract = copy_node (contract);
! 	  if (CONTRACT_CONDITION (contract) != error_mark_node)
! 	    remap_contract (fn, condfn, contract, /*duplicate_p=*/false);
! 	  emit_contract_statement (contract);
! 	}
!     }
  }
  
! /* Finish up the pre & post function definitions for a guarded FNDECL,
!    and compile those functions all the way to assembler language output.  */
  
! void
! finish_function_outlined_contracts (tree fndecl)
  {
!   /* If the guarded func is either already decided to be ill-formed or is
!      not yet complete return early.  */
!   if (error_operand_p (fndecl)
!       || !DECL_INITIAL (fndecl)
!       || DECL_INITIAL (fndecl) == error_mark_node)
!     return;
  
!   /* If there are no contracts here, or we're building them in-line then we
!      do not need to build the outlined functions.  */
!   if (!handle_contracts_p (fndecl)
!       || !flag_contract_checks_outlined)
!     return;
! 
!   /* If this is not a client side check and definition side checks are
!      disabled, do nothing.  */
!   if (!flag_contracts_definition_check
!       && !DECL_CONTRACT_WRAPPER (fndecl))
!     return;
! 
!   /* If either the pre or post functions are bad, don't bother emitting
!      any contracts.  The program is already ill-formed.  */
!   tree pre = DECL_PRE_FN (fndecl);
!   tree post = DECL_POST_FN (fndecl);
!   if (pre == error_mark_node || post == error_mark_node)
!     return;
! 
!   /* We are generating code, deferred parses should be complete.  */
!   tree contract_spec = get_fn_contract_specifiers (fndecl);
!   gcc_checking_assert (!contract_any_deferred_p (contract_spec));
! 
!   int flags = SF_DEFAULT | SF_PRE_PARSED;
! 
!   if (pre && !DECL_INITIAL (pre))
!     {
!       DECL_PENDING_INLINE_P (pre) = false;
!       start_preparsed_function (pre, DECL_ATTRIBUTES (pre), flags);
!       remap_and_emit_conditions (fndecl, pre, PRECONDITION_STMT);
!       finish_return_stmt (NULL_TREE);
!       pre = finish_function (false);
!       expand_or_defer_fn (pre);
!     }
! 
!   if (post && !DECL_INITIAL (post))
!     {
!       DECL_PENDING_INLINE_P (post) = false;
!       start_preparsed_function (post, DECL_ATTRIBUTES (post), flags);
!       remap_and_emit_conditions (fndecl, post, POSTCONDITION_STMT);
!       gcc_checking_assert (VOID_TYPE_P (TREE_TYPE (TREE_TYPE (post))));
!       finish_return_stmt (NULL_TREE);
!       post = finish_function (false);
!       expand_or_defer_fn (post);
!     }
  }
  
! /* ===== Code generation ===== */
  
! /* Insert a BUILT_IN_OBSERVABLE_CHECKPOINT epoch marker.  */
! 
! static void
! emit_builtin_observable_checkpoint ()
  {
!   tree fn = builtin_decl_explicit (BUILT_IN_OBSERVABLE_CHKPT);
!   releasing_vec vec;
!   fn = finish_call_expr (fn, &vec, false, false, tf_warning_or_error);
!   finish_expr_stmt (fn);
! }
  
! /* Shared code between TU-local wrappers for the violation handler.  */
  
! static tree
! declare_one_violation_handler_wrapper (tree fn_name, tree fn_type,
! 				       tree p1_type, tree p2_type)
! {
!   location_t loc = BUILTINS_LOCATION;
!   tree fn_decl = build_lang_decl_loc (loc, FUNCTION_DECL, fn_name, fn_type);
!   DECL_CONTEXT (fn_decl) = FROB_CONTEXT (global_namespace);
!   DECL_ARTIFICIAL (fn_decl) = true;
!   DECL_INITIAL (fn_decl) = error_mark_node;
!   /* Let the start function code fill in the result decl.  */
!   DECL_RESULT (fn_decl) = NULL_TREE;
!   /* Two args violation ref, dynamic info.  */
!   tree parms = cp_build_parm_decl (fn_decl, NULL_TREE, p1_type);
!   TREE_USED (parms) = true;
!   DECL_READ_P (parms) = true;
!   tree p2 = cp_build_parm_decl (fn_decl, NULL_TREE, p2_type);
!   TREE_USED (p2) = true;
!   DECL_READ_P (p2) = true;
!   DECL_CHAIN (parms) = p2;
!   DECL_ARGUMENTS (fn_decl) = parms;
!   /* Make this function internal.  */
!   TREE_PUBLIC (fn_decl) = false;
!   DECL_EXTERNAL (fn_decl) = false;
!   DECL_WEAK (fn_decl) = false;
!   return fn_decl;
  }
  
+ static GTY(()) tree tu_has_violation = NULL_TREE;
+ static GTY(()) tree tu_has_violation_exception = NULL_TREE;
+ 
  static void
! declare_violation_handler_wrappers ()
  {
!   if (tu_has_violation && tu_has_violation_exception)
      return;
  
!   iloc_sentinel ils (input_location);
!   input_location = BUILTINS_LOCATION;
!   tree v_obj_type = builtin_contract_violation_type;
!   v_obj_type = cp_build_qualified_type (v_obj_type, TYPE_QUAL_CONST);
!   v_obj_type = cp_build_reference_type (v_obj_type, /*rval*/false);
!   tree fn_type = build_function_type_list (void_type_node, v_obj_type,
! 					   uint16_type_node, NULL_TREE);
!   tree fn_name = get_identifier ("__tu_has_violation_exception");
!   tu_has_violation_exception
!     = declare_one_violation_handler_wrapper (fn_name, fn_type, v_obj_type,
! 					     uint16_type_node);
!   fn_name = get_identifier ("__tu_has_violation");
!   tu_has_violation
!     = declare_one_violation_handler_wrapper (fn_name, fn_type, v_obj_type,
! 					     uint16_type_node);
  }
  
! static GTY(()) tree tu_terminate_wrapper = NULL_TREE;
  
! /* Declare a noipa wrapper around the call to std::terminate */
! 
! static tree
! declare_terminate_wrapper ()
  {
!   if (tu_terminate_wrapper)
!     return tu_terminate_wrapper;
! 
!   iloc_sentinel ils (input_location);
!   input_location = BUILTINS_LOCATION;
! 
!   tree fn_type = build_function_type_list (void_type_node, NULL_TREE);
!   if (!TREE_NOTHROW (terminate_fn))
!     fn_type = build_exception_variant (fn_type, noexcept_true_spec);
!   tree fn_name = get_identifier ("__tu_terminate_wrapper");
! 
!   tu_terminate_wrapper
!     = build_lang_decl_loc (input_location, FUNCTION_DECL, fn_name, fn_type);
!   DECL_CONTEXT (tu_terminate_wrapper) = FROB_CONTEXT(global_namespace);
!   DECL_ARTIFICIAL (tu_terminate_wrapper) = true;
!   DECL_INITIAL (tu_terminate_wrapper) = error_mark_node;
!   /* Let the start function code fill in the result decl.  */
!   DECL_RESULT (tu_terminate_wrapper) = NULL_TREE;
! 
!   /* Make this function internal.  */
!   TREE_PUBLIC (tu_terminate_wrapper) = false;
!   DECL_EXTERNAL (tu_terminate_wrapper) = false;
!   DECL_WEAK (tu_terminate_wrapper) = false;
! 
!   DECL_ATTRIBUTES (tu_terminate_wrapper)
!     = tree_cons (get_identifier ("noipa"), NULL, NULL_TREE);
!   cplus_decl_attributes (&tu_terminate_wrapper,
! 			 DECL_ATTRIBUTES (tu_terminate_wrapper), 0);
!   return tu_terminate_wrapper;
  }
  
! /* Define a noipa wrapper around the call to std::terminate */
  
! static void
! build_terminate_wrapper ()
  {
!   /* We should not be trying to build this if we never used it.  */
!   gcc_checking_assert (tu_terminate_wrapper);
! 
!   start_preparsed_function (tu_terminate_wrapper,
! 			    DECL_ATTRIBUTES(tu_terminate_wrapper),
! 			    SF_DEFAULT | SF_PRE_PARSED);
!   tree body = begin_function_body ();
!   tree compound_stmt = begin_compound_stmt (BCS_FN_BODY);
!   finish_expr_stmt (build_call_a (terminate_fn, 0, nullptr));
!   finish_return_stmt (NULL_TREE);
!   finish_compound_stmt (compound_stmt);
!   finish_function_body (body);
!   tu_terminate_wrapper = finish_function (false);
!   expand_or_defer_fn (tu_terminate_wrapper);
  }
  
! /* Lookup a name in std::contracts, or inject it.  */
  
  static tree
! lookup_std_contracts_type (tree name_id)
  {
!   tree id_ns = get_identifier ("contracts");
!   tree ns = lookup_qualified_name (std_node, id_ns);
  
!   tree res_type = error_mark_node;
!   if (TREE_CODE (ns) == NAMESPACE_DECL)
!     res_type = lookup_qualified_name
!       (ns, name_id, LOOK_want::TYPE | LOOK_want::HIDDEN_FRIEND);
  
!   if (TREE_CODE (res_type) == TYPE_DECL)
!     res_type = TREE_TYPE (res_type);
!   else
!     {
!       push_nested_namespace (std_node);
!       push_namespace (id_ns, /*inline*/false);
!       res_type = make_class_type (RECORD_TYPE);
!       create_implicit_typedef (name_id, res_type);
!       DECL_SOURCE_LOCATION (TYPE_NAME (res_type)) = BUILTINS_LOCATION;
!       DECL_CONTEXT (TYPE_NAME (res_type)) = current_namespace;
!       pushdecl_namespace_level (TYPE_NAME (res_type), /*hidden*/true);
!       pop_namespace ();
!       pop_nested_namespace (std_node);
!     }
!   return res_type;
  }
  
! /* Return handle_contract_violation (), declaring it if needed.  */
  
  static tree
  declare_handle_contract_violation ()
  {
+   /* We may need to declare new types, ensure they are not considered
+      attached to a named module.  */
+   auto module_kind_override = make_temp_override
+     (module_kind, module_kind & ~(MK_PURVIEW | MK_ATTACH | MK_EXPORTING));
    tree fnname = get_identifier ("handle_contract_violation");
    tree viol_name = get_identifier ("contract_violation");
    tree l = lookup_qualified_name (global_namespace, fnname,
*************** declare_handle_contract_violation ()
*** 1738,2345 ****
  	    return f;
  	}
  
!   tree id_exp = get_identifier ("experimental");
!   tree ns_exp = lookup_qualified_name (std_node, id_exp);
! 
!   tree violation = error_mark_node;
!   if (TREE_CODE (ns_exp) == NAMESPACE_DECL)
!     violation = lookup_qualified_name (ns_exp, viol_name,
! 				       LOOK_want::TYPE
! 				       |LOOK_want::HIDDEN_FRIEND);
! 
!   if (TREE_CODE (violation) == TYPE_DECL)
!     violation = TREE_TYPE (violation);
!   else
!     {
!       push_nested_namespace (std_node);
!       push_namespace (id_exp, /*inline*/false);
!       violation = make_class_type (RECORD_TYPE);
!       create_implicit_typedef (viol_name, violation);
!       DECL_SOURCE_LOCATION (TYPE_NAME (violation)) = BUILTINS_LOCATION;
!       DECL_CONTEXT (TYPE_NAME (violation)) = current_namespace;
!       TREE_PUBLIC (TYPE_NAME (violation)) = true;
!       pushdecl_namespace_level (TYPE_NAME (violation), /*hidden*/true);
!       pop_namespace ();
!       pop_nested_namespace (std_node);
!     }
! 
!   tree argtype = cp_build_qualified_type (violation, TYPE_QUAL_CONST);
!   argtype = cp_build_reference_type (argtype, /*rval*/false);
!   tree fntype = build_function_type_list (void_type_node, argtype, NULL_TREE);
  
    push_nested_namespace (global_namespace);
!   tree fn = build_cp_library_fn_ptr ("handle_contract_violation", fntype,
! 				     ECF_COLD);
!   pushdecl_namespace_level (fn, /*hiding*/true);
    pop_nested_namespace (global_namespace);
  
!   return fn;
  }
  
! /* Build the call to handle_contract_violation for CONTRACT.  */
  
  static void
! build_contract_handler_call (tree contract,
! 			     contract_continuation cmode)
  {
-   /* We may need to declare new types, ensure they are not considered
-      attached to a named module.  */
-   auto module_kind_override = make_temp_override
-     (module_kind, module_kind & ~(MK_PURVIEW | MK_ATTACH | MK_EXPORTING));
- 
-   tree violation = build_contract_violation (contract, cmode);
    tree violation_fn = declare_handle_contract_violation ();
!   tree call = build_call_n (violation_fn, 1, build_address (violation));
    finish_expr_stmt (call);
  }
  
! /* Generate the code that checks or assumes a contract, but do not attach
!    it to the current context.  This is called during genericization.  */
  
! tree
! build_contract_check (tree contract)
  {
!   contract_semantic semantic = get_contract_semantic (contract);
!   if (semantic == CCS_INVALID)
!     return NULL_TREE;
  
!   /* Ignored contracts are never checked or assumed.  */
!   if (semantic == CCS_IGNORE)
!     return void_node;
  
!   remap_dummy_this (current_function_decl, &CONTRACT_CONDITION (contract));
!   tree condition = CONTRACT_CONDITION (contract);
!   if (condition == error_mark_node)
!     return NULL_TREE;
  
!   location_t loc = EXPR_LOCATION (contract);
  
!   if (semantic == CCS_ASSUME)
!     return build_assume_call (loc, condition);
  
!   tree if_stmt = begin_if_stmt ();
!   tree cond = build_x_unary_op (loc,
! 				TRUTH_NOT_EXPR,
! 				condition, NULL_TREE,
! 				tf_warning_or_error);
!   finish_if_stmt_cond (cond, if_stmt);
  
!   /* Get the continuation mode.  */
!   contract_continuation cmode;
!   switch (semantic)
!     {
!     case CCS_NEVER: cmode = NEVER_CONTINUE; break;
!     case CCS_MAYBE: cmode = MAYBE_CONTINUE; break;
!     default: gcc_unreachable ();
!     }
  
!   build_contract_handler_call (contract, cmode);
!   if (cmode == NEVER_CONTINUE)
!     finish_expr_stmt (build_call_a (terminate_fn, 0, nullptr));
  
!   finish_then_clause (if_stmt);
!   tree scope = IF_SCOPE (if_stmt);
!   IF_SCOPE (if_stmt) = NULL;
!   return do_poplevel (scope);
  }
  
! /* Add the contract statement CONTRACT to the current block if valid.  */
  
! static void
! emit_contract_statement (tree contract)
  {
!   /* Only add valid contracts.  */
!   if (get_contract_semantic (contract) != CCS_INVALID
!       && CONTRACT_CONDITION (contract) != error_mark_node)
!     add_stmt (contract);
  }
  
! /* Generate the statement for the given contract attribute by adding the
!    statement to the current block. Returns the next contract in the chain.  */
  
  static tree
! emit_contract_attr (tree attr)
  {
!   gcc_assert (TREE_CODE (attr) == TREE_LIST);
! 
!   emit_contract_statement (CONTRACT_STATEMENT (attr));
! 
!   return CONTRACT_CHAIN (attr);
! }
  
! /* Add the statements of contract attributes ATTRS to the current block.  */
  
! static void
! emit_contract_conditions (tree attrs, tree_code code)
! {
!   if (!attrs) return;
!   gcc_assert (TREE_CODE (attrs) == TREE_LIST);
!   gcc_assert (code == PRECONDITION_STMT || code == POSTCONDITION_STMT);
!   while (attrs)
!     {
!       tree contract = CONTRACT_STATEMENT (attrs);
!       if (TREE_CODE (contract) == code)
! 	attrs = emit_contract_attr (attrs);
!       else
! 	attrs = CONTRACT_CHAIN (attrs);
!     }
  }
  
! /* Emit the statement for an assertion attribute.  */
! 
  void
! emit_assertion (tree attr)
  {
!   emit_contract_attr (attr);
  }
  
! /* Emit statements for precondition attributes.  */
! 
! static void
! emit_preconditions (tree attr)
! {
!   return emit_contract_conditions (attr, PRECONDITION_STMT);
! }
  
! /* Emit statements for postcondition attributes.  */
  
! static void
! emit_postconditions (tree attr)
  {
!   return emit_contract_conditions (attr, POSTCONDITION_STMT);
! }
  
! /* We're compiling the pre/postcondition function CONDFN; remap any FN
!    attributes that match CODE and emit them.  */
  
! static void
! remap_and_emit_conditions (tree fn, tree condfn, tree_code code)
! {
!   gcc_assert (code == PRECONDITION_STMT || code == POSTCONDITION_STMT);
!   for (tree attr = DECL_CONTRACTS (fn); attr;
!        attr = CONTRACT_CHAIN (attr))
      {
!       tree contract = CONTRACT_STATEMENT (attr);
!       if (TREE_CODE (contract) == code)
! 	{
! 	  contract = copy_node (contract);
! 	  remap_contract (fn, condfn, contract, /*duplicate_p=*/false);
! 	  emit_contract_statement (contract);
! 	}
      }
- }
  
! /* Converts a contract condition to bool and ensures it has a locaiton.  */
  
! tree
! finish_contract_condition (cp_expr condition)
! {
!   /* Ensure we have the condition location saved in case we later need to
!      emit a conversion error during template instantiation and wouldn't
!      otherwise have it.  */
!   if (!CAN_HAVE_LOCATION_P (condition) || EXCEPTIONAL_CLASS_P (condition))
!     {
!       condition = build1_loc (condition.get_location (), VIEW_CONVERT_EXPR,
! 			      TREE_TYPE (condition), condition);
!       EXPR_LOCATION_WRAPPER_P (condition) = 1;
!     }
  
!   if (condition == error_mark_node || type_dependent_expression_p (condition))
!     return condition;
  
!   return condition_conversion (condition);
  }
  
! void
! maybe_update_postconditions (tree fco)
  {
!   /* Update any postconditions and the postcondition checking function
!      as needed.  If there are postconditions, we'll use those to rewrite
!      return statements to check postconditions.  */
!   if (has_active_postconditions (fco))
!     {
!       rebuild_postconditions (fco);
!       tree post = build_postcondition_function (fco);
!       set_postcondition_function (fco, post);
!     }
! }
! 
! /* Called on attribute lists that must not contain contracts.  If any
!    contracts are present, issue an error diagnostic and return true.  */
  
! bool
! diagnose_misapplied_contracts (tree attributes)
! {
!   if (attributes == NULL_TREE)
!     return false;
  
!   tree contract_attr = find_contract (attributes);
!   if (!contract_attr)
!     return false;
  
!   error_at (EXPR_LOCATION (CONTRACT_STATEMENT (contract_attr)),
! 	    "contracts must appertain to a function type");
  
!   /* Invalidate the contract so we don't treat it as valid later on.  */
!   invalidate_contract (TREE_VALUE (TREE_VALUE (contract_attr)));
  
!   return true;
! }
  
! /* Build and return an argument list containing all the parameters of the
!    (presumably guarded) FUNCTION_DECL FN.  This can be used to forward all of
!    FN's arguments to a function taking the same list of arguments -- namely
!    the unchecked form of FN.
  
!    We use CALL_FROM_THUNK_P instead of forward_parm for forwarding
!    semantics.  */
  
! static vec<tree, va_gc> *
! build_arg_list (tree fn)
! {
!   vec<tree, va_gc> *args = make_tree_vector ();
!   for (tree t = DECL_ARGUMENTS (fn); t; t = DECL_CHAIN (t))
!     vec_safe_push (args, t);
!   return args;
! }
  
! void
! start_function_contracts (tree decl1)
! {
!   if (!handle_contracts_p (decl1))
!     return;
  
!   /* For cdtors, we evaluate the contracts check inline.  */
!   if (!outline_contracts_p (decl1))
!     return;
  
!   /* Contracts may have just been added without a chance to parse them, though
!      we still need the PRE_FN available to generate a call to it.  */
!   if (!DECL_PRE_FN (decl1))
!     build_contract_function_decls (decl1);
  
  }
  
! /* If we have a precondition function and it's valid, call it.  */
  
! static void
! add_pre_condition_fn_call (tree fndecl)
  {
!   /* If we're starting a guarded function with valid contracts, we need to
!      insert a call to the pre function.  */
!   gcc_checking_assert (DECL_PRE_FN (fndecl)
! 		       && DECL_PRE_FN (fndecl) != error_mark_node);
! 
!   releasing_vec args = build_arg_list (fndecl);
!   tree call = build_call_a (DECL_PRE_FN (fndecl), args->length (),
! 			    args->address ());
!   CALL_FROM_THUNK_P (call) = true;
!   finish_expr_stmt (call);
  }
  
! /* Build and add a call to the post-condition checking function, when that
!    is in use.  */
  
! static void
! add_post_condition_fn_call (tree fndecl)
  {
!   gcc_checking_assert (DECL_POST_FN (fndecl)
! 		       && DECL_POST_FN (fndecl) != error_mark_node);
  
!   releasing_vec args = build_arg_list (fndecl);
!   if (get_postcondition_result_parameter (fndecl))
!     vec_safe_push (args, DECL_RESULT (fndecl));
!   tree call = build_call_a (DECL_POST_FN (fndecl), args->length (),
! 			    args->address ());
!   CALL_FROM_THUNK_P (call) = true;
!   finish_expr_stmt (call);
  }
  
! /* Add a call or a direct evaluation of the pre checks.  */
  
! static void
! apply_preconditions (tree fndecl)
  {
!   if (outline_contracts_p (fndecl))
!     add_pre_condition_fn_call (fndecl);
!   else
!     emit_preconditions (DECL_CONTRACTS (fndecl));
  }
  
! /* Add a call or a direct evaluation of the post checks.  */
  
  static void
! apply_postconditions (tree fndecl)
  {
!   if (outline_contracts_p (fndecl))
!     add_post_condition_fn_call (fndecl);
!   else
!     emit_postconditions (DECL_CONTRACTS (fndecl));
  }
  
! /* Add contract handling to the function in FNDECL.
! 
!    When we have only pre-conditions, this simply prepends a call (or a direct
!    evaluation, for cdtors) to the existing function body.
! 
!    When we have post conditions we build a try-finally block.
!    If the function might throw then the handler in the try-finally is an
!    EH_ELSE expression, where the post condition check is applied to the
!    non-exceptional path, and an empty statement is added to the EH path.  If
!    the function has a non-throwing eh spec, then the handler is simply the
!    post-condition checker.  */
  
! void
! maybe_apply_function_contracts (tree fndecl)
  {
!   if (!handle_contracts_p (fndecl))
!     /* We did nothing and the original function body statement list will be
!        popped by our caller.  */
!     return;
! 
!   bool do_pre = has_active_preconditions (fndecl);
!   bool do_post = has_active_postconditions (fndecl);
!   /* We should not have reached here with nothing to do... */
!   gcc_checking_assert (do_pre || do_post);
! 
!   /* This copies the approach used for function try blocks.  */
!   tree fnbody = pop_stmt_list (DECL_SAVED_TREE (fndecl));
!   DECL_SAVED_TREE (fndecl) = push_stmt_list ();
!   tree compound_stmt = begin_compound_stmt (0);
!   current_binding_level->artificial = 1;
! 
!   /* Do not add locations for the synthesised code.  */
!   location_t loc = UNKNOWN_LOCATION;
! 
!   /* For other cases, we call a function to process the check.  */
  
!   /* If we have a pre, but not a post, then just emit that and we are done.  */
!   if (!do_post)
!     {
!       apply_preconditions (fndecl);
!       add_stmt (fnbody);
!       finish_compound_stmt (compound_stmt);
!       return;
!     }
  
!   if (do_pre)
!     /* Add a precondition call, if we have one. */
!     apply_preconditions (fndecl);
!   tree try_fin = build_stmt (loc, TRY_FINALLY_EXPR, fnbody, NULL_TREE);
!   add_stmt (try_fin);
!   TREE_OPERAND (try_fin, 1) = push_stmt_list ();
!   /* If we have exceptions, and a function that might throw, then add
!      an EH_ELSE clause that allows the exception to propagate upwards
!      without encountering the post-condition checks.  */
!   if (flag_exceptions && !type_noexcept_p (TREE_TYPE (fndecl)))
      {
!       tree eh_else = build_stmt (loc, EH_ELSE_EXPR, NULL_TREE, NULL_TREE);
!       add_stmt (eh_else);
!       TREE_OPERAND (eh_else, 0) = push_stmt_list ();
!       apply_postconditions (fndecl);
!       TREE_OPERAND (eh_else, 0) = pop_stmt_list (TREE_OPERAND (eh_else, 0));
!       TREE_OPERAND (eh_else, 1) = build_empty_stmt (loc);
      }
    else
!     apply_postconditions (fndecl);
!   TREE_OPERAND (try_fin, 1) = pop_stmt_list (TREE_OPERAND (try_fin, 1));
!   finish_compound_stmt (compound_stmt);
!   /* The DECL_SAVED_TREE stmt list will be popped by our caller.  */
  }
  
! /* Finish up the pre & post function definitions for a guarded FNDECL,
!    and compile those functions all the way to assembler language output.  */
! 
! void
! finish_function_contracts (tree fndecl)
  {
!   if (!handle_contracts_p (fndecl)
!       || !outline_contracts_p (fndecl))
!     return;
! 
!   for (tree ca = DECL_CONTRACTS (fndecl); ca; ca = CONTRACT_CHAIN (ca))
!     {
!       tree contract = CONTRACT_STATEMENT (ca);
!       if (!CONTRACT_CONDITION (contract)
! 	  || CONTRACT_CONDITION_DEFERRED_P (contract)
! 	  || CONTRACT_CONDITION (contract) == error_mark_node)
! 	return;
!     }
! 
!   int flags = SF_DEFAULT | SF_PRE_PARSED;
! 
!   /* If either the pre or post functions are bad, don't bother emitting
!      any contracts.  The program is already ill-formed.  */
!   tree pre = DECL_PRE_FN (fndecl);
!   tree post = DECL_POST_FN (fndecl);
!   if (pre == error_mark_node || post == error_mark_node)
!     return;
! 
!   if (pre && DECL_INITIAL (fndecl) != error_mark_node)
!     {
!       DECL_PENDING_INLINE_P (pre) = false;
!       start_preparsed_function (pre, DECL_ATTRIBUTES (pre), flags);
!       remap_and_emit_conditions (fndecl, pre, PRECONDITION_STMT);
!       tree finished_pre = finish_function (false);
!       expand_or_defer_fn (finished_pre);
!     }
! 
!   if (post && DECL_INITIAL (fndecl) != error_mark_node)
!     {
!       DECL_PENDING_INLINE_P (post) = false;
!       start_preparsed_function (post,
! 				DECL_ATTRIBUTES (post),
! 				flags);
!       remap_and_emit_conditions (fndecl, post, POSTCONDITION_STMT);
!       if (!VOID_TYPE_P (TREE_TYPE (TREE_TYPE (post))))
! 	finish_return_stmt (get_postcondition_result_parameter (fndecl));
! 
!       tree finished_post = finish_function (false);
!       expand_or_defer_fn (finished_post);
!     }
  }
  
  
! /* A subroutine of duplicate_decls. Diagnose issues in the redeclaration of
!    guarded functions.  */
  
! void
! duplicate_contracts (tree newdecl, tree olddecl)
  {
!   if (TREE_CODE (newdecl) == TEMPLATE_DECL)
!     newdecl = DECL_TEMPLATE_RESULT (newdecl);
!   if (TREE_CODE (olddecl) == TEMPLATE_DECL)
!     olddecl = DECL_TEMPLATE_RESULT (olddecl);
! 
!   /* Compare contracts to see if they match.    */
!   tree old_contracts = DECL_CONTRACTS (olddecl);
!   tree new_contracts = DECL_CONTRACTS (newdecl);
  
!   if (!old_contracts && !new_contracts)
!     return;
  
!   location_t old_loc = DECL_SOURCE_LOCATION (olddecl);
!   location_t new_loc = DECL_SOURCE_LOCATION (newdecl);
  
!   /* If both declarations specify contracts, ensure they match.
  
!      TODO: This handles a potential error a little oddly. Consider:
  
! 	struct B {
! 	  virtual void f(int n) [[pre: n == 0]];
! 	};
! 	struct D : B {
! 	  void f(int n) override; // inherits contracts
! 	};
! 	void D::f(int n) [[pre: n == 0]] // OK
! 	{ }
  
!     It's okay because we're explicitly restating the inherited contract.
!     Changing the precondition on the definition D::f causes match_contracts
!     to complain about the mismatch.
  
!     This would previously have been diagnosed as adding contracts to an
!     override, but this seems like it should be well-formed.  */
!   if (old_contracts && new_contracts)
      {
!       if (!match_contract_conditions (old_loc, old_contracts,
! 				      new_loc, new_contracts,
! 				      cmc_declaration))
! 	return;
!       if (DECL_UNIQUE_FRIEND_P (newdecl))
! 	/* Newdecl's contracts are still DEFERRED_PARSE, and we're about to
! 	   collapse it into olddecl, so stash away olddecl's contracts for
! 	   later comparison.  */
! 	defer_guarded_contract_match (olddecl, olddecl, old_contracts);
      }
  
!   /* Handle cases where contracts are omitted in one or the other
!      declaration.  */
!   if (old_contracts)
      {
!       /* Contracts have been previously specified by are no omitted. The
! 	 new declaration inherits the existing contracts. */
!       if (!new_contracts)
! 	copy_contract_attributes (newdecl, olddecl);
  
!       /* In all cases, remove existing contracts from OLDDECL to prevent the
! 	 attribute merging function from adding excess contracts.  */
!       remove_contract_attributes (olddecl);
!     }
!   else if (!old_contracts)
!     {
!       /* We are adding contracts to a declaration.  */
!       if (new_contracts)
  	{
! 	  /* We can't add to a previously defined function.  */
! 	  if (DECL_INITIAL (olddecl))
! 	    {
! 	      auto_diagnostic_group d;
! 	      error_at (new_loc, "cannot add contracts after definition");
! 	      inform (DECL_SOURCE_LOCATION (olddecl), "original definition here");
! 	      return;
! 	    }
! 
! 	  /* We can't add to an unguarded virtual function declaration.  */
! 	  if (DECL_VIRTUAL_P (olddecl) && new_contracts)
! 	    {
! 	      auto_diagnostic_group d;
! 	      error_at (new_loc, "cannot add contracts to a virtual function");
! 	      inform (DECL_SOURCE_LOCATION (olddecl), "original declaration here");
! 	      return;
! 	    }
! 
! 	  /* Depending on the "first declaration" rule, we may not be able
! 	     to add contracts to a function after the fact.  */
! 	  if (flag_contract_strict_declarations)
  	    {
! 	      warning_at (new_loc,
! 			  OPT_fcontract_strict_declarations_,
! 			  "declaration adds contracts to %q#D",
! 			  olddecl);
! 	      return;
  	    }
! 
! 	  /* Copy the contracts from NEWDECL to OLDDECL. We shouldn't need to
! 	     remap them because NEWDECL's parameters will replace those of
! 	     OLDDECL.  Remove the contracts from NEWDECL so they aren't
! 	     cloned when merging.  */
! 	  copy_contract_attributes (olddecl, newdecl);
! 	  remove_contract_attributes (newdecl);
  	}
      }
- }
  
! /* Replace the any contract attributes on OVERRIDER with a copy where any
!    references to BASEFN's PARM_DECLs have been rewritten to the corresponding
!    PARM_DECL in OVERRIDER.  */
! 
! void
! inherit_base_contracts (tree overrider, tree basefn)
! {
!   tree last = NULL_TREE, contract_attrs = NULL_TREE;
!   for (tree a = DECL_CONTRACTS (basefn);
!       a != NULL_TREE;
!       a = CONTRACT_CHAIN (a))
!     {
!       tree c = copy_node (a);
!       TREE_VALUE (c) = build_tree_list (TREE_PURPOSE (TREE_VALUE (c)),
! 					copy_node (CONTRACT_STATEMENT (c)));
! 
!       tree src = basefn;
!       tree dst = overrider;
!       remap_contract (src, dst, CONTRACT_STATEMENT (c), /*duplicate_p=*/true);
! 
!       CONTRACT_COMMENT (CONTRACT_STATEMENT (c)) =
! 	copy_node (CONTRACT_COMMENT (CONTRACT_STATEMENT (c)));
! 
!       chainon (last, c);
!       last = c;
!       if (!contract_attrs)
! 	contract_attrs = c;
!     }
  
!   set_decl_contracts (overrider, contract_attrs);
  }
  
  #include "gt-cp-contracts.h"
--- 2434,3038 ----
  	    return f;
  	}
  
!   tree violation = lookup_std_contracts_type (viol_name);
!   tree fntype = NULL_TREE;
!   tree v_obj_ref = cp_build_qualified_type (violation, TYPE_QUAL_CONST);
!   v_obj_ref = cp_build_reference_type (v_obj_ref, /*rval*/false);
!   fntype = build_function_type_list (void_type_node, v_obj_ref, NULL_TREE);
  
    push_nested_namespace (global_namespace);
!   tree fndecl
!     = build_cp_library_fn_ptr ("handle_contract_violation", fntype, ECF_COLD);
!   pushdecl_namespace_level (fndecl, /*hiding*/true);
    pop_nested_namespace (global_namespace);
  
!   /* Build the parameter(s).  */
!   tree parms = cp_build_parm_decl (fndecl, NULL_TREE, v_obj_ref);
!   TREE_USED (parms) = true;
!   DECL_READ_P (parms) = true;
!   DECL_ARGUMENTS (fndecl) = parms;
!   return fndecl;
  }
  
! /* Build the call to handle_contract_violation for VIOLATION.  */
  
  static void
! build_contract_handler_call (tree violation)
  {
    tree violation_fn = declare_handle_contract_violation ();
!   tree call = build_call_n (violation_fn, 1, violation);
    finish_expr_stmt (call);
  }
  
! /* If we have emitted any contracts in this TU that will call a violation
!    handler, then emit the wrappers for the handler.  */
  
! void
! maybe_emit_violation_handler_wrappers ()
  {
!   /* We might need the terminate wrapper, even if we do not use the violation
!      handler wrappers.  */
!   if (tu_terminate_wrapper && flag_contracts_conservative_ipa)
!     build_terminate_wrapper ();
  
!   if (!tu_has_violation && !tu_has_violation_exception)
!     return;
  
!   tree terminate_wrapper = terminate_fn;
!   if (flag_contracts_conservative_ipa)
!     terminate_wrapper = tu_terminate_wrapper;
  
!   /* tu_has_violation */
!   start_preparsed_function (tu_has_violation, NULL_TREE,
! 			    SF_DEFAULT | SF_PRE_PARSED);
!   tree body = begin_function_body ();
!   tree compound_stmt = begin_compound_stmt (BCS_FN_BODY);
!   tree v = DECL_ARGUMENTS (tu_has_violation);
!   tree semantic = DECL_CHAIN (v);
  
!   /* We are going to call the handler.  */
!   build_contract_handler_call (v);
  
!   tree if_observe = begin_if_stmt ();
!   /* if (observe) return; */
!   tree cond = build2 (EQ_EXPR, uint16_type_node, semantic,
! 		      build_int_cst (uint16_type_node, (uint16_t)CES_OBSERVE));
!   finish_if_stmt_cond (cond, if_observe);
!   emit_builtin_observable_checkpoint ();
!   finish_then_clause (if_observe);
!   begin_else_clause (if_observe);
!   /* else terminate.  */
!   finish_expr_stmt (build_call_a (terminate_wrapper, 0, nullptr));
!   finish_else_clause (if_observe);
!   finish_if_stmt (if_observe);
!   finish_return_stmt (NULL_TREE);
  
!   finish_compound_stmt (compound_stmt);
!   finish_function_body (body);
!   tu_has_violation = finish_function (false);
!   expand_or_defer_fn (tu_has_violation);
  
!   /* tu_has_violation_exception */
!   start_preparsed_function (tu_has_violation_exception, NULL_TREE,
! 			    SF_DEFAULT | SF_PRE_PARSED);
!   body = begin_function_body ();
!   compound_stmt = begin_compound_stmt (BCS_FN_BODY);
!   v = DECL_ARGUMENTS (tu_has_violation_exception);
!   semantic = DECL_CHAIN (v);
!   location_t loc = DECL_SOURCE_LOCATION (tu_has_violation_exception);
  
!   tree a_type = strip_top_quals (non_reference (TREE_TYPE (v)));
!   tree v2 = build_decl (loc, VAR_DECL, NULL_TREE, a_type);
!   DECL_SOURCE_LOCATION (v2) = loc;
!   DECL_CONTEXT (v2) = current_function_decl;
!   DECL_ARTIFICIAL (v2) = true;
!   layout_decl (v2, 0);
!   v2 = pushdecl (v2);
!   add_decl_expr (v2);
!   tree r = cp_build_init_expr (v2, convert_from_reference (v));
!   finish_expr_stmt (r);
!   tree memb = lookup_member (a_type, get_identifier ("_M_detection_mode"),
! 		     /*protect=*/1, /*want_type=*/0, tf_warning_or_error);
!   r = build_class_member_access_expr (v2, memb, NULL_TREE, false,
! 				      tf_warning_or_error);
!   r = cp_build_modify_expr
!    (loc, r, NOP_EXPR,
!     build_int_cst (uint16_type_node, (uint16_t)CDM_EVAL_EXCEPTION),
!     tf_warning_or_error);
!   finish_expr_stmt (r);
!   /* We are going to call the handler.  */
!   build_contract_handler_call (v);
! 
!   if_observe = begin_if_stmt ();
!   /* if (observe) return; */
!   cond = build2 (EQ_EXPR, uint16_type_node, semantic,
! 		 build_int_cst (uint16_type_node, (uint16_t)CES_OBSERVE));
!   finish_if_stmt_cond (cond, if_observe);
!   emit_builtin_observable_checkpoint ();
!   finish_then_clause (if_observe);
!   begin_else_clause (if_observe);
!   /* else terminate.  */
!   finish_expr_stmt (build_call_a (terminate_wrapper, 0, nullptr));
!   finish_else_clause (if_observe);
!   finish_if_stmt (if_observe);
!   finish_return_stmt (NULL_TREE);
!   finish_compound_stmt (compound_stmt);
!   finish_function_body (body);
!   tu_has_violation_exception = finish_function (false);
!   expand_or_defer_fn (tu_has_violation_exception);
  }
  
! /* Build a layout-compatible internal version of contract_violation type.  */
  
! static tree
! get_contract_violation_fields ()
  {
!   tree fields = NULL_TREE;
!   /* Must match <contracts>:
!   class contract_violation {
!     uint16_t _M_version;
!     assertion_kind _M_assertion_kind;
!     evaluation_semantic _M_evaluation_semantic;
!     detection_mode _M_detection_mode;
!     const char* _M_comment;
!     void *_M_src_loc_ptr;
!     __vendor_ext* _M_ext;
!   };
!     If this changes, also update the initializer in
!     build_contract_violation.  */
!   const tree types[] = { uint16_type_node,
! 			 uint16_type_node,
! 			 uint16_type_node,
! 			 uint16_type_node,
! 			 const_string_type_node,
! 			 ptr_type_node,
! 			 ptr_type_node
! 			};
!  const char *names[] = { "_M_version",
! 			 "_M_assertion_kind",
! 			 "_M_evaluation_semantic",
! 			 "_M_detection_mode",
! 			 "_M_comment",
! 			 "_M_src_loc_ptr",
! 			 "_M_ext",
! 			};
!   unsigned n = 0;
!   for (tree type : types)
!     {
!       /* finish_builtin_struct wants fields chained in reverse.  */
!       tree next = build_decl (BUILTINS_LOCATION, FIELD_DECL,
! 				  get_identifier(names[n++]), type);
!       DECL_CHAIN (next) = fields;
!       fields = next;
!     }
!  return fields;
  }
  
! /* Build a type to represent contract violation objects.  */
  
  static tree
! init_builtin_contract_violation_type ()
  {
!   if (builtin_contract_violation_type)
!     return builtin_contract_violation_type;
  
!   tree fields = get_contract_violation_fields ();
  
!   iloc_sentinel ils (input_location);
!   input_location = BUILTINS_LOCATION;
!   builtin_contract_violation_type = make_class_type (RECORD_TYPE);
!   finish_builtin_struct (builtin_contract_violation_type,
! 			 "__builtin_contract_violation_type", fields, NULL_TREE);
!   CLASSTYPE_AS_BASE (builtin_contract_violation_type)
!     = builtin_contract_violation_type;
!   DECL_CONTEXT (TYPE_NAME (builtin_contract_violation_type))
!     = FROB_CONTEXT (global_namespace);
!   CLASSTYPE_LITERAL_P (builtin_contract_violation_type) = true;
!   CLASSTYPE_LAZY_COPY_CTOR (builtin_contract_violation_type) = true;
!   xref_basetypes (builtin_contract_violation_type, /*bases=*/NULL_TREE);
!   DECL_CONTEXT (TYPE_NAME (builtin_contract_violation_type))
!     = FROB_CONTEXT (global_namespace);
!   DECL_ARTIFICIAL (TYPE_NAME (builtin_contract_violation_type)) = true;
!   TYPE_ARTIFICIAL (builtin_contract_violation_type) = true;
!   builtin_contract_violation_type
!     = cp_build_qualified_type (builtin_contract_violation_type,
! 			       TYPE_QUAL_CONST);
!   return builtin_contract_violation_type;
  }
  
! /* Early initialisation of types and functions we will use.  */
  void
! init_contracts ()
  {
!   init_terminate_fn ();
!   init_builtin_contract_violation_type ();
  }
  
! static GTY(()) tree contracts_source_location_impl_type;
  
! /* Build a layout-compatible internal version of source location __impl
!    type.  */
  
! static tree
! get_contracts_source_location_impl_type (tree context = NULL_TREE)
  {
!   if (contracts_source_location_impl_type)
!      return contracts_source_location_impl_type;
  
!   /* First see if we have a declaration that we can use.  */
!   tree contracts_source_location_type
!     = lookup_std_type (get_identifier ("source_location"));
  
!   if (contracts_source_location_type
!       && contracts_source_location_type != error_mark_node
!       && TYPE_FIELDS (contracts_source_location_type))
      {
!       contracts_source_location_impl_type = get_source_location_impl_type ();
!       return contracts_source_location_impl_type;
      }
  
!   /* We do not, so build the __impl layout equivalent type, which must
!      match <source_location>:
!      struct __impl
!       {
! 	  const char* _M_file_name;
! 	  const char* _M_function_name;
! 	  unsigned _M_line;
! 	  unsigned _M_column;
!       }; */
!   const tree types[] = { const_string_type_node,
! 			const_string_type_node,
! 			uint_least32_type_node,
! 			uint_least32_type_node };
  
!  const char *names[] = { "_M_file_name",
! 			 "_M_function_name",
! 			 "_M_line",
! 			 "_M_column",
! 			};
!   tree fields = NULL_TREE;
!   unsigned n = 0;
!   for (tree type : types)
!   {
!     /* finish_builtin_struct wants fields chained in reverse.  */
!     tree next = build_decl (BUILTINS_LOCATION, FIELD_DECL,
! 			    get_identifier (names[n++]), type);
!     DECL_CHAIN (next) = fields;
!     fields = next;
!   }
  
!   iloc_sentinel ils (input_location);
!   input_location = BUILTINS_LOCATION;
!   contracts_source_location_impl_type = cxx_make_type (RECORD_TYPE);
!   finish_builtin_struct (contracts_source_location_impl_type,
! 			 "__impl", fields, NULL_TREE);
!   DECL_CONTEXT (TYPE_NAME (contracts_source_location_impl_type)) = context;
!   DECL_ARTIFICIAL (TYPE_NAME (contracts_source_location_impl_type)) = true;
!   TYPE_ARTIFICIAL (contracts_source_location_impl_type) = true;
!   contracts_source_location_impl_type
!     = cp_build_qualified_type (contracts_source_location_impl_type,
! 			       TYPE_QUAL_CONST);
  
!   return contracts_source_location_impl_type;
  }
  
! static tree
! get_src_loc_impl_ptr (location_t loc)
  {
!   if (!contracts_source_location_impl_type)
!     get_contracts_source_location_impl_type ();
  
!   tree fndecl = current_function_decl;
!   /* We might be an outlined function.  */
!   if (DECL_IS_PRE_FN_P (fndecl) || DECL_IS_POST_FN_P (fndecl))
!     fndecl = get_orig_for_outlined (fndecl);
!   /* We might be a wrapper.  */
!   if (DECL_IS_WRAPPER_FN_P (fndecl))
!     fndecl = get_orig_func_for_wrapper (fndecl);
  
!   gcc_checking_assert (fndecl);
!   tree impl__
!     = build_source_location_impl (loc, fndecl,
! 				  contracts_source_location_impl_type);
!   tree p = build_pointer_type (contracts_source_location_impl_type);
!   return build_fold_addr_expr_with_type_loc (loc, impl__, p);
! }
  
! /* Build a contract_violation layout compatible object. */
  
! /* Constructor.  At present, this should always be constant. */
  
! static tree
! build_contract_violation_ctor (tree contract)
! {
!   bool can_be_const = true;
!   uint16_t version = 1;
!   /* Default CDM_PREDICATE_FALSE. */
!   uint16_t detection_mode = CDM_PREDICATE_FALSE;
  
!   tree assertion_kind = CONTRACT_ASSERTION_KIND (contract);
!   if (!assertion_kind || really_constant_p (assertion_kind))
!     {
!       contract_assertion_kind kind = get_contract_assertion_kind (contract);
!       assertion_kind = build_int_cst (uint16_type_node, kind);
!     }
!   else
!     can_be_const = false;
  
!   tree eval_semantic = CONTRACT_EVALUATION_SEMANTIC (contract);
!   gcc_checking_assert (eval_semantic);
!   if (!really_constant_p (eval_semantic))
!     can_be_const = false;
  
!   tree comment = CONTRACT_COMMENT (contract);
!   if (comment && !really_constant_p (comment))
!     can_be_const = false;
  
!   tree std_src_loc_impl_ptr = CONTRACT_STD_SOURCE_LOC (contract);
!   if (std_src_loc_impl_ptr)
!     {
!       std_src_loc_impl_ptr = convert_from_reference (std_src_loc_impl_ptr);
!       if (!really_constant_p (std_src_loc_impl_ptr))
! 	can_be_const = false;
!     }
!   else
!     std_src_loc_impl_ptr = get_src_loc_impl_ptr (EXPR_LOCATION (contract));
  
!   /* Must match the type layout in builtin_contract_violation_type.  */
!   tree f0 = next_aggregate_field (TYPE_FIELDS (builtin_contract_violation_type));
!   tree f1 = next_aggregate_field (DECL_CHAIN (f0));
!   tree f2 = next_aggregate_field (DECL_CHAIN (f1));
!   tree f3 = next_aggregate_field (DECL_CHAIN (f2));
!   tree f4 = next_aggregate_field (DECL_CHAIN (f3));
!   tree f5 = next_aggregate_field (DECL_CHAIN (f4));
!   tree f6 = next_aggregate_field (DECL_CHAIN (f5));
!   tree ctor = build_constructor_va
!     (builtin_contract_violation_type, 7,
!      f0, build_int_cst (uint16_type_node, version),
!      f1, assertion_kind,
!      f2, eval_semantic,
!      f3, build_int_cst (uint16_type_node, detection_mode),
!      f4, comment,
!      f5, std_src_loc_impl_ptr,
!      f6, build_zero_cst (nullptr_type_node)); // __vendor_ext
  
!   TREE_READONLY (ctor) = true;
!   if (can_be_const)
!     TREE_CONSTANT (ctor) = true;
  
+   return ctor;
  }
  
! /* Build a named TU-local constant of TYPE.  */
  
! static tree
! contracts_tu_local_named_var (location_t loc, const char *name, tree type)
  {
!   tree var_ = build_decl (loc, VAR_DECL, NULL, type);
!   DECL_NAME (var_) = generate_internal_label (name);
!   TREE_PUBLIC (var_) = false;
!   DECL_EXTERNAL (var_) = false;
!   TREE_STATIC (var_) = true;
!   /* Compiler-generated.  */
!   DECL_ARTIFICIAL (var_) = true;
!   TREE_CONSTANT (var_) = true;
!   layout_decl (var_, 0);
!   return var_;
  }
  
! /* Create a read-only violation object.  */
  
! static tree
! build_contract_violation_constant (tree ctor, tree contract)
  {
!   tree viol_ = contracts_tu_local_named_var
!     (EXPR_LOCATION (contract), "Lcontract_violation",
!      builtin_contract_violation_type);
  
!   TREE_CONSTANT (viol_) = true;
!   DECL_INITIAL (viol_) = ctor;
!   varpool_node::finalize_decl (viol_);
! 
!   return viol_;
  }
  
! /* Helper to replace references to dummy this parameters with references to
!    the first argument of the FUNCTION_DECL DATA.  */
  
! static tree
! remap_dummy_this_1 (tree *tp, int *, void *data)
  {
!   if (!is_this_parameter (*tp))
!     return NULL_TREE;
!   tree fn = (tree)data;
!   *tp = DECL_ARGUMENTS (fn);
!   return NULL_TREE;
  }
  
! /* Replace all references to dummy this parameters in EXPR with references to
!    the first argument of the FUNCTION_DECL FNDECL.  */
  
  static void
! remap_dummy_this (tree fndecl, tree *expr)
  {
!   walk_tree (expr, remap_dummy_this_1, fndecl, NULL);
  }
  
! /* Replace uses of user's placeholder var with the actual return value.  */
  
! struct replace_tree
  {
!   tree from, to;
! };
  
! static tree
! remap_retval_1 (tree *here, int *do_subtree, void *d)
! {
!   replace_tree *data = (replace_tree *) d;
  
!   if (*here == data->from)
      {
!       *here = data->to;
!       *do_subtree = 0;
      }
    else
!     *do_subtree = 1;
!   return NULL_TREE;
  }
  
! static void
! remap_retval (tree fndecl, tree contract)
  {
!   struct replace_tree data;
!   data.from = POSTCONDITION_IDENTIFIER (contract);
!   gcc_checking_assert (DECL_RESULT (fndecl));
!   data.to = DECL_RESULT (fndecl);
!   walk_tree (&CONTRACT_CONDITION (contract), remap_retval_1, &data, NULL);
  }
  
  
! /* Genericize a CONTRACT tree, but do not attach it to the current context,
!    the caller is responsible for that.
!    This is called during genericization.  */
  
! tree
! build_contract_check (tree contract)
  {
!   contract_evaluation_semantic semantic = get_evaluation_semantic (contract);
!   bool quick = false;
!   bool calls_handler = false;
!   switch (semantic)
!     {
!     case CES_IGNORE:
!       return void_node;
!     case CES_ENFORCE:
!     case CES_OBSERVE:
!       calls_handler = true;
!       break;
!     case CES_QUICK:
!       quick = true;
!       break;
!     default:
!       gcc_unreachable ();
!     }
  
!   location_t loc = EXPR_LOCATION (contract);
  
!   remap_dummy_this (current_function_decl, &CONTRACT_CONDITION (contract));
!   tree condition = CONTRACT_CONDITION (contract);
!   if (condition == error_mark_node)
!     return NULL_TREE;
  
!   if (!flag_contract_checks_outlined && POSTCONDITION_P (contract))
!     {
!       remap_retval (current_function_decl, contract);
!       condition = CONTRACT_CONDITION (contract);
!       if (condition == error_mark_node)
! 	return NULL_TREE;
!     }
  
!   tree terminate_wrapper = terminate_fn;
!   if (flag_contracts_conservative_ipa)
!     terminate_wrapper = declare_terminate_wrapper ();
!   if (calls_handler)
!     declare_violation_handler_wrappers ();
  
!   bool check_might_throw = (flag_exceptions
! 			    && !expr_noexcept_p (condition, tf_none));
  
!   /* Build a statement expression to hold a contract check, with the check
!      potentially wrapped in a try-catch expr.  */
!   tree cc_bind = build3 (BIND_EXPR, void_type_node, NULL, NULL, NULL);
!   BIND_EXPR_BODY (cc_bind) = push_stmt_list ();
  
!   if (TREE_CODE (contract) == ASSERTION_STMT)
!     emit_builtin_observable_checkpoint ();
!   tree cond = build_x_unary_op (loc, TRUTH_NOT_EXPR, condition, NULL_TREE,
! 				tf_warning_or_error);
!   tree violation;
!   bool viol_is_var = false;
!   if (quick)
!     /* We will not be calling a handler.  */
!     violation = build_zero_cst (nullptr_type_node);
!   else
      {
!       /* Build a violation object, with the contract settings.  */
!       tree ctor = build_contract_violation_ctor (contract);
!       gcc_checking_assert (TREE_CONSTANT (ctor));
!       violation = build_contract_violation_constant (ctor, contract);
!       violation = build_address (violation);
      }
  
!   tree s_const = build_int_cst (uint16_type_node, semantic);
!   /* So now do we need a try-catch?  */
!   if (check_might_throw)
      {
!       /* This will hold the computed condition.  */
!       tree check_failed = build_decl (loc, VAR_DECL, NULL, boolean_type_node);
!       DECL_ARTIFICIAL (check_failed) = true;
!       DECL_IGNORED_P (check_failed) = true;
!       DECL_CONTEXT (check_failed) = current_function_decl;
!       layout_decl (check_failed, 0);
!       add_decl_expr (check_failed);
!       DECL_CHAIN (check_failed) = BIND_EXPR_VARS (cc_bind);
!       BIND_EXPR_VARS (cc_bind) = check_failed;
!       tree check_try = begin_try_block ();
!       finish_expr_stmt (cp_build_init_expr (check_failed, cond));
!       finish_try_block (check_try);
  
!       tree handler = begin_handler ();
!       finish_handler_parms (NULL_TREE, handler); /* catch (...) */
!       if (quick)
! 	finish_expr_stmt (build_call_a (terminate_wrapper, 0, nullptr));
!       else
  	{
! 	  if (viol_is_var)
  	    {
! 	      /* We can update the detection mode here.  */
! 	      tree memb
! 		= lookup_member (builtin_contract_violation_type,
! 				 get_identifier ("_M_detection_mode"),
! 				 1, 0, tf_warning_or_error);
! 	      tree r = cp_build_indirect_ref (loc, violation, RO_UNARY_STAR,
! 					      tf_warning_or_error);
! 	      r = build_class_member_access_expr (r, memb, NULL_TREE, false,
! 						  tf_warning_or_error);
! 	      r = cp_build_modify_expr
! 		(loc, r, NOP_EXPR,
! 		 build_int_cst (uint16_type_node, (uint16_t)CDM_EVAL_EXCEPTION),
! 		 tf_warning_or_error);
! 	      finish_expr_stmt (r);
! 	      finish_expr_stmt (build_call_n (tu_has_violation, 2,
! 					      violation, s_const));
  	    }
! 	  else
! 	    /* We need to make a copy of the violation object to update.  */
! 	    finish_expr_stmt (build_call_n (tu_has_violation_exception, 2,
! 					    violation, s_const));
! 	  /* If we reach here, we have handled the exception thrown and do not
! 	     need further action.  */
! 	  tree e = cp_build_modify_expr (loc, check_failed, NOP_EXPR,
! 					 boolean_false_node,
! 					 tf_warning_or_error);
! 	  finish_expr_stmt (e);
  	}
+       finish_handler (handler);
+       finish_handler_sequence (check_try);
+       cond = check_failed;
+       BIND_EXPR_VARS (cc_bind) = nreverse (BIND_EXPR_VARS (cc_bind));
      }
  
!   tree do_check = begin_if_stmt ();
!   finish_if_stmt_cond (cond, do_check);
!   if (quick)
!     finish_expr_stmt (build_call_a (terminate_wrapper, 0, nullptr));
!   else
!     finish_expr_stmt (build_call_n (tu_has_violation, 2, violation, s_const));
!   finish_then_clause (do_check);
!   finish_if_stmt (do_check);
  
!   BIND_EXPR_BODY (cc_bind) = pop_stmt_list (BIND_EXPR_BODY (cc_bind));
!   return cc_bind;
  }
  
  #include "gt-cp-contracts.h"
diff -Nrcpad gcc-16-20260125/gcc/cp/contracts.h gcc-16-20260201/gcc/cp/contracts.h
*** gcc-16-20260125/gcc/cp/contracts.h	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/cp/contracts.h	Sun Feb  1 22:32:07 2026
***************
*** 1,7 ****
! /* Definitions for C++ contract levels.  Implements functionality described in
!    the N4820 working draft version of contracts, P1290, P1332, and P1429.
     Copyright (C) 2020-2026 Free Software Foundation, Inc.
!    Contributed by Jeff Chapman II (jchapman@lock3software.com)
  
  This file is part of GCC.
  
--- 1,12 ----
! /* Definitions for C++26 contracts.
! 
     Copyright (C) 2020-2026 Free Software Foundation, Inc.
!    Originally by Jeff Chapman II (jchapman@lock3software.com) for proposed
!    C++20 contracts.
!    Rewritten for C++26 contracts by:
!      Nina Ranns (dinka.ranns@googlemail.com)
!      Iain Sandoe (iain@sandoe.co.uk)
!      Ville Voutilainen (ville.voutilainen@gmail.com).
  
  This file is part of GCC.
  
*************** along with GCC; see the file COPYING3.
*** 22,156 ****
  #ifndef GCC_CP_CONTRACT_H
  #define GCC_CP_CONTRACT_H
  
! /* Contract levels approximate the complexity of the expression.  */
! 
! enum contract_level
! {
!   CONTRACT_INVALID,
!   CONTRACT_DEFAULT,
!   CONTRACT_AUDIT,
!   CONTRACT_AXIOM
! };
! 
! /* The concrete semantics determine the behavior of a contract.  */
! 
! enum contract_semantic
! {
!   CCS_INVALID,
!   CCS_IGNORE,
!   CCS_ASSUME,
!   CCS_NEVER,
!   CCS_MAYBE
! };
! 
! /* True if the contract is unchecked.  */
! 
! inline bool
! unchecked_contract_p (contract_semantic cs)
! {
!   return cs == CCS_IGNORE || cs == CCS_ASSUME;
! }
! 
! /* True if the contract is checked.  */
! 
! inline bool
! checked_contract_p (contract_semantic cs)
! {
!   return cs >= CCS_NEVER;
! }
  
! /* Must match std::contract_violation_continuation_mode in <contract>.  */
! enum contract_continuation
! {
!   NEVER_CONTINUE,
!   MAYBE_CONTINUE
! };
  
! /* Assertion role info.  */
! struct contract_role
! {
!   const char *name;
!   contract_semantic default_semantic;
!   contract_semantic audit_semantic;
!   contract_semantic axiom_semantic;
  };
  
! /* Information for configured contract semantics.  */
! 
! struct contract_configuration
! {
!   contract_level level;
!   contract_role* role;
  };
  
! /* A contract mode contains information used to derive the checking
!    and assumption semantics of a contract. This is either a dynamic
!    configuration, meaning it derives from the build mode, or it is
!    explicitly specified.  */
! 
! struct contract_mode
! {
!   contract_mode () : kind(cm_invalid) {}
!   contract_mode (contract_level level, contract_role *role = NULL)
!     : kind(cm_dynamic)
!   {
!     contract_configuration cc;
!     cc.level = level;
!     cc.role = role;
!     u.config = cc;
!   }
!   contract_mode (contract_semantic semantic) : kind(cm_explicit)
!   {
!     u.semantic = semantic;
!   }
! 
!   contract_level get_level () const
!   {
!     gcc_assert (kind == cm_dynamic);
!     return u.config.level;
!   }
! 
!   contract_role *get_role () const
!   {
!     gcc_assert (kind == cm_dynamic);
!     return u.config.role;
!   }
! 
!   contract_semantic get_semantic () const
!   {
!     gcc_assert (kind == cm_explicit);
!     return u.semantic;
!   }
! 
!   enum { cm_invalid, cm_dynamic, cm_explicit } kind;
! 
!   union
!   {
!     contract_configuration config;
!     contract_semantic semantic;
!   } u;
  };
  
! /* Map a source level semantic or level name to its value, or invalid.  */
! extern contract_semantic map_contract_semantic	(const char *);
! extern contract_level map_contract_level	(const char *);
! 
! /* Check if an attribute is a cxx contract attribute.  */
! extern bool cxx_contract_attribute_p		(const_tree);
! extern bool cp_contract_assertion_p		(const_tree);
  
! /* Handle various command line arguments related to semantic mapping.  */
! extern void handle_OPT_fcontract_build_level_	(const char *);
! extern void handle_OPT_fcontract_assumption_mode_ (const char *);
! extern void handle_OPT_fcontract_continuation_mode_ (const char *);
! extern void handle_OPT_fcontract_role_		(const char *);
! extern void handle_OPT_fcontract_semantic_	(const char *);
  
! enum contract_matching_context
! {
!   cmc_declaration,
!   cmc_override
! };
  
  /* True if NODE is any kind of contract.  */
  #define CONTRACT_P(NODE)			\
--- 27,68 ----
  #ifndef GCC_CP_CONTRACT_H
  #define GCC_CP_CONTRACT_H
  
! #include <cstdint>
  
! /* Contract assertion kind */
! /* Must match relevant enums in <contracts> header  */
  
! enum contract_assertion_kind : uint16_t {
!   CAK_INVALID = 0 ,
!   CAK_PRE = 1 ,
!   CAK_POST = 2 ,
!   CAK_ASSERT = 3,
  };
  
! /* Per P2900R14 + D3290R3 + extensions.  */
! enum contract_evaluation_semantic : uint16_t {
!   CES_INVALID = 0,
!   CES_IGNORE = 1,
!   CES_OBSERVE = 2,
!   CES_ENFORCE = 3,
!   CES_QUICK = 4,
  };
  
! enum detection_mode : uint16_t {
!   CDM_UNSPECIFIED = 0,
!   CDM_PREDICATE_FALSE = 1,
!   CDM_EVAL_EXCEPTION = 2
  };
  
! /* Contract evaluation_semantic */
! #define CONTRACT_EVALUATION_SEMANTIC(NODE) \
!   (TREE_OPERAND (CONTRACT_CHECK (NODE), 0))
  
! #define CONTRACT_ASSERTION_KIND(NODE) \
!   (TREE_OPERAND (CONTRACT_CHECK (NODE), 1))
  
! #define CONTRACT_CHECK(NODE) \
!   (TREE_CHECK3 (NODE, ASSERTION_STMT, PRECONDITION_STMT, POSTCONDITION_STMT))
  
  /* True if NODE is any kind of contract.  */
  #define CONTRACT_P(NODE)			\
*************** enum contract_matching_context
*** 171,191 ****
  #define POSTCONDITION_P(NODE)          \
    (TREE_CODE (NODE) == POSTCONDITION_STMT)
  
- #define CONTRACT_CHECK(NODE) \
-   (TREE_CHECK3 (NODE, ASSERTION_STMT, PRECONDITION_STMT, POSTCONDITION_STMT))
- 
  /* True iff the FUNCTION_DECL NODE currently has any contracts.  */
  #define DECL_HAS_CONTRACTS_P(NODE) \
!   (DECL_CONTRACTS (NODE) != NULL_TREE)
! 
! /* For a FUNCTION_DECL of a guarded function, this points to a list of the pre
!    and post contracts of the first decl of NODE in original order. */
! #define DECL_CONTRACTS(NODE) \
!   (find_contract (DECL_ATTRIBUTES (NODE)))
! 
! /* The next contract (if any) after this one in an attribute list.  */
! #define CONTRACT_CHAIN(NODE) \
!   (find_contract (TREE_CHAIN (NODE)))
  
  /* The wrapper of the original source location of a list of contracts.  */
  #define CONTRACT_SOURCE_LOCATION_WRAPPER(NODE) \
--- 83,91 ----
  #define POSTCONDITION_P(NODE)          \
    (TREE_CODE (NODE) == POSTCONDITION_STMT)
  
  /* True iff the FUNCTION_DECL NODE currently has any contracts.  */
  #define DECL_HAS_CONTRACTS_P(NODE) \
!   (get_fn_contract_specifiers (NODE) != NULL_TREE)
  
  /* The wrapper of the original source location of a list of contracts.  */
  #define CONTRACT_SOURCE_LOCATION_WRAPPER(NODE) \
*************** enum contract_matching_context
*** 195,232 ****
  #define CONTRACT_SOURCE_LOCATION(NODE) \
    (EXPR_LOCATION (CONTRACT_SOURCE_LOCATION_WRAPPER (NODE)))
  
! /* The actual code _STMT for a contract attribute.  */
  #define CONTRACT_STATEMENT(NODE) \
    (TREE_VALUE (TREE_VALUE (NODE)))
  
- /* True if the contract semantic was specified literally. If true, the
-    contract mode is an identifier containing the semantic. Otherwise,
-    it is a TREE_LIST whose TREE_VALUE is the level and whose TREE_PURPOSE
-    is the role.  */
- #define CONTRACT_LITERAL_MODE_P(NODE) \
-   (CONTRACT_MODE (NODE) != NULL_TREE \
-    && TREE_CODE (CONTRACT_MODE (NODE)) == IDENTIFIER_NODE)
- 
- /* The identifier denoting the literal semantic of the contract.  */
- #define CONTRACT_LITERAL_SEMANTIC(NODE) \
-   (TREE_OPERAND (NODE, 0))
- 
- /* The written "mode" of the contract. Either an IDENTIFIER with the
-    literal semantic or a TREE_LIST containing the level and role.  */
- #define CONTRACT_MODE(NODE) \
-   (TREE_OPERAND (CONTRACT_CHECK (NODE), 0))
- 
- /* The identifier denoting the build level of the contract. */
- #define CONTRACT_LEVEL(NODE)		\
-   (TREE_VALUE (CONTRACT_MODE (NODE)))
- 
- /* The identifier denoting the role of the contract */
- #define CONTRACT_ROLE(NODE)		\
-   (TREE_PURPOSE (CONTRACT_MODE (NODE)))
- 
  /* The parsed condition of the contract.  */
  #define CONTRACT_CONDITION(NODE) \
!   (TREE_OPERAND (CONTRACT_CHECK (NODE), 1))
  
  /* True iff the condition of the contract NODE is not yet parsed.  */
  #define CONTRACT_CONDITION_DEFERRED_P(NODE) \
--- 95,107 ----
  #define CONTRACT_SOURCE_LOCATION(NODE) \
    (EXPR_LOCATION (CONTRACT_SOURCE_LOCATION_WRAPPER (NODE)))
  
! /* The actual code _STMT for a contract specifier.  */
  #define CONTRACT_STATEMENT(NODE) \
    (TREE_VALUE (TREE_VALUE (NODE)))
  
  /* The parsed condition of the contract.  */
  #define CONTRACT_CONDITION(NODE) \
!   (TREE_OPERAND (CONTRACT_CHECK (NODE), 2))
  
  /* True iff the condition of the contract NODE is not yet parsed.  */
  #define CONTRACT_CONDITION_DEFERRED_P(NODE) \
*************** enum contract_matching_context
*** 234,245 ****
  
  /* The raw comment of the contract.  */
  #define CONTRACT_COMMENT(NODE) \
!   (TREE_OPERAND (CONTRACT_CHECK (NODE), 2))
  
  /* The VAR_DECL of a postcondition result. For deferred contracts, this
     is an IDENTIFIER.  */
  #define POSTCONDITION_IDENTIFIER(NODE) \
!   (TREE_OPERAND (POSTCONDITION_STMT_CHECK (NODE), 3))
  
  /* For a FUNCTION_DECL of a guarded function, this holds the function decl
     where pre contract checks are emitted.  */
--- 109,124 ----
  
  /* The raw comment of the contract.  */
  #define CONTRACT_COMMENT(NODE) \
!   (TREE_OPERAND (CONTRACT_CHECK (NODE), 3))
! 
! /* A std::source_location, if provided.  */
! #define CONTRACT_STD_SOURCE_LOC(NODE) \
!   (TREE_OPERAND (CONTRACT_CHECK (NODE), 4))
  
  /* The VAR_DECL of a postcondition result. For deferred contracts, this
     is an IDENTIFIER.  */
  #define POSTCONDITION_IDENTIFIER(NODE) \
!   (TREE_OPERAND (POSTCONDITION_STMT_CHECK (NODE), 5))
  
  /* For a FUNCTION_DECL of a guarded function, this holds the function decl
     where pre contract checks are emitted.  */
*************** enum contract_matching_context
*** 253,345 ****
  
  /* True iff the FUNCTION_DECL is the pre function for a guarded function.  */
  #define DECL_IS_PRE_FN_P(NODE) \
!   (DECL_ABSTRACT_ORIGIN (NODE) && DECL_PRE_FN (DECL_ABSTRACT_ORIGIN (NODE)) == NODE)
  
  /* True iff the FUNCTION_DECL is the post function for a guarded function.  */
  #define DECL_IS_POST_FN_P(NODE) \
!   (DECL_ABSTRACT_ORIGIN (NODE) && DECL_POST_FN (DECL_ABSTRACT_ORIGIN (NODE)) == NODE)
  
  /* contracts.cc */
- extern void emit_assertion			(tree);
  
! extern void remove_contract_attributes		(tree);
! extern bool all_attributes_are_contracts_p	(tree);
! extern tree finish_contract_attribute		(tree, tree);
! extern void copy_contract_attributes		(tree, tree);
! extern bool diagnose_misapplied_contracts	(tree);
! extern void remap_contracts			(tree, tree, tree, bool);
! extern tree splice_out_contracts		(tree);
! extern void inherit_base_contracts		(tree, tree);
  
  extern tree make_postcondition_variable		(cp_expr);
  extern tree make_postcondition_variable		(cp_expr, tree);
  extern void maybe_update_postconditions		(tree);
  extern void rebuild_postconditions		(tree);
  extern bool check_postcondition_result		(tree, tree, location_t);
  
! extern tree grok_contract			(tree, tree, tree, cp_expr,
! 						 location_t);
! extern tree finish_contract_condition		(cp_expr);
! extern void update_late_contract		(tree, tree, tree);
! extern tree invalidate_contract			(tree);
! extern void duplicate_contracts			(tree, tree);
! 
! extern void match_deferred_contracts		(tree);
! extern void defer_guarded_contract_match	(tree, tree, tree);
  
  extern tree get_precondition_function		(tree);
  extern tree get_postcondition_function		(tree);
  extern void start_function_contracts		(tree);
  extern void maybe_apply_function_contracts	(tree);
! extern void finish_function_contracts		(tree);
  extern void set_contract_functions		(tree, tree, tree);
  
! extern tree build_contract_check		(tree);
! 
! /* Return the first contract in ATTRS, or NULL_TREE if there are none.  */
! 
! inline tree
! find_contract (tree attrs)
! {
!   while (attrs && !cxx_contract_attribute_p (attrs))
!     attrs = TREE_CHAIN (attrs);
!   return attrs;
! }
  
! inline void
! set_decl_contracts (tree decl, tree contract_attrs)
! {
!   remove_contract_attributes (decl);
!   DECL_ATTRIBUTES (decl) = chainon (DECL_ATTRIBUTES (decl), contract_attrs);
! }
  
! /* Returns the computed semantic of the node.  */
  
! inline contract_semantic
! get_contract_semantic (const_tree t)
  {
!   return (contract_semantic) (TREE_LANG_FLAG_3 (CONTRACT_CHECK (t))
!       | (TREE_LANG_FLAG_2 (t) << 1)
!       | (TREE_LANG_FLAG_0 ((t)) << 2));
  }
  
! /* Sets the computed semantic of the node.  */
  
! inline void
! set_contract_semantic (tree t, contract_semantic semantic)
  {
!   TREE_LANG_FLAG_3 (CONTRACT_CHECK (t)) = semantic & 0x01;
!   TREE_LANG_FLAG_2 (t) = (semantic & 0x02) >> 1;
!   TREE_LANG_FLAG_0 (t) = (semantic & 0x04) >> 2;
  }
  
  
  /* Will this contract be ignored.  */
  
  inline bool
  contract_ignored_p (const_tree contract)
  {
!   return (get_contract_semantic (contract) <= CCS_IGNORE);
  }
  
  /* Will this contract be evaluated?  */
--- 132,235 ----
  
  /* True iff the FUNCTION_DECL is the pre function for a guarded function.  */
  #define DECL_IS_PRE_FN_P(NODE) \
!   (DECL_DECLARES_FUNCTION_P (NODE) && DECL_LANG_SPECIFIC (NODE) \
!    && CONTRACT_HELPER (NODE) == ldf_contract_pre)
  
  /* True iff the FUNCTION_DECL is the post function for a guarded function.  */
  #define DECL_IS_POST_FN_P(NODE) \
!   (DECL_DECLARES_FUNCTION_P (NODE) && DECL_LANG_SPECIFIC (NODE) \
!    && CONTRACT_HELPER (NODE) == ldf_contract_post)
! 
! #define DECL_IS_WRAPPER_FN_P(NODE) \
!   (DECL_DECLARES_FUNCTION_P (NODE) && DECL_LANG_SPECIFIC (NODE) && \
!    DECL_CONTRACT_WRAPPER (NODE))
! 
! /* Allow specifying a sub-set of contract kinds to copy.  */
! enum contract_match_kind
! {
!   cmk_all,
!   cmk_pre,
!   cmk_post
! };
  
  /* contracts.cc */
  
! extern void init_contracts			(void);
! 
! extern tree grok_contract			(tree, tree, tree, cp_expr, location_t);
! extern tree finish_contract_specifier 		(tree, tree);
! extern tree finish_contract_condition		(cp_expr);
! extern void update_late_contract		(tree, tree, cp_expr);
! extern void check_redecl_contract		(tree, tree);
! extern tree invalidate_contract			(tree);
! extern tree copy_and_remap_contracts		(tree, tree, contract_match_kind = cmk_all);
! extern tree constify_contract_access		(tree);
! extern tree view_as_const			(tree);
! 
! extern void set_fn_contract_specifiers		(tree, tree);
! extern void update_fn_contract_specifiers	(tree, tree);
! extern tree get_fn_contract_specifiers		(tree);
! extern void remove_decl_with_fn_contracts_specifiers (tree);
! extern void remove_fn_contract_specifiers	(tree);
! extern void update_contract_arguments		(tree, tree);
  
  extern tree make_postcondition_variable		(cp_expr);
  extern tree make_postcondition_variable		(cp_expr, tree);
+ extern void check_param_in_postcondition	(tree, location_t);
+ extern void check_postconditions_in_redecl	(tree, tree);
  extern void maybe_update_postconditions		(tree);
  extern void rebuild_postconditions		(tree);
  extern bool check_postcondition_result		(tree, tree, location_t);
  
! extern bool contract_any_deferred_p 		(tree);
  
  extern tree get_precondition_function		(tree);
  extern tree get_postcondition_function		(tree);
+ extern tree get_orig_for_outlined		(tree);
+ 
  extern void start_function_contracts		(tree);
  extern void maybe_apply_function_contracts	(tree);
! extern void finish_function_outlined_contracts	(tree);
  extern void set_contract_functions		(tree, tree, tree);
  
! extern tree maybe_contract_wrap_call		(tree, tree);
! extern bool emit_contract_wrapper_func		(bool);
! extern void maybe_emit_violation_handler_wrappers (void);
  
! extern tree build_contract_check		(tree);
  
! /* Test if EXP is a contract const wrapper node.  */
  
! inline bool
! contract_const_wrapper_p (const_tree exp)
  {
!   /* A wrapper node has code VIEW_CONVERT_EXPR, and the flag base.private_flag
!      is set. The wrapper node is used to used to constify entities inside
!      contract assertions.  */
!   return ((TREE_CODE (exp) == VIEW_CONVERT_EXPR) && CONST_WRAPPER_P (exp));
  }
  
! /* If EXP is a contract_const_wrapper_p, return the wrapped expression.
!    Otherwise, do nothing. */
  
! inline tree
! strip_contract_const_wrapper (tree exp)
  {
!   if (contract_const_wrapper_p (exp))
!     return TREE_OPERAND (exp, 0);
!   else
!     return exp;
  }
  
+ /* TODO : decide if we should push the tests into contracts.cc  */
+ extern contract_evaluation_semantic get_evaluation_semantic (const_tree);
  
  /* Will this contract be ignored.  */
  
  inline bool
  contract_ignored_p (const_tree contract)
  {
!   return (get_evaluation_semantic (contract) <= CES_IGNORE);
  }
  
  /* Will this contract be evaluated?  */
*************** contract_ignored_p (const_tree contract)
*** 347,352 ****
  inline bool
  contract_evaluated_p (const_tree contract)
  {
!   return (get_contract_semantic (contract) >= CCS_NEVER);
  }
  #endif /* ! GCC_CP_CONTRACT_H */
--- 237,252 ----
  inline bool
  contract_evaluated_p (const_tree contract)
  {
!   return (get_evaluation_semantic (contract) >= CES_OBSERVE);
  }
+ 
+ /* Is the contract terminating?  */
+ 
+ inline bool
+ contract_terminating_p (const_tree contract)
+ {
+   return (get_evaluation_semantic (contract) == CES_ENFORCE
+ 	  || get_evaluation_semantic (contract) == CES_QUICK);
+ }
+ 
  #endif /* ! GCC_CP_CONTRACT_H */
diff -Nrcpad gcc-16-20260125/gcc/cp/coroutines.cc gcc-16-20260201/gcc/cp/coroutines.cc
*** gcc-16-20260125/gcc/cp/coroutines.cc	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/cp/coroutines.cc	Sun Feb  1 22:32:07 2026
*************** along with GCC; see the file COPYING3.
*** 33,39 ****
  #include "gcc-rich-location.h"
  #include "hash-map.h"
  #include "coroutines.h"
- #include "contracts.h"
  
  /* ================= Debug. ================= */
  
--- 33,38 ----
*************** coro_build_actor_or_destroy_function (tr
*** 4459,4466 ****
    DECL_USER_ALIGN (fn) = DECL_USER_ALIGN (orig);
    /* Apply attributes from the original fn.  */
    DECL_ATTRIBUTES (fn) = copy_list (DECL_ATTRIBUTES (orig));
-   /* but we do not want ones for contracts.  */
-   remove_contract_attributes (fn);
  
    /* A void return.  */
    tree resdecl = build_decl (loc, RESULT_DECL, 0, void_type_node);
--- 4458,4463 ----
diff -Nrcpad gcc-16-20260125/gcc/cp/cp-gimplify.cc gcc-16-20260201/gcc/cp/cp-gimplify.cc
*** gcc-16-20260125/gcc/cp/cp-gimplify.cc	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/cp/cp-gimplify.cc	Sun Feb  1 22:32:07 2026
*************** along with GCC; see the file COPYING3.
*** 43,49 ****
  #include "omp-general.h"
  #include "opts.h"
  #include "gcc-urlifier.h"
! #include "contracts.h"
  
  /* Keep track of forward references to immediate-escalating functions in
     case they become consteval.  This vector contains ADDR_EXPRs and
--- 43,49 ----
  #include "omp-general.h"
  #include "opts.h"
  #include "gcc-urlifier.h"
! #include "contracts.h" // build_contract_check ()
  
  /* Keep track of forward references to immediate-escalating functions in
     case they become consteval.  This vector contains ADDR_EXPRs and
*************** immediate_escalating_function_p (tree fn
*** 502,511 ****
  	 specifier  */
    if (LAMBDA_FUNCTION_P (fn))
      return true;
!   /* -- a defaulted special member function that is not declared with the
  	consteval specifier  */
!   special_function_kind sfk = special_memfn_p (fn);
!   if (sfk != sfk_none && DECL_DEFAULTED_FN (fn))
      return true;
    /* -- a function that results from the instantiation of a templated entity
  	defined with the constexpr specifier.  */
--- 502,510 ----
  	 specifier  */
    if (LAMBDA_FUNCTION_P (fn))
      return true;
!   /* -- a defaulted function that is not declared with the
  	consteval specifier  */
!   if (DECL_DEFAULTED_FN (fn))
      return true;
    /* -- a function that results from the instantiation of a templated entity
  	defined with the constexpr specifier.  */
*************** cp_gimplify_expr (tree *expr_p, gimple_s
*** 1046,1052 ****
    return ret;
  }
  
! static inline bool
  is_invisiref_parm (const_tree t)
  {
    return ((TREE_CODE (t) == PARM_DECL || TREE_CODE (t) == RESULT_DECL)
--- 1045,1051 ----
    return ret;
  }
  
! bool
  is_invisiref_parm (const_tree t)
  {
    return ((TREE_CODE (t) == PARM_DECL || TREE_CODE (t) == RESULT_DECL)
*************** cp_genericize_r (tree *stmt_p, int *walk
*** 2127,2144 ****
      case ASSERTION_STMT:
      case PRECONDITION_STMT:
      case POSTCONDITION_STMT:
!       {
! 	if (tree check = build_contract_check (stmt))
! 	  {
! 	    *stmt_p = check;
! 	    return cp_genericize_r (stmt_p, walk_subtrees, data);
! 	  }
! 
! 	/* If we didn't build a check, replace it with void_node so we don't
! 	   leak contracts into GENERIC.  */
! 	*stmt_p = void_node;
! 	*walk_subtrees = 0;
!       }
        break;
  
      case USING_STMT:
--- 2126,2140 ----
      case ASSERTION_STMT:
      case PRECONDITION_STMT:
      case POSTCONDITION_STMT:
!       if (tree check = build_contract_check (stmt))
! 	{
! 	  *stmt_p = check;
! 	  return cp_genericize_r (stmt_p, walk_subtrees, data);
! 	}
!       /* If we didn't build a check, replace it with void_node so we don't
! 	 leak contracts into GENERIC.  */
!       *stmt_p = void_node;
!       *walk_subtrees = 0;
        break;
  
      case USING_STMT:
*************** cp_genericize_r (tree *stmt_p, int *walk
*** 2503,2514 ****
      case OMP_TILE:
      case OMP_UNROLL:
      case OACC_LOOP:
-     case STATEMENT_LIST:
        /* These cases are handled by shared code.  */
        c_genericize_control_stmt (stmt_p, walk_subtrees, data,
  				 cp_genericize_r, cp_walk_subtrees);
        break;
  
      case BIT_CAST_EXPR:
        *stmt_p = build1_loc (EXPR_LOCATION (stmt), VIEW_CONVERT_EXPR,
  			    TREE_TYPE (stmt), TREE_OPERAND (stmt, 0));
--- 2499,2522 ----
      case OMP_TILE:
      case OMP_UNROLL:
      case OACC_LOOP:
        /* These cases are handled by shared code.  */
        c_genericize_control_stmt (stmt_p, walk_subtrees, data,
  				 cp_genericize_r, cp_walk_subtrees);
        break;
  
+     case STATEMENT_LIST:
+       /* As above, handled by shared code.  */
+       c_genericize_control_stmt (stmt_p, walk_subtrees, data,
+ 				 cp_genericize_r, cp_walk_subtrees);
+       /* If a statement list is freed as part of genericisation it will be
+ 	 pushed onto the top of a statement list cache stack.  A subsequent
+ 	 action can cause a new statement list to be required - and the one
+ 	 just pushed will be returned.  If that is marked as visited, it can
+ 	 prevent a tail recursion from processing the 'new' statement list,
+ 	 so we do not mark statement lists as visited.  */
+       return NULL_TREE;
+       break;
+ 
      case BIT_CAST_EXPR:
        *stmt_p = build1_loc (EXPR_LOCATION (stmt), VIEW_CONVERT_EXPR,
  			    TREE_TYPE (stmt), TREE_OPERAND (stmt, 0));
*************** cp_fold_maybe_rvalue (tree x, bool rval,
*** 3128,3153 ****
  {
    while (true)
      {
        x = cp_fold (x, flags);
        if (rval)
- 	x = mark_rvalue_use (x);
-       if (rval && (flags & ff_only_non_odr))
- 	{
- 	  tree v = cp_fold_non_odr_use_1 (x);
- 	  if (v != x)
- 	    {
- 	      x = v;
- 	      continue;
- 	    }
- 	}
-       else if (rval && DECL_P (x)
- 	       && !TYPE_REF_P (TREE_TYPE (x)))
  	{
! 	  tree v = decl_constant_value (x);
! 	  if (v != x && v != error_mark_node)
  	    {
! 	      x = v;
! 	      continue;
  	    }
  	}
        break;
--- 3136,3156 ----
  {
    while (true)
      {
+       if (rval && (flags & ff_only_non_odr))
+ 	x = cp_fold_non_odr_use_1 (x);
        x = cp_fold (x, flags);
        if (rval)
  	{
! 	  x = mark_rvalue_use (x);
! 	  if (!(flags & ff_only_non_odr)
! 	      && DECL_P (x) && !TYPE_REF_P (TREE_TYPE (x)))
  	    {
! 	      tree v = decl_constant_value (x);
! 	      if (v != x && v != error_mark_node)
! 		{
! 		  x = v;
! 		  continue;
! 		}
  	    }
  	}
        break;
*************** cp_fold (tree x, fold_flags_t flags)
*** 3411,3419 ****
  	 used as lvalues.  */
        if ((flags & ff_only_non_odr) && REFERENCE_REF_P (x))
  	{
! 	  tree r = cp_fold_non_odr_use_1 (x);
! 	  if (r != x)
! 	    return convert_from_reference (cp_fold (r, flags));
  	}
        goto unary;
  
--- 3414,3422 ----
  	 used as lvalues.  */
        if ((flags & ff_only_non_odr) && REFERENCE_REF_P (x))
  	{
! 	  op0 = cp_fold_non_odr_use_1 (TREE_OPERAND (x, 0));
! 	  if (op0 != TREE_OPERAND (x, 0))
! 	    return convert_from_reference (cp_fold (op0, flags));
  	}
        goto unary;
  
*************** cp_fold (tree x, fold_flags_t flags)
*** 3560,3566 ****
  	  if (op0 == error_mark_node || op1 == error_mark_node)
  	    x = error_mark_node;
  	  else if (op0 != TREE_OPERAND (x, 0) || op1 != TREE_OPERAND (x, 1))
! 	    x = build2_loc (loc, code, TREE_TYPE (x), op0, op1);
  	  break;
  	}
  
--- 3563,3573 ----
  	  if (op0 == error_mark_node || op1 == error_mark_node)
  	    x = error_mark_node;
  	  else if (op0 != TREE_OPERAND (x, 0) || op1 != TREE_OPERAND (x, 1))
! 	    {
! 	      if (code == INIT_EXPR && op1 != TREE_OPERAND (x, 1))
! 		set_target_expr_eliding (op1);
! 	      x = build2_loc (loc, code, TREE_TYPE (x), op0, op1);
! 	    }
  	  break;
  	}
  
*************** struct source_location_table_entry_hash
*** 4258,4277 ****
  static GTY(()) hash_table <source_location_table_entry_hash>
    *source_location_table;
  
! /* Fold the __builtin_source_location () call T.  */
  
  tree
! fold_builtin_source_location (const_tree t)
  {
-   gcc_assert (TREE_CODE (t) == CALL_EXPR);
-   /* TREE_TYPE (t) is const std::source_location::__impl*  */
-   tree source_location_impl = TREE_TYPE (TREE_TYPE (t));
-   if (source_location_impl == error_mark_node)
-     return build_zero_cst (const_ptr_type_node);
-   gcc_assert (CLASS_TYPE_P (source_location_impl)
- 	      && id_equal (TYPE_IDENTIFIER (source_location_impl), "__impl"));
- 
-   location_t loc = EXPR_LOCATION (t);
    if (source_location_table == NULL)
      source_location_table
        = hash_table <source_location_table_entry_hash>::create_ggc (64);
--- 4265,4276 ----
  static GTY(()) hash_table <source_location_table_entry_hash>
    *source_location_table;
  
! /* Build a std::source_location::__impl from a location_t.  */
  
  tree
! build_source_location_impl (location_t loc, tree fndecl,
! 			    tree source_location_impl)
  {
    if (source_location_table == NULL)
      source_location_table
        = hash_table <source_location_table_entry_hash>::create_ggc (64);
*************** fold_builtin_source_location (const_tree
*** 4280,4357 ****
    entry.loc
      = linemap_resolve_location (line_table, loc, LRK_MACRO_EXPANSION_POINT,
  				&map);
!   entry.uid = current_function_decl ? DECL_UID (current_function_decl) : -1;
    entry.var = error_mark_node;
    source_location_table_entry *entryp
      = source_location_table->find_slot (entry, INSERT);
!   tree var;
    if (entryp->var)
!     var = entryp->var;
!   else
!     {
!       var = build_decl (loc, VAR_DECL, generate_internal_label ("Lsrc_loc"),
! 			source_location_impl);
!       TREE_STATIC (var) = 1;
!       TREE_PUBLIC (var) = 0;
!       DECL_ARTIFICIAL (var) = 1;
!       DECL_IGNORED_P (var) = 1;
!       DECL_EXTERNAL (var) = 0;
!       DECL_DECLARED_CONSTEXPR_P (var) = 1;
!       DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (var) = 1;
!       layout_decl (var, 0);
  
!       vec<constructor_elt, va_gc> *v = NULL;
!       vec_alloc (v, 4);
!       for (tree field = TYPE_FIELDS (source_location_impl);
! 	   (field = next_aggregate_field (field)) != NULL_TREE;
! 	   field = DECL_CHAIN (field))
  	{
! 	  const char *n = IDENTIFIER_POINTER (DECL_NAME (field));
! 	  tree val = NULL_TREE;
! 	  if (strcmp (n, "_M_file_name") == 0)
! 	    {
! 	      if (const char *fname = LOCATION_FILE (loc))
! 		{
! 		  fname = remap_macro_filename (fname);
! 		  val = build_string_literal (fname);
! 		}
! 	      else
! 		val = build_string_literal ("");
! 	    }
! 	  else if (strcmp (n, "_M_function_name") == 0)
  	    {
! 	      const char *name = "";
! 
! 	      if (current_function_decl)
! 		{
! 		  /* If this is a coroutine, we should get the name of the user
! 		     function rather than the actor we generate.  */
! 		  if (tree ramp = DECL_RAMP_FN (current_function_decl))
! 		    name = cxx_printable_name (ramp, 2);
! 		  else
! 		    name = cxx_printable_name (current_function_decl, 2);
! 		}
! 
! 	      val = build_string_literal (name);
  	    }
- 	  else if (strcmp (n, "_M_line") == 0)
- 	    val = build_int_cst (TREE_TYPE (field), LOCATION_LINE (loc));
- 	  else if (strcmp (n, "_M_column") == 0)
- 	    val = build_int_cst (TREE_TYPE (field), LOCATION_COLUMN (loc));
  	  else
! 	    gcc_unreachable ();
! 	  CONSTRUCTOR_APPEND_ELT (v, field, val);
  	}
  
!       tree ctor = build_constructor (source_location_impl, v);
!       TREE_CONSTANT (ctor) = 1;
!       TREE_STATIC (ctor) = 1;
!       DECL_INITIAL (var) = ctor;
!       varpool_node::finalize_decl (var);
!       *entryp = entry;
!       entryp->var = var;
      }
  
    return build_fold_addr_expr_with_type_loc (loc, var, TREE_TYPE (t));
  }
  
--- 4279,4372 ----
    entry.loc
      = linemap_resolve_location (line_table, loc, LRK_MACRO_EXPANSION_POINT,
  				&map);
!   entry.uid = fndecl ? DECL_UID (fndecl) : -1;
    entry.var = error_mark_node;
    source_location_table_entry *entryp
      = source_location_table->find_slot (entry, INSERT);
! 
    if (entryp->var)
!     return entryp->var;
  
!   tree var = build_decl (loc, VAR_DECL, generate_internal_label ("Lsrc_loc"),
! 			 source_location_impl);
!   TREE_STATIC (var) = 1;
!   TREE_PUBLIC (var) = 0;
!   DECL_ARTIFICIAL (var) = 1;
!   DECL_IGNORED_P (var) = 1;
!   DECL_EXTERNAL (var) = 0;
!   DECL_DECLARED_CONSTEXPR_P (var) = 1;
!   DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (var) = 1;
!   layout_decl (var, 0);
! 
!   vec<constructor_elt, va_gc> *v = NULL;
!   vec_alloc (v, 4);
!   for (tree field = TYPE_FIELDS (source_location_impl);
! 	(field = next_aggregate_field (field)) != NULL_TREE;
! 	field = DECL_CHAIN (field))
!     {
!       const char *n = IDENTIFIER_POINTER (DECL_NAME (field));
!       tree val = NULL_TREE;
!       if (strcmp (n, "_M_file_name") == 0)
  	{
! 	  if (const char *fname = LOCATION_FILE (loc))
  	    {
! 	      fname = remap_macro_filename (fname);
! 	      val = build_string_literal (fname);
  	    }
  	  else
! 	    val = build_string_literal ("");
  	}
+       else if (strcmp (n, "_M_function_name") == 0)
+ 	{
+ 	  const char *name = "";
  
! 	  if (fndecl)
! 	    {
! 	      /* If this is a coroutine, we should get the name of the user
! 		 function rather than the actor we generate.  */
! 	      if (tree ramp = DECL_RAMP_FN (fndecl))
! 		name = cxx_printable_name (ramp, 2);
! 	      else
! 		name = cxx_printable_name (fndecl, 2);
! 	    }
! 
! 	  val = build_string_literal (name);
! 	}
!       else if (strcmp (n, "_M_line") == 0)
! 	val = build_int_cst (TREE_TYPE (field), LOCATION_LINE (loc));
!       else if (strcmp (n, "_M_column") == 0)
! 	val = build_int_cst (TREE_TYPE (field), LOCATION_COLUMN (loc));
!       else
! 	gcc_unreachable ();
!       CONSTRUCTOR_APPEND_ELT (v, field, val);
      }
  
+   tree ctor = build_constructor (source_location_impl, v);
+   TREE_CONSTANT (ctor) = 1;
+   TREE_STATIC (ctor) = 1;
+   DECL_INITIAL (var) = ctor;
+   varpool_node::finalize_decl (var);
+   *entryp = entry;
+   entryp->var = var;
+   return var;
+ }
+ 
+ /* Fold the __builtin_source_location () call T.  */
+ 
+ tree
+ fold_builtin_source_location (const_tree t)
+ {
+   gcc_assert (TREE_CODE (t) == CALL_EXPR);
+   /* TREE_TYPE (t) is const std::source_location::__impl*  */
+   tree source_location_impl = TREE_TYPE (TREE_TYPE (t));
+   if (source_location_impl == error_mark_node)
+     return build_zero_cst (const_ptr_type_node);
+   gcc_assert (CLASS_TYPE_P (source_location_impl)
+ 	      && id_equal (TYPE_IDENTIFIER (source_location_impl), "__impl"));
+ 
+   location_t loc = EXPR_LOCATION (t);
+   tree var = build_source_location_impl (loc, current_function_decl,
+ 					 source_location_impl);
    return build_fold_addr_expr_with_type_loc (loc, var, TREE_TYPE (t));
  }
  
diff -Nrcpad gcc-16-20260125/gcc/cp/cp-objcp-common.cc gcc-16-20260201/gcc/cp/cp-objcp-common.cc
*** gcc-16-20260125/gcc/cp/cp-objcp-common.cc	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/cp/cp-objcp-common.cc	Sun Feb  1 22:32:07 2026
*************** along with GCC; see the file COPYING3.
*** 26,32 ****
  #include "c-family/c-common.h"
  #include "dwarf2.h"
  #include "stringpool.h"
- #include "contracts.h"
  
  /* Class to determine whether a given C++ language feature is available.
     Used to implement __has_{feature,extension}.  */
--- 26,31 ----
*************** cp_handle_option (size_t scode, const ch
*** 741,778 ****
    if (handle_module_option (unsigned (scode), arg, value))
      return true;
  
-   enum opt_code code = (enum opt_code) scode;
-   bool handled_p = true;
- 
-   switch (code)
-     {
-     case OPT_fcontract_build_level_:
-       handle_OPT_fcontract_build_level_ (arg);
-       break;
- 
-     case OPT_fcontract_assumption_mode_:
-       handle_OPT_fcontract_assumption_mode_ (arg);
-       break;
- 
-     case OPT_fcontract_continuation_mode_:
-       handle_OPT_fcontract_continuation_mode_ (arg);
-       break;
- 
-     case OPT_fcontract_role_:
-       handle_OPT_fcontract_role_ (arg);
-       break;
- 
-     case OPT_fcontract_semantic_:
-       handle_OPT_fcontract_semantic_ (arg);
-       break;
- 
-     default:
-       handled_p = false;
-       break;
-     }
-   if (handled_p)
-     return handled_p;
- 
    return c_common_handle_option (scode, arg, value, kind, loc, handlers);
  }
  
--- 740,745 ----
diff -Nrcpad gcc-16-20260125/gcc/cp/cp-objcp-common.h gcc-16-20260201/gcc/cp/cp-objcp-common.h
*** gcc-16-20260125/gcc/cp/cp-objcp-common.h	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/cp/cp-objcp-common.h	Sun Feb  1 22:32:07 2026
*************** extern tree cxx_simulate_record_decl (lo
*** 112,119 ****
    cxx_simulate_builtin_function_decl
  #undef	LANG_HOOKS_TYPE_HASH_EQ
  #define LANG_HOOKS_TYPE_HASH_EQ	cxx_type_hash_eq
! #undef	LANG_HOOKS_COPY_LANG_QUALIFIERS
! #define LANG_HOOKS_COPY_LANG_QUALIFIERS	cxx_copy_lang_qualifiers
  #undef LANG_HOOKS_MISSING_NORETURN_OK_P
  #define LANG_HOOKS_MISSING_NORETURN_OK_P cp_missing_noreturn_ok_p
  #undef LANG_HOOKS_BLOCK_MAY_FALLTHRU
--- 112,119 ----
    cxx_simulate_builtin_function_decl
  #undef	LANG_HOOKS_TYPE_HASH_EQ
  #define LANG_HOOKS_TYPE_HASH_EQ	cxx_type_hash_eq
! #undef	LANG_HOOKS_BUILD_LANG_QUALIFIED_TYPE
! #define LANG_HOOKS_BUILD_LANG_QUALIFIED_TYPE	cxx_build_lang_qualified_type
  #undef LANG_HOOKS_MISSING_NORETURN_OK_P
  #define LANG_HOOKS_MISSING_NORETURN_OK_P cp_missing_noreturn_ok_p
  #undef LANG_HOOKS_BLOCK_MAY_FALLTHRU
diff -Nrcpad gcc-16-20260125/gcc/cp/cp-tree.def gcc-16-20260201/gcc/cp/cp-tree.def
*** gcc-16-20260125/gcc/cp/cp-tree.def	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/cp/cp-tree.def	Sun Feb  1 22:32:07 2026
*************** DEFTREECODE (CO_RETURN_EXPR, "co_return"
*** 576,584 ****
     operand to store the optional name for the result value.
  
     CONTRACT_SEMANTIC has the computed behavior of the contract.  */
! DEFTREECODE (ASSERTION_STMT, "assertion_stmt", tcc_statement, 3)
! DEFTREECODE (PRECONDITION_STMT, "precondition_stmt", tcc_statement, 3)
! DEFTREECODE (POSTCONDITION_STMT, "postcondition_stmt", tcc_statement, 4)
  
  /* A reference to a translation-unit local entity.
  
--- 576,584 ----
     operand to store the optional name for the result value.
  
     CONTRACT_SEMANTIC has the computed behavior of the contract.  */
! DEFTREECODE (ASSERTION_STMT, "assertion_stmt", tcc_statement, 5)
! DEFTREECODE (PRECONDITION_STMT, "precondition_stmt", tcc_statement, 5)
! DEFTREECODE (POSTCONDITION_STMT, "postcondition_stmt", tcc_statement, 6)
  
  /* A reference to a translation-unit local entity.
  
diff -Nrcpad gcc-16-20260125/gcc/cp/cp-tree.h gcc-16-20260201/gcc/cp/cp-tree.h
*** gcc-16-20260125/gcc/cp/cp-tree.h	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/cp/cp-tree.h	Sun Feb  1 22:32:07 2026
*************** enum cp_tree_index
*** 236,244 ****
      CPTI_THREAD_ATEXIT,
      CPTI_DSO_HANDLE,
      CPTI_DCAST,
- 
-     CPTI_PSEUDO_CONTRACT_VIOLATION,
      CPTI_META_INFO_TYPE,
  
      CPTI_MAX
  };
--- 236,243 ----
      CPTI_THREAD_ATEXIT,
      CPTI_DSO_HANDLE,
      CPTI_DCAST,
      CPTI_META_INFO_TYPE,
+     CPTI_CONTRACT_VIOLATION_TYPE,
  
      CPTI_MAX
  };
*************** extern GTY(()) tree cp_global_trees[CPTI
*** 269,276 ****
  #define current_aggr			cp_global_trees[CPTI_AGGR_TAG]
  /* std::align_val_t */
  #define align_type_node			cp_global_trees[CPTI_ALIGN_TYPE]
- #define pseudo_contract_violation_type	cp_global_trees[CPTI_PSEUDO_CONTRACT_VIOLATION]
  #define meta_info_type_node		cp_global_trees[CPTI_META_INFO_TYPE]
  
  /* We cache these tree nodes so as to call get_identifier less frequently.
     For identifiers for functions, including special member functions such
--- 268,275 ----
  #define current_aggr			cp_global_trees[CPTI_AGGR_TAG]
  /* std::align_val_t */
  #define align_type_node			cp_global_trees[CPTI_ALIGN_TYPE]
  #define meta_info_type_node		cp_global_trees[CPTI_META_INFO_TYPE]
+ #define builtin_contract_violation_type	cp_global_trees[CPTI_CONTRACT_VIOLATION_TYPE]
  
  /* We cache these tree nodes so as to call get_identifier less frequently.
     For identifiers for functions, including special member functions such
*************** extern GTY(()) tree cp_global_trees[CPTI
*** 454,460 ****
        OVL_DEDUP_P (in OVERLOAD)
        INIT_EXPR_NRV_P (in INIT_EXPR)
        ATOMIC_CONSTR_MAP_INSTANTIATED_P (in ATOMIC_CONSTR)
-       contract_semantic (in ASSERTION_, PRECONDITION_, POSTCONDITION_STMT)
        RETURN_EXPR_LOCAL_ADDR_P (in RETURN_EXPR)
        PACK_INDEX_PARENTHESIZED_P (in PACK_INDEX_*)
        MUST_NOT_THROW_NOEXCEPT_P (in MUST_NOT_THROW_EXPR)
--- 453,458 ----
*************** extern GTY(()) tree cp_global_trees[CPTI
*** 505,511 ****
        LAMBDA_EXPR_CAPTURE_OPTIMIZED (in LAMBDA_EXPR)
        IMPLICIT_CONV_EXPR_BRACED_INIT (in IMPLICIT_CONV_EXPR)
        PACK_EXPANSION_AUTO_P (in *_PACK_EXPANSION)
-       contract_semantic (in ASSERTION_, PRECONDITION_, POSTCONDITION_STMT)
        STATIC_INIT_DECOMP_NONBASE_P (in the TREE_LIST
  				    for {static,tls}_aggregates)
        MUST_NOT_THROW_CATCH_P (in MUST_NOT_THROW_EXPR)
--- 503,508 ----
*************** extern GTY(()) tree cp_global_trees[CPTI
*** 524,530 ****
        LAMBDA_EXPR_STATIC_P (in LAMBDA_EXPR)
        TARGET_EXPR_ELIDING_P (in TARGET_EXPR)
        IF_STMT_VACUOUS_INIT_P (IF_STMT)
-       contract_semantic (in ASSERTION_, PRECONDITION_, POSTCONDITION_STMT)
        TYPENAME_IS_RESOLVING_P (in TYPENAME_TYPE)
     4: IDENTIFIER_MARKED (IDENTIFIER_NODEs)
        TREE_HAS_CONSTRUCTOR (in INDIRECT_REF, SAVE_EXPR, CONSTRUCTOR,
--- 521,526 ----
*************** extern GTY(()) tree cp_global_trees[CPTI
*** 535,540 ****
--- 531,537 ----
        LOOKUP_FOUND_P (in RECORD_TYPE, UNION_TYPE, ENUMERAL_TYPE, NAMESPACE_DECL)
        FNDECL_MANIFESTLY_CONST_EVALUATED (in FUNCTION_DECL)
        TARGET_EXPR_INTERNAL_P (in TARGET_EXPR)
+       CONTRACT_CONST (in ASSERTION_, PRECONDITION_, POSTCONDITION_STMT)
     5: IDENTIFIER_VIRTUAL_P (in IDENTIFIER_NODE)
        FUNCTION_RVALUE_QUALIFIED (in FUNCTION_TYPE, METHOD_TYPE)
        CALL_EXPR_REVERSE_ARGS (in CALL_EXPR, AGGR_INIT_EXPR)
*************** extern GTY(()) tree cp_global_trees[CPTI
*** 585,590 ****
--- 582,588 ----
        DECL_SELF_REFERENCE_P (in a TYPE_DECL)
        DECL_INVALID_OVERRIDER_P (in a FUNCTION_DECL)
        DECL_UNINSTANIATED_TEMPLATE_FRIEND_P (in TEMPLATE_DECL)
+       parm_used_in_post_p (in PARM_DECL)
     5: DECL_INTERFACE_KNOWN.
     6: DECL_THIS_STATIC (in VAR_DECL, FUNCTION_DECL or PARM_DECL)
        DECL_FIELD_IS_BASE (in FIELD_DECL)
*************** struct GTY(()) saved_scope {
*** 2077,2087 ****
    tree x_current_class_ptr;
    tree x_current_class_ref;
  
    int x_processing_template_decl;
    int x_processing_specialization;
    int x_processing_constraint;
-   int x_processing_contract_condition;
    int suppress_location_wrappers;
    BOOL_BITFIELD x_processing_explicit_instantiation : 1;
    BOOL_BITFIELD need_pop_function_context : 1;
    BOOL_BITFIELD x_processing_omp_trait_property_expr : 1;
--- 2075,2088 ----
    tree x_current_class_ptr;
    tree x_current_class_ref;
  
+   /* Only used for uses of this in contract assertion.  */
+   tree x_contract_class_ptr;
+ 
    int x_processing_template_decl;
    int x_processing_specialization;
    int x_processing_constraint;
    int suppress_location_wrappers;
+   BOOL_BITFIELD x_processing_postcondition : 1;
    BOOL_BITFIELD x_processing_explicit_instantiation : 1;
    BOOL_BITFIELD need_pop_function_context : 1;
    BOOL_BITFIELD x_processing_omp_trait_property_expr : 1;
*************** extern GTY(()) struct saved_scope *scope
*** 2161,2171 ****
  #define processing_explicit_instantiation scope_chain->x_processing_explicit_instantiation
  #define processing_omp_trait_property_expr scope_chain->x_processing_omp_trait_property_expr
  
! /* Nonzero if we are parsing the conditional expression of a contract
!    condition. These expressions appear outside the parameter list (like a
!    trailing return type), but are potentially evaluated.  */
  
! #define processing_contract_condition scope_chain->x_processing_contract_condition
  
  #define in_discarded_stmt scope_chain->discarded_stmt
  #define in_consteval_if_p scope_chain->consteval_if_p
--- 2162,2175 ----
  #define processing_explicit_instantiation scope_chain->x_processing_explicit_instantiation
  #define processing_omp_trait_property_expr scope_chain->x_processing_omp_trait_property_expr
  
! /* Nonzero if we are parsing the expression of a contract condition. These
!    expressions appear outside the parameter list (like a trailing return
!    type), but are potentially evaluated.  */
  
! #define processing_contract_condition \
!   (scope_chain->bindings->kind == sk_contract)
! 
! #define processing_postcondition scope_chain->x_processing_postcondition
  
  #define in_discarded_stmt scope_chain->discarded_stmt
  #define in_consteval_if_p scope_chain->consteval_if_p
*************** extern GTY(()) struct saved_scope *scope
*** 2173,2178 ****
--- 2177,2186 ----
  
  #define current_ref_temp_count scope_chain->ref_temp_count
  
+ /* Nonzero if we're parsing a precondition on a constructor or postcondition
+    on destructor.  */
+ #define contract_class_ptr scope_chain->x_contract_class_ptr
+ 
  /* RAII sentinel to handle clearing processing_template_decl and restoring
     it when done.  */
  
*************** struct GTY(()) lang_decl_min {
*** 3175,3180 ****
--- 3183,3195 ----
    tree access;
  };
  
+ enum lang_contract_helper
+ {
+   ldf_contract_none = 0,
+   ldf_contract_pre,
+   ldf_contract_post
+ };
+ 
  /* Additional DECL_LANG_SPECIFIC information for functions.  */
  
  struct GTY(()) lang_decl_fn {
*************** struct GTY(()) lang_decl_fn {
*** 3202,3210 ****
    unsigned coroutine_p : 1;
    unsigned implicit_constexpr : 1;
    unsigned escalated_p : 1;
    unsigned xobj_func : 1;
  
!   unsigned spare : 7;
  
    /* 32-bits padding on 64-bit host.  */
  
--- 3217,3228 ----
    unsigned coroutine_p : 1;
    unsigned implicit_constexpr : 1;
    unsigned escalated_p : 1;
+ 
    unsigned xobj_func : 1;
+   unsigned contract_wrapper : 1;
+   ENUM_BITFIELD(lang_contract_helper) contract_helper : 2;
  
!   unsigned spare : 4;
  
    /* 32-bits padding on 64-bit host.  */
  
*************** struct GTY(()) lang_decl {
*** 3352,3357 ****
--- 3370,3378 ----
  
  #endif /* ENABLE_TREE_CHECKING */
  
+ #define CONTRACT_HELPER(NODE) \
+  (LANG_DECL_FN_CHECK (NODE)->contract_helper)
+ 
  /* For a FUNCTION_DECL or a VAR_DECL, the language linkage for the
     declaration.  Some entities (like a member function in a local
     class, or a local variable) do not have linkage at all, and this
*************** struct GTY(()) lang_decl {
*** 3625,3630 ****
--- 3646,3656 ----
    (TREE_CODE (STRIP_TEMPLATE (NODE)) == FUNCTION_DECL	\
     && DECL_FUNCTION_XOBJ_FLAG (NODE) == 1)
  
+ /* Nonzero for FUNCTION_DECL means that this decl is a contract
+    wrapper function.  */
+ #define DECL_CONTRACT_WRAPPER(NODE)	\
+   LANG_DECL_FN_CHECK (NODE)->contract_wrapper
+ 
  /* Nonzero if NODE is a member function with an object argument,
     in other words, a non-static member function.  */
  #define DECL_OBJECT_MEMBER_FUNCTION_P(NODE) \
*************** extern int comparing_specializations;
*** 6157,6166 ****
     FIXME we should always do this except during deduction/ordering.  */
  extern int comparing_dependent_aliases;
  
! /* Nonzero if we want to consider different member expressions to compare
!    equal if they designate the same entity. This is set when comparing
!    contract conditions of overrides.  */
! extern bool comparing_override_contracts;
  
  /* In parser.cc.  */
  
--- 6183,6192 ----
     FIXME we should always do this except during deduction/ordering.  */
  extern int comparing_dependent_aliases;
  
! /* True if we are matching contracts of two functions.  Depending on
!    whether a decl has been genericized or not, PARM_DECL may be adjusted
!    to be an invisible reference.  */
! extern bool comparing_contracts;
  
  /* In parser.cc.  */
  
*************** struct cp_declarator {
*** 6948,6953 ****
--- 6974,6982 ----
        tree late_return_type;
        /* The trailing requires-clause, if any.  */
        tree requires_clause;
+       /* The function-contract-specifier-seq, if any.  */
+       tree contract_specifiers;
+       /* The position of the opening brace for a function definition.  */
        location_t parens_loc;
      } function;
      /* For arrays.  */
*************** extern int decls_match				(tree, tree, b
*** 7427,7432 ****
--- 7456,7462 ----
  extern bool maybe_version_functions		(tree, tree);
  extern bool validate_constexpr_redeclaration	(tree, tree);
  extern bool merge_default_template_args		(tree, tree, bool);
+ extern void merge_decl_arguments		(tree, tree, bool, bool, bool);
  extern tree duplicate_decls			(tree, tree,
  						 bool hiding = false,
  						 bool was_hidden = false);
*************** extern tmpl_spec_kind current_tmpl_spec_
*** 7511,7516 ****
--- 7541,7547 ----
  extern tree cxx_builtin_function		(tree decl);
  extern tree cxx_builtin_function_ext_scope	(tree decl);
  extern tree cxx_simulate_builtin_function_decl	(tree);
+ extern tree cxx_build_lang_qualified_type	(tree, tree, int);
  extern tree check_elaborated_type_specifier	(enum tag_types, tree, bool);
  extern void warn_extern_redeclared_static	(tree, tree);
  extern tree cxx_comdat_group			(tree);
*************** extern void *finish_module_processing (c
*** 7951,7956 ****
--- 7982,7988 ----
  extern char const *module_name (unsigned, bool header_ok);
  extern bitmap get_import_bitmap ();
  extern bitmap visible_instantiation_path (bitmap *);
+ extern bitmap visible_from_instantiation_origination (unsigned *);
  extern void module_begin_main_file (cpp_reader *, line_maps *,
  				    const line_map_ordinary *);
  extern void module_preprocess_options (cpp_reader *);
*************** extern bool maybe_clone_body			(tree);
*** 7964,7970 ****
  extern tree cp_build_range_for_decls (location_t, tree, tree *, bool);
  extern tree cp_convert_range_for (tree, tree, tree, cp_decomp *, bool,
  				  tree, bool);
! extern tree build_range_temp (tree);
  extern tree cp_perform_range_for_lookup	(tree, tree *, tree *,
  					 tsubst_flags_t = tf_warning_or_error);
  extern void cp_convert_omp_range_for (tree &, tree &, tree &,
--- 7996,8002 ----
  extern tree cp_build_range_for_decls (location_t, tree, tree *, bool);
  extern tree cp_convert_range_for (tree, tree, tree, cp_decomp *, bool,
  				  tree, bool);
! extern tree build_range_temp (tree, bool = false);
  extern tree cp_perform_range_for_lookup	(tree, tree *, tree *,
  					 tsubst_flags_t = tf_warning_or_error);
  extern void cp_convert_omp_range_for (tree &, tree &, tree &,
*************** extern tree process_stmt_hotness_attribu
*** 9065,9070 ****
--- 9097,9103 ----
  extern tree build_assume_call			(location_t, tree);
  extern tree process_stmt_assume_attribute	(tree, tree, location_t);
  extern bool simple_empty_class_p		(tree, tree, tree_code);
+ extern tree build_source_location_impl		(location_t, tree, tree);
  extern tree fold_builtin_source_location	(const_tree);
  extern tree get_source_location_impl_type	();
  extern bool immediate_escalating_function_p	(tree);
*************** extern void promote_function_to_consteva
*** 9072,9077 ****
--- 9105,9111 ----
  extern tree cp_fold_immediate			(tree *, mce_value,
  						 tree = current_function_decl);
  extern void process_and_check_pending_immediate_escalating_fns ();
+ extern bool is_invisiref_parm 			(const_tree);
  
  /* in name-lookup.cc */
  extern tree strip_using_decl                    (tree);
diff -Nrcpad gcc-16-20260125/gcc/cp/decl.cc gcc-16-20260201/gcc/cp/decl.cc
*** gcc-16-20260125/gcc/cp/decl.cc	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/cp/decl.cc	Sun Feb  1 22:32:07 2026
*************** merge_default_template_args (tree new_pa
*** 1781,1786 ****
--- 1781,1877 ----
    return true;
  }
  
+ /* Helper function for duplicate_decls and push_local_extern_decl_alias.
+    Merge parameter attributes and names between NEWDECL and OLDDECL.
+    NEW_DEFINES_FUNCTION and TYPES_MATCH argument like variables in
+    duplicate_decls, EXTERN_ALIAS false for duplicate_decls and true for
+    push_local_extern_decl_alias.  */
+ 
+ void
+ merge_decl_arguments (tree newdecl, tree olddecl, bool new_defines_function,
+ 		      bool types_match, bool extern_alias)
+ {
+   tree oldarg, newarg;
+   for (oldarg = DECL_ARGUMENTS (olddecl), newarg = DECL_ARGUMENTS (newdecl);
+        oldarg && newarg;
+        oldarg = DECL_CHAIN (oldarg), newarg = DECL_CHAIN (newarg))
+     {
+       DECL_ATTRIBUTES (newarg)
+ 	= (*targetm.merge_decl_attributes) (oldarg, newarg);
+       if (lookup_attribute (NULL, "indeterminate", DECL_ATTRIBUTES (newarg))
+ 	  && !lookup_attribute (NULL, "indeterminate",
+ 				DECL_ATTRIBUTES (oldarg)))
+ 	{
+ 	  auto_diagnostic_group d;
+ 	  error_at (DECL_SOURCE_LOCATION (newarg),
+ 		    "%<indeterminate%> attribute not specified for parameter "
+ 		    "%qD on the first declaration of its function", newarg);
+ 	  inform (DECL_SOURCE_LOCATION (oldarg), "earlier declaration");
+ 	}
+       /* ??? Should attributes propagate out from a block extern?  If so,
+ 	 we should do that for the function itself, not just parameters.  */
+       if (!extern_alias || flag_reflection)
+ 	DECL_ATTRIBUTES (oldarg) = DECL_ATTRIBUTES (newarg);
+       /* Merge names for std::meta::has_identifier and
+ 	 std::meta::{,u8}identifier_of purposes.  If they are different and
+ 	 both oldarg and newarg are named, add flag to force that
+ 	 std::meta::has_identifier returns false.  If one is named and one is
+ 	 unnamed, if neither is a olddecl nor newdecl is definition, propagate
+ 	 DECL_NAME to both.  Otherwise stash the old name into "old parm name"
+ 	 artificial attribute.  */
+       if (flag_reflection && DECL_NAME (oldarg) != DECL_NAME (newarg))
+ 	{
+ 	  if (DECL_NAME (oldarg) && DECL_NAME (newarg))
+ 	    {
+ 	      /* Different names.  */
+ 	      MULTIPLE_NAMES_PARM_P (oldarg) = 1;
+ 	      MULTIPLE_NAMES_PARM_P (newarg) = 1;
+ 	    }
+ 	  else if (!new_defines_function
+ 		   && types_match
+ 		   && DECL_INITIAL (olddecl) == NULL_TREE)
+ 	    {
+ 	      /* For 2 non-definitions with matching types, one is named and
+ 		 one unnamed, propagate name to both.  */
+ 	      if (DECL_NAME (oldarg))
+ 		DECL_NAME (newarg) = DECL_NAME (oldarg);
+ 	      else
+ 		DECL_NAME (oldarg) = DECL_NAME (newarg);
+ 	    }
+ 	  /* Depending on which PARM_DECL we'll keep, look at the other
+ 	     PARM_DECL's name.  */
+ 	  else if (tree name = ((new_defines_function || !types_match)
+ 				? DECL_NAME (oldarg) : DECL_NAME (newarg)))
+ 	    {
+ 	      tree opn = lookup_attribute ("old parm name",
+ 					   DECL_ATTRIBUTES (oldarg));
+ 	      if (opn)
+ 		{
+ 		  if (TREE_VALUE (TREE_VALUE (opn)) == name)
+ 		    /* Name already in "old parm name" attribute.  */;
+ 		  else
+ 		    {
+ 		      /* Different names.  */
+ 		      MULTIPLE_NAMES_PARM_P (oldarg) = 1;
+ 		      MULTIPLE_NAMES_PARM_P (newarg) = 1;
+ 		    }
+ 		}
+ 	      else
+ 		{
+ 		  /* Save name into attribute.  */
+ 		  DECL_ATTRIBUTES (newarg)
+ 		    = tree_cons (get_identifier ("old parm name"),
+ 				 tree_cons (NULL_TREE, name, NULL_TREE),
+ 				 DECL_ATTRIBUTES (newarg));
+ 		  DECL_ATTRIBUTES (oldarg) = DECL_ATTRIBUTES (newarg);
+ 		}
+ 	    }
+ 	  else if (extern_alias)
+ 	    DECL_NAME (newarg) = DECL_NAME (oldarg);
+ 	}
+     }
+ }
+ 
  /* If NEWDECL is a redeclaration of OLDDECL, merge the declarations.
     If the redeclaration is invalid, a diagnostic is issued, and the
     error_mark_node is returned.  Otherwise, OLDDECL is returned.
*************** duplicate_decls (tree newdecl, tree oldd
*** 2528,2534 ****
  	  = DECL_OVERLOADED_OPERATOR_CODE_RAW (olddecl);
        new_defines_function = DECL_INITIAL (newdecl) != NULL_TREE;
  
!       duplicate_contracts (newdecl, olddecl);
  
        /* Optionally warn about more than one declaration for the same
  	 name, but don't warn about a function declaration followed by a
--- 2619,2625 ----
  	  = DECL_OVERLOADED_OPERATOR_CODE_RAW (olddecl);
        new_defines_function = DECL_INITIAL (newdecl) != NULL_TREE;
  
!       check_redecl_contract (newdecl, olddecl);
  
        /* Optionally warn about more than one declaration for the same
  	 name, but don't warn about a function declaration followed by a
*************** duplicate_decls (tree newdecl, tree oldd
*** 2611,2621 ****
        gcc_assert (!DECL_TEMPLATE_SPECIALIZATIONS (newdecl));
  
        /* Make sure the contracts are equivalent.  */
!       duplicate_contracts (newdecl, olddecl);
! 
!       /* Remove contracts from old_result so they aren't appended to
! 	 old_result by the merge function.  */
!       remove_contract_attributes (old_result);
  
        DECL_ATTRIBUTES (old_result)
  	= (*targetm.merge_decl_attributes) (old_result, new_result);
--- 2702,2708 ----
        gcc_assert (!DECL_TEMPLATE_SPECIALIZATIONS (newdecl));
  
        /* Make sure the contracts are equivalent.  */
!       check_redecl_contract (newdecl, olddecl);
  
        DECL_ATTRIBUTES (old_result)
  	= (*targetm.merge_decl_attributes) (old_result, new_result);
*************** duplicate_decls (tree newdecl, tree oldd
*** 2685,2690 ****
--- 2772,2779 ----
  	  DECL_INITIAL (old_result) = DECL_INITIAL (new_result);
  	  if (DECL_FUNCTION_TEMPLATE_P (newdecl))
  	    {
+ 	      update_contract_arguments (new_result, old_result);
+ 
  	      DECL_ARGUMENTS (old_result) = DECL_ARGUMENTS (new_result);
  	      for (tree p = DECL_ARGUMENTS (old_result); p; p = DECL_CHAIN (p))
  		DECL_CONTEXT (p) = old_result;
*************** duplicate_decls (tree newdecl, tree oldd
*** 3040,3127 ****
  
    if (TREE_CODE (newdecl) == FUNCTION_DECL)
      {
!       tree parm;
! 
!       /* Merge parameter attributes. */
!       tree oldarg, newarg;
!       for (oldarg = DECL_ARGUMENTS (olddecl),
! 	   newarg = DECL_ARGUMENTS (newdecl);
! 	   oldarg && newarg;
! 	   oldarg = DECL_CHAIN (oldarg), newarg = DECL_CHAIN (newarg))
! 	{
!           DECL_ATTRIBUTES (newarg)
! 	    = (*targetm.merge_decl_attributes) (oldarg, newarg);
! 	  if (lookup_attribute (NULL, "indeterminate",
! 				DECL_ATTRIBUTES (newarg))
! 	      && !lookup_attribute (NULL, "indeterminate",
! 				    DECL_ATTRIBUTES (oldarg)))
! 	    {
! 	      auto_diagnostic_group d;
! 	      error_at (DECL_SOURCE_LOCATION (newarg),
! 			"%<indeterminate%> attribute not specified "
! 			"for parameter %qD on the first declaration of "
! 			"its function", newarg);
! 	      inform (DECL_SOURCE_LOCATION (oldarg),
! 		      "earlier declaration");
! 	    }
!           DECL_ATTRIBUTES (oldarg) = DECL_ATTRIBUTES (newarg);
! 	  /* Merge names for std::meta::has_identifier and
! 	     std::meta::{,u8}identifier_of purposes.  If they are different
! 	     and both oldarg and newarg are named, add flag to force that
! 	     std::meta::has_identifier returns false.  If one is named and
! 	     one is unnamed, if neither is a olddecl nor newdecl is definition,
! 	     propagate DECL_NAME to both.  Otherwise stash the old name into
! 	     "old parm name" artificial attribute.  */
! 	  if (flag_reflection && DECL_NAME (oldarg) != DECL_NAME (newarg))
! 	    {
! 	      if (DECL_NAME (oldarg) && DECL_NAME (newarg))
! 		{
! 		  /* Different names.  */
! 		  MULTIPLE_NAMES_PARM_P (oldarg) = 1;
! 		  MULTIPLE_NAMES_PARM_P (newarg) = 1;
! 		}
! 	      else if (!new_defines_function
! 		       && types_match
! 		       && DECL_INITIAL (olddecl) == NULL_TREE)
! 		{
! 		  /* For 2 non-definitions with matching types,
! 		     one is named and one unnamed, propagate name
! 		     to both.  */
! 		  if (DECL_NAME (oldarg))
! 		    DECL_NAME (newarg) = DECL_NAME (oldarg);
! 		  else
! 		    DECL_NAME (oldarg) = DECL_NAME (newarg);
! 		}
! 	      /* Depending on which PARM_DECL we'll keep, look at the other
! 		 PARM_DECL's name.  */
! 	      else if (tree name = ((new_defines_function || !types_match)
! 				    ? DECL_NAME (oldarg) : DECL_NAME (newarg)))
! 		{
! 		  tree opn = lookup_attribute ("old parm name",
! 					       DECL_ATTRIBUTES (oldarg));
! 		  if (opn)
! 		    {
! 		      if (TREE_VALUE (TREE_VALUE (opn)) == name)
! 			/* Name already in "old parm name" attribute.  */;
! 		      else
! 			{
! 			  /* Different names.  */
! 			  MULTIPLE_NAMES_PARM_P (oldarg) = 1;
! 			  MULTIPLE_NAMES_PARM_P (newarg) = 1;
! 			}
! 		    }
! 		  else
! 		    {
! 		      /* Save name into attribute.  */
! 		      DECL_ATTRIBUTES (newarg)
! 			= tree_cons (get_identifier ("old parm name"),
! 				     tree_cons (NULL_TREE, name, NULL_TREE),
! 				     DECL_ATTRIBUTES (newarg));
! 		      DECL_ATTRIBUTES (oldarg) = DECL_ATTRIBUTES (newarg);
! 		    }
! 		}
! 	    }
! 	}
  
        if (DECL_TEMPLATE_INSTANTIATION (olddecl)
  	  && !DECL_TEMPLATE_INSTANTIATION (newdecl))
--- 3129,3136 ----
  
    if (TREE_CODE (newdecl) == FUNCTION_DECL)
      {
!       merge_decl_arguments (newdecl, olddecl, new_defines_function,
! 			    types_match, false);
  
        if (DECL_TEMPLATE_INSTANTIATION (olddecl)
  	  && !DECL_TEMPLATE_INSTANTIATION (newdecl))
*************** duplicate_decls (tree newdecl, tree oldd
*** 3200,3206 ****
        DECL_ABSTRACT_P (newdecl) = DECL_ABSTRACT_P (olddecl);
  
        /* Update newdecl's parms to point at olddecl.  */
!       for (parm = DECL_ARGUMENTS (newdecl); parm;
  	   parm = DECL_CHAIN (parm))
  	DECL_CONTEXT (parm) = olddecl;
  
--- 3209,3215 ----
        DECL_ABSTRACT_P (newdecl) = DECL_ABSTRACT_P (olddecl);
  
        /* Update newdecl's parms to point at olddecl.  */
!       for (tree parm = DECL_ARGUMENTS (newdecl); parm;
  	   parm = DECL_CHAIN (parm))
  	DECL_CONTEXT (parm) = olddecl;
  
*************** duplicate_decls (tree newdecl, tree oldd
*** 3212,3222 ****
  	}
        if (! types_match || new_defines_function)
  	{
! 	  /* These are the final DECL_ARGUMENTS that will be used within the
! 	     body; update any references to old DECL_ARGUMENTS in the
! 	     contracts, if present.  */
! 	  if (tree contracts = DECL_CONTRACTS (newdecl))
! 	    remap_contracts (olddecl, newdecl, contracts, true);
  
  	  /* Mark the old PARM_DECLs in case std::meta::parameters_of has
  	     been called on the old declaration and reflections of those
--- 3221,3228 ----
  	}
        if (! types_match || new_defines_function)
  	{
! 	  /* Update the contracts to reflect the new parameter names. */
! 	  update_contract_arguments (newdecl, olddecl);
  
  	  /* Mark the old PARM_DECLs in case std::meta::parameters_of has
  	     been called on the old declaration and reflections of those
*************** duplicate_decls (tree newdecl, tree oldd
*** 3232,3243 ****
  	     info and other bits, but if not, we won't.  */
  	  DECL_ARGUMENTS (olddecl) = DECL_ARGUMENTS (newdecl);
  	  DECL_RESULT (olddecl) = DECL_RESULT (newdecl);
- 
- 	  /* In some cases, duplicate_contracts will remove contracts from
- 	     OLDDECL, to avoid duplications. Sometimes, the contracts end up
- 	     shared. If we removed them, re-add them.  */
- 	  if (!DECL_CONTRACTS (olddecl))
- 	    copy_contract_attributes (olddecl, newdecl);
  	}
        /* If redeclaring a builtin function, it stays built in
  	 if newdecl is a gnu_inline definition, or if newdecl is just
--- 3238,3243 ----
*************** duplicate_decls (tree newdecl, tree oldd
*** 3281,3318 ****
  	  /* Don't clear out the arguments if we're just redeclaring a
  	     function.  */
  	  if (DECL_ARGUMENTS (olddecl))
- 	    {
- 	      /* If we removed contracts from previous definition, re-attach
- 		 them. Otherwise, rewrite the contracts so they match the
- 		 parameters of the new declaration.  */
- 	      if (DECL_INITIAL (olddecl)
- 		  && DECL_CONTRACTS (newdecl)
- 		  && !DECL_CONTRACTS (olddecl))
- 		copy_contract_attributes (olddecl, newdecl);
- 	      else
- 		{
- 		  /* Temporarily undo the re-contexting of parameters so we can
- 		     actually remap parameters.  The inliner won't replace
- 		     parameters if we don't do this.  */
- 		  tree args = DECL_ARGUMENTS (newdecl);
- 		  for (tree p = args; p; p = DECL_CHAIN (p))
- 		    DECL_CONTEXT (p) = newdecl;
- 
- 		  /* Save new argument names for use in contracts parsing,
- 		     unless we've already started parsing the body of olddecl
- 		     (particular issues arise when newdecl is from a prior
- 		     friend decl with no argument names, see
- 		     modules/contracts-tpl-friend-1).  */
- 		  if (tree contracts = DECL_CONTRACTS (olddecl))
- 		    remap_contracts (newdecl, olddecl, contracts, true);
- 
- 		  /* And reverse this operation again. */
- 		  for (tree p = args; p; p = DECL_CHAIN (p))
- 		    DECL_CONTEXT (p) = olddecl;
- 		}
- 
  	      DECL_ARGUMENTS (newdecl) = DECL_ARGUMENTS (olddecl);
- 	    }
  	}
      }
    else if (TREE_CODE (newdecl) == NAMESPACE_DECL)
--- 3281,3287 ----
*************** duplicate_decls (tree newdecl, tree oldd
*** 3583,3588 ****
--- 3552,3561 ----
    if (flag_concepts)
      remove_constraints (newdecl);
  
+   if (flag_contracts)
+     /* Remove the specifiers, and then remove the decl from the lookup.  */
+     remove_decl_with_fn_contracts_specifiers (newdecl);
+ 
    /* And similarly for any module tracking data.  */
    if (modules_p ())
      remove_defining_module (newdecl);
*************** cxx_init_decl_processing (void)
*** 5763,5769 ****
      init_exception_processing ();
  
    if (flag_contracts)
!     init_terminate_fn ();
  
    if (modules_p ())
      init_modules (parse_in);
--- 5736,5742 ----
      init_exception_processing ();
  
    if (flag_contracts)
!     init_contracts ();
  
    if (modules_p ())
      init_modules (parse_in);
*************** check_tag_decl (cp_decl_specifier_seq *d
*** 6430,6441 ****
  		"an attribute that appertains to a type-specifier is ignored");
      }
  
-   /* Diagnose invalid application of contracts, if any.  */
-   if (find_contract (declspecs->attributes))
-     diagnose_misapplied_contracts (declspecs->attributes);
-   else
-     diagnose_misapplied_contracts (declspecs->std_attributes);
- 
    return declared_type;
  }
  
--- 6403,6408 ----
*************** start_decl (const cp_declarator *declara
*** 6577,6582 ****
--- 6544,6563 ----
        return error_mark_node;
      }
  
+   if (flag_contracts
+       && TREE_CODE (decl) == FUNCTION_DECL
+       && !processing_template_decl
+       && DECL_RESULT (decl)
+       && is_auto (TREE_TYPE (DECL_RESULT (decl))))
+     for (tree ca = get_fn_contract_specifiers (decl); ca; ca = TREE_CHAIN (ca))
+       if (POSTCONDITION_P (CONTRACT_STATEMENT (ca))
+ 	  && POSTCONDITION_IDENTIFIER (CONTRACT_STATEMENT (ca)))
+ 	{
+ 	  error_at (DECL_SOURCE_LOCATION (decl),
+ 		    "postconditions with deduced result name types must only"
+ 		    " appear on function definitions");
+ 	  return error_mark_node;
+ 	}
    /* Save the DECL_INITIAL value in case it gets clobbered to assist
       with attribute validation.  */
    initial = DECL_INITIAL (decl);
*************** start_decl (const cp_declarator *declara
*** 6732,6745 ****
  	  /* Aliases are definitions. */
  	  && !alias)
  	{
! 	  if (DECL_VIRTUAL_P (decl) || !flag_contracts)
! 	    permerror (declarator->id_loc,
  		       "declaration of %q#D outside of class is not definition",
  		       decl);
- 	  else if (flag_contract_strict_declarations)
- 	    warning_at (declarator->id_loc, OPT_fcontract_strict_declarations_,
- 			"declaration of %q#D outside of class is not definition",
- 			decl);
  	}
      }
  
--- 6713,6721 ----
  	  /* Aliases are definitions. */
  	  && !alias)
  	{
! 	  permerror (declarator->id_loc,
  		       "declaration of %q#D outside of class is not definition",
  		       decl);
  	}
      }
  
*************** maybe_commonize_var (tree decl)
*** 7298,7307 ****
    if (DECL_ARTIFICIAL (decl) && !DECL_DECOMPOSITION_P (decl))
      return;
  
-   /* These are not output at all.  */
-   if (consteval_only_p (decl))
-     return;
- 
    /* Static data in a function with comdat linkage also has comdat
       linkage.  */
    if ((TREE_STATIC (decl)
--- 7274,7279 ----
*************** make_rtl_for_nonlocal_decl (tree decl, t
*** 8793,8798 ****
--- 8765,8777 ----
      {
        /* Disable assemble_variable.  */
        DECL_EXTERNAL (decl) = true;
+       /* Undo make_decl_one_only.  */
+       if (DECL_COMDAT_GROUP (decl))
+ 	{
+ 	  symtab_node *node = symtab_node::get (decl);
+ 	  node->set_comdat_group (NULL);
+ 	  node->dissolve_same_comdat_group_list ();
+ 	}
        return;
      }
  
*************** grokfndecl (tree ctype,
*** 12103,12109 ****
  	    int friendp,
  	    int publicp,
  	    int inlinep,
! 	    bool deletedp,
  	    bool xobj_func_p,
  	    special_function_kind sfk,
  	    bool funcdef_flag,
--- 12082,12088 ----
  	    int friendp,
  	    int publicp,
  	    int inlinep,
! 	    int initialized,
  	    bool xobj_func_p,
  	    special_function_kind sfk,
  	    bool funcdef_flag,
*************** grokfndecl (tree ctype,
*** 12111,12116 ****
--- 12090,12096 ----
  	    int template_count,
  	    tree in_namespace,
  	    tree* attrlist,
+ 	    tree contract_specifiers,
  	    location_t location)
  {
    tree decl;
*************** grokfndecl (tree ctype,
*** 12330,12336 ****
      = !xobj_func_p && ctype && TREE_CODE (type) == FUNCTION_TYPE;
    DECL_FUNCTION_XOBJ_FLAG (decl) = xobj_func_p;
  
!   if (deletedp)
      DECL_DELETED_FN (decl) = 1;
  
    if (ctype && funcdef_flag)
--- 12310,12316 ----
      = !xobj_func_p && ctype && TREE_CODE (type) == FUNCTION_TYPE;
    DECL_FUNCTION_XOBJ_FLAG (decl) = xobj_func_p;
  
!   if (initialized == SD_DELETED)
      DECL_DELETED_FN (decl) = 1;
  
    if (ctype && funcdef_flag)
*************** grokfndecl (tree ctype,
*** 12556,12562 ****
  
    /* Caller will do the rest of this.  */
    if (check < 0)
!     return decl;
  
    if (ctype != NULL_TREE)
      grokclassfn (ctype, decl, flags);
--- 12536,12546 ----
  
    /* Caller will do the rest of this.  */
    if (check < 0)
!     {
!       if (decl && decl != error_mark_node && contract_specifiers)
! 	set_fn_contract_specifiers (decl, contract_specifiers);
!       return decl;
!     }
  
    if (ctype != NULL_TREE)
      grokclassfn (ctype, decl, flags);
*************** grokfndecl (tree ctype,
*** 12587,12594 ****
        *attrlist = NULL_TREE;
      }
  
!   if (DECL_HAS_CONTRACTS_P (decl))
!     rebuild_postconditions (decl);
  
    /* Check main's type after attributes have been applied.  */
    if (ctype == NULL_TREE && DECL_MAIN_P (decl))
--- 12571,12585 ----
        *attrlist = NULL_TREE;
      }
  
!   /* Update now we have a decl and maybe know the return type.  */
!   if (contract_specifiers)
!     {
!       tree t = decl;
!       if (TREE_CODE (decl) == TEMPLATE_DECL)
! 	t = DECL_TEMPLATE_RESULT (decl);
!       set_fn_contract_specifiers (t, contract_specifiers);
!       rebuild_postconditions (t);
!     }
  
    /* Check main's type after attributes have been applied.  */
    if (ctype == NULL_TREE && DECL_MAIN_P (decl))
*************** grokfndecl (tree ctype,
*** 12679,12685 ****
    if (DECL_CONSTRUCTOR_P (decl) && !grok_ctor_properties (ctype, decl))
      return NULL_TREE;
  
!   check_consteval_only_fn (decl);
  
    if (ctype == NULL_TREE || check)
      return decl;
--- 12670,12680 ----
    if (DECL_CONSTRUCTOR_P (decl) && !grok_ctor_properties (ctype, decl))
      return NULL_TREE;
  
!   /* Don't call check_consteval_only_fn for defaulted functions.  Those are
!      immediate-escalating functions but at this point DECL_DEFAULTED_P has
!      not been set.  */
!   if (initialized != SD_DEFAULTED)
!     check_consteval_only_fn (decl);
  
    if (ctype == NULL_TREE || check)
      return decl;
*************** grokdeclarator (const cp_declarator *dec
*** 13935,13940 ****
--- 13930,13936 ----
    tree raises = NULL_TREE;
    int template_count = 0;
    tree returned_attrs = NULL_TREE;
+   tree contract_specifiers = NULL_TREE;
    tree parms = NULL_TREE;
    const cp_declarator *id_declarator;
    /* The unqualified name of the declarator; either an
*************** grokdeclarator (const cp_declarator *dec
*** 14930,14937 ****
  	}
      }
  
!   if (declspecs->std_attributes
!       && !diagnose_misapplied_contracts (declspecs->std_attributes))
      {
        location_t attr_loc = declspecs->locations[ds_std_attribute];
        auto_diagnostic_group d;
--- 14926,14932 ----
  	}
      }
  
!   if (declspecs->std_attributes)
      {
        location_t attr_loc = declspecs->locations[ds_std_attribute];
        auto_diagnostic_group d;
*************** grokdeclarator (const cp_declarator *dec
*** 14941,14949 ****
  		"is ignored");
      }
  
-   if (attrlist)
-     diagnose_misapplied_contracts (*attrlist);
- 
    /* Skip over build_memfn_type when a FUNCTION_DECL is an xobj memfn.  */
    bool is_xobj_member_function = false;
    /* Determine the type of the entity declared by recurring on the
--- 14936,14941 ----
*************** grokdeclarator (const cp_declarator *dec
*** 14983,14994 ****
  
        inner_declarator = declarator->declarator;
  
-       /* Check that contracts aren't misapplied.  */
-       if (tree contract_attr = find_contract (declarator->std_attributes))
- 	if (declarator->kind != cdk_function
- 	    || innermost_code != cdk_function)
- 	  diagnose_misapplied_contracts (contract_attr);
- 
        /* We don't want to warn in parameter context because we don't
  	 yet know if the parse will succeed, and this might turn out
  	 to be a constructor call.  */
--- 14975,14980 ----
*************** grokdeclarator (const cp_declarator *dec
*** 15526,15545 ****
  	      }
  
  	    /* Actually apply the contract attributes to the declaration.  */
! 	    for (tree *p = &attrs; *p;)
! 	      {
! 		tree l = *p;
! 		if (cxx_contract_attribute_p (l))
! 		  {
! 		    *p = TREE_CHAIN (l);
! 		    /* Intentionally reverse order of contracts so they're
! 		       reversed back into their lexical order.  */
! 		    TREE_CHAIN (l) = NULL_TREE;
! 		    returned_attrs = chainon (l, returned_attrs);
! 		  }
! 		else
! 		  p = &TREE_CHAIN (l);
! 	     }
  
  	    if (attrs)
  	      /* [dcl.fct]/2:
--- 15512,15521 ----
  	      }
  
  	    /* Actually apply the contract attributes to the declaration.  */
! 	    if (flag_contracts)
! 	      contract_specifiers
! 		= attr_chainon (contract_specifiers,
! 				declarator->u.function.contract_specifiers);
  
  	    if (attrs)
  	      /* [dcl.fct]/2:
*************** grokdeclarator (const cp_declarator *dec
*** 16498,16509 ****
  			       friendp ? -1 : 0, friendp, publicp,
  			       inlinep | (2 * constexpr_p) | (4 * concept_p)
  				       | (8 * consteval_p),
! 			       initialized == SD_DELETED,
  			       is_xobj_member_function, sfk,
  			       funcdef_flag, late_return_type_p,
  			       template_count, in_namespace,
! 			       attrlist, id_loc);
!             decl = set_virt_specifiers (decl, virt_specifiers);
  	    if (decl == NULL_TREE)
  	      return error_mark_node;
  #if 0
--- 16474,16485 ----
  			       friendp ? -1 : 0, friendp, publicp,
  			       inlinep | (2 * constexpr_p) | (4 * concept_p)
  				       | (8 * consteval_p),
! 			       initialized,
  			       is_xobj_member_function, sfk,
  			       funcdef_flag, late_return_type_p,
  			       template_count, in_namespace,
! 			       attrlist, contract_specifiers, id_loc);
! 	    decl = set_virt_specifiers (decl, virt_specifiers);
  	    if (decl == NULL_TREE)
  	      return error_mark_node;
  #if 0
*************** grokdeclarator (const cp_declarator *dec
*** 16581,16588 ****
  	       warn for standard attributes.  */
  	    if (attrlist
  		&& !funcdef_flag
! 		&& cxx11_attribute_p (*attrlist)
! 		&& !all_attributes_are_contracts_p (*attrlist))
  	      {
  		*attrlist = NULL_TREE;
  		auto_diagnostic_group d;
--- 16557,16563 ----
  	       warn for standard attributes.  */
  	    if (attrlist
  		&& !funcdef_flag
! 		&& cxx11_attribute_p (*attrlist))
  	      {
  		*attrlist = NULL_TREE;
  		auto_diagnostic_group d;
*************** grokdeclarator (const cp_declarator *dec
*** 16830,16847 ****
  		   || storage_class != sc_static);
  
  	decl = grokfndecl (ctype, type, original_name, parms, unqualified_id,
! 			   declspecs,
!                            reqs, virtualp, flags, memfn_quals, rqual, raises,
  			   1, friendp,
  			   publicp,
  			   inlinep | (2 * constexpr_p) | (4 * concept_p)
  				   | (8 * consteval_p),
! 			   initialized == SD_DELETED,
  			   is_xobj_member_function, sfk,
  			   funcdef_flag,
  			   late_return_type_p,
  			   template_count, in_namespace, attrlist,
! 			   id_loc);
  	if (decl == NULL_TREE)
  	  return error_mark_node;
  
--- 16805,16821 ----
  		   || storage_class != sc_static);
  
  	decl = grokfndecl (ctype, type, original_name, parms, unqualified_id,
! 			   declspecs, reqs, virtualp, flags, memfn_quals, rqual, raises,
  			   1, friendp,
  			   publicp,
  			   inlinep | (2 * constexpr_p) | (4 * concept_p)
  				   | (8 * consteval_p),
! 			   initialized,
  			   is_xobj_member_function, sfk,
  			   funcdef_flag,
  			   late_return_type_p,
  			   template_count, in_namespace, attrlist,
! 			   contract_specifiers, id_loc);
  	if (decl == NULL_TREE)
  	  return error_mark_node;
  
*************** finish_function (bool inline_p)
*** 20406,20414 ****
    if (fndecl == NULL_TREE || fndecl == error_mark_node)
      return error_mark_node;
  
-   bool do_contracts = (DECL_HAS_CONTRACTS_P (fndecl)
- 		       && !processing_template_decl);
- 
    if (!DECL_OMP_DECLARE_REDUCTION_P (fndecl))
      finish_lambda_scope ();
  
--- 20380,20385 ----
*************** finish_function (bool inline_p)
*** 20451,20457 ****
  			      current_eh_spec_block);
  
       /* If outlining succeeded, then add contracts handling if needed.  */
!      if (coroutine->cp_valid_coroutine () && do_contracts)
  	maybe_apply_function_contracts (fndecl);
      }
    else
--- 20422,20428 ----
  			      current_eh_spec_block);
  
       /* If outlining succeeded, then add contracts handling if needed.  */
!      if (coroutine->cp_valid_coroutine ())
  	maybe_apply_function_contracts (fndecl);
      }
    else
*************** finish_function (bool inline_p)
*** 20469,20476 ****
  			      (TREE_TYPE (current_function_decl)),
  			      current_eh_spec_block);
  
!      if (do_contracts)
! 	maybe_apply_function_contracts (current_function_decl);
  
      }
  
--- 20440,20446 ----
  			      (TREE_TYPE (current_function_decl)),
  			      current_eh_spec_block);
  
!       maybe_apply_function_contracts (current_function_decl);
  
      }
  
*************** finish_function (bool inline_p)
*** 20754,20760 ****
  
    /* If we have used outlined contracts checking functions, build and emit
       them here.  */
!   finish_function_contracts (fndecl);
  
    return fndecl;
  }
--- 20724,20730 ----
  
    /* If we have used outlined contracts checking functions, build and emit
       them here.  */
!   finish_function_outlined_contracts (fndecl);
  
    return fndecl;
  }
diff -Nrcpad gcc-16-20260125/gcc/cp/decl2.cc gcc-16-20260201/gcc/cp/decl2.cc
*** gcc-16-20260125/gcc/cp/decl2.cc	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/cp/decl2.cc	Sun Feb  1 22:32:07 2026
*************** along with GCC; see the file COPYING3.
*** 52,60 ****
  #include "omp-general.h"
  #include "tree-inline.h"
  #include "escaped_string.h"
- #include "contracts.h"
  #include "gcc-rich-location.h"
  #include "tree-pretty-print-markup.h"
  
  /* Id for dumping the raw trees.  */
  int raw_dump_id;
--- 52,60 ----
  #include "omp-general.h"
  #include "tree-inline.h"
  #include "escaped_string.h"
  #include "gcc-rich-location.h"
  #include "tree-pretty-print-markup.h"
+ #include "contracts.h"
  
  /* Id for dumping the raw trees.  */
  int raw_dump_id;
*************** cp_check_const_attributes (tree attribut
*** 1958,1966 ****
    tree attr;
    for (attr = attributes; attr; attr = TREE_CHAIN (attr))
      {
-       if (cxx_contract_attribute_p (attr))
- 	continue;
- 
        /* Annotation arguments are handled in handle_annotation_attribute.  */
        if (annotation_p (attr))
  	continue;
--- 1958,1963 ----
*************** void
*** 2599,2615 ****
  comdat_linkage (tree decl)
  {
    if (flag_weak)
!     {
!       make_decl_one_only (decl, cxx_comdat_group (decl));
!       if (HAVE_COMDAT_GROUP && flag_contracts && DECL_CONTRACTS (decl))
! 	{
! 	  symtab_node *n = symtab_node::get (decl);
! 	  if (tree pre = DECL_PRE_FN (decl))
! 	    cgraph_node::get_create (pre)->add_to_same_comdat_group (n);
! 	  if (tree post = DECL_POST_FN (decl))
! 	    cgraph_node::get_create (post)->add_to_same_comdat_group (n);
! 	}
!     }
    else if (TREE_CODE (decl) == FUNCTION_DECL
  	   || (VAR_P (decl) && DECL_ARTIFICIAL (decl)))
      /* We can just emit function and compiler-generated variables
--- 2596,2602 ----
  comdat_linkage (tree decl)
  {
    if (flag_weak)
!     make_decl_one_only (decl, cxx_comdat_group (decl));
    else if (TREE_CODE (decl) == FUNCTION_DECL
  	   || (VAR_P (decl) && DECL_ARTIFICIAL (decl)))
      /* We can just emit function and compiler-generated variables
*************** c_parse_final_cleanups (void)
*** 5906,5911 ****
--- 5893,5904 ----
  	   importer.  */
  	continue;
  
+       /* Emit wrappers where needed, and if that causes more to be added then
+ 	 make sure we account for possible additional instantiations.  */
+       if (flag_contracts)
+ 	if (emit_contract_wrapper_func (/*done*/false))
+ 	  reconsider = true;
+ 
        /* Write out virtual tables as required.  Writing out the
  	 virtual table for a template class may cause the
  	 instantiation of members of that class.  If we write out
*************** c_parse_final_cleanups (void)
*** 6118,6123 ****
--- 6111,6122 ----
  	reconsider = true;
      }
  
+   if (flag_contracts)
+     {
+       emit_contract_wrapper_func (/*done*/true);
+       maybe_emit_violation_handler_wrappers ();
+     }
+ 
    /* All templates have been instantiated.  */
    at_eof = 2;
  
diff -Nrcpad gcc-16-20260125/gcc/cp/lambda.cc gcc-16-20260201/gcc/cp/lambda.cc
*** gcc-16-20260125/gcc/cp/lambda.cc	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/cp/lambda.cc	Sun Feb  1 22:32:07 2026
*************** along with GCC; see the file COPYING3.
*** 33,38 ****
--- 33,39 ----
  #include "target.h"
  #include "decl.h"
  #include "flags.h"
+ #include "contracts.h"
  
  /* Constructor for a lambda expression.  */
  
*************** build_capture_proxy (tree member, tree i
*** 497,502 ****
--- 498,505 ----
  	    init = PACK_EXPANSION_PATTERN (init);
  	}
  
+       init = strip_contract_const_wrapper (init);
+ 
        if (INDIRECT_REF_P (init))
  	init = TREE_OPERAND (init, 0);
        STRIP_NOPS (init);
*************** prepare_op_call (tree fn, int nargs)
*** 1150,1156 ****
  bool
  generic_lambda_fn_p (tree callop)
  {
!   return (LAMBDA_FUNCTION_P (callop)
  	  && DECL_TEMPLATE_INFO (callop)
  	  && PRIMARY_TEMPLATE_P (DECL_TI_TEMPLATE (callop)));
  }
--- 1153,1159 ----
  bool
  generic_lambda_fn_p (tree callop)
  {
!   return (callop && LAMBDA_FUNCTION_P (callop)
  	  && DECL_TEMPLATE_INFO (callop)
  	  && PRIMARY_TEMPLATE_P (DECL_TI_TEMPLATE (callop)));
  }
diff -Nrcpad gcc-16-20260125/gcc/cp/lex.cc gcc-16-20260201/gcc/cp/lex.cc
*** gcc-16-20260125/gcc/cp/lex.cc	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/cp/lex.cc	Sun Feb  1 22:32:07 2026
*************** cxx_init (void)
*** 419,425 ****
        if (cxx_dialect >= cxx23)
  	cpp_warn (parse_in, "assume");
        if (cxx_dialect >= cxx26)
! 	cpp_warn (parse_in, "indeterminate");
      }
  
    if (c_common_init () == false)
--- 419,429 ----
        if (cxx_dialect >= cxx23)
  	cpp_warn (parse_in, "assume");
        if (cxx_dialect >= cxx26)
! 	{
! 	  if (flag_contracts)
! 	    cpp_warn (parse_in, "contract_assert");
! 	  cpp_warn (parse_in, "indeterminate");
! 	}
      }
  
    if (c_common_init () == false)
diff -Nrcpad gcc-16-20260125/gcc/cp/mangle.cc gcc-16-20260201/gcc/cp/mangle.cc
*** gcc-16-20260125/gcc/cp/mangle.cc	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/cp/mangle.cc	Sun Feb  1 22:32:07 2026
*************** write_mangled_name (const tree decl, boo
*** 833,845 ****
        write_encoding (decl);
      }
  
-   /* If this is the pre/post function for a guarded function, append
-      .pre/post, like something from create_virtual_clone.  */
-   if (DECL_IS_PRE_FN_P (decl))
-     write_string (".pre");
-   else if (DECL_IS_POST_FN_P (decl))
-     write_string (".post");
- 
    /* If this is a coroutine helper, then append an appropriate string to
       identify which.  */
    if (tree ramp = DECL_RAMP_FN (decl))
--- 833,838 ----
diff -Nrcpad gcc-16-20260125/gcc/cp/module.cc gcc-16-20260201/gcc/cp/module.cc
*** gcc-16-20260125/gcc/cp/module.cc	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/cp/module.cc	Sun Feb  1 22:32:07 2026
*************** trees_out::decl_node (tree decl, walk_ki
*** 9246,9252 ****
  	  // deferred noexcept and default parms, or references
  	  // to parms from earlier forward-decls (PR c++/119608).
  	  //
! 	  // Currently we'll end up cloning those bits of tree. 
  	  // It would be nice to reference those specific nodes.
  	  // I think putting those things in the map when we
  	  // reference their template by name.
--- 9246,9252 ----
  	  // deferred noexcept and default parms, or references
  	  // to parms from earlier forward-decls (PR c++/119608).
  	  //
! 	  // Currently we'll end up cloning those bits of tree.
  	  // It would be nice to reference those specific nodes.
  	  // I think putting those things in the map when we
  	  // reference their template by name.
*************** trees_out::type_node (tree type)
*** 9847,9852 ****
--- 9847,9858 ----
      case META_TYPE:
        /* No additional data.  */
        break;
+ 
+     case SPLICE_SCOPE:
+       if (streaming_p ())
+ 	u (SPLICE_SCOPE_TYPE_P (type));
+       tree_node (SPLICE_SCOPE_EXPR (type));
+       break;
      }
  
    tree_node (TYPE_ATTRIBUTES (type));
*************** trees_in::tree_node (bool is_use)
*** 10697,10702 ****
--- 10703,10718 ----
  	    if (!get_overrun ())
  	      res = meta_info_type_node;
  	    break;
+ 
+ 	  case SPLICE_SCOPE:
+ 	    {
+ 	      bool type = u ();
+ 	      tree expr = tree_node ();
+ 
+ 	      if (!get_overrun ())
+ 		res = make_splice_scope (expr, type);
+ 	    }
+ 	    break;
  	  }
  
  	/* In the exporting TU, a derived type with attributes was built by
*************** trees_out::fn_parms_init (tree fn)
*** 11299,11308 ****
  
    if (!streaming_p ())
      {
!       /* We must walk contract attrs so the dependency graph is complete. */
!       for (tree contract = DECL_CONTRACTS (fn);
! 	  contract;
! 	  contract = CONTRACT_CHAIN (contract))
  	tree_node (contract);
      }
  
--- 11315,11324 ----
  
    if (!streaming_p ())
      {
!       /* We must walk contract specifiers so the dependency graph is
! 	 complete.  */
!       tree contract = get_fn_contract_specifiers (fn);
!       for (; contract; contract = TREE_CHAIN (contract))
  	tree_node (contract);
      }
  
*************** get_import_bitmap ()
*** 21564,21569 ****
--- 21580,21602 ----
    return this_module ()->imports;
  }
  
+ /* Get the original decl for an instantiation at TINST, or NULL_TREE
+    if we're not an instantiation.  */
+ 
+ static tree
+ orig_decl_for_instantiation (tinst_level *tinst)
+ {
+   if (!tinst || TREE_CODE (tinst->tldcl) == TEMPLATE_FOR_STMT)
+     return NULL_TREE;
+ 
+   tree decl = tinst->tldcl;
+   if (TREE_CODE (decl) == TREE_LIST)
+     decl = TREE_PURPOSE (decl);
+   if (TYPE_P (decl))
+     decl = TYPE_NAME (decl);
+   return decl;
+ }
+ 
  /* Return the visible imports and path of instantiation for an
     instantiation at TINST.  If TINST is nullptr, we're not in an
     instantiation, and thus will return the visible imports of the
*************** get_import_bitmap ()
*** 21571,21581 ****
     the tinst level itself.  */
  
  static bitmap
! path_of_instantiation (tinst_level *tinst,  bitmap *path_map_p)
  {
    gcc_checking_assert (modules_p ());
  
!   if (!tinst || TREE_CODE (tinst->tldcl) == TEMPLATE_FOR_STMT)
      {
        gcc_assert (!tinst || !tinst->next);
        /* Not inside an instantiation, just the regular case.  */
--- 21604,21615 ----
     the tinst level itself.  */
  
  static bitmap
! path_of_instantiation (tinst_level *tinst, bitmap *path_map_p)
  {
    gcc_checking_assert (modules_p ());
  
!   tree decl = orig_decl_for_instantiation (tinst);
!   if (!decl)
      {
        gcc_assert (!tinst || !tinst->next);
        /* Not inside an instantiation, just the regular case.  */
*************** path_of_instantiation (tinst_level *tins
*** 21595,21606 ****
  	  bitmap_set_bit (path_map, 0);
  	}
  
-       tree decl = tinst->tldcl;
-       if (TREE_CODE (decl) == TREE_LIST)
- 	decl = TREE_PURPOSE (decl);
-       if (TYPE_P (decl))
- 	decl = TYPE_NAME (decl);
- 
        if (unsigned mod = get_originating_module (decl))
  	if (!bitmap_bit_p (path_map, mod))
  	  {
--- 21629,21634 ----
*************** visible_instantiation_path (bitmap *path
*** 21644,21649 ****
--- 21672,21696 ----
    return path_of_instantiation (current_instantiation (), path_map_p);
  }
  
+ /* Returns the bitmap describing what modules were visible from the
+    module that the current instantiation originated from.  If we're
+    not an instantiation, returns NULL.  *MODULE_P is filled in with
+    the originating module of the definition for this instantiation.  */
+ 
+ bitmap
+ visible_from_instantiation_origination (unsigned *module_p)
+ {
+   if (!modules_p ())
+     return NULL;
+ 
+   tree decl = orig_decl_for_instantiation (current_instantiation ());
+   if (!decl)
+     return NULL;
+ 
+   *module_p = get_originating_module (decl);
+   return (*modules)[*module_p]->imports;
+ }
+ 
  /* We've just directly imported IMPORT.  Update our import/export
     bitmaps.  IS_EXPORT is true if we're reexporting the OTHER.  */
  
diff -Nrcpad gcc-16-20260125/gcc/cp/name-lookup.cc gcc-16-20260201/gcc/cp/name-lookup.cc
*** gcc-16-20260125/gcc/cp/name-lookup.cc	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/cp/name-lookup.cc	Sun Feb  1 22:32:07 2026
*************** name_lookup::search_namespace_only (tree
*** 862,867 ****
--- 862,875 ----
  	     the import bitmap.  Hence iterate over the former
  	     checking for bits set in the bitmap.  */
  	  bitmap imports = get_import_bitmap ();
+ 	  /* FIXME: For instantiations, we also want to include any
+ 	     declarations visible at the point it was defined, even
+ 	     if not visible from the current TU; we approximate
+ 	     this here, but a proper solution would involve caching
+ 	     phase 1 lookup results (PR c++/122609).  */
+ 	  unsigned orig_mod = 0;
+ 	  bitmap orig_imp = visible_from_instantiation_origination (&orig_mod);
+ 
  	  binding_cluster *cluster = BINDING_VECTOR_CLUSTER_BASE (val);
  	  int marker = 0;
  	  int dup_detect = 0;
*************** name_lookup::search_namespace_only (tree
*** 922,939 ****
  		  if (unsigned span = cluster->indices[jx].span)
  		    do
  		      if (bool (want & LOOK_want::ANY_REACHABLE)
! 			  || bitmap_bit_p (imports, base))
  			goto found;
  		    while (++base, --span);
  		continue;
  
  	      found:;
  		/* Is it loaded?  */
  		if (cluster->slots[jx].is_lazy ())
  		  {
  		    gcc_assert (cluster->indices[jx].span == 1);
! 		    lazy_load_binding (cluster->indices[jx].base,
! 				       scope, name, &cluster->slots[jx]);
  		  }
  		tree bind = cluster->slots[jx];
  		if (!bind)
--- 930,948 ----
  		  if (unsigned span = cluster->indices[jx].span)
  		    do
  		      if (bool (want & LOOK_want::ANY_REACHABLE)
! 			  || bitmap_bit_p (imports, base)
! 			  || (orig_imp && bitmap_bit_p (orig_imp, base)))
  			goto found;
  		    while (++base, --span);
  		continue;
  
  	      found:;
  		/* Is it loaded?  */
+ 		unsigned mod = cluster->indices[jx].base;
  		if (cluster->slots[jx].is_lazy ())
  		  {
  		    gcc_assert (cluster->indices[jx].span == 1);
! 		    lazy_load_binding (mod, scope, name, &cluster->slots[jx]);
  		  }
  		tree bind = cluster->slots[jx];
  		if (!bind)
*************** name_lookup::search_namespace_only (tree
*** 966,972 ****
  			dup_detect |= dup;
  		      }
  
! 		    if (bool (want & LOOK_want::ANY_REACHABLE))
  		      {
  			type = STAT_TYPE (bind);
  			bind = STAT_DECL (bind);
--- 975,982 ----
  			dup_detect |= dup;
  		      }
  
! 		    if (bool (want & LOOK_want::ANY_REACHABLE)
! 			|| mod == orig_mod)
  		      {
  			type = STAT_TYPE (bind);
  			bind = STAT_DECL (bind);
*************** push_local_extern_decl_alias (tree decl)
*** 3726,3731 ****
--- 3736,3743 ----
  	      alias = *iter;
  	      if (!validate_constexpr_redeclaration (alias, decl))
  		return;
+ 	      if (TREE_CODE (decl) == FUNCTION_DECL)
+ 		merge_decl_arguments (decl, alias, false, true, true);
  	      break;
  	    }
  
*************** push_local_extern_decl_alias (tree decl)
*** 3739,3745 ****
--- 3751,3759 ----
  	      for (tree *chain = &DECL_ARGUMENTS (alias);
  		   *chain; chain = &DECL_CHAIN (*chain))
  		{
+ 		  tree next = DECL_CHAIN (*chain);
  		  *chain = copy_decl (*chain);
+ 		  DECL_CHAIN (*chain) = next;
  		  DECL_CONTEXT (*chain) = alias;
  		}
  
*************** cp_binding_level_descriptor (cp_binding_
*** 4737,4743 ****
      "template-explicit-spec-scope",
      "transaction-scope",
      "openmp-scope",
!     "lambda-scope"
    };
    static_assert (ARRAY_SIZE (scope_kind_names) == sk_count,
  		 "must keep names aligned with scope_kind enum");
--- 4751,4758 ----
      "template-explicit-spec-scope",
      "transaction-scope",
      "openmp-scope",
!     "lambda-scope",
!     "contract-check-scope"
    };
    static_assert (ARRAY_SIZE (scope_kind_names) == sk_count,
  		 "must keep names aligned with scope_kind enum");
*************** begin_scope (scope_kind kind, tree entit
*** 4828,4833 ****
--- 4843,4849 ----
      case sk_scoped_enum:
      case sk_transaction:
      case sk_omp:
+     case sk_contract:
      case sk_stmt_expr:
      case sk_lambda:
        scope->keep = keep_next_level_flag;
*************** lookup_name_fuzzy (tree name, enum looku
*** 7919,7925 ****
  {
    gcc_assert (TREE_CODE (name) == IDENTIFIER_NODE);
  
!   /* First, try some well-known names in the C++ standard library, in case
       the user forgot a #include.  */
    const char *header_hint
      = get_cp_stdlib_header_for_name (IDENTIFIER_POINTER (name));
--- 7935,7951 ----
  {
    gcc_assert (TREE_CODE (name) == IDENTIFIER_NODE);
  
!   /* Look up function-like macros first; maybe misusing them. */
!   auto cpp_node = cpp_lookup (parse_in,
! 			      (const unsigned char*)IDENTIFIER_POINTER (name),
! 			      IDENTIFIER_LENGTH (name));
!   if (cpp_node && cpp_fun_like_macro_p (cpp_node))
!     return name_hint
!       (nullptr,
!        std::make_unique<macro_like_function_used> (loc,
! 						   IDENTIFIER_POINTER (name)));
! 
!   /* Then, try some well-known names in the C++ standard library, in case
       the user forgot a #include.  */
    const char *header_hint
      = get_cp_stdlib_header_for_name (IDENTIFIER_POINTER (name));
*************** struct local_state_t
*** 8960,8965 ****
--- 8986,8992 ----
    int cp_unevaluated_operand;
    int c_inhibit_evaluation_warnings;
    int cp_noexcept_operand_;
+   bool has_cfun;
  
    static local_state_t
    save_and_clear ()
*************** struct local_state_t
*** 8971,8976 ****
--- 8998,9006 ----
      ::c_inhibit_evaluation_warnings = 0;
      s.cp_noexcept_operand_ = ::cp_noexcept_operand;
      ::cp_noexcept_operand = 0;
+     s.has_cfun = !!cfun;
+     if (s.has_cfun)
+       push_function_context ();
      return s;
    }
  
*************** struct local_state_t
*** 8980,8985 ****
--- 9010,9017 ----
      ::cp_unevaluated_operand = this->cp_unevaluated_operand;
      ::c_inhibit_evaluation_warnings = this->c_inhibit_evaluation_warnings;
      ::cp_noexcept_operand = this->cp_noexcept_operand_;
+     if (this->has_cfun)
+       pop_function_context ();
    }
  };
  
*************** maybe_push_to_top_level (tree d)
*** 9008,9014 ****
    else
      {
        gcc_assert (!processing_template_decl);
-       push_function_context ();
        local_state_stack.safe_push (local_state_t::save_and_clear ());
      }
  
--- 9040,9045 ----
*************** maybe_pop_from_top_level (bool push_to_t
*** 9023,9032 ****
    if (push_to_top)
      pop_from_top_level ();
    else
!     {
!       local_state_stack.pop ().restore ();
!       pop_function_context ();
!     }
  }
  
  /* Push into the scope of the namespace NS, even if it is deeply
--- 9054,9060 ----
    if (push_to_top)
      pop_from_top_level ();
    else
!     local_state_stack.pop ().restore ();
  }
  
  /* Push into the scope of the namespace NS, even if it is deeply
diff -Nrcpad gcc-16-20260125/gcc/cp/name-lookup.h gcc-16-20260201/gcc/cp/name-lookup.h
*** gcc-16-20260125/gcc/cp/name-lookup.h	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/cp/name-lookup.h	Sun Feb  1 22:32:07 2026
*************** enum scope_kind {
*** 229,234 ****
--- 229,236 ----
    sk_transaction,    /* A synchronized or atomic statement.  */
    sk_omp,	     /* An OpenMP structured block.  */
    sk_lambda,	     /* A lambda scope.  */
+   sk_contract,	     /* A C++26 contract-assertion scope.
+ 			[basic.scope.contract] */
    sk_count	     /* Number of scope_kind enumerations.  */
  };
  
diff -Nrcpad gcc-16-20260125/gcc/cp/parser.cc gcc-16-20260201/gcc/cp/parser.cc
*** gcc-16-20260125/gcc/cp/parser.cc	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/cp/parser.cc	Sun Feb  1 22:32:07 2026
*************** along with GCC; see the file COPYING3.
*** 47,55 ****
  #include "cp-name-hint.h"
  #include "memmodel.h"
  #include "c-family/known-headers.h"
- #include "contracts.h"
  #include "bitmap.h"
  #include "builtins.h"
  #include "analyzer/analyzer-language.h"
  
  
--- 47,55 ----
  #include "cp-name-hint.h"
  #include "memmodel.h"
  #include "c-family/known-headers.h"
  #include "bitmap.h"
  #include "builtins.h"
+ #include "contracts.h"
  #include "analyzer/analyzer-language.h"
  
  
*************** cp_lexer_get_preprocessor_token (unsigne
*** 1184,1189 ****
--- 1184,1203 ----
  		 particular identifier-turned-keyword again.  */
  	      C_SET_RID_CODE (token->u.value, RID_MAX);
  	    }
+ 	  if (warn_cxx26_compat
+ 	      && C_RID_CODE (token->u.value) >= RID_FIRST_CXX26
+ 	      && C_RID_CODE (token->u.value) <= RID_LAST_CXX26)
+ 	    {
+ 	      /* Warn about the C++26 keyword (but still treat it as
+ 		 an identifier).  */
+ 	      warning_at (token->location, OPT_Wc__26_compat,
+ 			  "identifier %qE is a keyword in C++26",
+ 			  token->u.value);
+ 
+ 	      /* Clear out the C_RID_CODE so we don't warn about this
+ 		 particular identifier-turned-keyword again.  */
+ 	      C_SET_RID_CODE (token->u.value, RID_MAX);
+ 	    }
  
  	  token->keyword = RID_MAX;
  	}
*************** clear_decl_specs (cp_decl_specifier_seq
*** 1845,1851 ****
  
  static cp_declarator *make_call_declarator
    (cp_declarator *, tree, cp_cv_quals, cp_virt_specifiers, cp_ref_qualifier,
!    tree, tree, tree, tree, tree, location_t);
  static cp_declarator *make_array_declarator
    (cp_declarator *, tree, tree);
  static cp_declarator *make_pointer_declarator
--- 1859,1865 ----
  
  static cp_declarator *make_call_declarator
    (cp_declarator *, tree, cp_cv_quals, cp_virt_specifiers, cp_ref_qualifier,
!    tree, tree, tree, tree, tree, tree, location_t);
  static cp_declarator *make_array_declarator
    (cp_declarator *, tree, tree);
  static cp_declarator *make_pointer_declarator
*************** make_call_declarator (cp_declarator *tar
*** 2031,2036 ****
--- 2045,2051 ----
  		      tree exception_specification,
  		      tree late_return_type,
  		      tree requires_clause,
+ 		      tree contract_specifiers,
  		      tree std_attrs,
  		      location_t parens_loc)
  {
*************** make_call_declarator (cp_declarator *tar
*** 2046,2051 ****
--- 2061,2067 ----
    declarator->u.function.exception_specification = exception_specification;
    declarator->u.function.late_return_type = late_return_type;
    declarator->u.function.requires_clause = requires_clause;
+   declarator->u.function.contract_specifiers = contract_specifiers;
    declarator->u.function.parens_loc = parens_loc;
    if (target)
      {
*************** static tree cp_parser_yield_expression
*** 2983,2990 ****
  
  /* Contracts */
  
! static void cp_parser_late_contract_condition
!   (cp_parser *, tree, tree);
  
  enum pragma_context {
    pragma_external,
--- 2999,3016 ----
  
  /* Contracts */
  
! static tree cp_parser_contract_assert
!   (cp_parser *parser, cp_token *token);
! 
! static tree cp_maybe_function_contract_specifier
!   (cp_parser *parser);
! 
! static tree cp_parser_function_contract_specifier
!   (cp_parser *);
! static tree cp_parser_function_contract_specifier_seq
!   (cp_parser *);
! static void cp_parser_late_contracts
!   (cp_parser *, tree);
  
  enum pragma_context {
    pragma_external,
*************** cp_parser_parenthesized_expression_list
*** 9842,9847 ****
--- 9868,9884 ----
  		expression_list->quick_push (arg);
  	    goto get_comma;
  	  }
+ 	else if (is_attribute_list == normal_attr
+ 		 && cp_lexer_next_token_is (parser->lexer, CPP_STRING)
+ 		 && (cp_lexer_nth_token_is (parser->lexer, 2, CPP_COMMA)
+ 		     || cp_lexer_nth_token_is (parser->lexer, 2, CPP_CLOSE_PAREN)))
+ 	  {
+ 	    auto t = make_temp_override (parser->translate_strings_p, false);
+ 	    expr
+ 	      = cp_parser_parenthesized_expression_list_elt (parser, cast_p,
+ 							     allow_expansion_p,
+ 							     non_constant_p);
+ 	  }
  	else
  	  expr
  	    = cp_parser_parenthesized_expression_list_elt (parser, cast_p,
*************** cp_parser_lambda_introducer (cp_parser*
*** 12917,12923 ****
        first = false;
  
        tree scope = current_nonlambda_scope (/*only_skip_closures_p=*/true);
!       if (TREE_CODE (scope) != FUNCTION_DECL && !parsing_nsdmi ())
  	error ("non-local lambda expression cannot have a capture-default");
      }
  
--- 12954,12962 ----
        first = false;
  
        tree scope = current_nonlambda_scope (/*only_skip_closures_p=*/true);
!       if (TREE_CODE (scope) != FUNCTION_DECL
! 	  && !parsing_nsdmi ()
! 	  && current_binding_level->kind != sk_contract)
  	error ("non-local lambda expression cannot have a capture-default");
      }
  
*************** cp_parser_lambda_declarator_opt (cp_pars
*** 13479,13484 ****
--- 13518,13527 ----
        return_type = cp_parser_trailing_type_id (parser);
      }
  
+   tree contract_specifiers = NULL_TREE;
+   if (flag_contracts)
+     contract_specifiers = cp_parser_function_contract_specifier_seq (parser);
+ 
    /* Also allow GNU attributes at the very end of the declaration, the usual
       place for GNU attributes.  */
    if (cp_next_tokens_can_be_gnu_attribute_p (parser))
*************** cp_parser_lambda_declarator_opt (cp_pars
*** 13547,13552 ****
--- 13590,13596 ----
  				       exception_spec,
  				       return_type,
  				       trailing_requires_clause,
+ 				       contract_specifiers,
  				       std_attrs,
  				       UNKNOWN_LOCATION);
  
*************** make_dummy_lambda_op ()
*** 13603,13609 ****
  				     VIRT_SPEC_UNSPECIFIED,
  				     REF_QUAL_NONE, NULL_TREE,
  				     NULL_TREE, NULL_TREE, NULL_TREE,
! 				     NULL_TREE, UNKNOWN_LOCATION);
  
    tree fco = grokmethod (&return_type_specs, declarator, NULL_TREE);
    obstack_free (&declarator_obstack, p);
--- 13647,13653 ----
  				     VIRT_SPEC_UNSPECIFIED,
  				     REF_QUAL_NONE, NULL_TREE,
  				     NULL_TREE, NULL_TREE, NULL_TREE,
! 				     NULL_TREE, NULL_TREE, UNKNOWN_LOCATION);
  
    tree fco = grokmethod (&return_type_specs, declarator, NULL_TREE);
    obstack_free (&declarator_obstack, p);
*************** cp_parser_lambda_body (cp_parser* parser
*** 13698,13703 ****
--- 13742,13751 ----
         removed the need for that.  */
      cp_parser_function_body (parser, false);
  
+     /* We need to parse deferred contract conditions before we try to call
+        finish_function (which will try to emit the contracts).  */
+     cp_parser_late_contracts (parser, fco);
+ 
      finish_lambda_function (body);
    }
  
*************** cp_parser_handle_statement_omp_attribute
*** 13961,13976 ****
    return attrs;
  }
  
- /* True if and only if the name is one of the contract types.  */
- 
- static bool
- contract_attribute_p (const_tree id)
- {
-   return is_attribute_p ("assert", id)
-     || is_attribute_p ("pre", id)
-     || is_attribute_p ("post", id);
- }
- 
  /* Handle omp::directive and omp::sequence attributes in *PATTRS
     (if any) at the start or after declaration-id of a declaration.  */
  
--- 14009,14014 ----
*************** cp_parser_statement (cp_parser* parser,
*** 14150,14171 ****
    /* Peek at the next token.  */
    token = cp_lexer_peek_token (parser->lexer);
  
-   /* If we have contracts, check that they're valid in this context.  */
-   if (std_attrs != error_mark_node)
-     {
-       if (tree pre = lookup_attribute ("pre", std_attrs))
- 	error_at (EXPR_LOCATION (TREE_VALUE (pre)),
- 		  "preconditions cannot be statements");
-       else if (tree post = lookup_attribute ("post", std_attrs))
- 	error_at (EXPR_LOCATION (TREE_VALUE (post)),
- 		  "postconditions cannot be statements");
- 
-     /* Check that assertions are null statements.  */
-     if (cp_contract_assertion_p (std_attrs))
-       if (token->type != CPP_SEMICOLON)
- 	error_at (token->location, "assertions must be followed by %<;%>");
-     }
- 
    bool omp_attrs_forbidden_p;
    omp_attrs_forbidden_p = parser->omp_attrs_forbidden_p;
  
--- 14188,14193 ----
*************** cp_parser_statement (cp_parser* parser,
*** 14314,14323 ****
  	  std_attrs = process_stmt_hotness_attribute (std_attrs, attrs_loc);
  	  statement = cp_parser_transaction_cancel (parser);
  	  break;
! 
  	default:
  	  /* It might be a keyword like `int' that can start a
! 	     declaration-statement.  */
  	  break;
  	}
      }
--- 14336,14347 ----
  	  std_attrs = process_stmt_hotness_attribute (std_attrs, attrs_loc);
  	  statement = cp_parser_transaction_cancel (parser);
  	  break;
! 	case RID_CONTASSERT:
! 	  statement = cp_parser_contract_assert (parser, token);
! 	  break;
  	default:
  	  /* It might be a keyword like `int' that can start a
! 	   declaration-statement.  */
  	  break;
  	}
      }
*************** cp_parser_statement (cp_parser* parser,
*** 14503,14519 ****
  			"%<fallthrough%> attribute not followed by %<;%>");
  	  std_attrs = NULL_TREE;
  	}
- 
-       /* Handle [[assert: ...]];  */
-       if (cp_contract_assertion_p (std_attrs))
- 	{
- 	  /* Add the assertion as a statement in the current block.  */
- 	  if (!statement)
- 	    emit_assertion (std_attrs);
- 	  /* We already checked that the contract assertion is followed by
- 	   a semicolon.  */
- 	  std_attrs = NULL_TREE;
- 	}
      }
  
    /* Set the line number for the statement.  */
--- 14527,14532 ----
*************** cp_parser_range_for (cp_parser *parser,
*** 15842,15853 ****
     builds up the range temporary.  */
  
  tree
! build_range_temp (tree range_expr)
  {
!   /* Find out the type deduced by the declaration
!      `auto &&__range = range_expr'.  */
!   tree auto_node = make_auto ();
!   tree range_type = cp_build_reference_type (auto_node, true);
    range_type = do_auto_deduction (range_type, range_expr, auto_node);
  
    /* Create the __range variable.  */
--- 15855,15878 ----
     builds up the range temporary.  */
  
  tree
! build_range_temp (tree range_expr, bool expansion_stmt_p /* = false */)
  {
!   tree range_type, auto_node;
! 
!   if (expansion_stmt_p)
!     {
!       /* Build const decltype(auto) __range = range_expr;
! 	 - range_expr provided by the caller already is (range_expr).  */
!       auto_node = make_decltype_auto ();
!       range_type = cp_build_qualified_type (auto_node, TYPE_QUAL_CONST);
!     }
!   else
!     {
!       /* Find out the type deduced by the declaration
! 	 `auto &&__range = range_expr'.  */
!       auto_node = make_auto ();
!       range_type = cp_build_reference_type (auto_node, true);
!     }
    range_type = do_auto_deduction (range_type, range_expr, auto_node);
  
    /* Create the __range variable.  */
*************** cp_build_range_for_decls (location_t loc
*** 16006,16018 ****
  	range_temp = range_expr;
        else
  	{
- 	  range_temp = build_range_temp (range_expr);
  	  if (expansion_stmt_p)
  	    {
! 	      /* Depending on CWG3044 resolution, we might want to remove
! 		 these 3 sets of TREE_STATIC (on range_temp, begin and end).
! 		 Although it can only be done when P2686R4 is fully
! 		 implemented.  */
  	      TREE_STATIC (range_temp) = 1;
  	      TREE_PUBLIC (range_temp) = 0;
  	      DECL_COMMON (range_temp) = 0;
--- 16031,16047 ----
  	range_temp = range_expr;
        else
  	{
  	  if (expansion_stmt_p)
  	    {
! 	      /* Build constexpr decltype(auto) __for_range = (range_expr);  */
! 	      location_t range_loc = cp_expr_loc_or_loc (range_expr, loc);
! 	      range_expr
! 		= finish_parenthesized_expr (cp_expr (range_expr, range_loc));
! 	      range_temp = build_range_temp (range_expr, true);
! 
! 	      /* When P2686R4 is fully implemented, these 3 sets of TREE_STATIC
! 		 (on range_temp, begin and end) should be removed as per
! 		 CWG3044.  */
  	      TREE_STATIC (range_temp) = 1;
  	      TREE_PUBLIC (range_temp) = 0;
  	      DECL_COMMON (range_temp) = 0;
*************** cp_build_range_for_decls (location_t loc
*** 16020,16025 ****
--- 16049,16058 ----
  	      DECL_DECLARED_CONSTEXPR_P (range_temp) = 1;
  	      TREE_READONLY (range_temp) = 1;
  	    }
+ 	  else
+ 	    /* Build auto &&__for_range = range_expr;  */
+ 	    range_temp = build_range_temp (range_expr);
+ 
  	  pushdecl (range_temp);
  	  cp_finish_decl (range_temp, range_expr,
  			  /*is_constant_init*/false, NULL_TREE,
*************** cp_parser_decl_specifier_seq (cp_parser*
*** 18515,18526 ****
  		   declared.  */;
  	      else
  		{
! 		  if (find_contract (attrs))
! 		    {
! 		      diagnose_misapplied_contracts (attrs);
! 		      attrs = NULL_TREE;
! 		    }
! 		  else if (decl_specs->type
  			   && decl_specs->type_definition_p
  			   && OVERLOAD_TYPE_P (decl_specs->type))
  		    {
--- 18548,18554 ----
  		   declared.  */;
  	      else
  		{
! 		  if (decl_specs->type
  			   && decl_specs->type_definition_p
  			   && OVERLOAD_TYPE_P (decl_specs->type))
  		    {
*************** cp_parser_type_specifier (cp_parser* par
*** 22277,22283 ****
        /* Fall through.  */
      case RID_TYPENAME:
        /* If we see 'typename [:', this could be a typename-specifier.
! 	 But if there's no '::' after the '[:x:]' then it is probably
  	 a simple-type-specifier.  */
        if (keyword == RID_TYPENAME
  	  && cp_parser_nth_token_starts_splice_without_nns_p (parser, 2))
--- 22305,22311 ----
        /* Fall through.  */
      case RID_TYPENAME:
        /* If we see 'typename [:', this could be a typename-specifier.
! 	 But if there's no '::' after the '[:x:]' then it is
  	 a simple-type-specifier.  */
        if (keyword == RID_TYPENAME
  	  && cp_parser_nth_token_starts_splice_without_nns_p (parser, 2))
*************** cp_parser_init_declarator (cp_parser* pa
*** 26059,26064 ****
--- 26087,26093 ----
      {
        /* If the init-declarator isn't initialized and isn't followed by a
  	 `,' or `;', it's not a valid init-declarator.  */
+ 
        if (token->type != CPP_COMMA
  	  && token->type != CPP_SEMICOLON)
  	{
*************** cp_parser_direct_declarator (cp_parser*
*** 26664,26669 ****
--- 26693,26703 ----
  		  /* Parse the virt-specifier-seq.  */
  		  virt_specifiers = cp_parser_virt_specifier_seq_opt (parser);
  
+ 		  tree contract_specifiers = NULL_TREE;
+ 		  if (flag_contracts)
+ 		    contract_specifiers
+ 		      = cp_parser_function_contract_specifier_seq (parser);
+ 
  		  location_t parens_loc = make_location (parens_start,
  							 parens_start,
  							 parens_end);
*************** cp_parser_direct_declarator (cp_parser*
*** 26677,26682 ****
--- 26711,26717 ----
  						     exception_specification,
  						     late_return,
  						     requires_clause,
+ 						     contract_specifiers,
  						     attrs,
  						     parens_loc);
  		  declarator->attributes = gnu_attrs;
*************** cp_parser_type_id_1 (cp_parser *parser,
*** 27661,27667 ****
  {
    cp_decl_specifier_seq type_specifier_seq;
    cp_declarator *abstract_declarator;
-   cp_token *next = nullptr;
  
    /* Parse the type-specifier-seq.  */
    cp_parser_type_specifier_seq (parser, flags,
--- 27696,27701 ----
*************** cp_parser_type_id_1 (cp_parser *parser,
*** 27671,27687 ****
    if (type_location)
      *type_location = type_specifier_seq.locations[ds_type_spec];
  
-   /* If there is just ds_type_spec specified, this could be a type alias.  */
-   if (type_alias_p && is_typedef_decl (type_specifier_seq.type))
-     {
-       int i;
-       for (i = ds_first; i < ds_last; ++i)
- 	if (i != ds_type_spec && type_specifier_seq.locations[i])
- 	  break;
-       if (i == ds_last)
- 	next = cp_lexer_peek_token (parser->lexer);
-     }
- 
    if (is_template_arg && type_specifier_seq.type
        && TREE_CODE (type_specifier_seq.type) == TEMPLATE_TYPE_PARM
        && CLASS_PLACEHOLDER_TEMPLATE (type_specifier_seq.type))
--- 27705,27710 ----
*************** cp_parser_type_id_1 (cp_parser *parser,
*** 27707,27718 ****
  			    /*static_p=*/false);
    /* Check to see if there really was a declarator.  */
    if (!cp_parser_parse_definitely (parser))
!     abstract_declarator = NULL;
  
    /* If we found * or & and similar after the type-specifier, it's not
       a type alias.  */
    if (type_alias_p)
!     *type_alias_p = cp_lexer_peek_token (parser->lexer) == next;
  
    bool auto_typeid_ok = false;
    /* DR 625 prohibits use of auto as a template-argument.  We allow 'auto'
--- 27730,27748 ----
  			    /*static_p=*/false);
    /* Check to see if there really was a declarator.  */
    if (!cp_parser_parse_definitely (parser))
!     abstract_declarator = nullptr;
  
    /* If we found * or & and similar after the type-specifier, it's not
       a type alias.  */
    if (type_alias_p)
!     *type_alias_p = [&] {
!       if (abstract_declarator || !is_typedef_decl (type_specifier_seq.type))
! 	return false;
!       for (int i = ds_first; i < ds_last; ++i)
! 	if (i != ds_type_spec && type_specifier_seq.locations[i])
! 	  return false;
!       return true;
!     } ();
  
    bool auto_typeid_ok = false;
    /* DR 625 prohibits use of auto as a template-argument.  We allow 'auto'
*************** cp_parser_type_specifier_seq (cp_parser*
*** 27893,27898 ****
--- 27923,27934 ----
  	  continue;
  	}
  
+       /* We might have contract specifiers after a trailing return.  */
+       if (seen_type_specifier
+ 	  && is_trailing_return
+ 	  && cp_maybe_function_contract_specifier (parser))
+ 	break;
+ 
        /* record the token of the beginning of the type specifier seq,
           for error reporting purposes*/
       if (!start_token)
*************** cp_parser_class_specifier (cp_parser* pa
*** 29920,29932 ****
  	}
        vec_safe_truncate (unparsed_nsdmis, 0);
  
!       /* Now contract attributes.  */
        FOR_EACH_VEC_SAFE_ELT (unparsed_contracts, ix, decl)
  	{
  	  tree ctx = DECL_CONTEXT (decl);
  	  switch_to_class (ctx);
  
! 	  temp_override<tree> cfd(current_function_decl, decl);
  
  	  /* Make sure that any template parameters are in scope.  */
  	  maybe_begin_member_template_processing (decl);
--- 29956,29968 ----
  	}
        vec_safe_truncate (unparsed_nsdmis, 0);
  
!       /* Now contract specifiers.  */
        FOR_EACH_VEC_SAFE_ELT (unparsed_contracts, ix, decl)
  	{
  	  tree ctx = DECL_CONTEXT (decl);
  	  switch_to_class (ctx);
  
! 	  temp_override<tree> cfd (current_function_decl, decl);
  
  	  /* Make sure that any template parameters are in scope.  */
  	  maybe_begin_member_template_processing (decl);
*************** cp_parser_class_specifier (cp_parser* pa
*** 29943,29953 ****
  	    parser->local_variables_forbidden_p |= THIS_FORBIDDEN;
  
  	  /* Now we can parse contract conditions.  */
! 	  for (tree a = DECL_ATTRIBUTES (decl); a; a = TREE_CHAIN (a))
! 	    {
! 	      if (cxx_contract_attribute_p (a))
! 		cp_parser_late_contract_condition (parser, decl, a);
! 	    }
  
  	  /* Restore the state of local_variables_forbidden_p.  */
  	  parser->local_variables_forbidden_p = local_variables_forbidden_p;
--- 29979,29985 ----
  	    parser->local_variables_forbidden_p |= THIS_FORBIDDEN;
  
  	  /* Now we can parse contract conditions.  */
! 	  cp_parser_late_contracts (parser, decl);
  
  	  /* Restore the state of local_variables_forbidden_p.  */
  	  parser->local_variables_forbidden_p = local_variables_forbidden_p;
*************** cp_parser_class_specifier (cp_parser* pa
*** 29957,29965 ****
  
  	  /* Remove any template parameters from the symbol table.  */
  	  maybe_end_member_template_processing ();
- 
- 	  /* Perform any deferred contract matching.  */
- 	  match_deferred_contracts (decl);
  	}
        vec_safe_truncate (unparsed_contracts, 0);
  
--- 29989,29994 ----
*************** cp_parser_class_head (cp_parser* parser,
*** 30129,30136 ****
  
    /* Parse the attributes.  */
    attributes = cp_parser_attributes_opt (parser);
-   if (find_contract (attributes))
-     diagnose_misapplied_contracts (attributes);
  
    /* If the next token is `::', that is invalid -- but sometimes
       people do try to write:
--- 30158,30163 ----
*************** cp_nth_tokens_can_be_std_attribute_p (cp
*** 32687,32695 ****
    cp_token *token = cp_lexer_peek_nth_token (parser->lexer, n);
  
    return ((token->type == CPP_KEYWORD && token->keyword == RID_ALIGNAS)
! 	  || (token->type == CPP_OPEN_SQUARE
! 	      && (token = cp_lexer_peek_nth_token (parser->lexer, n + 1))
! 	      && token->type == CPP_OPEN_SQUARE));
  }
  
  /* Return TRUE iff the next Nth tokens in the stream are possibly the
--- 32714,32722 ----
    cp_token *token = cp_lexer_peek_nth_token (parser->lexer, n);
  
    return ((token->type == CPP_KEYWORD && token->keyword == RID_ALIGNAS)
! 	   || (token->type == CPP_OPEN_SQUARE
! 		&& (token = cp_lexer_peek_nth_token (parser->lexer, n + 1))
! 		&& token->type == CPP_OPEN_SQUARE));
  }
  
  /* Return TRUE iff the next Nth tokens in the stream are possibly the
*************** cp_parser_std_attribute_list (cp_parser
*** 33368,33588 ****
    return attributes;
  }
  
! /* Optionally parse a C++20 contract role. A NULL return means that no
!    contract role was specified.
  
!     contract-role:
!       % default
!       % identifier
  
!    If the identifier does not name a known contract role, it will
!    be assumed to be default. Returns the identifier for the role
!    token.  */
  
  static tree
! cp_parser_contract_role (cp_parser *parser)
  {
!   gcc_assert (cp_lexer_next_token_is (parser->lexer, CPP_MOD));
!   cp_lexer_consume_token (parser->lexer);
  
!   cp_token *token = cp_lexer_peek_token (parser->lexer);
!   tree role_id = NULL_TREE;
!   if (token->type == CPP_NAME)
!     role_id = token->u.value;
!   else if (token->type == CPP_KEYWORD && token->keyword == RID_DEFAULT)
!     role_id = get_identifier ("default");
!   else
      {
!       error_at (token->location, "expected contract-role");
!       return error_mark_node;
      }
!   cp_lexer_consume_token (parser->lexer);
! 
!   /* FIXME: Warn about invalid/unknown roles?  */
!   return role_id;
  }
  
! /* Parse an optional contract mode.
  
!      contract-mode:
! 	contract-semantic
! 	[contract-level] [contract-role]
  
!      contract-semantic:
!        check_never_continue
!        check_maybe_continue
!        check_always_continue
  
!      contract-level:
!        default
!        audit
!        axiom
  
!      contract-role:
!        default
!        identifier
  
!    This grammar is taken from P1332R0. During parsing, this sets options
!    on the MODE object to determine the configuration of the contract.
  
!    Returns a tree containing the identifiers used in the configuration.
!    This is either an IDENTIFIER with the literal semantic or a TREE_LIST
!    whose TREE_VALUE is the contract-level and whose TREE_PURPOSE is the
!    contract-role, if any. NULL_TREE is returned if no information is
!    given (i.e., all defaults selected).  */
  
! static tree
! cp_parser_contract_mode_opt (cp_parser *parser,
! 			     bool postcondition_p)
! {
!   /* The mode is empty; the level and role are default.  */
!   if (cp_lexer_next_token_is (parser->lexer, CPP_COLON))
!     return NULL_TREE;
  
!   /* There is only a role; the level is default.  */
!   if (cp_lexer_next_token_is (parser->lexer, CPP_MOD))
      {
!       tree role_id = cp_parser_contract_role (parser);
!       return build_tree_list (role_id, get_identifier ("default"));
      }
  
!   /* Otherwise, match semantic or level.  */
!   cp_token *token = cp_lexer_peek_token (parser->lexer);
!   contract_level level = CONTRACT_INVALID;
!   contract_semantic semantic = CCS_INVALID;
!   tree config_id;
!   if (token->type == CPP_NAME)
!     {
!       config_id = token->u.value;
  
!       /* Either a named level, a concrete semantic, or an identifier
! 	 for a postcondition.  */
!       const char *ident = IDENTIFIER_POINTER (token->u.value);
!       level = map_contract_level (ident);
!       semantic = map_contract_semantic (ident);
  
!       /* The identifier is the return value for a postcondition.  */
!       if (level == CONTRACT_INVALID && semantic == CCS_INVALID
! 	  && postcondition_p)
! 	return NULL_TREE;
!     }
!   else if (token->type == CPP_KEYWORD && token->keyword == RID_DEFAULT)
!     {
!       config_id = get_identifier ("default");
!       level = CONTRACT_DEFAULT;
!     }
!   else
      {
!       /* We got some other token other than a ':'.  */
!       error_at (token->location, "expected contract semantic or level");
!       return NULL_TREE;
      }
  
!   /* Consume the literal semantic or level token.  */
!   cp_lexer_consume_token (parser->lexer);
  
!   if (semantic == CCS_INVALID && level == CONTRACT_INVALID)
      {
!       error_at (token->location,
! 		"expected contract level: "
! 		"%<default%>, %<audit%>, or %<axiom%>");
!       return NULL_TREE;
      }
  
!   /* We matched an explicit semantic. */
!   if (semantic != CCS_INVALID)
      {
!       if (cp_lexer_next_token_is (parser->lexer, CPP_MOD))
! 	{
! 	  error ("invalid use of contract role for explicit semantic");
! 	  cp_lexer_consume_token (parser->lexer);
! 	  cp_lexer_consume_token (parser->lexer);
! 	}
!       return config_id;
      }
  
!   /* We matched a level, there may be a role; otherwise this is default.  */
!   if (cp_lexer_next_token_is (parser->lexer, CPP_MOD))
      {
!       tree role_id = cp_parser_contract_role (parser);
!       return build_tree_list (role_id, config_id);
      }
  
!   return build_tree_list (NULL_TREE, config_id);
  }
  
  static tree
! find_error (tree *tp, int *, void *)
  {
!   if (*tp == error_mark_node)
!     return *tp;
!   return NULL_TREE;
  }
  
! static bool
! contains_error_p (tree t)
  {
!   return walk_tree (&t, find_error, NULL, NULL);
! }
  
! /* Parse a standard C++20 contract attribute specifier.
  
!   contract-attribute-specifier:
!     [ [ assert contract-level [opt] : conditional-expression ] ]
!     [ [ pre contract-level [opt] : conditional-expression ] ]
!     [ [ post contract-level [opt] identifier [opt] : conditional-expression ] ]
  
!    For free functions, we cannot determine the type of the postcondition
!    identifier because the we haven't called grokdeclarator yet. In those
!    cases we parse the postcondition as if the identifier was declared as
!    'auto <identifier>'. We then instantiate the postcondition once the
!    return type is known.
  
!    For member functions, contracts are in the complete-class context, so the
!    parse is deferred. We also have the return type avaialable (unless it's
!    deduced), so we don't need to parse the postcondition in terms of a
!    placeholder.  */
  
  static tree
! cp_parser_contract_attribute_spec (cp_parser *parser, tree attribute)
  {
!   gcc_assert (contract_attribute_p (attribute));
!   cp_token *token = cp_lexer_consume_token (parser->lexer);
    location_t loc = token->location;
  
!   bool assertion_p = is_attribute_p ("assert", attribute);
!   bool postcondition_p = is_attribute_p ("post", attribute);
  
!   /* Parse the optional mode.  */
!   tree mode = cp_parser_contract_mode_opt (parser, postcondition_p);
  
    /* Check for postcondition identifiers.  */
    cp_expr identifier;
!   if (postcondition_p && cp_lexer_next_token_is (parser->lexer, CPP_NAME))
      identifier = cp_parser_identifier (parser);
    if (identifier == error_mark_node)
!     return error_mark_node;
  
!   cp_parser_require (parser, CPP_COLON, RT_COLON);
  
-   /* Defer the parsing of pre/post contracts inside class definitions.  */
    tree contract;
!   if (!assertion_p &&
!       current_class_type &&
!       TYPE_BEING_DEFINED (current_class_type))
      {
!       /* Skip until we reach an unenclose ']'. If we ran into an unnested ']'
! 	 that doesn't close the attribute, return an error and let the attribute
! 	 handling code emit an error for missing ']]'.  */
        cp_token *first = cp_lexer_peek_token (parser->lexer);
!       cp_parser_skip_to_closing_parenthesis_1 (parser,
! 					       /*recovering=*/false,
! 					       CPP_CLOSE_SQUARE,
! 					       /*consume_paren=*/false);
!       if (cp_lexer_peek_token (parser->lexer)->type != CPP_CLOSE_SQUARE
! 	  || cp_lexer_peek_nth_token (parser->lexer, 2)->type != CPP_CLOSE_SQUARE)
! 	return error_mark_node;
        cp_token *last = cp_lexer_peek_token (parser->lexer);
  
        /* Build a deferred-parse node.  */
        tree condition = make_node (DEFERRED_PARSE);
--- 33395,33759 ----
    return attributes;
  }
  
! /* Parse a C++-26 annotation list.
  
!    annotation-list:
!      annotation ... [opt]
!      annotation-list , annotation ... [opt]
  
!    annotation:
!      = constant-expression  */
  
  static tree
! cp_parser_annotation_list (cp_parser *parser)
  {
!   tree attributes = NULL_TREE;
  
!   while (true)
      {
!       cp_token *token = cp_lexer_peek_token (parser->lexer);
!       location_t loc = token->location;
!       if (cp_lexer_next_token_is (parser->lexer, CPP_EQ))
! 	{
! 	  tree annotation = cp_parser_annotation (parser);
! 	  if (annotation == error_mark_node)
! 	    break;
! 	  annotation = build_tree_list (NULL_TREE, annotation);
! 	  if (cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
! 	    {
! 	      cp_lexer_consume_token (parser->lexer);
! 	      annotation = make_pack_expansion (annotation);
! 	      if (annotation == error_mark_node)
! 		break;
! 	    }
! 	  attributes = tree_cons (build_tree_list (internal_identifier,
! 						   annotation_identifier),
! 				  annotation, attributes);
! 	}
!       else if (token->type == CPP_NAME
! 	       || token->type == CPP_KEYWORD
! 	       || (token->flags & NAMED_OP))
! 	{
! 	  error_at (loc, "mixing annotations and attributes in the same list");
! 	  if (cp_parser_std_attribute (parser, NULL_TREE) == error_mark_node)
! 	    break;
! 	  if (cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
! 	    cp_lexer_consume_token (parser->lexer);
! 	}
!       else
! 	{
! 	  cp_parser_require (parser, CPP_EQ, RT_EQ);
! 	  break;
! 	}
!       token = cp_lexer_peek_token (parser->lexer);
!       if (token->type != CPP_COMMA)
! 	break;
!       cp_lexer_consume_token (parser->lexer);
      }
!   attributes = nreverse (attributes);
!   return attributes;
  }
  
! /* Parse a contract condition for a deferred contract.  */
  
! void
! cp_parser_late_contract_condition (cp_parser *parser, tree fn, tree contract)
! {
!   tree condition = CONTRACT_CONDITION (contract);
!   tree r_ident = NULL_TREE;
!   if (TREE_CODE (contract) == POSTCONDITION_STMT)
!     r_ident = POSTCONDITION_IDENTIFIER (contract);
  
!   tree type = TREE_TYPE (TREE_TYPE (fn));
!   location_t r_loc = UNKNOWN_LOCATION;
!   if (r_ident)
!     {
!       r_loc = EXPR_LOCATION (r_ident);
!       r_ident = tree_strip_any_location_wrapper (r_ident);
!       if (r_loc == UNKNOWN_LOCATION)
! 	r_loc = cp_expr_location (contract);
!       if (!check_postcondition_result (fn, type, r_loc))
! 	{
! 	  invalidate_contract (contract);
! 	  return;
! 	}
!     }
  
!   /* Contracts allow access to members only through explicit use of 'this'
!      pointer. */
!    tree saved_ccr = current_class_ref;
!    tree saved_ccp = current_class_ptr;
!    tree saved_contract_ccp = contract_class_ptr;
  
!    if ((DECL_CONSTRUCTOR_P (fn) && PRECONDITION_P (contract))
!        || (DECL_DESTRUCTOR_P (fn) && POSTCONDITION_P (contract)))
!     contract_class_ptr = current_class_ptr;
!   else
!     contract_class_ptr = NULL_TREE;
  
!   push_unparsed_function_queues (parser);
  
!   /* Push the saved tokens onto the parser's lexer stack.  */
!   cp_token_cache *tokens = DEFPARSE_TOKENS (condition);
!   cp_parser_push_lexer_for_tokens (parser, tokens);
  
!   /* If we have a current class object, we need to consider
!      it const when processing the contract condition.  */
!   tree current_class_ref_copy = current_class_ref;
!   if (flag_contracts && current_class_ref_copy)
!     current_class_ref = view_as_const (current_class_ref_copy);
  
!   /* Parse the condition, ensuring that parameters or the return variable
!      aren't flagged for use outside the body of a function.  */
!   begin_scope (sk_contract, fn);
!   bool old_pc = processing_postcondition;
!   processing_postcondition = POSTCONDITION_P (contract);
!   /* Build a fake variable for the result identifier.  */
!   tree result = NULL_TREE;
!   if (r_ident)
      {
!       cp_expr result_id (r_ident, r_loc);
!       result = make_postcondition_variable (result_id, type);
!       ++processing_template_decl;
      }
+   cp_expr parsed_condition = cp_parser_conditional_expression (parser);
+   /* Commit to changes.  */
+   update_late_contract (contract, result, parsed_condition);
+   if (r_ident)
+     --processing_template_decl;
  
!   /* Rebuild the postcondition since we didn't do it in grokfndecl. */
!   rebuild_postconditions (fn);
  
!   /* Leave our temporary scope for the postcondition result.  */
!   processing_postcondition = old_pc;
!   gcc_checking_assert (scope_chain && scope_chain->bindings
! 		       && scope_chain->bindings->kind == sk_contract);
!   pop_bindings_and_leave_scope ();
  
!   if (cp_lexer_next_token_is_not (parser->lexer, CPP_EOF))
!     error_at (input_location, "expected conditional-expression");
! 
!   /* Revert to the main lexer.  */
!   cp_parser_pop_lexer (parser);
! 
!   /* Restore the queue.  */
!   pop_unparsed_function_queues (parser);
! 
!   current_class_ref = saved_ccr;
!   current_class_ptr = saved_ccp;
!   contract_class_ptr = saved_contract_ccp;
! }
! 
! /* Parse deferred contracts of FNDECL.  */
! 
! void
! cp_parser_late_contracts (cp_parser *parser, tree fndecl)
! {
! 
!   tree new_contracts = NULL_TREE;
!   tree old_contracts = get_fn_contract_specifiers (fndecl);
! 
!   if (old_contracts == NULL_TREE || !contract_any_deferred_p (old_contracts))
!     return;
! 
!   for (; old_contracts; old_contracts = TREE_CHAIN (old_contracts))
      {
!       tree contract = TREE_VALUE (TREE_VALUE (old_contracts));
! 
!       tree condition = CONTRACT_CONDITION (contract);
!       /* All contracts should be deferred if one of them is deferred */
!       gcc_checking_assert (TREE_CODE (condition) == DEFERRED_PARSE);
! 
!       cp_parser_late_contract_condition (parser, fndecl, contract);
!       tree list = tree_cons (TREE_PURPOSE (old_contracts),
! 			     TREE_VALUE (old_contracts), NULL_TREE);
!       new_contracts = chainon (new_contracts, list);
      }
  
!   update_fn_contract_specifiers (fndecl, new_contracts);
! }
  
! static tree
! cp_parser_contract_assert (cp_parser *parser, cp_token *token)
! {
!   if (!flag_contracts)
      {
!       error_at (token->location, "%qs is only available with %qs",
! 		"contract_assert", "-fcontracts");
!       cp_parser_skip_to_end_of_statement (parser);
!       return error_mark_node;
      }
  
!   tree cont_assert = token->u.value;
! 
!   token = cp_lexer_consume_token (parser->lexer);
!   location_t loc = token->location;
! 
!   location_t attrs_loc = cp_lexer_peek_token (parser->lexer)->location;
!   tree std_attrs = cp_parser_std_attribute_spec_seq (parser);
!   if (std_attrs)
      {
!       attrs_loc = make_location (attrs_loc, attrs_loc, input_location);
!       warning_at (attrs_loc, OPT_Wattributes, "attributes are ignored on %qs",
! 		  "contract_assert");
!       std_attrs = NULL_TREE;
      }
  
!   matching_parens parens;
!   parens.require_open (parser);
!   /* Enable location wrappers when parsing contracts.  */
!   auto suppression = make_temp_override (suppress_location_wrappers, 0);
! 
!   /* If we have a current class object, see if we need to consider
!      it const when processing the contract condition.  */
!   tree current_class_ref_copy = current_class_ref;
!   if (current_class_ref_copy)
!     current_class_ref = view_as_const (current_class_ref_copy);
! 
!   /* Parse the condition.  */
!   begin_scope (sk_contract, current_function_decl);
!   bool old_pc = processing_postcondition;
!   processing_postcondition = false;
!   cp_expr condition = cp_parser_conditional_expression (parser);
!   gcc_checking_assert (scope_chain && scope_chain->bindings
! 		       && scope_chain->bindings->kind == sk_contract);
!   /* Build the contract.  */
!   tree contract = grok_contract (cont_assert, /*mode*/NULL_TREE,
! 			    /*result*/NULL_TREE, condition, loc);
!   processing_postcondition = old_pc;
!   pop_bindings_and_leave_scope ();
! 
!   /* Revert (any) constification of the current class object.  */
!   current_class_ref = current_class_ref_copy;
! 
!   parens.require_close (parser);
! 
!   if (!contract || contract == error_mark_node)
      {
!       cp_parser_skip_to_end_of_statement (parser);
!       return error_mark_node;
      }
  
!   if (!cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON))
!     return error_mark_node;
! 
!   add_stmt (contract);
!   return contract;
  }
  
+ /* Can the next tokens introduce a function contract specifier.  */
+ 
  static tree
! cp_function_contract_specifier_intro (cp_parser *parser)
  {
!   cp_token *token = cp_lexer_peek_token (parser->lexer);
! 
!   /* Look for the contextual keywords 'pre' and 'post' as an introducer.  */
!   if (token->type != CPP_NAME)
!     return NULL_TREE;
! 
!   tree contract_name = token->u.value;
! 
!   if (!id_equal (contract_name, "pre") && !id_equal (contract_name, "post"))
!     /* If we don't have a valid contract start, we are done.  */
!     return NULL_TREE;
!   return contract_name;
  }
  
! /* Look ahead to see if this might introduce a function contract specifier.
!    If not return NULL_TREE, if successful return the name (pre or post).  */
! 
! static tree
! cp_maybe_function_contract_specifier (cp_parser *parser)
  {
!   tree contract_name = cp_function_contract_specifier_intro (parser);
!   if (!contract_name)
!     return NULL_TREE;
  
!   size_t n = 2;
!   if (cp_nth_tokens_can_be_std_attribute_p (parser, n))
!     n = cp_parser_skip_std_attribute_spec_seq (parser, n);
!   if (cp_lexer_nth_token_is (parser->lexer, n, CPP_OPEN_PAREN))
!     return contract_name;
!   return NULL_TREE;
! }
  
! /* Parse a contract specifier.
  
!   function-contract-specifier :
!     precondition-specifier
!     postcondition-specifier
!   precondition-specifier :
!     pre attribute-specifier-seqopt ( conditional-expression )
!   postcondition-specifier :
!     post attribute-specifier-seqopt ( result-name-introduceropt conditional-expression )
!   result-name-introducer :
!     attributed-identifier :
  
!    Return void_list_node if the current token doesn't start a
!    contract specifier.  */
  
  static tree
! cp_parser_function_contract_specifier (cp_parser *parser)
  {
!   tree contract_name = cp_function_contract_specifier_intro (parser);
!   if (!contract_name)
!     return NULL_TREE;
! 
!   cp_token *token = cp_lexer_peek_token (parser->lexer);
!   cp_lexer_consume_token (parser->lexer);
    location_t loc = token->location;
+   bool postcondition_p = id_equal (contract_name, "post");
  
!   location_t attrs_loc = cp_lexer_peek_token (parser->lexer)->location;
!   tree std_attrs = cp_parser_std_attribute_spec_seq (parser);
!   if (std_attrs)
!     {
!       attrs_loc = make_location (attrs_loc, attrs_loc, input_location);
!       warning_at (attrs_loc, OPT_Wattributes, "attributes are ignored on"
! 		  " function contract specifiers");
!       std_attrs = NULL_TREE;
!     }
  
!   matching_parens parens;
!   parens.require_open (parser);
  
    /* Check for postcondition identifiers.  */
    cp_expr identifier;
!   if (postcondition_p && cp_lexer_next_token_is (parser->lexer, CPP_NAME)
!       && cp_lexer_peek_nth_token (parser->lexer, 2)->type == CPP_COLON)
      identifier = cp_parser_identifier (parser);
+ 
    if (identifier == error_mark_node)
!     {
!       cp_parser_skip_to_closing_parenthesis (parser,
! 					     /*recovering=*/true,
! 					     /*or_comma=*/false,
! 					     /*consume_paren=*/true);
!       return error_mark_node;
!     }
  
!   if (identifier)
!     cp_parser_require (parser, CPP_COLON, RT_COLON);
  
    tree contract;
!   if (current_class_type && TYPE_BEING_DEFINED (current_class_type))
      {
!       /* Defer the parsing of pre/post contracts inside class definitions.  */
        cp_token *first = cp_lexer_peek_token (parser->lexer);
! 
!       /* Skip until we reach a closing token ).  */
!       cp_parser_skip_to_closing_parenthesis (parser,
! 					     /*recovering=*/false,
! 					     /*or_comma=*/false,
! 					     /*consume_paren=*/false);
! 
        cp_token *last = cp_lexer_peek_token (parser->lexer);
+       location_t end = last->location;
+       loc = make_location (loc, loc, end);
+ 
+       parens.require_close (parser);
  
        /* Build a deferred-parse node.  */
        tree condition = make_node (DEFERRED_PARSE);
*************** cp_parser_contract_attribute_spec (cp_pa
*** 33590,33780 ****
        DEFPARSE_INSTANTIATIONS (condition) = NULL;
  
        /* And its corresponding contract.  */
!       contract = grok_contract (attribute, mode, identifier, condition, loc);
      }
    else
      {
        /* Enable location wrappers when parsing contracts.  */
        auto suppression = make_temp_override (suppress_location_wrappers, 0);
  
!       /* Build a fake variable for the result identifier.  */
        tree result = NULL_TREE;
        if (identifier)
  	{
! 	  begin_scope (sk_block, NULL_TREE);
  	  result = make_postcondition_variable (identifier);
  	  ++processing_template_decl;
  	}
- 
-       /* Parse the condition, ensuring that parameters or the return variable
- 	 aren't flagged for use outside the body of a function.  */
-       ++processing_contract_condition;
        cp_expr condition = cp_parser_conditional_expression (parser);
-       --processing_contract_condition;
- 
-       /* Try to recover from errors by scanning up to the end of the
- 	 attribute.  Sometimes we get partially parsed expressions, so
- 	 we need to search the condition for errors.  */
-       if (contains_error_p (condition))
- 	cp_parser_skip_up_to_closing_square_bracket (parser);
- 
        /* Build the contract.  */
!       contract = grok_contract (attribute, mode, result, condition, loc);
! 
!       /* Leave our temporary scope for the postcondition result.  */
!       if (result)
! 	{
! 	  --processing_template_decl;
! 	  pop_bindings_and_leave_scope ();
! 	}
!     }
! 
!   if (!flag_contracts)
!     {
!       error_at (loc, "contracts are only available with %<-fcontracts%>");
!       return error_mark_node;
!     }
! 
!   return finish_contract_attribute (attribute, contract);
! }
! 
! /* Parse a contract condition for a deferred contract.  */
! 
! void cp_parser_late_contract_condition (cp_parser *parser,
! 					tree fn,
! 					tree attribute)
! {
!   tree contract = TREE_VALUE (TREE_VALUE (attribute));
! 
!   /* Make sure we've gotten something that hasn't been parsed yet or that
!      we're not parsing an invalid contract.  */
!   tree condition = CONTRACT_CONDITION (contract);
!   if (TREE_CODE (condition) != DEFERRED_PARSE)
!     return;
  
!   tree identifier = NULL_TREE;
!   if (TREE_CODE (contract) == POSTCONDITION_STMT)
!     identifier = POSTCONDITION_IDENTIFIER (contract);
  
!   /* Build a fake variable for the result identifier.  */
!   tree result = NULL_TREE;
!   if (identifier)
!     {
!       /* TODO: Can we guarantee that the identifier has a location? */
!       location_t loc = cp_expr_location (contract);
!       tree type = TREE_TYPE (TREE_TYPE (fn));
!       if (!check_postcondition_result (fn, type, loc))
  	{
! 	  invalidate_contract (contract);
! 	  return;
  	}
  
!       begin_scope (sk_block, NULL_TREE);
!       result = make_postcondition_variable (identifier, type);
!       ++processing_template_decl;
      }
  
!   /* 'this' is not allowed in preconditions of constructors or in postconditions
!      of destructors.  Note that the previous value of this variable is
!      established by the calling function, so we need to save it here.  */
!   tree saved_ccr = current_class_ref;
!   tree saved_ccp = current_class_ptr;
!   if ((DECL_CONSTRUCTOR_P (fn) && PRECONDITION_P (contract)) ||
!        (DECL_DESTRUCTOR_P (fn) && POSTCONDITION_P (contract)))
      {
!       current_class_ref = current_class_ptr = NULL_TREE;
!       parser->local_variables_forbidden_p |= THIS_FORBIDDEN;
      }
  
!   push_unparsed_function_queues (parser);
! 
!   /* Push the saved tokens onto the parser's lexer stack.  */
!   cp_token_cache *tokens = DEFPARSE_TOKENS (condition);
!   cp_parser_push_lexer_for_tokens (parser, tokens);
! 
!   /* Parse the condition, ensuring that parameters or the return variable
!      aren't flagged for use outside the body of a function.  */
!   ++processing_contract_condition;
!   condition = cp_parser_conditional_expression (parser);
!   --processing_contract_condition;
! 
!   /* Revert to the main lexer.  */
!   cp_parser_pop_lexer (parser);
! 
!   /* Restore the queue.  */
!   pop_unparsed_function_queues (parser);
! 
!   current_class_ref = saved_ccr;
!   current_class_ptr = saved_ccp;
! 
!   /* Commit to changes.  */
!   update_late_contract (contract, result, condition);
! 
!   /* Leave our temporary scope for the postcondition result.  */
!   if (result)
!     {
!       --processing_template_decl;
!       pop_bindings_and_leave_scope ();
!     }
  }
  
! /* Parse a C++-26 annotation list.
! 
!    annotation-list:
!      annotation ... [opt]
!      annotation-list , annotation ... [opt]
  
!    annotation:
!      = constant-expression  */
  
  static tree
! cp_parser_annotation_list (cp_parser *parser)
  {
!   tree attributes = NULL_TREE;
  
    while (true)
      {
!       cp_token *token = cp_lexer_peek_token (parser->lexer);
!       location_t loc = token->location;
!       if (cp_lexer_next_token_is (parser->lexer, CPP_EQ))
! 	{
! 	  tree annotation = cp_parser_annotation (parser);
! 	  if (annotation == error_mark_node)
! 	    break;
! 	  annotation = build_tree_list (NULL_TREE, annotation);
! 	  if (cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
! 	    {
! 	      cp_lexer_consume_token (parser->lexer);
! 	      annotation = make_pack_expansion (annotation);
! 	      if (annotation == error_mark_node)
! 		break;
! 	    }
! 	  attributes = tree_cons (build_tree_list (internal_identifier,
! 						   annotation_identifier),
! 				  annotation, attributes);
! 	}
!       else if (token->type == CPP_NAME
! 	       || token->type == CPP_KEYWORD
! 	       || (token->flags & NAMED_OP))
! 	{
! 	  error_at (loc, "mixing annotations and attributes in the same list");
! 	  if (cp_parser_std_attribute (parser, NULL_TREE) == error_mark_node)
! 	    break;
! 	  if (cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
! 	    cp_lexer_consume_token (parser->lexer);
! 	}
!       else
! 	{
! 	  cp_parser_require (parser, CPP_EQ, RT_EQ);
! 	  break;
! 	}
!       token = cp_lexer_peek_token (parser->lexer);
!       if (token->type != CPP_COMMA)
  	break;
!       cp_lexer_consume_token (parser->lexer);
      }
!   attributes = nreverse (attributes);
!   return attributes;
  }
  
  /* Parse a standard C++-11 attribute specifier.
--- 33761,33863 ----
        DEFPARSE_INSTANTIATIONS (condition) = NULL;
  
        /* And its corresponding contract.  */
!       if (identifier)
! 	identifier.maybe_add_location_wrapper ();
!       contract = grok_contract (contract_name, /*mode*/NULL_TREE, identifier,
! 				condition, loc);
      }
    else
      {
        /* Enable location wrappers when parsing contracts.  */
        auto suppression = make_temp_override (suppress_location_wrappers, 0);
  
!       /* If we have a current class object, see if we need to consider
!        it const when processing the contract condition.  */
!       tree current_class_ref_copy = current_class_ref;
!       if (current_class_ref_copy)
!       current_class_ref = view_as_const (current_class_ref_copy);
! 
!       /* Parse the condition, ensuring that parameters or the return variable
!        aren't flagged for use outside the body of a function.  */
!       begin_scope (sk_contract, current_function_decl);
!       bool old_pc = processing_postcondition;
!       processing_postcondition = postcondition_p;
        tree result = NULL_TREE;
        if (identifier)
  	{
! 	  /* Build a fake variable for the result identifier.  */
  	  result = make_postcondition_variable (identifier);
  	  ++processing_template_decl;
  	}
        cp_expr condition = cp_parser_conditional_expression (parser);
        /* Build the contract.  */
!       contract = grok_contract (contract_name, /*mode*/NULL_TREE, result,
! 				condition, loc);
!       if (identifier)
! 	--processing_template_decl;
!       processing_postcondition = old_pc;
!       gcc_checking_assert (scope_chain && scope_chain->bindings
! 			   && scope_chain->bindings->kind == sk_contract);
!       pop_bindings_and_leave_scope ();
  
!       /* Revert (any) constification of the current class object.  */
!       current_class_ref = current_class_ref_copy;
  
!       if (contract != error_mark_node)
  	{
! 	  location_t end = cp_lexer_peek_token (parser->lexer)->location;
! 	  loc = make_location (loc, loc, end);
! 	  SET_EXPR_LOCATION (contract, loc);
  	}
  
!       parens.require_close (parser);
      }
  
!   if (!flag_contracts)
      {
!       error_at (loc, "contracts are only available with %qs", "-fcontracts");
!       return error_mark_node;
      }
  
!   return contract;
  }
  
! /* Parse a contract specifier seq. Returns a list of preconditions and
!   postconditions in an attribute tree.
  
!   function-contract-specifier-seq :
!     function-contract-specifier function-contract-specifier-seq.  */
  
  static tree
! cp_parser_function_contract_specifier_seq (cp_parser *parser)
  {
!   tree contract_specs = NULL_TREE;
  
    while (true)
      {
!       tree contract_spec = cp_parser_function_contract_specifier (parser);
! 
!       /* If there are no more contracts, done.  */
!       if (contract_spec == NULL_TREE)
  	break;
! 
!       /* Ignore any erroneous contracts and attempt to continue parsing.  */
!       if (contract_spec == error_mark_node)
! 	continue;
! 
!       /* For now, turn this into an attribute.  */
!       tree contract_name = TREE_CODE (contract_spec) == PRECONDITION_STMT
! 			   ? get_identifier ("pre")
! 			   : get_identifier ("post");
!       contract_spec = finish_contract_specifier (contract_name, contract_spec);
!       /* Arrange to build the list in the correct order.  */
!       if (contract_specs)
! 	contract_specs = attr_chainon (contract_specs, contract_spec);
!       else
! 	contract_specs = contract_spec;
      }
! 
!     return contract_specs;
  }
  
  /* Parse a standard C++-11 attribute specifier.
*************** cp_parser_annotation_list (cp_parser *pa
*** 33782,33788 ****
     attribute-specifier:
       [ [ attribute-using-prefix [opt] attribute-list ] ]
       [ [ annotation-list ]]
-      contract-attribute-specifier
       alignment-specifier
  
     attribute-using-prefix:
--- 33865,33870 ----
*************** cp_parser_annotation_list (cp_parser *pa
*** 33792,33805 ****
       alignas ( type-id ... [opt] )
       alignas ( alignment-expression ... [opt] ).
  
-    Extensions for contracts:
- 
-    contract-attribute-specifier:
-      [ [ assert :  contract-mode [opt] : conditional-expression ] ]
-      [ [ pre :  contract-mode [opt] : conditional-expression ] ]
-      [ [ post :  contract-mode [opt] identifier [opt] :
- 	 conditional-expression ] ]
- 
     Return void_list_node if the current token doesn't start an
     attribute-specifier to differentiate from NULL_TREE returned e.g.
     for [ [ ] ].  */
--- 33874,33879 ----
*************** cp_parser_std_attribute_spec (cp_parser
*** 33840,33854 ****
  	  attr_name = canonicalize_attr_name (attr_name);
  	}
  
-       /* Handle contract-attribute-specs specially.  */
-       if (attr_name && contract_attribute_p (attr_name))
- 	{
- 	  tree attrs = cp_parser_contract_attribute_spec (parser, attr_name);
- 	  if (attrs != error_mark_node)
- 	    attributes = attrs;
- 	  goto finish_attrs;
- 	}
- 
        if (cp_lexer_next_token_is_keyword (parser->lexer, RID_USING))
  	{
  	  token = cp_lexer_peek_nth_token (parser->lexer, 2);
--- 33914,33919 ----
*************** cp_parser_std_attribute_spec (cp_parser
*** 33877,33883 ****
  
        attributes = cp_parser_std_attribute_list (parser, attr_ns);
  
-       finish_attrs:
        if (!cp_parser_require (parser, CPP_CLOSE_SQUARE, RT_CLOSE_SQUARE)
  	  || !cp_parser_require (parser, CPP_CLOSE_SQUARE, RT_CLOSE_SQUARE))
  	cp_parser_skip_to_end_of_statement (parser);
--- 33942,33947 ----
*************** cp_parser_explicit_template_declaration
*** 36211,36217 ****
    cp_parser_require_end_of_template_parameter_list (parser);
  
    /* Manage template requirements */
!   if (flag_concepts)
    {
      tree reqs = get_shorthand_constraints (current_template_parms);
      if (tree treqs = cp_parser_requires_clause_opt (parser, false))
--- 36275,36281 ----
    cp_parser_require_end_of_template_parameter_list (parser);
  
    /* Manage template requirements */
!   if (flag_concepts && current_template_parms)
    {
      tree reqs = get_shorthand_constraints (current_template_parms);
      if (tree treqs = cp_parser_requires_clause_opt (parser, false))
*************** cp_parser_save_default_args (cp_parser*
*** 36899,36910 ****
      }
  
    /* Contracts are deferred.  */
!   for (tree attr = DECL_ATTRIBUTES (decl); attr; attr = TREE_CHAIN (attr))
!     if (cxx_contract_attribute_p (attr))
!       {
! 	vec_safe_push (unparsed_contracts, decl);
! 	break;
!       }
  }
  
  /* DEFAULT_ARG contains the saved tokens for the initializer of DECL,
--- 36963,36970 ----
      }
  
    /* Contracts are deferred.  */
!   if (DECL_HAS_CONTRACTS_P (decl))
!     vec_safe_push (unparsed_contracts, decl);
  }
  
  /* DEFAULT_ARG contains the saved tokens for the initializer of DECL,
diff -Nrcpad gcc-16-20260125/gcc/cp/pt.cc gcc-16-20260201/gcc/cp/pt.cc
*** gcc-16-20260125/gcc/cp/pt.cc	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/cp/pt.cc	Sun Feb  1 22:32:07 2026
*************** check_explicit_specialization (tree decl
*** 3271,3277 ****
  		}
  	      decl = register_specialization (tmpl, gen_tmpl, targs,
  					      is_friend, 0);
! 	      remove_contract_attributes (result);
  	      return decl;
  	    }
  
--- 3271,3278 ----
  		}
  	      decl = register_specialization (tmpl, gen_tmpl, targs,
  					      is_friend, 0);
! 	      if (flag_contracts)
! 		remove_fn_contract_specifiers (result);
  	      return decl;
  	    }
  
*************** check_explicit_specialization (tree decl
*** 3364,3373 ****
  					      is_friend, 0);
  	    }
  
! 	  /* If this is a specialization, splice any contracts that may have
! 	     been inherited from the template, removing them.  */
! 	  if (decl != error_mark_node && DECL_TEMPLATE_SPECIALIZATION (decl))
! 	    remove_contract_attributes (decl);
  
  	  /* A 'structor should already have clones.  */
  	  gcc_assert (decl == error_mark_node
--- 3365,3374 ----
  					      is_friend, 0);
  	    }
  
! 	  if (flag_contracts
! 	      && decl != error_mark_node
! 	      && DECL_TEMPLATE_SPECIALIZATION (decl))
! 	    remove_fn_contract_specifiers (decl);
  
  	  /* A 'structor should already have clones.  */
  	  gcc_assert (decl == error_mark_node
*************** tsubst_contract (tree decl, tree t, tree
*** 12187,12198 ****
  
    tree r = copy_node (t);
  
!   /* Rebuild the result variable.  */
    if (type && POSTCONDITION_P (t) && POSTCONDITION_IDENTIFIER (t))
      {
!       tree oldvar = POSTCONDITION_IDENTIFIER (t);
  
!       tree newvar = copy_node (oldvar);
        TREE_TYPE (newvar) = type;
        DECL_CONTEXT (newvar) = decl;
        POSTCONDITION_IDENTIFIER (r) = newvar;
--- 12188,12203 ----
  
    tree r = copy_node (t);
  
!   /* Rebuild the result variable, if present.  */
!   tree oldvar = NULL_TREE;
!   tree newvar = NULL_TREE;
    if (type && POSTCONDITION_P (t) && POSTCONDITION_IDENTIFIER (t))
      {
!       oldvar = POSTCONDITION_IDENTIFIER (t);
!       if (oldvar == error_mark_node)
! 	return invalidate_contract (r);
  
!       newvar = copy_node (oldvar);
        TREE_TYPE (newvar) = type;
        DECL_CONTEXT (newvar) = decl;
        POSTCONDITION_IDENTIFIER (r) = newvar;
*************** tsubst_contract (tree decl, tree t, tree
*** 12202,12234 ****
        if (!auto_p)
  	if (!check_postcondition_result (decl, type, loc))
  	  return invalidate_contract (r);
- 
-       /* Make the variable available for lookup.  */
-       register_local_specialization (newvar, oldvar);
      }
  
    /* Instantiate the condition.  If the return type is undeduced, process
       the expression as if inside a template to avoid spurious type errors.  */
    if (auto_p)
      ++processing_template_decl;
!   ++processing_contract_condition;
!   CONTRACT_CONDITION (r)
!       = tsubst_expr (CONTRACT_CONDITION (t), args, complain, in_decl);
!   --processing_contract_condition;
    if (auto_p)
      --processing_template_decl;
! 
!   /* And the comment.  */
!   CONTRACT_COMMENT (r)
!       = tsubst_expr (CONTRACT_COMMENT (r), args, complain, in_decl);
  
    return r;
  }
  
! /* Update T by instantiating its contract attribute.  */
  
  static void
! tsubst_contract_attribute (tree decl, tree t, tree args,
  			   tsubst_flags_t complain, tree in_decl)
  {
    /* For non-specializations, adjust the current declaration to the most general
--- 12207,12259 ----
        if (!auto_p)
  	if (!check_postcondition_result (decl, type, loc))
  	  return invalidate_contract (r);
      }
  
    /* Instantiate the condition.  If the return type is undeduced, process
       the expression as if inside a template to avoid spurious type errors.  */
+   begin_scope (sk_contract, decl);
+   bool old_pc = processing_postcondition;
+   processing_postcondition = POSTCONDITION_P (t);
    if (auto_p)
      ++processing_template_decl;
!   if (newvar)
!     /* Make the variable available for lookup.  */
!     register_local_specialization (newvar, oldvar);
! 
!   /* Contract conditions have a wider application of location wrappers than
!      other trees (which will not work with the generic handling in tsubst_expr),
!      remove the wrapper here...  */
!   location_t cond_l = EXPR_LOCATION (CONTRACT_CONDITION (t));
!   tree cond_t = tree_strip_any_location_wrapper (CONTRACT_CONDITION (t));
! 
!   /* ... and substitute the contained expression.  */
!   cond_t = tsubst_expr (cond_t, args, complain, in_decl);
! 
!   /* Convert to bool, if possible, and then re-apply a location wrapper
!      when required.  */
!   cp_expr new_condition (cond_t, cond_l);
!   CONTRACT_CONDITION (r) = finish_contract_condition (new_condition);
! 
!   /* At present, the semantic, kind and comment cannot be dependent.  */
!   gcc_checking_assert
!     (!type_dependent_expression_p (CONTRACT_EVALUATION_SEMANTIC (r))
!      && !type_dependent_expression_p (CONTRACT_ASSERTION_KIND (r))
!      && !type_dependent_expression_p (CONTRACT_COMMENT (r)));
! 
    if (auto_p)
      --processing_template_decl;
!   processing_postcondition = old_pc;
!   gcc_checking_assert (scope_chain && scope_chain->bindings
! 		       && scope_chain->bindings->kind == sk_contract);
!   pop_bindings_and_leave_scope ();
  
    return r;
  }
  
! /* Update T instantiating a contract specifier.  */
  
  static void
! tsubst_contract_specifier (tree decl, tree t, tree args,
  			   tsubst_flags_t complain, tree in_decl)
  {
    /* For non-specializations, adjust the current declaration to the most general
*************** tsubst_contract_attribute (tree decl, tr
*** 12268,12286 ****
    TREE_VALUE (t) = build_tree_list (NULL_TREE, contract);
  }
  
! /* Rebuild the attribute list for DECL, substituting into contracts
!    as needed.  */
  
  void
! tsubst_contract_attributes (tree decl, tree args, tsubst_flags_t complain, tree in_decl)
  {
!   tree list = copy_list (DECL_ATTRIBUTES (decl));
!   for (tree attr = list; attr; attr = CONTRACT_CHAIN (attr))
      {
!       if (cxx_contract_attribute_p (attr))
! 	tsubst_contract_attribute (decl, attr, args, complain, in_decl);
      }
!   DECL_ATTRIBUTES (decl) = list;
  }
  
  /* Instantiate a single dependent attribute T (a TREE_LIST), and return either
--- 12293,12316 ----
    TREE_VALUE (t) = build_tree_list (NULL_TREE, contract);
  }
  
! /* For unsubstituted list of contracts in SPECIFIERS, instantiate contracts
!  for DECL and set the list as contracts for decl. Substitution creates a deep
!  copy of the contract.  */
  
  void
! tsubst_contract_specifiers (tree specfiers, tree decl, tree args,
! 			    tsubst_flags_t complain, tree in_decl)
  {
!   tree subst_contract_list = NULL_TREE;
!   for (tree spec = specfiers; spec; spec = TREE_CHAIN (spec))
      {
!       tree nc = copy_node (spec);
!       tsubst_contract_specifier (decl, nc, args, complain, in_decl);
!       TREE_CHAIN (nc) = subst_contract_list;
!       subst_contract_list = nc;
      }
!   if (flag_contracts)
!     set_fn_contract_specifiers (decl, nreverse (subst_contract_list));
  }
  
  /* Instantiate a single dependent attribute T (a TREE_LIST), and return either
*************** tsubst_attribute (tree t, tree *decl_p,
*** 12292,12301 ****
  {
    gcc_assert (ATTR_IS_DEPENDENT (t));
  
-   /* Note that contract attributes are never substituted from this function.
-      Their instantiation is triggered by regenerate_from_template_decl when
-      we instantiate the body of the function.  */
- 
    tree val = TREE_VALUE (t);
    if (val == NULL_TREE)
      /* Nothing to do.  */;
--- 12322,12327 ----
*************** tsubst_pack_expansion (tree t, tree args
*** 14146,14152 ****
  	  /* We can't substitute for this parameter pack.  We use a flag as
  	     well as the missing_level counter because function parameter
  	     packs don't have a level.  */
! 	  gcc_assert (processing_template_decl || is_auto (parm_pack));
  	  unsubstituted_packs = true;
  	}
      }
--- 14172,14179 ----
  	  /* We can't substitute for this parameter pack.  We use a flag as
  	     well as the missing_level counter because function parameter
  	     packs don't have a level.  */
! 	  gcc_assert (processing_template_decl || is_auto (parm_pack)
! 		      || args == NULL_TREE);
  	  unsubstituted_packs = true;
  	}
      }
*************** tsubst_function_decl (tree t, tree args,
*** 15238,15243 ****
--- 15265,15278 ----
    if (tree ci = get_constraints (t))
      set_constraints (r, ci);
  
+   /* copy_decl () does not know about contract specifiers.  NOTE these are not
+      substituted at this point.  */
+   if (tree ctrct = get_fn_contract_specifiers (t))
+     set_fn_contract_specifiers (r, ctrct);
+ 
+   /* The parms have now been substituted, check for incorrect const cases.  */
+   check_postconditions_in_redecl (t, r);
+ 
    if (DECL_FRIEND_CONTEXT (t))
      SET_DECL_FRIEND_CONTEXT (r,
  			     tsubst (DECL_FRIEND_CONTEXT (t),
*************** tsubst_expr (tree t, tree args, tsubst_f
*** 22238,22244 ****
  		      error_at (loc, "call to %<__builtin_operator_new%> "
  				     "does not select replaceable global "
  				     "allocation function");
! 		    else 
  		      error_at (loc, "call to %<__builtin_operator_delete%> "
  				     "does not select replaceable global "
  				     "deallocation function");
--- 22273,22279 ----
  		      error_at (loc, "call to %<__builtin_operator_new%> "
  				     "does not select replaceable global "
  				     "allocation function");
! 		    else
  		      error_at (loc, "call to %<__builtin_operator_delete%> "
  				     "does not select replaceable global "
  				     "deallocation function");
*************** tsubst_expr (tree t, tree args, tsubst_f
*** 22647,22653 ****
  					       complain, adc_variable_type);
  		    }
  		  gcc_assert (cp_unevaluated_operand
- 			      || processing_contract_condition
  			      || TREE_STATIC (r)
  			      || decl_constant_var_p (r)
  			      || seen_error ());
--- 22682,22687 ----
*************** tsubst_expr (tree t, tree args, tsubst_f
*** 23006,23011 ****
--- 23040,23050 ----
  	  /* force_paren_expr can also create a VIEW_CONVERT_EXPR.  */
  	  RETURN (finish_parenthesized_expr (op));
  
+ 	check_param_in_postcondition (op, EXPR_LOCATION (t));
+ 
+ 	if (flag_contracts && processing_contract_condition)
+ 	    op = constify_contract_access (op);
+ 
  	/* Otherwise, we're dealing with a wrapper to make a C++20 template
  	   parameter object const.  */
  	if (TREE_TYPE (op) == NULL_TREE
*************** regenerate_decl_from_template (tree decl
*** 27953,27971 ****
  	    DECL_CONTEXT (t) = decl;
  	}
  
!       if (DECL_CONTRACTS (decl))
  	{
  	  /* If we're regenerating a specialization, the contracts will have
  	     been copied from the most general template. Replace those with
  	     the ones from the actual specialization.  */
  	  tree tmpl = DECL_TI_TEMPLATE (decl);
  	  if (DECL_TEMPLATE_SPECIALIZATION (tmpl))
! 	    {
! 	      remove_contract_attributes (decl);
! 	      copy_contract_attributes (decl, code_pattern);
! 	    }
  
! 	  tsubst_contract_attributes (decl, args, tf_warning_or_error, code_pattern);
  	}
  
        /* Merge additional specifiers from the CODE_PATTERN.  */
--- 27992,28008 ----
  	    DECL_CONTEXT (t) = decl;
  	}
  
!       if (tree attr = get_fn_contract_specifiers (decl))
  	{
  	  /* If we're regenerating a specialization, the contracts will have
  	     been copied from the most general template. Replace those with
  	     the ones from the actual specialization.  */
  	  tree tmpl = DECL_TI_TEMPLATE (decl);
  	  if (DECL_TEMPLATE_SPECIALIZATION (tmpl))
! 	    attr = get_fn_contract_specifiers (code_pattern);
  
! 	  tsubst_contract_specifiers (attr, decl, args,
! 				      tf_warning_or_error, code_pattern);
  	}
  
        /* Merge additional specifiers from the CODE_PATTERN.  */
*************** finish_expansion_stmt (tree expansion_st
*** 33125,33131 ****
      return;
  
    location_t loc = DECL_SOURCE_LOCATION (range_decl);
!   tree begin = NULL_TREE;
    auto_vec<tree, 8> destruct_decls;
    if (BRACE_ENCLOSED_INITIALIZER_P (expansion_init))
      {
--- 33162,33168 ----
      return;
  
    location_t loc = DECL_SOURCE_LOCATION (range_decl);
!   tree begin = NULL_TREE, begin_minus_begin_type = NULL_TREE;
    auto_vec<tree, 8> destruct_decls;
    if (BRACE_ENCLOSED_INITIALIZER_P (expansion_init))
      {
*************** finish_expansion_stmt (tree expansion_st
*** 33272,33281 ****
  	  init = CONSTRUCTOR_ELT (expansion_init, i)->value;
  	  break;
  	case esk_iterating:
! 	  tree iter_init, auto_node, iter_type, iter;
  	  iter_init
! 	    = build_x_binary_op (loc, PLUS_EXPR, begin, ERROR_MARK,
! 				 build_int_cst (ptrdiff_type_node, i),
  				 ERROR_MARK, NULL_TREE, NULL,
  				 tf_warning_or_error);
  	  auto_node = make_auto ();
--- 33309,33336 ----
  	  init = CONSTRUCTOR_ELT (expansion_init, i)->value;
  	  break;
  	case esk_iterating:
! 	  tree iter_init, auto_node, iter_type, iter, it;
! 	  it = build_int_cst (ptrdiff_type_node, i);
! 	  if (begin_minus_begin_type == NULL_TREE)
! 	    {
! 	      ++cp_unevaluated_operand;
! 	      ++c_inhibit_evaluation_warnings;
! 	      tree begin_minus_begin
! 		= build_x_binary_op (loc, MINUS_EXPR, begin, TREE_CODE (begin),
! 				     begin, TREE_CODE (begin), NULL_TREE, NULL,
! 				     tf_warning_or_error);
! 	      --cp_unevaluated_operand;
! 	      --c_inhibit_evaluation_warnings;
! 	      begin_minus_begin_type
! 		= finish_decltype_type (begin_minus_begin, false,
! 					tf_warning_or_error);
! 	    }
! 	  it = build_constructor_single (init_list_type_node, NULL_TREE, it);
! 	  CONSTRUCTOR_IS_DIRECT_INIT (it) = true;
! 	  it = finish_compound_literal (begin_minus_begin_type, it,
! 					tf_warning_or_error, fcl_functional);
  	  iter_init
! 	    = build_x_binary_op (loc, PLUS_EXPR, begin, ERROR_MARK, it,
  				 ERROR_MARK, NULL_TREE, NULL,
  				 tf_warning_or_error);
  	  auto_node = make_auto ();
diff -Nrcpad gcc-16-20260125/gcc/cp/reflect.cc gcc-16-20260201/gcc/cp/reflect.cc
*** gcc-16-20260125/gcc/cp/reflect.cc	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/cp/reflect.cc	Sun Feb  1 22:32:07 2026
*************** static tree
*** 2805,2817 ****
  eval_has_template_arguments (tree r)
  {
    r = MAYBE_BASELINK_FUNCTIONS (r);
!   /* Presumably for
         typedef cls_tmpl<int> TYPE;
!      'has_template_arguments (^^TYPE)' should be false?  */
!   if (TYPE_P (r)
!       && typedef_variant_p (r)
!       && !alias_template_specialization_p (r, nt_opaque))
!     return boolean_false_node;
    if (primary_template_specialization_p (r)
        || variable_template_specialization_p (r))
      return boolean_true_node;
--- 2805,2816 ----
  eval_has_template_arguments (tree r)
  {
    r = MAYBE_BASELINK_FUNCTIONS (r);
!   /* For
         typedef cls_tmpl<int> TYPE;
!      'has_template_arguments (^^TYPE)' should be false.  */
!   if (TYPE_P (r) && typedef_variant_p (r))
!     return (alias_template_specialization_p (r, nt_opaque)
! 	    ? boolean_true_node : boolean_false_node);
    if (primary_template_specialization_p (r)
        || variable_template_specialization_p (r))
      return boolean_true_node;
*************** eval_annotations_of (location_t loc, con
*** 3768,3773 ****
--- 3767,3773 ----
        type = remove_const (type);
      }
  
+   r = maybe_get_first_fn (r);
    if (kind == REFLECT_BASE)
      {
        gcc_assert (TREE_CODE (r) == TREE_BINFO);
*************** static tree
*** 3919,3924 ****
--- 3919,3925 ----
  eval_type_trait (location_t loc, tree type1, tree type2, cp_trait_kind kind)
  {
    tree r = finish_trait_expr (loc, kind, type1, type2);
+   gcc_checking_assert (r != error_mark_node);
    STRIP_ANY_LOCATION_WRAPPER (r);
    return r;
  }
*************** eval_can_substitute (location_t loc, con
*** 5338,5344 ****
        if (fn == error_mark_node)
  	return boolean_false_node;
        fn = resolve_nondeduced_context_or_error (fn, tf_none);
!       if (fn == error_mark_node)
  	return boolean_false_node;
        return boolean_true_node;
      }
--- 5339,5345 ----
        if (fn == error_mark_node)
  	return boolean_false_node;
        fn = resolve_nondeduced_context_or_error (fn, tf_none);
!       if (fn == error_mark_node || undeduced_auto_decl (fn))
  	return boolean_false_node;
        return boolean_true_node;
      }
*************** eval_define_aggregate (location_t loc, c
*** 5896,5901 ****
--- 5897,5910 ----
        *non_constant_p = true;
        return call;
      }
+   if (TYPE_BEING_DEFINED (type))
+     {
+       if (!cxx_constexpr_quiet_p (ctx))
+ 	error_at (loc, "first %<define_aggregate%> argument is a reflection "
+ 		       "of a class type %qT being defined", type);
+       *non_constant_p = true;
+       return call;
+     }
    hash_set<tree> nameset;
    for (int i = 0; i < TREE_VEC_LENGTH (rvec); ++i)
      {
*************** eval_define_aggregate (location_t loc, c
*** 5952,5972 ****
    tree cscope = NULL_TREE, tscope = NULL_TREE;
    for (tree c = TYPE_CONTEXT (CP_DECL_CONTEXT (consteval_block)); c;
         c = get_containing_scope (c))
!     {
!       if (c == type)
! 	{
! 	  auto_diagnostic_group d;
! 	  error_at (loc, "%<define_aggregate%> evaluated from "
! 			 "%<consteval%> block enclosed by %qT being "
! 			 "defined", type);
! 	  inform (DECL_SOURCE_LOCATION (consteval_block),
! 		  "%<consteval%> block defined here");
! 	  return get_reflection_raw (loc, orig_type);
! 	}
!       if (cscope == NULL_TREE
! 	  && (TYPE_P (c) || TREE_CODE (c) == FUNCTION_DECL))
  	cscope = c;
!     }
    for (tree c = TYPE_CONTEXT (type); c; c = get_containing_scope (c))
      {
        if (c == consteval_block)
--- 5961,5971 ----
    tree cscope = NULL_TREE, tscope = NULL_TREE;
    for (tree c = TYPE_CONTEXT (CP_DECL_CONTEXT (consteval_block)); c;
         c = get_containing_scope (c))
!     if (TYPE_P (c) || TREE_CODE (c) == FUNCTION_DECL)
!       {
  	cscope = c;
! 	break;
!       }
    for (tree c = TYPE_CONTEXT (type); c; c = get_containing_scope (c))
      {
        if (c == consteval_block)
*************** class_members_of (location_t loc, const
*** 6563,6569 ****
      {
        tree m = field;
        if (TREE_CODE (field) == FIELD_DECL && DECL_ARTIFICIAL (field))
! 	continue; /* Ignore bases.  */
        else if (DECL_SELF_REFERENCE_P (field))
  	continue;
        else if (TREE_CODE (field) == TYPE_DECL)
--- 6562,6568 ----
      {
        tree m = field;
        if (TREE_CODE (field) == FIELD_DECL && DECL_ARTIFICIAL (field))
! 	continue; /* Ignore bases and the vptr.  */
        else if (DECL_SELF_REFERENCE_P (field))
  	continue;
        else if (TREE_CODE (field) == TYPE_DECL)
*************** can_extract_member_or_function_p (tree T
*** 7206,7212 ****
        tree F = TREE_TYPE (r);
        F = build_pointer_type (F);
        F = build_ptrmemfunc_type (F);
!       if (same_type_p (T, F))
  	return true;
        return false;
      }
--- 7205,7211 ----
        tree F = TREE_TYPE (r);
        F = build_pointer_type (F);
        F = build_ptrmemfunc_type (F);
!       if (same_type_p (T, F) || fnptr_conv_p (T, F))
  	return true;
        return false;
      }
*************** can_extract_member_or_function_p (tree T
*** 7214,7220 ****
      {
        tree F = TREE_TYPE (r);
        F = build_pointer_type (F);
!       if (same_type_p (T, F))
  	return true;
        return false;
      }
--- 7213,7219 ----
      {
        tree F = TREE_TYPE (r);
        F = build_pointer_type (F);
!       if (same_type_p (T, F) || fnptr_conv_p (T, F))
  	return true;
        return false;
      }
*************** extract_member_or_function (location_t l
*** 7250,7256 ****
  
    const tsubst_flags_t complain = complain_flags (ctx);
    if (POINTER_TYPE_P (T))
!     return cp_build_addr_expr (r, complain);
    else
      {
        if (!mark_used (r, complain))
--- 7249,7258 ----
  
    const tsubst_flags_t complain = complain_flags (ctx);
    if (POINTER_TYPE_P (T))
!     {
!       r = cp_build_addr_expr (r, complain);
!       return perform_implicit_conversion (T, r, complain);
!     }
    else
      {
        if (!mark_used (r, complain))
*************** splice (tree refl)
*** 7988,7996 ****
      refl = fold_non_dependent_expr (refl, tf_warning_or_error, true);
    else
      refl = cxx_constant_value (refl);
    if (!REFLECT_EXPR_P (refl))
!     /* I don't wanna do your dirty work no more.  */
!     return error_mark_node;
  
    /* We are bringing some entity from the unevaluated expressions world
       to possibly outside of that, mark it used.  */
--- 7990,8006 ----
      refl = fold_non_dependent_expr (refl, tf_warning_or_error, true);
    else
      refl = cxx_constant_value (refl);
+   if (refl == error_mark_node)
+     {
+       gcc_checking_assert (seen_error ());
+       return error_mark_node;
+     }
    if (!REFLECT_EXPR_P (refl))
!     {
!       error_at (cp_expr_loc_or_input_loc (refl), "splice argument must be an "
! 		"expression of type %qs", "std::meta::info");
!       return error_mark_node;
!     }
  
    /* We are bringing some entity from the unevaluated expressions world
       to possibly outside of that, mark it used.  */
*************** check_splice_expr (location_t loc, locat
*** 8392,8411 ****
       -- a local entity such that there is a lambda scope that intervenes
       between the expression and the point at which S was introduced"
       This also checks ODR violations (reflect/odr1.C).  */
!   if (outer_automatic_var_p (t)
!       && process_outer_var_ref (t, tf_none) == error_mark_node)
!     {
!       /* Not letting process_outer_var_ref emit the error so that we can
! 	 say "in a splice expression".  */
!       if (complain_p)
  	{
! 	  auto_diagnostic_group d;
! 	  error_at (loc, "use of local variable with automatic storage from "
! 		    "containing function in a splice expression");
! 	  inform (DECL_SOURCE_LOCATION (t), "%q#D declared here", t);
  	}
-       return false;
-     }
  
    /* If we had a reflect_kind here, we could just check for
       REFLECT_ANNOTATION and be done with it.  But we don't have it yet (TODO),
--- 8402,8422 ----
       -- a local entity such that there is a lambda scope that intervenes
       between the expression and the point at which S was introduced"
       This also checks ODR violations (reflect/odr1.C).  */
!   if (outer_automatic_var_p (t))
!     if (tree r = process_outer_var_ref (t, tf_none))
!       if (r == error_mark_node || is_capture_proxy (r))
  	{
! 	  /* Not letting process_outer_var_ref emit the error so that we can
! 	     say "in a splice expression".  */
! 	  if (complain_p)
! 	    {
! 	      auto_diagnostic_group d;
! 	      error_at (loc, "use of local variable with automatic storage "
! 			"from containing function in a splice expression");
! 	      inform (DECL_SOURCE_LOCATION (t), "%q#D declared here", t);
! 	    }
! 	  return false;
  	}
  
    /* If we had a reflect_kind here, we could just check for
       REFLECT_ANNOTATION and be done with it.  But we don't have it yet (TODO),
diff -Nrcpad gcc-16-20260125/gcc/cp/search.cc gcc-16-20260201/gcc/cp/search.cc
*** gcc-16-20260125/gcc/cp/search.cc	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/cp/search.cc	Sun Feb  1 22:32:07 2026
*************** check_final_overrider (tree overrider, t
*** 2184,2215 ****
        return 0;
      }
  
-   if (!DECL_HAS_CONTRACTS_P (basefn) && DECL_HAS_CONTRACTS_P (overrider))
-     {
-       auto_diagnostic_group d;
-       error ("function with contracts %q+D overriding contractless function",
- 	     overrider);
-       inform (DECL_SOURCE_LOCATION (basefn),
- 	      "overridden function is %qD", basefn);
-       return 0;
-     }
-   else if (DECL_HAS_CONTRACTS_P (basefn) && !DECL_HAS_CONTRACTS_P (overrider))
-     {
-       /* We're inheriting basefn's contracts; create a copy of them but
- 	 replace references to their parms to our parms.  */
-       inherit_base_contracts (overrider, basefn);
-     }
-   else if (DECL_HAS_CONTRACTS_P (basefn) && DECL_HAS_CONTRACTS_P (overrider))
-     {
-       /* We're in the process of completing the overrider's class, which means
- 	 our conditions definitely are not parsed so simply chain on the
- 	 basefn for later checking.
- 
- 	 Note that OVERRIDER's contracts will have been fully parsed at the
- 	 point the deferred match is run.  */
-       defer_guarded_contract_match (overrider, basefn, DECL_CONTRACTS (basefn));
-     }
- 
    if (DECL_FINAL_P (basefn))
      {
        auto_diagnostic_group d;
--- 2184,2189 ----
diff -Nrcpad gcc-16-20260125/gcc/cp/semantics.cc gcc-16-20260201/gcc/cp/semantics.cc
*** gcc-16-20260125/gcc/cp/semantics.cc	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/cp/semantics.cc	Sun Feb  1 22:32:07 2026
*************** along with GCC; see the file COPYING3.
*** 47,52 ****
--- 47,53 ----
  #include "memmodel.h"
  #include "gimplify.h"
  #include "contracts.h"
+ #include "c-family/c-pragma.h"
  
  /* There routines provide a modular interface to perform many parsing
     operations.  They may therefore be used during actual parsing, or
*************** set_one_cleanup_loc (tree t, location_t
*** 609,616 ****
--- 610,619 ----
  {
    if (!t)
      return;
+ 
    if (TREE_CODE (t) != POSTCONDITION_STMT)
      protected_set_expr_location (t, loc);
+ 
    /* Avoid locus differences for C++ cdtor calls depending on whether
       cdtor_returns_this: a conversion to void is added to discard the return
       value, and this conversion ends up carrying the location, and when it
*************** finish_this_expr (void)
*** 3665,3673 ****
    else if (fn && DECL_STATIC_FUNCTION_P (fn))
      error ("%<this%> is unavailable for static member functions");
    else if (fn && processing_contract_condition && DECL_CONSTRUCTOR_P (fn))
!     error ("invalid use of %<this%> before it is valid");
    else if (fn && processing_contract_condition && DECL_DESTRUCTOR_P (fn))
!     error ("invalid use of %<this%> after it is valid");
    else if (fn)
      error ("invalid use of %<this%> in non-member function");
    else
--- 3668,3676 ----
    else if (fn && DECL_STATIC_FUNCTION_P (fn))
      error ("%<this%> is unavailable for static member functions");
    else if (fn && processing_contract_condition && DECL_CONSTRUCTOR_P (fn))
!     error ("invalid use of %<this%> in a constructor %<pre%> condition");
    else if (fn && processing_contract_condition && DECL_DESTRUCTOR_P (fn))
!     error ("invalid use of %<this%> in a destructor %<post%> condition");
    else if (fn)
      error ("invalid use of %<this%> in non-member function");
    else
*************** finish_id_expression_1 (tree id_expressi
*** 4812,4818 ****
        /* A use in unevaluated operand might not be instantiated appropriately
  	 if tsubst_copy builds a dummy parm, or if we never instantiate a
  	 generic lambda, so mark it now.  */
!       if (processing_template_decl && cp_unevaluated_operand)
  	mark_type_use (decl);
  
        /* Disallow uses of local variables from containing functions, except
--- 4815,4823 ----
        /* A use in unevaluated operand might not be instantiated appropriately
  	 if tsubst_copy builds a dummy parm, or if we never instantiate a
  	 generic lambda, so mark it now.  */
!       if (processing_template_decl
! 	  && (cp_unevaluated_operand
! 	      || generic_lambda_fn_p (current_function_decl)))
  	mark_type_use (decl);
  
        /* Disallow uses of local variables from containing functions, except
*************** finish_id_expression_1 (tree id_expressi
*** 4884,4889 ****
--- 4889,4898 ----
  		   "integral or enumeration type", decl, TREE_TYPE (decl));
  	  *non_integral_constant_expression_p = true;
  	}
+ 
+       if (flag_contracts && processing_contract_condition)
+ 	r = constify_contract_access (r);
+ 
        return r;
      }
    else if (TREE_CODE (decl) == UNBOUND_CLASS_TEMPLATE)
*************** finish_id_expression_1 (tree id_expressi
*** 5007,5012 ****
--- 5016,5029 ----
  	}
        else if (TREE_CODE (decl) == FIELD_DECL)
  	{
+ 	  if (flag_contracts && processing_contract_condition
+ 	      && contract_class_ptr == current_class_ptr)
+ 	    {
+ 	      error ("%qD 'this' required when accessing a member within a "
+ 		  "constructor precondition or destructor postcondition "
+ 		  "contract check", decl);
+ 		      return error_mark_node;
+ 	    }
  	  /* Since SCOPE is NULL here, this is an unqualified name.
  	     Access checking has been performed during name lookup
  	     already.  Turn off checking to avoid duplicate errors.  */
*************** finish_id_expression_1 (tree id_expressi
*** 5030,5035 ****
--- 5047,5060 ----
  		      && !shared_member_p (decl))))
  	    {
  	      /* A set of member functions.  */
+ 	      if (flag_contracts && processing_contract_condition
+ 		  && contract_class_ptr == current_class_ptr)
+ 		{
+ 		  error ("%qD 'this' required when accessing a member within a "
+ 		      "constructor precondition or destructor postcondition "
+ 		      "contract check", decl);
+ 		  return error_mark_node;
+ 		}
  	      decl = maybe_dummy_object (DECL_CONTEXT (first_fn), 0);
  	      return finish_class_member_access_expr (decl, id_expression,
  						      /*template_p=*/false,
*************** finish_id_expression_1 (tree id_expressi
*** 5065,5070 ****
--- 5090,5099 ----
  	}
      }
  
+   check_param_in_postcondition (decl, location);
+   if (flag_contracts && processing_contract_condition)
+     decl = constify_contract_access (decl);
+ 
    return cp_expr (decl, location);
  }
  
*************** cexpr_str::extract (location_t location,
*** 12827,12832 ****
--- 12856,12879 ----
  	      return false;
  	    }
  	}
+       /* Convert the string from execution charset to SOURCE_CHARSET.  */
+       cpp_string istr, ostr;
+       istr.len = len;
+       istr.text = (const unsigned char *) msg;
+       if (!cpp_translate_string (parse_in, &istr, &ostr, CPP_STRING, true))
+ 	{
+ 	  error_at (location, "could not convert constexpr string from "
+ 			      "ordinary literal encoding to source character "
+ 			      "set");
+ 	  return false;
+ 	}
+       else
+ 	{
+ 	  if (buf)
+ 	    XDELETEVEC (buf);
+ 	  msg = buf = const_cast <char *> ((const char *) ostr.text);
+ 	  len = ostr.len;
+ 	}
      }
    else
      {
*************** finish_decltype_type (tree expr, bool id
*** 13036,13041 ****
--- 13083,13094 ----
        if (identifier_p (expr))
          expr = lookup_name (expr);
  
+       /* If e is a constified expression inside a contract assertion,
+ 	 strip the const wrapper. Per P2900R14, "For a function f with the
+ 	 return type T , the result name is an lvalue of type const T , decltype(r)
+ 	 is T , and decltype((r)) is const T&."  */
+       expr = strip_contract_const_wrapper (expr);
+ 
        if (INDIRECT_REF_P (expr)
  	  || TREE_CODE (expr) == VIEW_CONVERT_EXPR)
          /* This can happen when the expression is, e.g., "a.b". Just
diff -Nrcpad gcc-16-20260125/gcc/cp/tree.cc gcc-16-20260201/gcc/cp/tree.cc
*** gcc-16-20260125/gcc/cp/tree.cc	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/cp/tree.cc	Sun Feb  1 22:32:07 2026
*************** static tree verify_stmt_tree_r (tree *,
*** 46,52 ****
  
  static tree handle_init_priority_attribute (tree *, tree, tree, int, bool *);
  static tree handle_abi_tag_attribute (tree *, tree, tree, int, bool *);
- static tree handle_contract_attribute (tree *, tree, tree, int, bool *);
  static tree handle_no_dangling_attribute (tree *, tree, tree, int, bool *);
  static tree handle_annotation_attribute (tree *, tree, tree, int, bool *);
  
--- 46,51 ----
*************** c_build_qualified_type (tree type, int t
*** 1471,1476 ****
--- 1470,1496 ----
    return cp_build_qualified_type (type, type_quals);
  }
  
+ /* Implementation of the build_lang_qualified_type langhook.  */
+ tree
+ cxx_build_lang_qualified_type (tree type, tree otype, int type_quals)
+ {
+   /* Only handle ARRAY_TYPEs using cp_build_qualified_type, so that
+      quals are pushed to the element type.  That is needed for PR101312.
+      For other types just keep using build_qualified_type with
+      cxx_copy_lang_qualifiers if needed, otherwise we can run into
+      issues with FUNCTION_TYPEs with cv-qualifier-seq vs. type-specifier,
+      or REFERENCE_TYPE which will error on certain TYPE_QUALS.  */
+   if (TREE_CODE (type) == ARRAY_TYPE)
+     return cp_build_qualified_type (type, type_quals);
+   else
+     {
+       tree ret = build_qualified_type (type, type_quals);
+       if (otype)
+ 	ret = cxx_copy_lang_qualifiers (ret, otype);
+       return ret;
+     }
+ }
+ 
  
  /* Make a variant of TYPE, qualified with the TYPE_QUALS.  Handles
     arrays correctly.  In particular, if TYPE is an array of T's, and
*************** cxx_printable_name_internal (tree decl,
*** 2859,2864 ****
--- 2879,2893 ----
        /* yes, so return it.  */
        return print_ring[i];
  
+   const char *ret = lang_decl_name (decl, v, translate);
+ 
+   /* The lang_decl_name call could have called this function recursively,
+      so check again.  */
+   for (i = 0; i < PRINT_RING_SIZE; i++)
+     if (uid_ring[i] == DECL_UID (decl) && translate == trans_ring[i])
+       /* yes, so return it.  */
+       return print_ring[i];
+ 
    if (++ring_counter == PRINT_RING_SIZE)
      ring_counter = 0;
  
*************** cxx_printable_name_internal (tree decl,
*** 2878,2884 ****
  
    free (print_ring[ring_counter]);
  
!   print_ring[ring_counter] = xstrdup (lang_decl_name (decl, v, translate));
    uid_ring[ring_counter] = DECL_UID (decl);
    trans_ring[ring_counter] = translate;
    return print_ring[ring_counter];
--- 2907,2913 ----
  
    free (print_ring[ring_counter]);
  
!   print_ring[ring_counter] = xstrdup (ret);
    uid_ring[ring_counter] = DECL_UID (decl);
    trans_ring[ring_counter] = translate;
    return print_ring[ring_counter];
*************** called_fns_equal (tree t1, tree t2)
*** 4095,4144 ****
      return cp_tree_equal (t1, t2);
  }
  
- bool comparing_override_contracts;
- 
- /* In a component reference, return the innermost object of
-    the postfix-expression.  */
- 
- static tree
- get_innermost_component (tree t)
- {
-   gcc_assert (TREE_CODE (t) == COMPONENT_REF);
-   while (TREE_CODE (t) == COMPONENT_REF)
-     t = TREE_OPERAND (t, 0);
-   return t;
- }
- 
- /* Returns true if T is a possibly converted 'this' or '*this' expression.  */
- 
- static bool
- is_this_expression (tree t)
- {
-   t = get_innermost_component (t);
-   /* See through deferences and no-op conversions.  */
-   if (INDIRECT_REF_P (t))
-     t = TREE_OPERAND (t, 0);
-   if (TREE_CODE (t) == NOP_EXPR)
-     t = TREE_OPERAND (t, 0);
-   return is_this_parameter (t);
- }
- 
- static bool
- comparing_this_references (tree t1, tree t2)
- {
-   return is_this_expression (t1) && is_this_expression (t2);
- }
- 
- static bool
- equivalent_member_references (tree t1, tree t2)
- {
-   if (!comparing_this_references (t1, t2))
-     return false;
-   t1 = TREE_OPERAND (t1, 1);
-   t2 = TREE_OPERAND (t2, 1);
-   return t1 == t2;
- }
- 
  /* Return truthvalue of whether T1 is the same tree structure as T2.
     Return 1 if they are the same. Return 0 if they are different.  */
  
--- 4124,4129 ----
*************** cp_tree_equal (tree t1, tree t2)
*** 4155,4160 ****
--- 4140,4165 ----
    code1 = TREE_CODE (t1);
    code2 = TREE_CODE (t2);
  
+   if (comparing_contracts)
+     {
+       /* When comparing contracts, one declaration may already be
+ 	 genericized. Check for invisible references and unravel them
+ 	 for comparison purposes. Remember that a parameter is an invisible
+ 	 reference so we can compare the parameter types accordingly.  */
+       if (code1 == VIEW_CONVERT_EXPR
+ 	  && is_invisiref_parm (TREE_OPERAND(t1, 0)))
+ 	{
+ 	  t1 = TREE_OPERAND(t1, 0);
+ 	  code1 = TREE_CODE(t1);
+ 	}
+       if (code2 == VIEW_CONVERT_EXPR
+ 	  && is_invisiref_parm (TREE_OPERAND(t2, 0)))
+ 	{
+ 	  t2 = TREE_OPERAND(t2, 0);
+ 	  code2 = TREE_CODE(t2);
+ 	}
+     }
+ 
    if (code1 != code2)
      return false;
  
*************** cp_tree_equal (tree t1, tree t2)
*** 4317,4324 ****
  	   with parameters with identical contexts.  */
  	return false;
  
!       if (same_type_p (TREE_TYPE (t1), TREE_TYPE (t2)))
  	{
  	  if (DECL_ARTIFICIAL (t1) ^ DECL_ARTIFICIAL (t2))
  	    return false;
  	  if (CONSTRAINT_VAR_P (t1) ^ CONSTRAINT_VAR_P (t2))
--- 4322,4335 ----
  	   with parameters with identical contexts.  */
  	return false;
  
!       if (same_type_p (TREE_TYPE (t1), TREE_TYPE (t2)) || comparing_contracts)
  	{
+ 	  /* When comparing contracts, we already know the declarations match,
+ 	    and that the arguments have the same type. If one of the declarations
+ 	    has been genericised, then the type of arguments in that declaration
+ 	    will be adjusted for an invisible reference and the type comparison
+ 	    would spuriosly fail. The only thing we care about when comparing
+ 	    contractsis that we're using the same parameter.  */
  	  if (DECL_ARTIFICIAL (t1) ^ DECL_ARTIFICIAL (t2))
  	    return false;
  	  if (CONSTRAINT_VAR_P (t1) ^ CONSTRAINT_VAR_P (t2))
*************** cp_tree_equal (tree t1, tree t2)
*** 4515,4527 ****
  	return false;
        return true;
  
-     case COMPONENT_REF:
-       /* If we're comparing contract conditions of overrides, member references
- 	 compare equal if they designate the same member.  */
-       if (comparing_override_contracts)
- 	return equivalent_member_references (t1, t2);
-       break;
- 
      case REFLECT_EXPR:
        if (!cp_tree_equal (REFLECT_EXPR_HANDLE (t1), REFLECT_EXPR_HANDLE (t2))
  	  || REFLECT_EXPR_KIND (t1) != REFLECT_EXPR_KIND (t2))
--- 4526,4531 ----
*************** static const attribute_spec std_attribut
*** 5608,5617 ****
      handle_carries_dependency_attribute, NULL },
    { "indeterminate", 0, 0, true, false, false, false,
      handle_indeterminate_attribute, NULL },
-   { "pre", 0, -1, false, false, false, false,
-     handle_contract_attribute, NULL },
-   { "post", 0, -1, false, false, false, false,
-     handle_contract_attribute, NULL }
  };
  
  const scoped_attribute_specs std_attribute_table =
--- 5612,5617 ----
*************** handle_abi_tag_attribute (tree* node, tr
*** 5879,5895 ****
    return NULL_TREE;
  }
  
- /* Perform checking for contract attributes.  */
- 
- tree
- handle_contract_attribute (tree *ARG_UNUSED (node), tree ARG_UNUSED (name),
- 			   tree ARG_UNUSED (args), int ARG_UNUSED (flags),
- 			   bool *ARG_UNUSED (no_add_attrs))
- {
-   /* TODO: Is there any checking we could do here?  */
-   return NULL_TREE;
- }
- 
  /* Handle a "no_dangling" attribute; arguments as in
     struct attribute_spec.handler.  */
  
--- 5879,5884 ----
diff -Nrcpad gcc-16-20260125/gcc/cp/typeck.cc gcc-16-20260201/gcc/cp/typeck.cc
*** gcc-16-20260125/gcc/cp/typeck.cc	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/cp/typeck.cc	Sun Feb  1 22:32:07 2026
*************** cp_build_array_ref (location_t loc, tree
*** 4244,4249 ****
--- 4244,4250 ----
  	    {
  	      idx = save_expr (idx);
  	      op0 = save_expr (op0);
+ 	      warning_sentinel w (warn_unused_value);
  	      tree tem = build_compound_expr (loc, op0, idx);
  	      op0 = build_compound_expr (loc, tem, op0);
  	    }
diff -Nrcpad gcc-16-20260125/gcc/cp/typeck2.cc gcc-16-20260201/gcc/cp/typeck2.cc
*** gcc-16-20260125/gcc/cp/typeck2.cc	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/cp/typeck2.cc	Sun Feb  1 22:32:07 2026
*************** build_m_component_ref (tree datum, tree
*** 2459,2466 ****
  	{
  	mismatch:
  	  if (complain & tf_error)
! 	    error ("pointer to member type %qT incompatible with object "
! 		   "type %qT", type, objtype);
  	  return error_mark_node;
  	}
        else if (binfo == error_mark_node)
--- 2459,2474 ----
  	{
  	mismatch:
  	  if (complain & tf_error)
! 	    {
! 	      if (COMPLETE_TYPE_P (objtype))
! 		error ("pointer to member type %qT incompatible "
! 		       "with object type %qT because %qT is not "
! 		       "derived from %qT", ptrmem_type, objtype,
! 		       objtype, ctype);
! 	      else
! 		error ("pointer to member type %qT incompatible with "
! 		       "incomplete object type %qT", ptrmem_type, objtype);
! 	    }
  	  return error_mark_node;
  	}
        else if (binfo == error_mark_node)
diff -Nrcpad gcc-16-20260125/gcc/d/ChangeLog gcc-16-20260201/gcc/d/ChangeLog
*** gcc-16-20260125/gcc/d/ChangeLog	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/ChangeLog	Sun Feb  1 22:32:07 2026
***************
*** 1,3 ****
--- 1,143 ----
+ 2026-01-31  Iain Buclaw  <ibuclaw@gdcproject.org>
+ 
+ 	* dmd/MERGE: Merge upstream dmd e1f6680f50.
+ 	* Make-lang.in (D_FRONTEND_OBJS): Remove d/gluelayer.o, d/iasm.o,
+ 	d/iasmgcc.o.  Add d/iasm-package.o, d/iasm-gcc.o.
+ 	(d/iasm-%.o): New recipe.
+ 	* d-convert.cc (convert_expr): Remove library call to dynamic_cast.
+ 	* d-lang.cc (d_init_options): Set errorSupplementLimit parameter.
+ 	* decl.cc (DeclVisitor::visit): Update for new front-end interface.
+ 	* expr.cc (ExprVisitor::visit (EqualExp *)): Update for front-end
+ 	lowering expression using templates.
+ 	(ExprVisitor::visit (InExp *)): Likewise.
+ 	(ExprVisitor::visit (IndexExp *)): Likewise.
+ 	(ExprVisitor::visit (CastExp *)): Likewise.
+ 	(ExprVisitor::visit (RemoveExp *)): Likewise.
+ 	(ExprVisitor::visit (AddrExp *)): Likewise.
+ 	(ExprVisitor::visit (NewExp *)): Likewise.
+ 	(ExprVisitor::visit (ArrayLiteralExp *)): Likewise.
+ 	(ExprVisitor::visit (AssocArrayLiteralExp *)): Likewise.
+ 	* imports.cc (ImportVisitor::visit (AliasDeclaration *)): Update for
+ 	new front-end interface.
+ 	* runtime.def (DYNAMIC_CAST): Remove.
+ 	(INTERFACE_CAST): Remove.
+ 	(ARRAYLITERALTX): Remove.
+ 	(ADEQ2): Remove.
+ 	(ASSOCARRAYLITERALTX): Remove.
+ 	(AANEW): Remove.
+ 	(AAEQUAL): Remove.
+ 	(AAINX): Remove.
+ 	(AAGETY): Remove.
+ 	(AAGETRVALUEX): Remove.
+ 	(AADELX): Remove.
+ 	* typeinfo.cc (TypeInfoVisitor::visit): Layout xopEquals and xtoHash
+ 	in TypeInfo_AssociativeArray.
+ 	(create_typeinfo): Add new fields to internal typeinfo.
+ 	(check_typeinfo_type): Print instantiation trace of error.
+ 	* types.cc (TypeVisitor::visit (TypeStruct *)): Update for new
+ 	front-end interface.
+ 
+ 2026-01-30  Iain Buclaw  <ibuclaw@gdcproject.org>
+ 
+ 	* dmd/MERGE: Merge upstream dmd 1017635a96.
+ 	* dmd/VERSION: Bump version to v2.112.0-beta.1.
+ 	* decl.cc (DeclVisitor::finish_vtable): Update for new front-end
+ 	interface.
+ 	(DeclVisitor::visit): Likewise.
+ 	* typeinfo.cc (TypeInfoVisitor::visit): Likewise.
+ 
+ 2026-01-30  Iain Buclaw  <ibuclaw@gdcproject.org>
+ 
+ 	* decl.cc (DeclVisitor::visit (EnumDeclaration *)): Treat sinit member
+ 	field as a generic pointer.
+ 	(enum_initializer_decl): Likewise.
+ 	* expr.cc (ExprVisitor::visit (ArrayLiteralExp *)): Compute static
+ 	array length separately from creating type.
+ 	* modules.cc (struct module_info): Add ctor_decl, dtor_decl,
+ 	sharedctor_decl, shareddtor_decl, standalonector_decl, and
+ 	unittest_decl.
+ 	(layout_moduleinfo_fields): Add mi argument. Use it to check whether
+ 	module helpers have been generated.
+ 	(layout_moduleinfo): Likewise.
+ 	(build_module_tree): Cache generated module helpers in module_info.
+ 	* typeinfo.cc (cpp_type_info_ptrs): New variable.
+ 	(get_cpp_typeinfo_decl): Cache generated C++ type_info references in
+ 	cpp_type_info_ptrs.
+ 	* types.cc (TypeVisitor::visit (TypeEnum *)): Separate getting
+ 	front-end member value from building its CST tree.
+ 
+ 2026-01-30  Iain Buclaw  <ibuclaw@gdcproject.org>
+ 
+ 	PR d/123263
+ 	* d-codegen.cc (d_decl_context): Set DECL_CONTEXT of compiler
+ 	generated functions to that of parent module.
+ 
+ 2026-01-30  Iain Buclaw  <ibuclaw@gdcproject.org>
+ 
+ 	PR d/123264
+ 	* types.cc (finish_aggregate_type): Propagate struct TYPE_NAME to all
+ 	TYPE_NEXT_VARIANT types.
+ 
+ 2026-01-29  Iain Buclaw  <ibuclaw@gdcproject.org>
+ 
+ 	PR d/123407
+ 	* decl.cc (get_symbol_decl): Handle declarations with matching
+ 	assembler names, but different TREE_CODE.
+ 
+ 2026-01-29  Iain Buclaw  <ibuclaw@gdcproject.org>
+ 
+ 	PR d/123046
+ 	* d-codegen.cc (build_address): Return `null' when generating the
+ 	address of a `noreturn' declaration.
+ 	(d_build_call): Compare TYPE_MAIN_VARIANT of type with `noreturn'.
+ 	* decl.cc (get_fndecl_arguments): Likewise.
+ 	* types.cc (finish_aggregate_mode): Likewise.
+ 	(TypeVisitor::visit (TypeFunction *)): Likewise.
+ 
+ 2026-01-29  Iain Buclaw  <ibuclaw@gdcproject.org>
+ 
+ 	PR d/123349
+ 	* d-spec.cc (lang_specific_driver): Use xstrdup to copy -defaultlib
+ 	and -debuglib argument, and unconditionally free the old value.
+ 
+ 2026-01-28  Iain Buclaw  <ibuclaw@gdcproject.org>
+ 
+ 	PR d/123419
+ 	* expr.cc (ExprVisitor::visit (VarExp *)): Adjust assertion.
+ 
+ 2026-01-28  Iain Buclaw  <ibuclaw@gdcproject.org>
+ 
+ 	PR d/123798
+ 	* types.cc (insert_aggregate_bitfield): Set DECL_NONADDRESSABLE_P and
+ 	DECL_PADDING_P on bit-field decls.
+ 	(finish_aggregate_type): Pass the aligned bit offset to layout_decl.
+ 
+ 2026-01-28  Iain Buclaw  <ibuclaw@gdcproject.org>
+ 
+ 	PR d/121477
+ 	* d-codegen.cc (d_mark_addressable): Give an error if taking the
+ 	address of a DECL_BIT_FIELD.
+ 
+ 2026-01-28  Iain Buclaw  <ibuclaw@gdcproject.org>
+ 
+ 	PR d/123422
+ 	* expr.cc (ExprVisitor::visit (ArrayLiteralExp *)): Don't add
+ 	TARGET_EXPR around constructor.
+ 	* toir.cc (IRVisitor::visit (ReturnStatement *)): Recognize more
+ 	patterns for return value optimization.
+ 
+ 2026-01-27  Iain Buclaw  <ibuclaw@gdcproject.org>
+ 
+ 	PR d/120096
+ 	* expr.cc (ExprVisitor::visit (ArrayLiteralExp *)): Include saved side
+ 	effects in expression result.
+ 
+ 2026-01-27  Iain Buclaw  <ibuclaw@gdcproject.org>
+ 
+ 	PR d/122817
+ 	* d-lang.cc (d_parse_file): Set module filename location after
+ 	creation.
+ 
  2026-01-01  Jakub Jelinek  <jakub@redhat.com>
  
  	* gdc.texi: Bump @copyrights-d year.
diff -Nrcpad gcc-16-20260125/gcc/d/Make-lang.in gcc-16-20260201/gcc/d/Make-lang.in
*** gcc-16-20260125/gcc/d/Make-lang.in	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/Make-lang.in	Sun Feb  1 22:32:07 2026
*************** D_FRONTEND_OBJS = \
*** 135,144 ****
  	d/func.o \
  	d/funcsem.o \
  	d/globals.o \
- 	d/gluelayer.o \
  	d/hdrgen.o \
! 	d/iasm.o \
! 	d/iasmgcc.o \
  	d/id.o \
  	d/identifier.o \
  	d/impcnvtab.o \
--- 135,143 ----
  	d/func.o \
  	d/funcsem.o \
  	d/globals.o \
  	d/hdrgen.o \
! 	d/iasm-package.o \
! 	d/iasm-gcc.o \
  	d/id.o \
  	d/identifier.o \
  	d/impcnvtab.o \
*************** d/common-%.o: d/dmd/common/%.d
*** 420,425 ****
--- 419,428 ----
  	$(DCOMPILE) $(D_INCLUDES) $<
  	$(DPOSTCOMPILE)
  
+ d/iasm-%.o: d/dmd/iasm/%.d
+ 	$(DCOMPILE) $(D_INCLUDES) $<
+ 	$(DPOSTCOMPILE)
+ 
  d/mangle-%.o: d/dmd/mangle/%.d
  	$(DCOMPILE) $(D_INCLUDES) $<
  	$(DPOSTCOMPILE)
diff -Nrcpad gcc-16-20260125/gcc/d/d-codegen.cc gcc-16-20260201/gcc/d/d-codegen.cc
*** gcc-16-20260125/gcc/d/d-codegen.cc	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/d-codegen.cc	Sun Feb  1 22:32:07 2026
*************** d_decl_context (Dsymbol *dsym)
*** 78,83 ****
--- 78,84 ----
    Dsymbol *parent = dsym;
    Declaration *decl = dsym->isDeclaration ();
    AggregateDeclaration *ad = dsym->isAggregateDeclaration ();
+   FuncDeclaration *fd = dsym->isFuncDeclaration ();
  
    while ((parent = parent->toParent2 ()))
      {
*************** d_decl_context (Dsymbol *dsym)
*** 98,115 ****
        if (decl != NULL && decl->isDataseg ())
  	continue;
  
        /* Nested functions.  */
!       FuncDeclaration *fd = parent->isFuncDeclaration ();
!       if (fd != NULL)
! 	return get_symbol_decl (fd);
  
        /* Methods of classes or structs.  */
!       AggregateDeclaration *ad = parent->isAggregateDeclaration ();
!       if (ad != NULL)
  	{
! 	  tree context = build_ctype (ad->type);
  	  /* Want the underlying RECORD_TYPE.  */
! 	  if (ad->isClassDeclaration ())
  	    context = TREE_TYPE (context);
  
  	  return context;
--- 99,119 ----
        if (decl != NULL && decl->isDataseg ())
  	continue;
  
+       /* Likewise generated functions are part of module context.  */
+       if (fd != NULL && fd->isGenerated ()
+ 	  && !(fd->isVirtual () && fd->vtblIndex != -1))
+ 	continue;
+ 
        /* Nested functions.  */
!       if (FuncDeclaration *fdp = parent->isFuncDeclaration ())
! 	return get_symbol_decl (fdp);
  
        /* Methods of classes or structs.  */
!       if (AggregateDeclaration *adp = parent->isAggregateDeclaration ())
  	{
! 	  tree context = build_ctype (adp->type);
  	  /* Want the underlying RECORD_TYPE.  */
! 	  if (adp->isClassDeclaration ())
  	    context = TREE_TYPE (context);
  
  	  return context;
*************** build_address (tree exp)
*** 705,710 ****
--- 709,719 ----
    if (TREE_CODE (exp) == CONST_DECL)
      exp = DECL_INITIAL (exp);
  
+   /* Type `noreturn' has no storage, return `null' for the expression.  */
+   if (DECL_P (exp) && TREE_CODE (exp) != FIELD_DECL
+       && TYPE_MAIN_VARIANT (TREE_TYPE (exp)) == noreturn_type_node)
+     return compound_expr (init, null_pointer_node);
+ 
    /* Some expression lowering may request an address of a compile-time constant,
       or other non-lvalue expression.  Make sure it is assigned to a location we
       can reference.  */
*************** d_mark_addressable (tree exp, bool compl
*** 745,752 ****
  {
    switch (TREE_CODE (exp))
      {
-     case ADDR_EXPR:
      case COMPONENT_REF:
      case ARRAY_REF:
      case REALPART_EXPR:
      case IMAGPART_EXPR:
--- 754,765 ----
  {
    switch (TREE_CODE (exp))
      {
      case COMPONENT_REF:
+       if (complain && DECL_BIT_FIELD (TREE_OPERAND (exp, 1)))
+ 	error ("cannot take address of bit-field %qD", TREE_OPERAND (exp, 1));
+ 
+       /* Fall through.  */
+     case ADDR_EXPR:
      case ARRAY_REF:
      case REALPART_EXPR:
      case IMAGPART_EXPR:
*************** d_build_call (TypeFunction *tf, tree cal
*** 2357,2363 ****
  
  	  /* Type `noreturn` is a terminator, as no other arguments can possibly
  	     be evaluated after it.  */
! 	  if (TREE_TYPE (targ) == noreturn_type_node)
  	    noreturn_call = true;
  
  	  vec_safe_push (args, targ);
--- 2370,2376 ----
  
  	  /* Type `noreturn` is a terminator, as no other arguments can possibly
  	     be evaluated after it.  */
! 	  if (TYPE_MAIN_VARIANT (TREE_TYPE (targ)) == noreturn_type_node)
  	    noreturn_call = true;
  
  	  vec_safe_push (args, targ);
*************** d_build_call (TypeFunction *tf, tree cal
*** 2377,2383 ****
        unsigned int ix;
  
        FOR_EACH_VEC_SAFE_ELT (args, ix, arg)
! 	saved_args = compound_expr (saved_args, arg);
  
        /* Add a stub result type for the expression.  */
        tree result = build_zero_cst (TREE_TYPE (ctype));
--- 2390,2401 ----
        unsigned int ix;
  
        FOR_EACH_VEC_SAFE_ELT (args, ix, arg)
! 	{
! 	  saved_args = compound_expr (saved_args, arg);
! 
! 	  if (TYPE_MAIN_VARIANT (TREE_TYPE (arg)) == noreturn_type_node)
! 	    break;
! 	}
  
        /* Add a stub result type for the expression.  */
        tree result = build_zero_cst (TREE_TYPE (ctype));
diff -Nrcpad gcc-16-20260125/gcc/d/d-convert.cc gcc-16-20260201/gcc/d/d-convert.cc
*** gcc-16-20260125/gcc/d/d-convert.cc	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/d-convert.cc	Sun Feb  1 22:32:07 2026
*************** convert_expr (tree exp, Type *etype, Typ
*** 448,460 ****
  
  	      break;
  	    }
- 
- 	  /* The offset can only be determined at run-time, do dynamic cast.  */
- 	  libcall_fn libcall = cdfrom->isInterfaceDeclaration ()
- 	    ? LIBCALL_INTERFACE_CAST : LIBCALL_DYNAMIC_CAST;
- 
- 	  return build_libcall (libcall, totype, 2, exp,
- 				build_address (get_classinfo_decl (cdto)));
  	}
        /* else default conversion.  */
        break;
--- 448,453 ----
diff -Nrcpad gcc-16-20260125/gcc/d/d-lang.cc gcc-16-20260201/gcc/d/d-lang.cc
*** gcc-16-20260125/gcc/d/d-lang.cc	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/d-lang.cc	Sun Feb  1 22:32:07 2026
*************** d_init_options (unsigned int, cl_decoded
*** 304,309 ****
--- 304,310 ----
    global.params.useDeprecated = DIAGNOSTICinform;
    global.params.useWarnings = DIAGNOSTICoff;
    global.params.v.errorLimit = flag_max_errors;
+   global.params.v.errorSupplementLimit = flag_max_errors;
    global.params.v.messageStyle = MessageStyle::gnu;
  
    /* Extra GDC-specific options.  */
*************** d_parse_file (void)
*** 1128,1133 ****
--- 1129,1135 ----
  				      Identifier::idPool ("__stdin"),
  				      global.params.ddoc.doOutput,
  				      global.params.dihdr.doOutput);
+ 	  m->loc = Loc::singleFilename (in_fnames[i]);
  	  modules.push (m);
  
  	  /* Zero the padding past the end of the buffer so the D lexer has a
*************** d_parse_file (void)
*** 1148,1153 ****
--- 1150,1156 ----
  	  Module *m = Module::create (in_fnames[i], Identifier::idPool (name),
  				      global.params.ddoc.doOutput,
  				      global.params.dihdr.doOutput);
+ 	  m->loc = Loc::singleFilename (in_fnames[i]);
  	  modules.push (m);
  	  FileName::free (name);
  	}
diff -Nrcpad gcc-16-20260125/gcc/d/d-spec.cc gcc-16-20260201/gcc/d/d-spec.cc
*** gcc-16-20260125/gcc/d/d-spec.cc	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/d-spec.cc	Sun Feb  1 22:32:07 2026
*************** lang_specific_driver (cl_decoded_option
*** 162,185 ****
  	  break;
  
  	case OPT_defaultlib_:
! 	  if (defaultlib != NULL)
! 	    free (CONST_CAST (char *, defaultlib));
  	  if (arg != NULL)
  	    {
  	      args[i] |= SKIPOPT;
! 	      defaultlib = XNEWVEC (char, strlen (arg));
! 	      strcpy (CONST_CAST (char *, defaultlib), arg);
  	    }
  	  break;
  
  	case OPT_debuglib_:
! 	  if (debuglib != NULL)
! 	    free (CONST_CAST (char *, debuglib));
  	  if (arg != NULL)
  	    {
  	      args[i] |= SKIPOPT;
! 	      debuglib = XNEWVEC (char, strlen (arg));
! 	      strcpy (CONST_CAST (char *, debuglib), arg);
  	    }
  	  break;
  
--- 162,181 ----
  	  break;
  
  	case OPT_defaultlib_:
! 	  free (CONST_CAST (char *, defaultlib));
  	  if (arg != NULL)
  	    {
  	      args[i] |= SKIPOPT;
! 	      defaultlib = xstrdup (arg);
  	    }
  	  break;
  
  	case OPT_debuglib_:
! 	  free (CONST_CAST (char *, debuglib));
  	  if (arg != NULL)
  	    {
  	      args[i] |= SKIPOPT;
! 	      debuglib = xstrdup (arg);
  	    }
  	  break;
  
diff -Nrcpad gcc-16-20260125/gcc/d/decl.cc gcc-16-20260201/gcc/d/decl.cc
*** gcc-16-20260125/gcc/d/decl.cc	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/decl.cc	Sun Feb  1 22:32:07 2026
*************** get_fndecl_arguments (FuncDeclaration *d
*** 184,190 ****
  
  	  /* Type `noreturn` is a terminator, as no other arguments can possibly
  	     be evaluated after it.  */
! 	  if (TREE_TYPE (parm_decl) == noreturn_type_node)
  	    break;
  
  	  /* Chain them in the correct order.  */
--- 184,190 ----
  
  	  /* Type `noreturn` is a terminator, as no other arguments can possibly
  	     be evaluated after it.  */
! 	  if (TYPE_MAIN_VARIANT (TREE_TYPE (parm_decl)) == noreturn_type_node)
  	    break;
  
  	  /* Chain them in the correct order.  */
*************** public:
*** 449,455 ****
      if (dmd::isError (d)|| !d->members)
        return;
  
!     if (!d->needsCodegen ())
        return;
  
      for (size_t i = 0; i < d->members->length; i++)
--- 449,455 ----
      if (dmd::isError (d)|| !d->members)
        return;
  
!     if (!dmd::needsCodegen (d))
        return;
  
      for (size_t i = 0; i < d->members->length; i++)
*************** public:
*** 534,540 ****
        {
  	FuncDeclaration *fd = d->vtbl[i]->isFuncDeclaration ();
  
! 	if (!fd || (!fd->fbody && d->isAbstract ()))
  	  continue;
  
  	/* Ensure function has a return value.  */
--- 534,540 ----
        {
  	FuncDeclaration *fd = d->vtbl[i]->isFuncDeclaration ();
  
! 	if (!fd || (!fd->fbody && dmd::isAbstract (d)))
  	  continue;
  
  	/* Ensure function has a return value.  */
*************** public:
*** 643,649 ****
        {
  	FuncDeclaration *fd = d->vtbl[i]->isFuncDeclaration ();
  
! 	if (fd && (fd->fbody || !d->isAbstract ()))
  	  {
  	    CONSTRUCTOR_APPEND_ELT (elms, size_int (i),
  				    build_address (get_symbol_decl (fd)));
--- 643,649 ----
        {
  	FuncDeclaration *fd = d->vtbl[i]->isFuncDeclaration ();
  
! 	if (fd && (fd->fbody || !dmd::isAbstract (d)))
  	  {
  	    CONSTRUCTOR_APPEND_ELT (elms, size_int (i),
  				    build_address (get_symbol_decl (fd)));
*************** public:
*** 731,739 ****
      if (tc->sym->members && !dmd::isZeroInit (d->type))
        {
  	/* Generate static initializer.  */
! 	d->sinit = enum_initializer_decl (d);
! 	DECL_INITIAL (d->sinit) = build_expr (tc->sym->defaultval, true);
! 	d_finish_decl (d->sinit);
        }
  
      d->semanticRun (PASS::obj);
--- 731,740 ----
      if (tc->sym->members && !dmd::isZeroInit (d->type))
        {
  	/* Generate static initializer.  */
! 	tree sinit = enum_initializer_decl (d);
! 	d->sinit = sinit;
! 	DECL_INITIAL (sinit) = build_expr (tc->sym->defaultval, true);
! 	d_finish_decl (sinit);
        }
  
      d->semanticRun (PASS::obj);
*************** public:
*** 765,771 ****
  	    Expression *ie = dmd::initializerToExpression (d->_init);
  	    add_stmt (build_expr (ie));
  
! 	    Expression *e = d->type->defaultInitLiteral (d->loc);
  	    add_stmt (build_expr (e));
  	  }
  
--- 766,772 ----
  	    Expression *ie = dmd::initializerToExpression (d->_init);
  	    add_stmt (build_expr (ie));
  
! 	    Expression *e = dmd::defaultInitLiteral (d->type, d->loc);
  	    add_stmt (build_expr (e));
  	  }
  
*************** public:
*** 774,780 ****
  
      if (d->aliasTuple)
        {
! 	this->build_dsymbol (d->toAlias ());
  	return;
        }
  
--- 775,781 ----
  
      if (d->aliasTuple)
        {
! 	this->build_dsymbol (dmd::toAlias (d));
  	return;
        }
  
*************** public:
*** 833,839 ****
  	      DECL_INITIAL (decl) = layout_struct_initializer (ts->sym);
  	    else
  	      {
! 		Expression *e = d->type->defaultInitLiteral (d->loc);
  		DECL_INITIAL (decl) = build_expr (e, true);
  	      }
  	  }
--- 834,840 ----
  	      DECL_INITIAL (decl) = layout_struct_initializer (ts->sym);
  	    else
  	      {
! 		Expression *e = dmd::defaultInitLiteral (d->type, d->loc);
  		DECL_INITIAL (decl) = build_expr (e, true);
  	      }
  	  }
*************** get_symbol_decl (Declaration *decl)
*** 1213,1220 ****
  
    /* Deal with placeholder symbols immediately:
       SymbolDeclaration is used as a shell around an initializer symbol.  */
!   SymbolDeclaration *sd = decl->isSymbolDeclaration ();
!   if (sd)
      {
        decl->csym = aggregate_initializer_decl (sd->dsym);
        return decl->csym;
--- 1214,1220 ----
  
    /* Deal with placeholder symbols immediately:
       SymbolDeclaration is used as a shell around an initializer symbol.  */
!   if (SymbolDeclaration *sd = decl->isSymbolDeclaration ())
      {
        decl->csym = aggregate_initializer_decl (sd->dsym);
        return decl->csym;
*************** get_symbol_decl (Declaration *decl)
*** 1225,1232 ****
      return get_typeinfo_decl ((TypeInfoDeclaration *) decl);
  
    /* FuncAliasDeclaration is used to import functions from another scope.  */
!   FuncAliasDeclaration *fad = decl->isFuncAliasDeclaration ();
!   if (fad)
      {
        decl->csym = get_symbol_decl (fad->funcalias);
        return decl->csym;
--- 1225,1231 ----
      return get_typeinfo_decl ((TypeInfoDeclaration *) decl);
  
    /* FuncAliasDeclaration is used to import functions from another scope.  */
!   if (FuncAliasDeclaration *fad = decl->isFuncAliasDeclaration ())
      {
        decl->csym = get_symbol_decl (fad->funcalias);
        return decl->csym;
*************** get_symbol_decl (Declaration *decl)
*** 1261,1268 ****
      }
  
    /* Build the tree for the symbol.  */
!   FuncDeclaration *fd = decl->isFuncDeclaration ();
!   if (fd)
      {
        /* Run full semantic on functions we need to know about.  */
        if (!dmd::functionSemantic (fd))
--- 1260,1266 ----
      }
  
    /* Build the tree for the symbol.  */
!   if (FuncDeclaration *fd = decl->isFuncDeclaration ())
      {
        /* Run full semantic on functions we need to know about.  */
        if (!dmd::functionSemantic (fd))
*************** get_symbol_decl (Declaration *decl)
*** 1354,1382 ****
        if (IDENTIFIER_DSYMBOL (mangled_name))
  	{
  	  Declaration *other = IDENTIFIER_DSYMBOL (mangled_name);
! 	  tree olddecl = decl->csym;
! 	  decl->csym = get_symbol_decl (other);
! 
! 	  /* Update the symbol location to the current definition.  */
! 	  if (DECL_EXTERNAL (decl->csym) && !DECL_INITIAL (decl->csym))
! 	    DECL_SOURCE_LOCATION (decl->csym) = DECL_SOURCE_LOCATION (olddecl);
  
! 	  /* The current declaration is a prototype or marked extern, merge
! 	     applied user attributes and return.  */
! 	  if (DECL_EXTERNAL (olddecl) && !DECL_INITIAL (olddecl))
! 	    {
! 	      apply_user_attributes (decl, decl->csym);
! 	      return decl->csym;
! 	    }
! 	  /* The previous declaration is a prototype or marked extern, set the
! 	     current declaration as the main reference of the symbol.  */
! 	  else if (DECL_EXTERNAL (decl->csym) && !DECL_INITIAL (decl->csym))
  	    {
! 	      IDENTIFIER_DSYMBOL (mangled_name) = decl;
! 	      DECL_EXTERNAL (decl->csym) = 0;
  	    }
! 	  /* Non-extern, non-templated decls shouldn't be defined twice.  */
! 	  else if (!decl->isInstantiated ())
  	    ScopeDsymbol::multiplyDefined (decl->loc, decl, other);
  	}
        else
--- 1352,1389 ----
        if (IDENTIFIER_DSYMBOL (mangled_name))
  	{
  	  Declaration *other = IDENTIFIER_DSYMBOL (mangled_name);
! 	  tree newdecl = decl->csym;
! 	  tree olddecl = get_symbol_decl (other);
  
! 	  if (TREE_CODE (olddecl) == TREE_CODE (newdecl))
  	    {
! 	      /* Update the symbol location to the current definition.  */
! 	      if (DECL_EXTERNAL (olddecl) && !DECL_INITIAL (olddecl))
! 		DECL_SOURCE_LOCATION (olddecl) = DECL_SOURCE_LOCATION (newdecl);
! 
! 	      /* The current declaration is a prototype or marked extern, merge
! 		 applied user attributes and return.  */
! 	      if (DECL_EXTERNAL (newdecl) && !DECL_INITIAL (newdecl))
! 		{
! 		  apply_user_attributes (decl, olddecl);
! 		  decl->csym = olddecl;
! 		  return decl->csym;
! 		}
! 	      /* The previous declaration is a prototype or marked extern, set
! 		 the current declaration as the main reference of the symbol.
! 	       */
! 	      else if (DECL_EXTERNAL (olddecl) && !DECL_INITIAL (olddecl))
! 		{
! 		  IDENTIFIER_DSYMBOL (mangled_name) = decl;
! 		  decl->csym = olddecl;
! 		  DECL_EXTERNAL (decl->csym) = 0;
! 		}
! 	      /* Non-extern, non-templated decls shouldn't be defined twice.  */
! 	      else if (!decl->isInstantiated ())
! 		ScopeDsymbol::multiplyDefined (decl->loc, decl, other);
  	    }
! 	  /* Declarations are for conflicting kinds of symbol.  */
! 	  else
  	    ScopeDsymbol::multiplyDefined (decl->loc, decl, other);
  	}
        else
*************** get_symbol_decl (Declaration *decl)
*** 1418,1423 ****
--- 1425,1433 ----
      }
    else if (TREE_CODE (decl->csym) == FUNCTION_DECL)
      {
+       FuncDeclaration *fd = decl->isFuncDeclaration ();
+       gcc_assert (fd != NULL);
+ 
        /* Dual-context functions require the code generation to build an array
  	 for the context pointer of the function, making the delicate task of
  	 tracking which context to follow when encountering a non-local symbol,
*************** get_symbol_decl (Declaration *decl)
*** 1571,1576 ****
--- 1581,1587 ----
    if (decl->isDataseg () || decl->isCodeseg () || decl->isThreadlocal ())
      {
        /* Set TREE_PUBLIC by default, but allow private template to override.  */
+       FuncDeclaration *fd = decl->isFuncDeclaration ();
        if (!fd || !fd->isNested ())
  	TREE_PUBLIC (decl->csym) = 1;
  
*************** tree
*** 2444,2463 ****
  enum_initializer_decl (EnumDeclaration *decl)
  {
    if (decl->sinit)
!     return decl->sinit;
  
    gcc_assert (decl->ident);
  
    tree type = build_ctype (decl->type);
    tree ident = mangle_internal_decl (decl, "__init", "Z");
  
!   decl->sinit = declare_extern_var (ident, type);
!   DECL_LANG_SPECIFIC (decl->sinit) = build_lang_decl (NULL);
  
!   DECL_CONTEXT (decl->sinit) = d_decl_context (decl);
!   TREE_READONLY (decl->sinit) = 1;
  
!   return decl->sinit;
  }
  
  /* Return an anonymous static variable of type TYPE, initialized with INIT,
--- 2455,2475 ----
  enum_initializer_decl (EnumDeclaration *decl)
  {
    if (decl->sinit)
!     return (tree) decl->sinit;
  
    gcc_assert (decl->ident);
  
    tree type = build_ctype (decl->type);
    tree ident = mangle_internal_decl (decl, "__init", "Z");
  
!   tree sinit = declare_extern_var (ident, type);
!   DECL_LANG_SPECIFIC (sinit) = build_lang_decl (NULL);
  
!   DECL_CONTEXT (sinit) = d_decl_context (decl);
!   TREE_READONLY (sinit) = 1;
  
!   decl->sinit = sinit;
!   return sinit;
  }
  
  /* Return an anonymous static variable of type TYPE, initialized with INIT,
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/MERGE gcc-16-20260201/gcc/d/dmd/MERGE
*** gcc-16-20260125/gcc/d/dmd/MERGE	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/MERGE	Sun Feb  1 22:32:07 2026
***************
*** 1,4 ****
! 956e73d64e532a68213970316c2590c572ec03f3
  
  The first line of this file holds the git revision number of the last
  merge done from the dlang/dmd repository.
--- 1,4 ----
! e1f6680f50d147846316c2fa3363461a2aa7ac1d
  
  The first line of this file holds the git revision number of the last
  merge done from the dlang/dmd repository.
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/README.md gcc-16-20260201/gcc/d/dmd/README.md
*** gcc-16-20260125/gcc/d/dmd/README.md	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/README.md	Sun Feb  1 22:32:07 2026
*************** Note that these groups have no strict me
*** 35,40 ****
--- 35,41 ----
  | [mars.d](https://github.com/dlang/dmd/blob/master/compiler/src/dmd/mars.d)           | Argument parsing, path manipulation.                                  |
  | [cli.d](https://github.com/dlang/dmd/blob/master/compiler/src/dmd/cli.d)             | Define the command line interface                                     |
  | [dmdparams.d](https://github.com/dlang/dmd/blob/master/compiler/src/dmd/dmdparams.d) | DMD-specific parameters                                               |
+ | [dmsc.d](https://github.com/dlang/dmd/blob/master/compiler/src/dmd/dmsc.d)           | Configures and initializes the back-end                               |
  | [globals.d](https://github.com/dlang/dmd/blob/master/compiler/src/dmd/globals.d)     | Define a structure storing command line options                       |
  | [dinifile.d](https://github.com/dlang/dmd/blob/master/compiler/src/dmd/dinifile.d)   | Parse settings from .ini file (`sc.ini` / `dmd.conf`)                 |
  | [vsoptions.d](https://github.com/dlang/dmd/blob/master/compiler/src/dmd/vsoptions.d) | Detect the Microsoft Visual Studio toolchain for linking              |
*************** Note that these groups have no strict me
*** 170,178 ****
  
  | File                                                                    | Purpose                                   |
  |-------------------------------------------------------------------------|-------------------------------------------|
! | [iasm.d](https://github.com/dlang/dmd/blob/master/compiler/src/dmd/iasm.d)       | Inline assembly depending on the compiler |
! | [iasmdmd.d](https://github.com/dlang/dmd/blob/master/compiler/src/dmd/iasmdmd.d) | Inline assembly for DMD                   |
! | [iasmgcc.d](https://github.com/dlang/dmd/blob/master/compiler/src/dmd/iasmgcc.d) | Inline assembly for GDC                   |
  
  **Other**
  
--- 171,180 ----
  
  | File                                                                    | Purpose                                   |
  |-------------------------------------------------------------------------|-------------------------------------------|
! | [iasm/package.d](https://github.com/dlang/dmd/blob/master/compiler/src/dmd/iasm/package.d)       | Inline assembly depending on the compiler |
! | [iasm/dmdx86.d](https://github.com/dlang/dmd/blob/master/compiler/src/dmd/iasm/dmd.d) | Inline assembly for DMD X86_64            |
! | [iasm/dmdaarch64.d](https://github.com/dlang/dmd/blob/master/compiler/src/dmd/iasm/aarch64.d) | Inline assembly for DMD AArch64   |
! | [iasm/gcc.d](https://github.com/dlang/dmd/blob/master/compiler/src/dmd/iasm/gcc.d) | Inline assembly for GDC                   |
  
  **Other**
  
*************** Note that these groups have no strict me
*** 208,234 ****
  | [lib/scanmach.d](https://github.com/dlang/dmd/blob/master/compiler/src/dmd/lib/scanmach.d)     | Extract symbol names from a library in Mach-O format |
  | [lib/scanmscoff.d](https://github.com/dlang/dmd/blob/master/compiler/src/dmd/lib/scanmscoff.d) | Extract symbol names from a library in COFF format   |
  
  ### Code generation / back-end interfacing
  
  | File                                                                                        | Purpose                                                                             |
  |---------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------|
! | [dmsc.d](https://github.com/dlang/dmd/blob/master/compiler/src/dmd/dmsc.d)                           | Configures and initializes the back-end                                             |
! | [toobj.d](https://github.com/dlang/dmd/blob/master/compiler/src/dmd/toobj.d)                         | Convert an AST that went through all semantic phases into an object file            |
! | [toir.d](https://github.com/dlang/dmd/blob/master/compiler/src/dmd/toir.d)                           | Convert Dsymbols intermediate representation                                        |
! | [e2ir.d](https://github.com/dlang/dmd/blob/master/compiler/src/dmd/e2ir.d)                           | Convert Expressions to intermediate representation                                  |
! | [s2ir.d](https://github.com/dlang/dmd/blob/master/compiler/src/dmd/s2ir.d)                           | Convert Statements to intermediate representation                                   |
! | [stmtstate.d](https://github.com/dlang/dmd/blob/master/compiler/src/dmd/stmtstate.d)                 | Used to help transform statement AST into flow graph                                |
! | [toctype.d](https://github.com/dlang/dmd/blob/master/compiler/src/dmd/toctype.d)                     | Convert a D type to a type the back-end understands                                 |
! | [tocsym.d](https://github.com/dlang/dmd/blob/master/compiler/src/dmd/tocsym.d)                       | Convert a D symbol to a symbol the linker understands (with mangled name)           |
! | [argtypes_x86.d](https://github.com/dlang/dmd/blob/master/compiler/src/dmd/argtypes_x86.d)           | Convert a D type into simple (register) types for the 32-bit x86 ABI                |
! | [argtypes_sysv_x64.d](https://github.com/dlang/dmd/blob/master/compiler/src/dmd/argtypes_sysv_x64.d) | 'argtypes' for the x86_64 System V ABI                                              |
! | [argtypes_aarch64.d](https://github.com/dlang/dmd/blob/master/compiler/src/dmd/argtypes_aarch64.d)   | 'argtypes' for the AArch64 ABI                                                      |
! | [glue.d](https://github.com/dlang/dmd/blob/master/compiler/src/dmd/glue.d)                           | Generate the object file for function declarations                                  |
! | [gluelayer.d](https://github.com/dlang/dmd/blob/master/compiler/src/dmd/gluelayer.d)                 | Declarations for back-end functions that the front-end invokes                      |
! | [todt.d](https://github.com/dlang/dmd/blob/master/compiler/src/dmd/todt.d)                           | Convert initializers into structures that the back-end will add to the data segment |
! | [tocvdebug.d](https://github.com/dlang/dmd/blob/master/compiler/src/dmd/tovcdebug.d)                 | Generate debug info in the CV4 debug format.                                        |
! | [objc.d](https://github.com/dlang/dmd/blob/master/compiler/src/dmd/objc.d)                           | Objective-C interfacing                                                             |
! | [objc_glue.d](https://github.com/dlang/dmd/blob/master/compiler/src/dmd/objc_glue.d)                 | Glue code for Objective-C interop.                                                  |
  
  **Name mangling**
  
--- 210,237 ----
  | [lib/scanmach.d](https://github.com/dlang/dmd/blob/master/compiler/src/dmd/lib/scanmach.d)     | Extract symbol names from a library in Mach-O format |
  | [lib/scanmscoff.d](https://github.com/dlang/dmd/blob/master/compiler/src/dmd/lib/scanmscoff.d) | Extract symbol names from a library in COFF format   |
  
+ 
+ ### ABI
+ | File                                                                          | Purpose                                              |
+ | [argtypes_x86.d](https://github.com/dlang/dmd/blob/master/compiler/src/dmd/argtypes_x86.d)     | Convert a D type into simple (register) types for the 32-bit x86 ABI |
+ | [argtypes_sysv_x64.d](https://github.com/dlang/dmd/blob/master/compiler/src/dmd/argtypes_sysv_x64.d) | 'argtypes' for the x86_64 System V ABI |
+ | [argtypes_aarch64.d](https://github.com/dlang/dmd/blob/master/compiler/src/dmd/argtypes_aarch64.d)   | 'argtypes' for the AArch64 ABI |
  ### Code generation / back-end interfacing
  
  | File                                                                                        | Purpose                                                                             |
  |---------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------|
! | [stmtstate.d](https://github.com/dlang/dmd/blob/master/compiler/src/dmd/stmtstate.d)        | Used to help transform statement AST into flow graph    |
! | [objc.d](https://github.com/dlang/dmd/blob/master/compiler/src/dmd/objc.d)                  | Objective-C interfacing                                 |
! | [irgen/toobj.d](https://github.com/dlang/dmd/blob/master/compiler/src/dmd/irgen/toobj.d)      | Convert an AST that went through all semantic phases into an object file|
! | [irgen/toir.d](https://github.com/dlang/dmd/blob/master/compiler/src/dmd/irgen/toir.d)        | Convert Dsymbols intermediate representation                            |
! | [irgen/e2ir.d](https://github.com/dlang/dmd/blob/master/compiler/src/dmd/irgen/e2ir.d)        | Convert Expressions to intermediate representation                      |
! | [irgen/s2ir.d](https://github.com/dlang/dmd/blob/master/compiler/src/dmd/irgen/s2ir.d)        | Convert Statements to intermediate representation                       |
! | [irgen/toctype.d](https://github.com/dlang/dmd/blob/master/compiler/src/dmd/irgen/toctype.d)  | Convert a D type to a type the back-end understands                     |
! | [irgen/tocsym.d](https://github.com/dlang/dmd/blob/master/compiler/src/dmd/irgen/tocsym.d)    | Convert a D symbol to a symbol the linker understands (with mangled name) |
! | [irgen/package.d](https://github.com/dlang/dmd/blob/master/compiler/src/dmd/irgen/package.d)  | Generate the object file for function declarations                      |
! | [irgen/todt.d](https://github.com/dlang/dmd/blob/master/compiler/src/dmd/irgen/todt.d)        | Convert initializers into structures that the back-end will add to the data segment |
! | [irgen/tocvdebug.d](https://github.com/dlang/dmd/blob/master/compiler/src/dmd/irgen/tovcdebug.d)| Generate debug info in the CV4 debug format.                            |
! | [irgen/objc.d](https://github.com/dlang/dmd/blob/master/compiler/src/dmd/irgen/objc.d)| irgen code for Objective-C interop.                                      |
  
  **Name mangling**
  
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/VERSION gcc-16-20260201/gcc/d/dmd/VERSION
*** gcc-16-20260125/gcc/d/dmd/VERSION	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/VERSION	Sun Feb  1 22:32:07 2026
***************
*** 1 ****
! v2.111.0
--- 1 ----
! v2.112.0-beta.1
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/access.d gcc-16-20260201/gcc/d/dmd/access.d
*** gcc-16-20260125/gcc/d/dmd/access.d	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/access.d	Sun Feb  1 22:32:07 2026
*************** import dmd.dmodule;
*** 20,25 ****
--- 20,26 ----
  import dmd.dscope;
  import dmd.dstruct;
  import dmd.dsymbol;
+ import dmd.dsymbolsem : toAlias;
  import dmd.errors;
  import dmd.expression;
  import dmd.funcsem : overloadApply;
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/aggregate.d gcc-16-20260201/gcc/d/dmd/aggregate.d
*** gcc-16-20260125/gcc/d/dmd/aggregate.d	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/aggregate.d	Sun Feb  1 22:32:07 2026
*************** import dmd.declaration;
*** 25,43 ****
  import dmd.dscope;
  import dmd.dstruct;
  import dmd.dsymbol;
! import dmd.dsymbolsem : dsymbolSemantic, determineFields, search, determineSize, include;
  import dmd.dtemplate;
  import dmd.errors;
  import dmd.expression;
  import dmd.func;
- import dmd.globals;
  import dmd.hdrgen;
  import dmd.id;
  import dmd.identifier;
  import dmd.location;
  import dmd.mtype;
  import dmd.tokens;
- import dmd.typesem : defaultInit, addMod, size;
  import dmd.visitor;
  
  /**
--- 25,41 ----
  import dmd.dscope;
  import dmd.dstruct;
  import dmd.dsymbol;
! import dmd.dsymbolsem : determineSize;
  import dmd.dtemplate;
  import dmd.errors;
  import dmd.expression;
  import dmd.func;
  import dmd.hdrgen;
  import dmd.id;
  import dmd.identifier;
  import dmd.location;
  import dmd.mtype;
  import dmd.tokens;
  import dmd.visitor;
  
  /**
*************** extern (C++) abstract class AggregateDec
*** 171,177 ****
          sc2.parent = this;
          sc2.inunion = isUnionDeclaration();
          sc2.visibility = Visibility(Visibility.Kind.public_);
!         sc2.explicitVisibility = 0;
          sc2.aligndecl = null;
          sc2.userAttribDecl = null;
          sc2.namespace = null;
--- 169,175 ----
          sc2.parent = this;
          sc2.inunion = isUnionDeclaration();
          sc2.visibility = Visibility(Visibility.Kind.public_);
!         sc2.explicitVisibility = false;
          sc2.aligndecl = null;
          sc2.userAttribDecl = null;
          sc2.namespace = null;
*************** extern (C++) abstract class AggregateDec
*** 187,195 ****
          return fields.length - isNested() - (vthis2 !is null);
      }
  
!     abstract void finalizeSize();
! 
!     override final uinteger_t size(Loc loc)
      {
          //printf("+AggregateDeclaration::size() %s, scope = %p, sizeok = %d\n", toChars(), _scope, sizeok);
          bool ok = determineSize(this, loc);
--- 185,191 ----
          return fields.length - isNested() - (vthis2 !is null);
      }
  
!     override final ulong size(Loc loc)
      {
          //printf("+AggregateDeclaration::size() %s, scope = %p, sizeok = %d\n", toChars(), _scope, sizeok);
          bool ok = determineSize(this, loc);
*************** extern (C++) abstract class AggregateDec
*** 197,282 ****
          return ok ? structsize : SIZE_INVALID;
      }
  
-     /***************************************
-      * Calculate field[i].overlapped and overlapUnsafe, and check that all of explicit
-      * field initializers have unique memory space on instance.
-      * Returns:
-      *      true if any errors happen.
-      */
-     extern (D) final bool checkOverlappedFields()
-     {
-         //printf("AggregateDeclaration::checkOverlappedFields() %s\n", toChars());
-         assert(sizeok == Sizeok.done);
-         size_t nfields = fields.length;
-         if (isNested())
-         {
-             auto cd = isClassDeclaration();
-             if (!cd || !cd.baseClass || !cd.baseClass.isNested())
-                 nfields--;
-             if (vthis2 && !(cd && cd.baseClass && cd.baseClass.vthis2))
-                 nfields--;
-         }
-         bool errors = false;
- 
-         // Fill in missing any elements with default initializers
-         foreach (i; 0 .. nfields)
-         {
-             auto vd = fields[i];
-             if (vd.errors)
-             {
-                 errors = true;
-                 continue;
-             }
- 
-             const vdIsVoidInit = vd._init && vd._init.isVoidInitializer();
- 
-             // Find overlapped fields with the hole [vd.offset .. vd.offset.size()].
-             foreach (j; 0 .. nfields)
-             {
-                 if (i == j)
-                     continue;
-                 auto v2 = fields[j];
-                 if (v2.errors)
-                 {
-                     errors = true;
-                     continue;
-                 }
-                 if (!vd.isOverlappedWith(v2))
-                     continue;
- 
-                 // vd and v2 are overlapping.
-                 vd.overlapped = true;
-                 v2.overlapped = true;
- 
-                 if (!MODimplicitConv(vd.type.mod, v2.type.mod))
-                     v2.overlapUnsafe = true;
-                 if (!MODimplicitConv(v2.type.mod, vd.type.mod))
-                     vd.overlapUnsafe = true;
- 
-                 if (i > j)
-                     continue;
- 
-                 if (!v2._init)
-                     continue;
- 
-                 if (v2._init.isVoidInitializer())
-                     continue;
- 
-                 if (vd._init && !vdIsVoidInit && v2._init)
-                 {
-                     .error(loc, "overlapping default initialization for field `%s` and `%s`", v2.toChars(), vd.toChars());
-                     errors = true;
-                 }
-                 else if (v2._init && i < j)
-                 {
-                     .error(v2.loc, "union field `%s` with default initialization `%s` must be before field `%s`",
-                         v2.toChars(), dmd.hdrgen.toChars(v2._init), vd.toChars());
-                     errors = true;
-                 }
-             }
-         }
-         return errors;
-     }
  
      override final Type getType()
      {
--- 193,198 ----
*************** extern (C++) abstract class AggregateDec
*** 435,480 ****
          return visibility.kind == Visibility.Kind.export_;
      }
  
-     /*******************************************
-      * Look for constructor declaration.
-      */
-     extern (D) final Dsymbol searchCtor()
-     {
-         auto s = this.search(Loc.initial, Id.ctor);
-         if (s)
-         {
-             if (!(s.isCtorDeclaration() ||
-                   s.isTemplateDeclaration() ||
-                   s.isOverloadSet()))
-             {
-                 error(s.loc, "%s name `__ctor` is not allowed", s.kind);
-                 errorSupplemental(s.loc, "identifiers starting with `__` are reserved for internal use");
-                 errors = true;
-                 s = null;
-             }
-         }
-         if (s && s.toParent() != this)
-             s = null; // search() looks through ancestor classes
-         if (s)
-         {
-             // Finish all constructors semantics to determine this.noDefaultCtor.
-             static int searchCtor(Dsymbol s, void*)
-             {
-                 auto f = s.isCtorDeclaration();
-                 if (f && f.semanticRun == PASS.initial)
-                     f.dsymbolSemantic(null);
-                 return 0;
-             }
- 
-             for (size_t i = 0; i < members.length; i++)
-             {
-                 auto sm = (*members)[i];
-                 sm.apply(&searchCtor, null);
-             }
-         }
-         return s;
-     }
- 
      override final Visibility visible() pure nothrow @nogc @safe
      {
          return visibility;
--- 351,356 ----
*************** extern (C++) abstract class AggregateDec
*** 501,539 ****
      }
  }
  
- /*********************************
-  * Iterate this dsymbol or members of this scoped dsymbol, then
-  * call `fp` with the found symbol and `params`.
-  * Params:
-  *  symbol = the dsymbol or parent of members to call fp on
-  *  fp = function pointer to process the iterated symbol.
-  *       If it returns nonzero, the iteration will be aborted.
-  *  ctx = context parameter passed to fp.
-  * Returns:
-  *  nonzero if the iteration is aborted by the return value of fp,
-  *  or 0 if it's completed.
-  */
- int apply(Dsymbol symbol, int function(Dsymbol, void*) fp, void* ctx)
- {
-     if (auto nd = symbol.isNspace())
-     {
-         return nd.members.foreachDsymbol( (s) { return s && s.apply(fp, ctx); } );
-     }
-     if (auto ad = symbol.isAttribDeclaration())
-     {
-         return ad.include(ad._scope).foreachDsymbol( (s) { return s && s.apply(fp, ctx); } );
-     }
-     if (auto tm = symbol.isTemplateMixin())
-     {
-         if (tm._scope) // if fwd reference
-             dsymbolSemantic(tm, null); // try to resolve it
- 
-         return tm.members.foreachDsymbol( (s) { return s && s.apply(fp, ctx); } );
-     }
- 
-     return fp(symbol, ctx);
- }
- 
  /****************************
   * Do byte or word alignment as necessary.
   * Align sizes of 0, as we may not know array sizes yet.
--- 377,382 ----
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/aggregate.h gcc-16-20260201/gcc/d/dmd/aggregate.h
*** gcc-16-20260125/gcc/d/dmd/aggregate.h	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/aggregate.h	Sun Feb  1 22:32:07 2026
*************** public:
*** 120,126 ****
      Sizeok sizeok;              // set when structsize contains valid data
  
      virtual Scope *newScope(Scope *sc);
-     virtual void finalizeSize() = 0;
      uinteger_t size(Loc loc) override final;
      Type *getType() override final;
      bool isDeprecated() const override final; // is aggregate deprecated?
--- 120,125 ----
*************** public:
*** 172,179 ****
      static StructDeclaration *create(Loc loc, Identifier *id, bool inObject);
      StructDeclaration *syntaxCopy(Dsymbol *s) override;
      const char *kind() const override;
-     void finalizeSize() override final;
-     bool isPOD();
      bool zeroInit() const;          // !=0 if initialize with 0 fill
      bool zeroInit(bool v);
      bool hasIdentityAssign() const; // true if has identity opAssign
--- 171,176 ----
*************** public:
*** 196,202 ****
  
      unsigned numArgTypes() const;
      Type *argType(unsigned index);
-     bool hasRegularCtor(bool checkDisabled = false);
  };
  
  class UnionDeclaration final : public StructDeclaration
--- 193,198 ----
*************** public:
*** 275,281 ****
      ThreeState isabstract;              // if abstract class
      Baseok baseok;                      // set the progress of base classes resolving
      ObjcClassDeclaration objc;          // Data for a class declaration that is needed for the Objective-C integration
-     Symbol *cpp_type_info_ptr_sym;      // cached instance of class Id.cpp_type_info_ptr
  
      static ClassDeclaration *create(Loc loc, Identifier *id, BaseClasses *baseclasses, Dsymbols *members, bool inObject);
      const char *toPrettyChars(bool QualifyTypes = false) override;
--- 271,276 ----
*************** public:
*** 287,299 ****
      virtual bool isBaseOf(ClassDeclaration *cd, int *poffset);
  
      bool isBaseInfoComplete();
-     void finalizeSize() override;
      bool hasMonitor();
      bool isCOMclass() const;
      virtual bool isCOMinterface() const;
      bool isCPPclass() const;
      virtual bool isCPPinterface() const;
-     bool isAbstract();
      virtual int vtblOffset() const;
      const char *kind() const override;
  
--- 282,292 ----
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/arrayop.d gcc-16-20260201/gcc/d/dmd/arrayop.d
*** gcc-16-20260125/gcc/d/dmd/arrayop.d	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/arrayop.d	Sun Feb  1 22:32:07 2026
*************** import dmd.location;
*** 31,36 ****
--- 31,37 ----
  import dmd.mtype;
  import dmd.common.outbuffer;
  import dmd.tokens;
+ import dmd.typesem : isAssignable;
  import dmd.visitor;
  
  /**********************************************
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/arraytypes.d gcc-16-20260201/gcc/d/dmd/arraytypes.d
*** gcc-16-20260125/gcc/d/dmd/arraytypes.d	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/arraytypes.d	Sun Feb  1 22:32:07 2026
*************** alias Strings = Array!(const(char)*);
*** 29,34 ****
--- 29,35 ----
  alias Identifiers = Array!(Identifier);
  alias TemplateParameters = Array!(TemplateParameter);
  alias Expressions = Array!(Expression);
+ alias ArgumentLabels = Array!(ArgumentLabel);
  alias Statements = Array!(Statement);
  alias BaseClasses = Array!(BaseClass*);
  alias ClassDeclarations = Array!(ClassDeclaration);
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/arraytypes.h gcc-16-20260201/gcc/d/dmd/arraytypes.h
*** gcc-16-20260125/gcc/d/dmd/arraytypes.h	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/arraytypes.h	Sun Feb  1 22:32:07 2026
*************** typedef Array<class TemplateParameter *>
*** 17,22 ****
--- 17,24 ----
  
  typedef Array<class Expression *> Expressions;
  
+ typedef Array<struct ArgumentLabel> ArgumentLabels;
+ 
  typedef Array<class Statement *> Statements;
  
  typedef Array<struct BaseClass *> BaseClasses;
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/astenums.d gcc-16-20260201/gcc/d/dmd/astenums.d
*** gcc-16-20260125/gcc/d/dmd/astenums.d	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/astenums.d	Sun Feb  1 22:32:07 2026
*************** enum Sizeok : ubyte
*** 19,30 ****
  }
  
  /// D Language version
! enum Edition : ubyte
  {
!     none,
!     legacy,          /// Before the introduction of editions
!     v2024,           /// Experimental first new edition
!     latest = v2024   /// Newest edition that this compiler knows of
  }
  
  enum Baseok : ubyte
--- 19,30 ----
  }
  
  /// D Language version
! enum Edition : ushort
  {
!     v2023 = 2023,    /// Edition.min for default edition
!     v2024,           /// first Edition
!     v2025,           /// next Edition
!                      /// use Edition.max for latest edition
  }
  
  enum Baseok : ubyte
*************** enum STC : ulong  // transfer changes to
*** 77,85 ****
      ref_                = 0x4_0000,   /// `ref`
      scope_              = 0x8_0000,   /// `scope`
  
!     scopeinferred       = 0x20_0000,   /// `scope` has been inferred and should not be part of mangling, `scope_` must also be set
!     return_             = 0x40_0000,   /// 'return ref' or 'return scope' for function parameters
!     returnScope         = 0x80_0000,   /// if `ref return scope` then resolve to `ref` and `return scope`
  
      returninferred      = 0x100_0000,   /// `return` has been inferred and should not be part of mangling, `return_` must also be set
      immutable_          = 0x200_0000,   /// `immutable`
--- 77,86 ----
      ref_                = 0x4_0000,   /// `ref`
      scope_              = 0x8_0000,   /// `scope`
  
!     scopeinferred       = 0x10_0000,   /// `scope` has been inferred and should not be part of mangling, `scope_` must also be set
!     return_             = 0x20_0000,   /// 'return ref' or 'return scope' for function parameters
!     returnScope         = 0x40_0000,   /// if `ref return scope` then resolve to `ref` and `return scope`
!     returnRef           = 0x80_0000,   /// if `return ref`
  
      returninferred      = 0x100_0000,   /// `return` has been inferred and should not be part of mangling, `return_` must also be set
      immutable_          = 0x200_0000,   /// `immutable`
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/attrib.d gcc-16-20260201/gcc/d/dmd/attrib.d
*** gcc-16-20260125/gcc/d/dmd/attrib.d	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/attrib.d	Sun Feb  1 22:32:07 2026
*************** import dmd.declaration;
*** 32,41 ****
  import dmd.dmodule;
  import dmd.dscope;
  import dmd.dsymbol;
- import dmd.dsymbolsem : include;
  import dmd.expression;
  import dmd.func;
- import dmd.globals;
  import dmd.hdrgen : visibilityToBuffer;
  import dmd.id;
  import dmd.identifier;
--- 32,39 ----
*************** extern (C++) abstract class AttribDeclar
*** 80,86 ****
       * the scope after it used.
       */
      extern (D) static Scope* createNewScope(Scope* sc, STC stc, LINK linkage,
!         CPPMANGLE cppmangle, Visibility visibility, int explicitVisibility,
          AlignDeclaration aligndecl, PragmaDeclaration inlining)
      {
          Scope* sc2 = sc;
--- 78,84 ----
       * the scope after it used.
       */
      extern (D) static Scope* createNewScope(Scope* sc, STC stc, LINK linkage,
!         CPPMANGLE cppmangle, Visibility visibility, bool explicitVisibility,
          AlignDeclaration aligndecl, PragmaDeclaration inlining)
      {
          Scope* sc2 = sc;
*************** extern (C++) abstract class AttribDeclar
*** 110,120 ****
          return "attribute";
      }
  
-     override final bool hasPointers()
-     {
-         return this.include(null).foreachDsymbol( (s) { return s.hasPointers(); } ) != 0;
-     }
- 
      /****************************************
       */
      override final void addObjcSymbols(ClassDeclarations* classes, ClassDeclarations* categories)
--- 108,113 ----
*************** extern (C++) final class AlignDeclaratio
*** 419,426 ****
          this.dsym = DSYM.alignDeclaration;
          if (exp)
          {
!             exps = new Expressions();
!             exps.push(exp);
          }
      }
  
--- 412,418 ----
          this.dsym = DSYM.alignDeclaration;
          if (exp)
          {
!             exps = new Expressions(exp);
          }
      }
  
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/attrib.h gcc-16-20260201/gcc/d/dmd/attrib.h
*** gcc-16-20260125/gcc/d/dmd/attrib.h	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/attrib.h	Sun Feb  1 22:32:07 2026
*************** class AttribDeclaration : public Dsymbol
*** 29,35 ****
  public:
      Dsymbols *decl;     // array of Dsymbol's
      const char *kind() const override;
-     bool hasPointers() override final;
      void accept(Visitor *v) override { v->visit(this); }
  };
  
--- 29,34 ----
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/canthrow.d gcc-16-20260201/gcc/d/dmd/canthrow.d
*** gcc-16-20260125/gcc/d/dmd/canthrow.d	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/canthrow.d	Sun Feb  1 22:32:07 2026
*************** import dmd.astenums;
*** 20,26 ****
  import dmd.blockexit : BE, checkThrow;
  import dmd.declaration;
  import dmd.dsymbol;
! import dmd.dsymbolsem : include;
  import dmd.errorsink;
  import dmd.expression;
  import dmd.expressionsem : errorSupplementalInferredAttr;
--- 20,26 ----
  import dmd.blockexit : BE, checkThrow;
  import dmd.declaration;
  import dmd.dsymbol;
! import dmd.dsymbolsem : include, toAlias;
  import dmd.errorsink;
  import dmd.expression;
  import dmd.expressionsem : errorSupplementalInferredAttr;
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/clone.d gcc-16-20260201/gcc/d/dmd/clone.d
*** gcc-16-20260125/gcc/d/dmd/clone.d	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/clone.d	Sun Feb  1 22:32:07 2026
*************** FuncDeclaration buildOpAssign(StructDecl
*** 300,307 ****
              stc = (stc & ~STC.safe) | STC.trusted;
      }
  
!     auto fparams = new Parameters();
!     fparams.push(new Parameter(loc, STC.nodtor, sd.type, Id.p, null, null));
      auto tf = new TypeFunction(ParameterList(fparams), sd.handleType(), LINK.d, stc | STC.ref_);
      auto fop = new FuncDeclaration(declLoc, Loc.initial, Id.opAssign, stc, tf);
      fop.storage_class |= STC.inference;
--- 300,306 ----
              stc = (stc & ~STC.safe) | STC.trusted;
      }
  
!     auto fparams = new Parameters(new Parameter(loc, STC.nodtor, sd.type, Id.p, null, null));
      auto tf = new TypeFunction(ParameterList(fparams), sd.handleType(), LINK.d, stc | STC.ref_);
      auto fop = new FuncDeclaration(declLoc, Loc.initial, Id.opAssign, stc, tf);
      fop.storage_class |= STC.inference;
*************** FuncDeclaration buildXopEquals(StructDec
*** 574,581 ****
                  scx.eSink = sc.eSink;
                  /* const bool opEquals(ref const S s);
                   */
!                 auto parameters = new Parameters();
!                 parameters.push(new Parameter(Loc.initial, STC.ref_ | STC.const_, sd.type, null, null, null));
                  tfeqptr = new TypeFunction(ParameterList(parameters), Type.tbool, LINK.d);
                  tfeqptr.mod = MODFlags.const_;
                  tfeqptr = tfeqptr.typeSemantic(Loc.initial, &scx).isTypeFunction();
--- 573,580 ----
                  scx.eSink = sc.eSink;
                  /* const bool opEquals(ref const S s);
                   */
!                 auto parameters = new Parameters(new Parameter(Loc.initial, STC.ref_ | STC.const_, sd.type,
!                                                                null, null, null));
                  tfeqptr = new TypeFunction(ParameterList(parameters), Type.tbool, LINK.d);
                  tfeqptr.mod = MODFlags.const_;
                  tfeqptr = tfeqptr.typeSemantic(Loc.initial, &scx).isTypeFunction();
*************** FuncDeclaration buildXopEquals(StructDec
*** 602,609 ****
      }
      Loc declLoc; // loc is unnecessary so __xopEquals is never called directly
      Loc loc; // loc is unnecessary so errors are gagged
!     auto parameters = new Parameters();
!     parameters.push(new Parameter(loc, STC.ref_ | STC.const_, sd.type, Id.p, null, null));
      auto tf = new TypeFunction(ParameterList(parameters), Type.tbool, LINK.d, STC.const_);
      tf = tf.addSTC(STC.const_).toTypeFunction();
      Identifier id = Id.xopEquals;
--- 601,607 ----
      }
      Loc declLoc; // loc is unnecessary so __xopEquals is never called directly
      Loc loc; // loc is unnecessary so errors are gagged
!     auto parameters = new Parameters(new Parameter(loc, STC.ref_ | STC.const_, sd.type, Id.p, null, null));
      auto tf = new TypeFunction(ParameterList(parameters), Type.tbool, LINK.d, STC.const_);
      tf = tf.addSTC(STC.const_).toTypeFunction();
      Identifier id = Id.xopEquals;
*************** FuncDeclaration buildXopCmp(StructDeclar
*** 649,656 ****
                  scx.eSink = sc.eSink;
                  /* const int opCmp(ref const S s);
                   */
!                 auto parameters = new Parameters();
!                 parameters.push(new Parameter(Loc.initial, STC.ref_ | STC.const_, sd.type, null, null, null));
                  tfcmpptr = new TypeFunction(ParameterList(parameters), Type.tint32, LINK.d);
                  tfcmpptr.mod = MODFlags.const_;
                  tfcmpptr = tfcmpptr.typeSemantic(Loc.initial, &scx).isTypeFunction();
--- 647,654 ----
                  scx.eSink = sc.eSink;
                  /* const int opCmp(ref const S s);
                   */
!                 auto parameters = new Parameters(new Parameter(Loc.initial, STC.ref_ | STC.const_, sd.type,
!                                                                null, null, null));
                  tfcmpptr = new TypeFunction(ParameterList(parameters), Type.tint32, LINK.d);
                  tfcmpptr.mod = MODFlags.const_;
                  tfcmpptr = tfcmpptr.typeSemantic(Loc.initial, &scx).isTypeFunction();
*************** FuncDeclaration buildXopCmp(StructDeclar
*** 726,733 ****
      }
      Loc declLoc; // loc is unnecessary so __xopCmp is never called directly
      Loc loc; // loc is unnecessary so errors are gagged
!     auto parameters = new Parameters();
!     parameters.push(new Parameter(loc, STC.ref_ | STC.const_, sd.type, Id.p, null, null));
      auto tf = new TypeFunction(ParameterList(parameters), Type.tint32, LINK.d, STC.const_);
      tf = tf.addSTC(STC.const_).toTypeFunction();
      Identifier id = Id.xopCmp;
--- 724,730 ----
      }
      Loc declLoc; // loc is unnecessary so __xopCmp is never called directly
      Loc loc; // loc is unnecessary so errors are gagged
!     auto parameters = new Parameters(new Parameter(loc, STC.ref_ | STC.const_, sd.type, Id.p, null, null));
      auto tf = new TypeFunction(ParameterList(parameters), Type.tint32, LINK.d, STC.const_);
      tf = tf.addSTC(STC.const_).toTypeFunction();
      Identifier id = Id.xopCmp;
*************** FuncDeclaration buildXtoHash(StructDecla
*** 854,861 ****
      //printf("StructDeclaration::buildXtoHash() %s\n", sd.toPrettyChars());
      Loc declLoc; // loc is unnecessary so __xtoHash is never called directly
      Loc loc; // internal code should have no loc to prevent coverage
!     auto parameters = new Parameters();
!     parameters.push(new Parameter(loc, STC.ref_ | STC.const_, sd.type, Id.p, null, null));
      auto tf = new TypeFunction(ParameterList(parameters), Type.thash_t, LINK.d, STC.nothrow_ | STC.trusted);
      Identifier id = Id.xtoHash;
      auto fop = new FuncDeclaration(declLoc, Loc.initial, id, STC.static_, tf);
--- 851,857 ----
      //printf("StructDeclaration::buildXtoHash() %s\n", sd.toPrettyChars());
      Loc declLoc; // loc is unnecessary so __xtoHash is never called directly
      Loc loc; // internal code should have no loc to prevent coverage
!     auto parameters = new Parameters(new Parameter(loc, STC.ref_ | STC.const_, sd.type, Id.p, null, null));
      auto tf = new TypeFunction(ParameterList(parameters), Type.thash_t, LINK.d, STC.nothrow_ | STC.trusted);
      Identifier id = Id.xtoHash;
      auto fop = new FuncDeclaration(declLoc, Loc.initial, id, STC.static_, tf);
*************** FuncDeclaration buildXtoHash(StructDecla
*** 872,877 ****
--- 868,878 ----
          // workaround https://issues.dlang.org/show_bug.cgi?id=17968
          "    static if(is(T* : const(.object.Object)*)) " ~
          "        h = h * 33 + typeid(const(.object.Object)).getHash(cast(const void*)&p.tupleof[i]);" ~
+         // and another workaround for bitfields https://github.com/dlang/dmd/issues/20473
+         "    else static if (!__traits(compiles, &p.tupleof[i])) {" ~
+         "        auto t = p.tupleof[i];" ~
+         "        h = h * 33 + typeid(T).getHash(cast(const void*)&t);" ~
+         "    } " ~
          "    else " ~
          "        h = h * 33 + typeid(T).getHash(cast(const void*)&p.tupleof[i]);" ~
          "return h;";
*************** FuncDeclaration buildPostBlit(StructDecl
*** 1561,1570 ****
   */
  private CtorDeclaration generateCtorDeclaration(StructDeclaration sd, const STC paramStc, const STC funcStc, bool move)
  {
-     auto fparams = new Parameters();
      auto structType = sd.type;
      STC stc = move ? STC.none : STC.ref_;     // the only difference between copy or move
!     fparams.push(new Parameter(Loc.initial, paramStc | stc, structType, Id.p, null, null));
      ParameterList pList = ParameterList(fparams);
      auto tf = new TypeFunction(pList, structType, LINK.d, STC.ref_);
      auto ccd = new CtorDeclaration(sd.loc, Loc.initial, STC.ref_, tf);
--- 1562,1570 ----
   */
  private CtorDeclaration generateCtorDeclaration(StructDeclaration sd, const STC paramStc, const STC funcStc, bool move)
  {
      auto structType = sd.type;
      STC stc = move ? STC.none : STC.ref_;     // the only difference between copy or move
!     auto fparams = new Parameters(new Parameter(Loc.initial, paramStc | stc, structType, Id.p, null, null));
      ParameterList pList = ParameterList(fparams);
      auto tf = new TypeFunction(pList, structType, LINK.d, STC.ref_);
      auto ccd = new CtorDeclaration(sd.loc, Loc.initial, STC.ref_, tf);
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/common/bitfields.d gcc-16-20260201/gcc/d/dmd/common/bitfields.d
*** gcc-16-20260125/gcc/d/dmd/common/bitfields.d	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/common/bitfields.d	Sun Feb  1 22:32:07 2026
***************
*** 10,27 ****
   */
  module dmd.common.bitfields;
  
  /**
   * Generate code for bit fields inside a struct/class body
   * Params:
   *   S = type of a struct with only boolean fields, which should become bit fields
   *   T = type of bit fields variable, must have enough bits to store all booleans
   * Returns: D code with a bit fields variable and getter / setter functions
   */
! extern (D) string generateBitFields(S, T)()
  if (__traits(isUnsigned, T))
  {
      import core.bitop: bsr;
! 
      string result = "extern (C++) pure nothrow @nogc @safe final {";
  
      struct BitInfo
--- 10,34 ----
   */
  module dmd.common.bitfields;
  
+ //version = Has_Bitfields; // does not work (yet) because hashOf doesn't work on bitfields
+ version(Has_Bitfields)
+     version = Debugger_friendly; // without Has_Bitfields, this uses more space by using S
+ 
  /**
   * Generate code for bit fields inside a struct/class body
   * Params:
   *   S = type of a struct with only boolean fields, which should become bit fields
   *   T = type of bit fields variable, must have enough bits to store all booleans
+  *   field = if provided, assume it is declared and initialized elsewhere
+  *   bitOff = start using bits at the given offset
   * Returns: D code with a bit fields variable and getter / setter functions
   */
! extern (D) string generateBitFields(S, T, string field = "", int bitOff = 0, int ID = __LINE__)()
  if (__traits(isUnsigned, T))
  {
      import core.bitop: bsr;
!     // if _fieldName provided, assume it declared and initialized elsewhere
!     enum fieldName = field.length == 0 ? "bitFields" : field;
      string result = "extern (C++) pure nothrow @nogc @safe final {";
  
      struct BitInfo
*************** if (__traits(isUnsigned, T))
*** 35,41 ****
      // Iterate over members to compute bit offset and bit size for each of them
      enum BitInfo bitInfo = () {
          BitInfo result;
!         int bitOffset = 0;
          foreach (size_t i, mem; __traits(allMembers, S))
          {
              alias memType = typeof(__traits(getMember, S, mem));
--- 42,48 ----
      // Iterate over members to compute bit offset and bit size for each of them
      enum BitInfo bitInfo = () {
          BitInfo result;
!         int bitOffset = bitOff;
          foreach (size_t i, mem; __traits(allMembers, S))
          {
              alias memType = typeof(__traits(getMember, S, mem));
*************** if (__traits(isUnsigned, T))
*** 55,76 ****
      static assert(bitInfo.totalSize <= T.sizeof * 8,
          "sum of bit field size "~toString!(bitInfo.totalSize)~" exceeds storage type `"~T.stringof~"`");
  
      foreach (size_t i, mem; __traits(allMembers, S))
      {
          enum typeName = typeof(__traits(getMember, S, mem)).stringof;
          enum shift = toString!(bitInfo.offset[i]);
          enum sizeMask = toString!((1 << bitInfo.size[i]) - 1); // 0x01 for bool, 0xFF for ubyte etc.
!         result ~= "
!         "~typeName~" "~mem~"() const scope { return cast("~typeName~") ((bitFields >>> "~shift~") & "~sizeMask~"); }
!         "~typeName~" "~mem~"("~typeName~" v) scope
          {
!             bitFields &= ~("~sizeMask~" << "~shift~");
!             bitFields |= v << "~shift~";
!             return v;
!         }";
      }
-     enum TP initVal = bitInfo.initialValue;
-     return result ~ "\n}\n private "~T.stringof~" bitFields = " ~ toString!(initVal) ~ ";\n";
  }
  
  ///
--- 62,121 ----
      static assert(bitInfo.totalSize <= T.sizeof * 8,
          "sum of bit field size "~toString!(bitInfo.totalSize)~" exceeds storage type `"~T.stringof~"`");
  
+     version(Debugger_friendly)
+     {
+         // unique name needed to allow same name as in base class using `alias`, but without overloading
+         string bitfieldsName = fieldName ~ toString!(ID);
+         string bitfieldsRead = T.stringof~" "~bitfieldsName~"() const pure { return 0";
+         string bitfieldsWrite = "void "~bitfieldsName~"("~T.stringof~" v) {\n";
+     }
+ 
      foreach (size_t i, mem; __traits(allMembers, S))
      {
          enum typeName = typeof(__traits(getMember, S, mem)).stringof;
          enum shift = toString!(bitInfo.offset[i]);
          enum sizeMask = toString!((1 << bitInfo.size[i]) - 1); // 0x01 for bool, 0xFF for ubyte etc.
!         version(Debugger_friendly)
          {
!             string memacc = mem;
!             bitfieldsRead ~= "\n| (cast("~T.stringof~")("~memacc~" & "~sizeMask~") << "~shift~")";
!             bitfieldsWrite ~= memacc~" = cast("~typeName~")((v >> "~shift~") & "~sizeMask~");\n";
!             result ~= typeName~" "~mem;
!             version(Has_Bitfields)
!                 result ~= " : "~toString!(bitInfo.size[i]);
!             enum meminit = __traits(getMember, S.init, mem);
!             result ~= " = "~meminit.stringof~";\n";
!         }
!         else
!         {
!             result ~= "
!                 "~typeName~" "~mem~"() const scope { return cast("~typeName~") (("~fieldName~" >>> "~shift~") & "~sizeMask~"); }
!             "~typeName~" "~mem~"("~typeName~" v) scope
!             {
!                 "~fieldName~" &= ~("~sizeMask~" << "~shift~");
!                 "~fieldName~" |= v << "~shift~";
!                 return v;
!             }";
!         }
!     }
!     version(Debugger_friendly)
!     {
!         bitfieldsRead ~= ";\n}\n";
!         bitfieldsWrite ~= "}\n";
!         if (field.length == 0)
!             result ~= "alias "~fieldName~" = "~bitfieldsName~";\n";
!         result ~= bitfieldsRead ~ bitfieldsWrite;
!         result ~= "\n}\n";
!         return result;
!     }
!     else
!     {
!         result ~= "\n}\n";
!         enum TP initVal = bitInfo.initialValue;
!         if (field.length == 0)
!             result ~= " private "~T.stringof~" "~fieldName~" = " ~ toString!(initVal) ~ ";\n";
!         return result;
      }
  }
  
  ///
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/common/outbuffer.d gcc-16-20260201/gcc/d/dmd/common/outbuffer.d
*** gcc-16-20260125/gcc/d/dmd/common/outbuffer.d	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/common/outbuffer.d	Sun Feb  1 22:32:07 2026
*************** struct OutBuffer
*** 230,238 ****
          offset += len;
      }
  
!     extern (C++) void write(const(void)* data, size_t nbytes) pure nothrow @system
      {
!         write(data[0 .. nbytes]);
      }
  
      void write(scope const(void)[] buf) pure nothrow @trusted
--- 230,240 ----
          offset += len;
      }
  
!     alias put = write;  // transition to output range which uses put()
! 
!     extern (C++) void write(scope const(void)* data, size_t nbytes) pure nothrow @system
      {
!         put(data[0 .. nbytes]);
      }
  
      void write(scope const(void)[] buf) pure nothrow @trusted
*************** struct OutBuffer
*** 244,249 ****
--- 246,268 ----
          offset += buf.length;
      }
  
+     void write(scope string buf) pure nothrow @trusted // so write("hello") chooses this overload
+     {
+         if (doindent && !notlinehead)
+             indent();
+         reserve(buf.length);
+         memcpy(this.data.ptr + offset, buf.ptr, buf.length);
+         offset += buf.length;
+     }
+ 
+     extern (C++) void write(scope const(char)* s) pure nothrow @trusted
+     {
+         if (!s)
+             return;
+         import core.stdc.string : strlen;
+         put(s[0 .. strlen(s)]);
+     }
+ 
      /**
       * Writes a 16 bit value, no reserve check.
       */
*************** struct OutBuffer
*** 262,268 ****
      void write16(int v) nothrow
      {
          auto u = cast(ushort) v;
!         write(&u, u.sizeof);
      }
  
      /**
--- 281,287 ----
      void write16(int v) nothrow
      {
          auto u = cast(ushort) v;
!         put(&u, u.sizeof);
      }
  
      /**
*************** struct OutBuffer
*** 270,276 ****
       */
      void write32(int v) nothrow @trusted
      {
!         write(&v, v.sizeof);
      }
  
      /**
--- 289,295 ----
       */
      void write32(int v) nothrow @trusted
      {
!         put(&v, v.sizeof);
      }
  
      /**
*************** struct OutBuffer
*** 278,311 ****
       */
      @trusted void write64(long v) nothrow
      {
!         write(&v, v.sizeof);
      }
  
      /// Buffer will NOT be zero-terminated
      extern (C++) void writestring(const(char)* s) pure nothrow @system
      {
!         if (!s)
!             return;
!         import core.stdc.string : strlen;
!         write(s[0 .. strlen(s)]);
      }
  
      /// ditto
      void writestring(scope const(char)[] s) pure nothrow @safe
      {
!         write(s);
      }
  
      /// ditto
      void writestring(scope string s) pure nothrow @safe
      {
!         write(s);
      }
  
      /// Buffer will NOT be zero-terminated, followed by newline
      void writestringln(const(char)[] s) pure nothrow @safe
      {
!         writestring(s);
          writenl();
      }
  
--- 297,327 ----
       */
      @trusted void write64(long v) nothrow
      {
!         put(&v, v.sizeof);
      }
  
      /// Buffer will NOT be zero-terminated
      extern (C++) void writestring(const(char)* s) pure nothrow @system
      {
!         put(s);
      }
  
      /// ditto
      void writestring(scope const(char)[] s) pure nothrow @safe
      {
!         put(s);
      }
  
      /// ditto
      void writestring(scope string s) pure nothrow @safe
      {
!         put(s);
      }
  
      /// Buffer will NOT be zero-terminated, followed by newline
      void writestringln(const(char)[] s) pure nothrow @safe
      {
!         put(s);
          writenl();
      }
  
*************** struct OutBuffer
*** 313,325 ****
       */
      void writeStringz(const(char)* s) pure nothrow @system
      {
!         write(s[0 .. strlen(s)+1]);
      }
  
      /// ditto
      void writeStringz(const(char)[] s) pure nothrow @safe
      {
!         write(s);
          writeByte(0);
      }
  
--- 329,341 ----
       */
      void writeStringz(const(char)* s) pure nothrow @system
      {
!         put(s[0 .. strlen(s)+1]);
      }
  
      /// ditto
      void writeStringz(const(char)[] s) pure nothrow @safe
      {
!         put(s);
          writeByte(0);
      }
  
*************** struct OutBuffer
*** 382,398 ****
       * Writes an 8 bit byte, no reserve check.
       */
      extern (C++) nothrow @safe
!     void writeByten(int b)
      {
!         this.data[offset++] = cast(ubyte) b;
      }
  
!     extern (C++) void writeByte(uint b) pure nothrow @safe
      {
          if (doindent && !notlinehead && b != '\n')
              indent();
          reserve(1);
!         this.data[offset] = cast(ubyte)b;
          offset++;
      }
  
--- 398,423 ----
       * Writes an 8 bit byte, no reserve check.
       */
      extern (C++) nothrow @safe
!     void writeByten(ubyte b)
      {
!         this.data[offset++] = b;
      }
  
!     extern (C++) void writeByte(ubyte b) pure nothrow @safe
      {
          if (doindent && !notlinehead && b != '\n')
              indent();
          reserve(1);
!         this.data[offset] = b;
!         offset++;
!     }
! 
!     void write(ubyte b) pure nothrow @safe
!     {
!         if (doindent && !notlinehead && b != '\n')
!             indent();
!         reserve(1);
!         this.data[offset] = b;
          offset++;
      }
  
*************** struct OutBuffer
*** 502,515 ****
          offset += 4;
      }
  
!     extern (C++) void write(const OutBuffer* buf) pure nothrow @trusted
      {
          if (buf)
!         {
!             reserve(buf.offset);
!             memcpy(data.ptr + offset, buf.data.ptr, buf.offset);
!             offset += buf.offset;
!         }
      }
  
      extern (C++) void fill0(size_t nbytes) pure nothrow @trusted
--- 527,543 ----
          offset += 4;
      }
  
!     extern (C++) void write(scope const OutBuffer* buf) pure nothrow @trusted
      {
          if (buf)
!             put(*buf);
!     }
! 
!     void write(ref scope const OutBuffer buf) pure nothrow @trusted
!     {
!         reserve(buf.offset);
!         memcpy(data.ptr + offset, buf.data.ptr, buf.offset);
!         offset += buf.offset;
      }
  
      extern (C++) void fill0(size_t nbytes) pure nothrow @trusted
*************** unittest
*** 871,877 ****
      buf.prependbyte('x');
      OutBuffer buf2;
      buf2.writestring("mmm");
!     buf.write(&buf2);
      char[] s = buf.extractSlice();
      assert(s == "xdefabcmmm");
  }
--- 899,905 ----
      buf.prependbyte('x');
      OutBuffer buf2;
      buf2.writestring("mmm");
!     buf.put(&buf2);
      char[] s = buf.extractSlice();
      assert(s == "xdefabcmmm");
  }
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/common/outbuffer.h gcc-16-20260201/gcc/d/dmd/common/outbuffer.h
*** gcc-16-20260125/gcc/d/dmd/common/outbuffer.h	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/common/outbuffer.h	Sun Feb  1 22:32:07 2026
*************** public:
*** 53,59 ****
      void writestring(const char *string);
      void prependstring(const char *string);
      void writenl();                     // write newline
!     void writeByte(unsigned b);
      void writeUTF8(unsigned b);
      void prependbyte(unsigned b);
      void writewchar(unsigned w);
--- 53,59 ----
      void writestring(const char *string);
      void prependstring(const char *string);
      void writenl();                     // write newline
!     void writeByte(uint8_t b);
      void writeUTF8(unsigned b);
      void prependbyte(unsigned b);
      void writewchar(unsigned w);
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/cond.d gcc-16-20260201/gcc/d/dmd/cond.d
*** gcc-16-20260125/gcc/d/dmd/cond.d	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/cond.d	Sun Feb  1 22:32:07 2026
*************** import dmd.dscope;
*** 24,36 ****
  import dmd.dsymbol;
  import dmd.errors;
  import dmd.expression;
- import dmd.expressionsem : evalStaticCondition;
  import dmd.globals;
  import dmd.identifier;
  import dmd.location;
  import dmd.mtype;
  import dmd.optimize;
- import dmd.typesem;
  import dmd.common.outbuffer;
  import dmd.rootobject;
  import dmd.root.string;
--- 24,34 ----
*************** extern (C++) abstract class Condition :
*** 71,78 ****
  
      abstract Condition syntaxCopy();
  
-     abstract int include(Scope* sc);
- 
      inout(DebugCondition) isDebugCondition() inout
      {
          return null;
--- 69,74 ----
*************** extern (C++) final class StaticForeach :
*** 214,223 ****
          auto sid = Identifier.generateId("Tuple");
          auto sdecl = new StructDeclaration(loc, sid, false);
          sdecl.storage_class |= STC.static_;
-         sdecl.members = new Dsymbols();
          auto fid = Identifier.idPool(tupleFieldName);
          auto ty = new TypeTypeof(loc, new TupleExp(loc, e));
!         sdecl.members.push(new VarDeclaration(loc, ty, fid, null, STC.none));
          auto r = cast(TypeStruct)sdecl.type;
          if (global.params.useTypeInfo && Type.dtypeinfo)
              r.vtinfo = TypeInfoStructDeclaration.create(r); // prevent typeinfo from going to object file
--- 210,218 ----
          auto sid = Identifier.generateId("Tuple");
          auto sdecl = new StructDeclaration(loc, sid, false);
          sdecl.storage_class |= STC.static_;
          auto fid = Identifier.idPool(tupleFieldName);
          auto ty = new TypeTypeof(loc, new TupleExp(loc, e));
!         sdecl.members = new Dsymbols(new VarDeclaration(loc, ty, fid, null, STC.none));
          auto r = cast(TypeStruct)sdecl.type;
          if (global.params.useTypeInfo && Type.dtypeinfo)
              r.vtinfo = TypeInfoStructDeclaration.create(r); // prevent typeinfo from going to object file
*************** extern (C++) final class DebugCondition
*** 324,362 ****
          super(loc, mod, ident);
      }
  
-     override int include(Scope* sc)
-     {
-         //printf("DebugCondition::include() level = %d, debuglevel = %d\n", level, global.params.debuglevel);
-         if (inc != Include.notComputed)
-         {
-             return inc == Include.yes;
-         }
-         inc = Include.no;
-         bool definedInModule = false;
-         if (ident)
-         {
-             if (mod.debugids && findCondition(*mod.debugids, ident))
-             {
-                 inc = Include.yes;
-                 definedInModule = true;
-             }
-             else if (findCondition(global.debugids, ident))
-                 inc = Include.yes;
-             else
-             {
-                 if (!mod.debugidsNot)
-                     mod.debugidsNot = new Identifiers();
-                 mod.debugidsNot.push(ident);
-             }
-         }
-         else if (global.params.debugEnabled)
-             inc = Include.yes;
- 
-         if (!definedInModule)
-             printDepsConditional(sc, this, "depsDebug ");
-         return (inc == Include.yes);
-     }
- 
      override inout(DebugCondition) isDebugCondition() inout
      {
          return this;
--- 319,324 ----
*************** extern (C++) final class VersionConditio
*** 390,396 ****
       * Returns:
       *   `true` if it is reserved, `false` otherwise
       */
!     extern(D) private static bool isReserved(const(char)[] ident) @safe
      {
          // This list doesn't include "D_*" versions, see the last return
          switch (ident)
--- 352,358 ----
       * Returns:
       *   `true` if it is reserved, `false` otherwise
       */
!     extern(D) public static bool isReserved(const(char)[] ident) @safe
      {
          // This list doesn't include "D_*" versions, see the last return
          switch (ident)
*************** extern (C++) final class VersionConditio
*** 599,639 ****
          super(loc, mod, ident);
      }
  
-     override int include(Scope* sc)
-     {
-         //printf("VersionCondition::include() level = %d, versionlevel = %d\n", level, global.params.versionlevel);
-         //if (ident) printf("\tident = '%s'\n", ident.toChars());
-         if (inc != Include.notComputed)
-         {
-             return inc == Include.yes;
-         }
- 
-         inc = Include.no;
-         bool definedInModule = false;
-         if (ident)
-         {
-             if (mod.versionids && findCondition(*mod.versionids, ident))
-             {
-                 inc = Include.yes;
-                 definedInModule = true;
-             }
-             else if (findCondition(global.versionids, ident))
-                 inc = Include.yes;
-             else
-             {
-                 if (!mod.versionidsNot)
-                     mod.versionidsNot = new Identifiers();
-                 mod.versionidsNot.push(ident);
-             }
-         }
-         if (!definedInModule &&
-             (!ident || (!isReserved(ident.toString()) && ident != Id._unittest && ident != Id._assert)))
-         {
-             printDepsConditional(sc, this, "depsVersion ");
-         }
-         return (inc == Include.yes);
-     }
- 
      override inout(VersionCondition) isVersionCondition() inout
      {
          return this;
--- 561,566 ----
*************** extern (C++) final class StaticIfConditi
*** 662,708 ****
          return new StaticIfCondition(loc, exp.syntaxCopy());
      }
  
-     override int include(Scope* sc)
-     {
-         // printf("StaticIfCondition::include(sc = %p) this=%p inc = %d\n", sc, this, inc);
- 
-         int errorReturn()
-         {
-             if (!global.gag)
-                 inc = Include.no; // so we don't see the error message again
-             return 0;
-         }
- 
-         if (inc != Include.notComputed)
-         {
-             return inc == Include.yes;
-         }
- 
-         if (!sc)
-         {
-             error(loc, "`static if` conditional cannot be at global scope");
-             inc = Include.no;
-             return 0;
-         }
- 
-         import dmd.staticcond;
-         bool errors;
- 
-         bool result = evalStaticCondition(sc, exp, exp, errors);
- 
-         // Prevent repeated condition evaluation.
-         // See: fail_compilation/fail7815.d
-         if (inc != Include.notComputed)
-             return (inc == Include.yes);
-         if (errors)
-             return errorReturn();
-         if (result)
-             inc = Include.yes;
-         else
-             inc = Include.no;
-         return (inc == Include.yes);
-     }
- 
      override void accept(Visitor v)
      {
          v.visit(this);
--- 589,594 ----
*************** bool findCondition(ref Identifiers ids,
*** 734,740 ****
  }
  
  // Helper for printing dependency information
! private void printDepsConditional(Scope* sc, DVCondition condition, const(char)[] depType)
  {
      if (!global.params.moduleDeps.buffer || global.params.moduleDeps.name)
          return;
--- 620,626 ----
  }
  
  // Helper for printing dependency information
! public void printDepsConditional(Scope* sc, DVCondition condition, const(char)[] depType)
  {
      if (!global.params.moduleDeps.buffer || global.params.moduleDeps.name)
          return;
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/cond.h gcc-16-20260201/gcc/d/dmd/cond.h
*** gcc-16-20260125/gcc/d/dmd/cond.h	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/cond.h	Sun Feb  1 22:32:07 2026
*************** public:
*** 38,44 ****
      DYNCAST dyncast() const override final { return DYNCAST_CONDITION; }
  
      virtual Condition *syntaxCopy() = 0;
-     virtual int include(Scope *sc) = 0;
      virtual DebugCondition *isDebugCondition() { return nullptr; }
      virtual VersionCondition *isVersionCondition() { return nullptr; }
      void accept(Visitor *v) override { v->visit(this); }
--- 38,43 ----
*************** class DebugCondition final : public DVCo
*** 70,76 ****
  public:
      static void addGlobalIdent(const char *ident);
  
-     int include(Scope *sc) override;
      void accept(Visitor *v) override { v->visit(this); }
  };
  
--- 69,74 ----
*************** public:
*** 80,86 ****
      static void addGlobalIdent(const char *ident);
      static void addPredefinedGlobalIdent(const char *ident);
  
-     int include(Scope *sc) override;
      void accept(Visitor *v) override { v->visit(this); }
  };
  
--- 78,83 ----
*************** public:
*** 90,95 ****
      Expression *exp;
  
      StaticIfCondition *syntaxCopy() override;
-     int include(Scope *sc) override;
      void accept(Visitor *v) override { v->visit(this); }
  };
--- 87,91 ----
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/constfold.d gcc-16-20260201/gcc/d/dmd/constfold.d
*** gcc-16-20260125/gcc/d/dmd/constfold.d	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/constfold.d	Sun Feb  1 22:32:07 2026
*************** import dmd.declaration;
*** 25,30 ****
--- 25,31 ----
  import dmd.dstruct;
  import dmd.errors;
  import dmd.expression;
+ import dmd.expressionsem : getField;
  import dmd.globals;
  import dmd.location;
  import dmd.mtype;
*************** UnionExp Cat(Loc loc, Type type, Express
*** 1432,1439 ****
          else
          {
              // Create an ArrayLiteralExp
!             auto elements = new Expressions();
!             elements.push(e);
              emplaceExp!(ArrayLiteralExp)(&ue, e.loc, type, elements);
          }
          assert(ue.exp().type);
--- 1433,1439 ----
          else
          {
              // Create an ArrayLiteralExp
!             auto elements = new Expressions(e);
              emplaceExp!(ArrayLiteralExp)(&ue, e.loc, type, elements);
          }
          assert(ue.exp().type);
*************** UnionExp Cat(Loc loc, Type type, Express
*** 1674,1681 ****
          Type tb = t.toBasetype();
          if (tb.ty == Tarray && tb.nextOf().equivalent(e.type))
          {
!             auto expressions = new Expressions();
!             expressions.push(e);
              emplaceExp!(ArrayLiteralExp)(&ue, loc, t, expressions);
              e = ue.exp();
          }
--- 1674,1680 ----
          Type tb = t.toBasetype();
          if (tb.ty == Tarray && tb.nextOf().equivalent(e.type))
          {
!             auto expressions = new Expressions(e);
              emplaceExp!(ArrayLiteralExp)(&ue, loc, t, expressions);
              e = ue.exp();
          }
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/cparse.d gcc-16-20260201/gcc/d/dmd/cparse.d
*** gcc-16-20260125/gcc/d/dmd/cparse.d	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/cparse.d	Sun Feb  1 22:32:07 2026
*************** final class CParser(AST) : Parser!AST
*** 655,662 ****
--- 655,664 ----
          case TOK.asm_:
              switch (peekNext())
              {
+                 case TOK.const_:
                  case TOK.goto_:
                  case TOK.inline:
+                 case TOK.restrict:
                  case TOK.volatile:
                  case TOK.leftParenthesis:
                      s = cparseGnuAsm();
*************** final class CParser(AST) : Parser!AST
*** 832,839 ****
                      const len2 = token.len;
                      len = len1 + len2;
                      auto s2 = cast(char*)mem.xmalloc_noscan(len * char.sizeof);
!                     memcpy(s2, s, len1 * char.sizeof);
!                     memcpy(s2 + len1, token.ustring, len2 * char.sizeof);
                      s = s2;
                  }
                  else
--- 834,841 ----
                      const len2 = token.len;
                      len = len1 + len2;
                      auto s2 = cast(char*)mem.xmalloc_noscan(len * char.sizeof);
!                     s2[0 .. len1] = s[0 .. len1];
!                     s2[len1 .. len1 + len2] = token.ustring[0 .. len2];
                      s = s2;
                  }
                  else
*************** final class CParser(AST) : Parser!AST
*** 982,987 ****
--- 984,990 ----
       *    sizeof unary-expression
       *    sizeof ( type-name )
       *    _Alignof ( type-name )
+      *    _Alignof unary-expression // gcc extension
       *
       * unary-operator:
       *    & * + - ~ !
*************** final class CParser(AST) : Parser!AST
*** 1044,1051 ****
--- 1047,1056 ----
              e = new AST.ComExp(loc, e);
              break;
  
+         case TOK._Alignof:
          case TOK.sizeof_:
          {
+             Identifier id = token.value == TOK.sizeof_? Id.__sizeof : Id.__xalignof;
              nextToken();
              if (token.value == TOK.leftParenthesis)
              {
*************** final class CParser(AST) : Parser!AST
*** 1084,1090 ****
                  e = cparseUnaryExp();
              }
  
!             e = new AST.DotIdExp(loc, e, Id.__sizeof);
              break;
          }
  
--- 1089,1095 ----
                  e = cparseUnaryExp();
              }
  
!             e = new AST.DotIdExp(loc, e, id);
              break;
          }
  
*************** final class CParser(AST) : Parser!AST
*** 1096,1112 ****
              e = cparseCastExp();
              break;
  
-         case TOK._Alignof:
-         {
-             nextToken();
-             check(TOK.leftParenthesis);
-             auto t = cparseTypeName();
-             check(TOK.rightParenthesis);
-             e = new AST.TypeExp(loc, t);
-             e = new AST.DotIdExp(loc, e, Id.__xalignof);
-             break;
-         }
- 
          default:
              e = cparsePostfixExp(e);
              break;
--- 1101,1106 ----
*************** final class CParser(AST) : Parser!AST
*** 1482,1488 ****
       *    logical-OR-expression
       *    logical-OR-expression ? expression : conditional-expression
       */
!     private AST.Expression cparseCondExp()
      {
          const loc = token.loc;
  
--- 1476,1482 ----
       *    logical-OR-expression
       *    logical-OR-expression ? expression : conditional-expression
       */
!     AST.Expression cparseCondExp()
      {
          const loc = token.loc;
  
*************** final class CParser(AST) : Parser!AST
*** 1645,1651 ****
       */
      private AST.Expression cparseConstantExp()
      {
!         return cparseAssignExp();
      }
  
      /*****************************
--- 1639,1645 ----
       */
      private AST.Expression cparseConstantExp()
      {
!         return cparseCondExp();
      }
  
      /*****************************
*************** final class CParser(AST) : Parser!AST
*** 1728,1733 ****
--- 1722,1755 ----
      /********************************* Declaration Parser ***************************/
      //{
  
+     void declareTag(AST.TypeTag tt, ref Specifier specifier, bool generate_enum_id = false)
+     {
+         if (!tt.id && (generate_enum_id || tt.tok != TOK.enum_)) tt.id = Identifier.generateId("__tag");
+         /* `struct tag;` and `struct tag { ... };`
+          * always result in a declaration in the current scope
+          */
+         auto stag = (tt.tok == TOK.struct_) ? new AST.StructDeclaration(tt.loc, tt.id, false) :
+                     (tt.tok == TOK.union_)  ? new AST.UnionDeclaration(tt.loc, tt.id) :
+                                               new AST.EnumDeclaration(tt.loc, tt.id, tt.base);
+         if (!tt.alignExps && !tt.packalign.isUnknown())
+         {
+             // saw `struct __declspec(align(N)) Tag ...`
+             auto st = stag.isStructDeclaration();
+             st.alignment = tt.packalign;
+         }
+         stag.members = tt.members;
+         tt.members = null;
+         if (!symbols)
+             symbols = new AST.Dsymbols();
+         AST.Dsymbol stags = stag;
+         if (tt.alignExps)
+         {
+             auto decls = new AST.Dsymbols(1);
+             (*decls)[0] = stags;
+             stags = new AST.AlignDeclaration(stags.loc, tt.alignExps, decls);
+         }
+         symbols.push(stags);
+     }
      /*************************************
       * C11 6.7
       * declaration:
*************** final class CParser(AST) : Parser!AST
*** 1775,1802 ****
          specifier.packalign = this.packalign;
          auto tspec = cparseDeclarationSpecifiers(level, specifier);
  
!         AST.Dsymbol declareTag(AST.TypeTag tt, ref Specifier specifier)
!         {
!             /* `struct tag;` and `struct tag { ... };`
!              * always result in a declaration in the current scope
!              */
!             auto stag = (tt.tok == TOK.struct_) ? new AST.StructDeclaration(tt.loc, tt.id, false) :
!                         (tt.tok == TOK.union_)  ? new AST.UnionDeclaration(tt.loc, tt.id) :
!                                                   new AST.EnumDeclaration(tt.loc, tt.id, tt.base);
!             if (!tt.packalign.isUnknown())
!             {
!                 // saw `struct __declspec(align(N)) Tag ...`
!                 auto st = stag.isStructDeclaration();
!                 st.alignment = tt.packalign;
!             }
!             stag.members = tt.members;
!             tt.members = null;
!             if (!symbols)
!                 symbols = new AST.Dsymbols();
!             auto stags = applySpecifier(stag, specifier);
!             symbols.push(stags);
!             return stags;
!         }
  
          /* If a declarator does not follow, it is unnamed
           */
--- 1797,1805 ----
          specifier.packalign = this.packalign;
          auto tspec = cparseDeclarationSpecifiers(level, specifier);
  
!         // Defer declaring a tagged type (struct/union/enum) so
!         // that anonymous types can use a typedef as their id.
! 
  
          /* If a declarator does not follow, it is unnamed
           */
*************** final class CParser(AST) : Parser!AST
*** 1822,1833 ****
                  !tt.id && (tt.tok == TOK.struct_ || tt.tok == TOK.union_))
                  return; // legal but meaningless empty declaration, ignore it
  
!             auto stags = declareTag(tt, specifier);
  
              if (0 && tt.tok == TOK.enum_)    // C11 proscribes enums with no members, but we allow it
              {
                  if (!tt.members)
!                     error(tt.loc, "`enum %s` has no members", stags.toChars());
              }
              return;
          }
--- 1825,1837 ----
                  !tt.id && (tt.tok == TOK.struct_ || tt.tok == TOK.union_))
                  return; // legal but meaningless empty declaration, ignore it
  
!             if (tt.members || tt.tok != TOK.enum_)
!                 declareTag(tt, specifier);
  
              if (0 && tt.tok == TOK.enum_)    // C11 proscribes enums with no members, but we allow it
              {
                  if (!tt.members)
!                     error(tt.loc, "`enum %s` has no members", tt.toChars());
              }
              return;
          }
*************** final class CParser(AST) : Parser!AST
*** 1840,1845 ****
--- 1844,1858 ----
              return;
          }
  
+         if (auto tt = tspec.isTypeTag())
+         {
+             if (tt.id && tt.members)
+             {
+                 // Valid tag decl with name and members, go ahead and declare it now.
+                 declareTag(tt, specifier);
+             }
+         }
+ 
          if (tspec && specifier.mod & MOD.xconst)
          {
              tspec = toConst(tspec);
*************** final class CParser(AST) : Parser!AST
*** 1867,1873 ****
          {
              Identifier id;
              AST.StringExp asmName;
!             auto dt = cparseDeclarator(DTR.xdirect, tspec, id, specifier);
              if (!dt)
              {
                  panic();
--- 1880,1886 ----
          {
              Identifier id;
              AST.StringExp asmName;
!             auto dt = cparseDeclarator(DTR.xdirect_fd, tspec, id, specifier);
              if (!dt)
              {
                  panic();
*************** final class CParser(AST) : Parser!AST
*** 1913,1922 ****
                      break;
              }
  
!             if (specifier.alignExps && dt.isTypeFunction())
!                 error("no alignment-specifier for function declaration"); // C11 6.7.5-2
!             if (specifier.alignExps && specifier.scw == SCW.xregister)
!                 error("no alignment-specifier for `register` storage class"); // C11 6.7.5-2
  
              /* C11 6.9.1 Function Definitions
               * function-definition:
--- 1926,1939 ----
                      break;
              }
  
! 
!             // Check alignasExp and not alignExps so that gnu
!             // __atribute__((aligned())) is silently allowed, matching the
!             // behavior of other compilers.
!             if (specifier.alignasExp && dt.isTypeFunction())
!                 error(specifier.alignasExp.loc, "no alignment-specifier for function declaration"); // C11 6.7.5-2
!             if (specifier.alignasExp && specifier.scw == SCW.xregister)
!                 error(specifier.alignasExp.loc, "no alignment-specifier for `register` storage class"); // C11 6.7.5-2
  
              /* C11 6.9.1 Function Definitions
               * function-definition:
*************** final class CParser(AST) : Parser!AST
*** 1952,1958 ****
              typedefTab.setDim(typedefTabLengthSave);
              symbols = symbolsSave;
              if (!symbols)
!                 symbols = new AST.Dsymbols;     // lazilly create it
  
              if (level != LVL.global && !tspec && !specifier.scw && !specifier.mod)
                  error("declaration-specifier-seq required");
--- 1969,1975 ----
              typedefTab.setDim(typedefTabLengthSave);
              symbols = symbolsSave;
              if (!symbols)
!                 symbols = new AST.Dsymbols;     // lazily create it
  
              if (level != LVL.global && !tspec && !specifier.scw && !specifier.mod)
                  error("declaration-specifier-seq required");
*************** final class CParser(AST) : Parser!AST
*** 1960,1967 ****
              {
                  if (token.value == TOK.assign)
                      error("no initializer for typedef declaration");
!                 if (specifier.alignExps)
!                     error("no alignment-specifier for typedef declaration"); // C11 6.7.5-2
  
                  if (specifier.vector_size)
                  {
--- 1977,1984 ----
              {
                  if (token.value == TOK.assign)
                      error("no initializer for typedef declaration");
!                 if (specifier.alignasExp)
!                     error(specifier.alignasExp.loc, "no alignment-specifier for typedef declaration"); // C11 6.7.5-2
  
                  if (specifier.vector_size)
                  {
*************** final class CParser(AST) : Parser!AST
*** 1973,2010 ****
  
                  bool isalias = true;
                  Identifier idt;
!                 if (auto ts = dt.isTypeStruct())
!                 {
!                     if (ts.sym.isAnonymous())
!                     {
!                         // This is a typedef for an anonymous struct-or-union.
!                         // Directly set the ident for the struct-or-union.
!                         ts.sym.ident = id;
!                         isalias = false;
!                     }
!                     idt = ts.sym.ident;
!                 }
!                 else if (auto te = dt.isTypeEnum())
!                 {
!                     if (te.sym.isAnonymous())
!                     {
!                         // This is a typedef for an anonymous enum.
!                         te.sym.ident = id;
!                         isalias = false;
!                     }
!                     idt = te.sym.ident;
!                 }
!                 else if (auto tt = dt.isTypeTag())
                  {
                      if (!tt.id && id)
                          /* This applies for enums declared as
                           * typedef enum {A} E;
                           */
                          tt.id = id;
!                     Specifier spec;
!                     declareTag(tt, spec);
                      idt = tt.id;
                  }
                  if (isalias)
                  {
                      //printf("AliasDeclaration %s %s\n", id.toChars(), dt.toChars());
--- 1990,2022 ----
  
                  bool isalias = true;
                  Identifier idt;
!                 if (auto tt = dt.isTypeTag())
                  {
                      if (!tt.id && id)
                          /* This applies for enums declared as
                           * typedef enum {A} E;
+                          * Or for similar structs and unions.
                           */
                          tt.id = id;
!                     if (tt.members)
!                     {
!                         Specifier spec;
!                         declareTag(tt, spec);
!                     }
                      idt = tt.id;
                  }
+                 else if (auto tt = tspec.isTypeTag())
+                 {
+                     // The unusual situation of an anonymous typedef struct where the
+                     // first typedef can't be used as its name.
+                     // Just declare it now so we can get a valid id.
+                     if (!tt.id && tt.members)
+                     {
+                         Specifier spec;
+                         declareTag(tt, spec, true);
+                         idt = tt.id;
+                     }
+                 }
                  if (isalias)
                  {
                      //printf("AliasDeclaration %s %s\n", id.toChars(), dt.toChars());
*************** final class CParser(AST) : Parser!AST
*** 2033,2038 ****
--- 2045,2060 ----
                  if (dt.ty == AST.Tvoid)
                      error("`void` has no value");
  
+                 if (auto tt = tspec.isTypeTag())
+                 {
+                     // Anonymous struct being used as a var decl type
+                     if (!tt.id && tt.members && tt.tok != TOK.enum_)
+                     {
+                         Specifier spec;
+                         declareTag(tt, spec);
+                     }
+                 }
+ 
                  AST.Initializer initializer;
                  bool hasInitializer;
                  if (token.value == TOK.assign)
*************** final class CParser(AST) : Parser!AST
*** 2456,2480 ****
                      const sloc = token.loc;
                      nextToken();
  
!                     Specifier tagSpecifier;
! 
!                     /* GNU Extensions
!                      * struct-or-union-specifier:
!                      *    struct-or-union gnu-attributes (opt) identifier (opt) { struct-declaration-list } gnu-attributes (opt)
!                      *    struct-or-union gnu-attribute (opt) identifier
!                      */
!                     while (1)
!                     {
!                         if (token.value == TOK.__attribute__)
!                             cparseGnuAttributes(tagSpecifier);
!                         else if (token.value == TOK.__declspec)
!                             cparseDeclspec(tagSpecifier);
!                         else if (token.value == TOK.__pragma)
!                             uupragmaDirective(sloc);
!                         else
!                             break;
!                     }
!                     t = cparseStruct(sloc, structOrUnion, tagSpecifier.packalign, symbols);
                      tkwx = TKW.xtag;
                      break;
                  }
--- 2478,2484 ----
                      const sloc = token.loc;
                      nextToken();
  
!                     t = cparseStruct(sloc, structOrUnion, symbols);
                      tkwx = TKW.xtag;
                      break;
                  }
*************** final class CParser(AST) : Parser!AST
*** 2536,2541 ****
--- 2540,2546 ----
                      if (!specifier.alignExps)
                          specifier.alignExps = new AST.Expressions(0);
                      specifier.alignExps.push(exp);
+                     specifier.alignasExp = exp;
  
                      check(TOK.rightParenthesis);
                      break;
*************** final class CParser(AST) : Parser!AST
*** 2839,2844 ****
--- 2844,2861 ----
          //printf("cparseDeclarator(%d, %s)\n", declarator, tbase.toChars());
          AST.Types constTypes; // all the Types that will need `const` applied to them
  
+         // this.symbols can get changed to the symbol table for the
+         // parameter-type-list if we parse a function type.
+         // Callers are only ready to handle this if they pass DTR.xdirect_fd,
+         // so remember to restore this.symbols.
+         bool restore_symbols = true;
+         if (declarator == DTR.xdirect_fd)
+         {
+             declarator = DTR.xdirect;
+             restore_symbols = false;
+         }
+ 
+ 
          /* Insert tx -> t into
           *   ts -> ... -> t
           * so that
*************** final class CParser(AST) : Parser!AST
*** 3030,3036 ****
                          //tf = tf.addSTC(storageClass);  // TODO
                          insertTx(ts, tf, t);  // ts -> ... -> tf -> t
  
!                         if (ts != tf)
                              this.symbols = symbolsSave;
                          break;
                      }
--- 3047,3053 ----
                          //tf = tf.addSTC(storageClass);  // TODO
                          insertTx(ts, tf, t);  // ts -> ... -> tf -> t
  
!                         if (ts != tf || restore_symbols)
                              this.symbols = symbolsSave;
                          break;
                      }
*************** final class CParser(AST) : Parser!AST
*** 3422,3427 ****
--- 3439,3449 ----
                          cparseParens();
                  }
              }
+             else if (token.value == TOK._Noreturn)
+             {
+                 specifier.noreturn = true;
+                 nextToken();
+             }
              else if (token.value == TOK.restrict) // ImportC assigns no semantics to `restrict`, so just ignore the keyword.
                  nextToken();
              else
*************** final class CParser(AST) : Parser!AST
*** 3470,3488 ****
  
          nextToken();
  
!         // Consume all asm-qualifiers. As a future optimization, we could record
!         // the `inline` and `volatile` storage classes against the statement.
!         while (token.value == TOK.goto_ ||
!                token.value == TOK.inline ||
!                token.value == TOK.volatile)
!             nextToken();
  
          check(TOK.leftParenthesis);
          if (token.value != TOK.string_)
              error("string literal expected for Assembler Template, not `%s`", token.toChars());
          Token* toklist = null;
          Token** ptoklist = &toklist;
-         //Identifier label = null;
          auto statements = new AST.Statements();
  
          int parens;
--- 3492,3542 ----
  
          nextToken();
  
!         // Consume all asm-qualifiers.
!         enum AsmQualifiers { none = 0, goto_ = 1, inline = 2, volatile = 4, }
!         AsmQualifiers asmQualifiers;
!         while (1)
!         {
!             AsmQualifiers qual;
!             switch (token.value)
!             {
!                 case TOK.goto_:
!                     qual = AsmQualifiers.goto_;
!                     goto Lcontinue;
! 
!                 case TOK.inline:
!                     qual = AsmQualifiers.inline;
!                     goto Lcontinue;
! 
!                 case TOK.volatile:
!                     qual = AsmQualifiers.volatile;
!                     goto Lcontinue;
! 
!                 Lcontinue:
!                     if (asmQualifiers & qual)
!                         error(token.loc, "duplicate `asm` qualifier `%s`", token.toChars());
!                     else
!                         asmQualifiers |= qual;
!                     nextToken();
!                     continue;
! 
!                 case TOK.const_:
!                 case TOK.restrict:
!                     error(token.loc, "`%s` is not a valid `asm` qualifier", token.toChars());
!                     nextToken();
!                     continue;
! 
!                 default:
!                     break;
!             }
!             break;
!         }
  
          check(TOK.leftParenthesis);
          if (token.value != TOK.string_)
              error("string literal expected for Assembler Template, not `%s`", token.toChars());
          Token* toklist = null;
          Token** ptoklist = &toklist;
          auto statements = new AST.Statements();
  
          int parens;
*************** final class CParser(AST) : Parser!AST
*** 3509,3532 ****
                      error("matching `)` expected, not end of file");
                      break;
  
-                 case TOK.colonColon:  // treat as two separate : tokens for iasmgcc
-                     *ptoklist = allocateToken();
-                     memcpy(*ptoklist, &token, Token.sizeof);
-                     (*ptoklist).value = TOK.colon;
-                     ptoklist = &(*ptoklist).next;
- 
-                     *ptoklist = allocateToken();
-                     memcpy(*ptoklist, &token, Token.sizeof);
-                     (*ptoklist).value = TOK.colon;
-                     ptoklist = &(*ptoklist).next;
- 
-                     *ptoklist = null;
-                     nextToken();
-                     continue;
- 
                  default:
                      *ptoklist = allocateToken();
!                     memcpy(*ptoklist, &token, Token.sizeof);
                      ptoklist = &(*ptoklist).next;
                      *ptoklist = null;
                      nextToken();
--- 3563,3571 ----
                      error("matching `)` expected, not end of file");
                      break;
  
                  default:
                      *ptoklist = allocateToken();
!                     **ptoklist = this.token;
                      ptoklist = &(*ptoklist).next;
                      *ptoklist = null;
                      nextToken();
*************** final class CParser(AST) : Parser!AST
*** 3535,3541 ****
              if (toklist)
              {
                  // Create AsmStatement from list of tokens we've saved
!                 AST.Statement s = new AST.AsmStatement(token.loc, toklist);
                  statements.push(s);
              }
              break;
--- 3574,3584 ----
              if (toklist)
              {
                  // Create AsmStatement from list of tokens we've saved
!                 auto s = new AST.AsmStatement(token.loc, toklist);
!                 if (asmQualifiers & AsmQualifiers.volatile)
!                     s.isVolatile = true;
!                 if (asmQualifiers & AsmQualifiers.inline)
!                     s.isInline = true;
                  statements.push(s);
              }
              break;
*************** final class CParser(AST) : Parser!AST
*** 3620,3645 ****
                  if (token.value == TOK.leftParenthesis)
                  {
                      nextToken();
!                     if (token.value == TOK.int32Literal)
!                     {
!                         const n = token.unsvalue;
!                         if (n < 1 || n & (n - 1) || ushort.max < n)
!                             error("__attribute__((aligned(%lld))) must be an integer positive power of 2 and be <= 32,768", cast(ulong)n);
!                         specifier.packalign.set(cast(uint)n);
!                         specifier.packalign.setPack(true);
!                         nextToken();
!                     }
!                     else
!                     {
!                         error("alignment value expected, not `%s`", token.toChars());
!                         nextToken();
!                     }
! 
                      check(TOK.rightParenthesis);
                  }
!                 /* ignore __attribute__((aligned)), which sets the alignment to the largest value for any data
!                  * type on the target machine. It's the opposite of __attribute__((packed))
!                  */
              }
              else if (token.ident == Id.packed)
              {
--- 3663,3680 ----
                  if (token.value == TOK.leftParenthesis)
                  {
                      nextToken();
!                     AST.Expression exp = cparseConstantExp();
!                     if (!specifier.alignExps)
!                         specifier.alignExps = new AST.Expressions(0);
!                     specifier.alignExps.push(exp);
                      check(TOK.rightParenthesis);
                  }
!                 else
!                 {
!                     /* ignore __attribute__((aligned)), which sets the alignment to the largest value for any data
!                      * type on the target machine. It's the opposite of __attribute__((packed))
!                      */
!                 }
              }
              else if (token.ident == Id.packed)
              {
*************** final class CParser(AST) : Parser!AST
*** 3951,3957 ****
           * redeclaration, or reference to existing declaration.
           * Defer to the semantic() pass with a TypeTag.
           */
!         return new AST.TypeTag(loc, TOK.enum_, tag, structalign_t.init, base, members);
      }
  
      /*************************************
--- 3986,3992 ----
           * redeclaration, or reference to existing declaration.
           * Defer to the semantic() pass with a TypeTag.
           */
!         return new AST.TypeTag(loc, TOK.enum_, tag, structalign_t.init, null, base, members);
      }
  
      /*************************************
*************** final class CParser(AST) : Parser!AST
*** 3978,3985 ****
       * Returns:
       *  type of the struct
       */
!     private AST.Type cparseStruct(Loc loc, TOK structOrUnion, structalign_t packalign, ref AST.Dsymbols* symbols)
      {
          Identifier tag;
  
          if (token.value == TOK.identifier)
--- 4013,4037 ----
       * Returns:
       *  type of the struct
       */
!     private AST.Type cparseStruct(Loc loc, TOK structOrUnion, ref AST.Dsymbols* symbols)
      {
+         /* GNU Extensions
+          * struct-or-union-specifier:
+          *    struct-or-union gnu-attributes (opt) identifier (opt) { struct-declaration-list } gnu-attributes (opt)
+          *    struct-or-union gnu-attribute (opt) identifier
+          */
+         Specifier tagSpecifier;
+         while (1)
+         {
+             if (token.value == TOK.__attribute__)
+                 cparseGnuAttributes(tagSpecifier);
+             else if (token.value == TOK.__declspec)
+                 cparseDeclspec(tagSpecifier);
+             else if (token.value == TOK.__pragma)
+                 uupragmaDirective(loc);
+             else
+                 break;
+         }
          Identifier tag;
  
          if (token.value == TOK.identifier)
*************** final class CParser(AST) : Parser!AST
*** 3995,4001 ****
              members = new AST.Dsymbols();          // so `members` will be non-null even with 0 members
              while (token.value != TOK.rightCurly)
              {
!                 cparseStructDeclaration(members, packalign);
  
                  if (token.value == TOK.endOfFile)
                      break;
--- 4047,4053 ----
              members = new AST.Dsymbols();          // so `members` will be non-null even with 0 members
              while (token.value != TOK.rightCurly)
              {
!                 cparseStructDeclaration(members, tagSpecifier.packalign);
  
                  if (token.value == TOK.endOfFile)
                      break;
*************** final class CParser(AST) : Parser!AST
*** 4013,4030 ****
              /* GNU Extensions
               * Parse the postfix gnu-attributes (opt)
               */
-             Specifier specifier;
              if (token.value == TOK.__attribute__)
!                 cparseGnuAttributes(specifier);
!             if (!specifier.packalign.isUnknown)
              {
-                 packalign.set(specifier.packalign.get());
-                 packalign.setPack(specifier.packalign.isPack());
                  foreach (ref d; (*members)[])
                  {
                      auto decls = new AST.Dsymbols(1);
                      (*decls)[0] = d;
!                     d = new AST.AlignDeclaration(d.loc, specifier.packalign, decls);
                  }
              }
          }
--- 4065,4082 ----
              /* GNU Extensions
               * Parse the postfix gnu-attributes (opt)
               */
              if (token.value == TOK.__attribute__)
!                 cparseGnuAttributes(tagSpecifier);
!             if (!tagSpecifier.packalign.isUnknown)
              {
                  foreach (ref d; (*members)[])
                  {
+                     // skip possible static assert declarations
+                     if (d.isStaticAssert()) continue;
+ 
                      auto decls = new AST.Dsymbols(1);
                      (*decls)[0] = d;
!                     d = new AST.AlignDeclaration(d.loc, tagSpecifier.packalign, decls);
                  }
              }
          }
*************** final class CParser(AST) : Parser!AST
*** 4032,4045 ****
              error("missing tag `identifier` after `%s`", Token.toChars(structOrUnion));
  
          // many ways and places to declare alignment
!         if (packalign.isUnknown() && !this.packalign.isUnknown())
!             packalign.set(this.packalign.get());
  
          /* Need semantic information to determine if this is a declaration,
           * redeclaration, or reference to existing declaration.
           * Defer to the semantic() pass with a TypeTag.
           */
!         return new AST.TypeTag(loc, structOrUnion, tag, packalign, null, members);
      }
  
      /*************************************
--- 4084,4097 ----
              error("missing tag `identifier` after `%s`", Token.toChars(structOrUnion));
  
          // many ways and places to declare alignment
!         if (tagSpecifier.packalign.isUnknown() && !this.packalign.isUnknown())
!             tagSpecifier.packalign.set(this.packalign.get());
  
          /* Need semantic information to determine if this is a declaration,
           * redeclaration, or reference to existing declaration.
           * Defer to the semantic() pass with a TypeTag.
           */
!         return new AST.TypeTag(loc, structOrUnion, tag, tagSpecifier.packalign, tagSpecifier.alignExps, null, members);
      }
  
      /*************************************
*************** final class CParser(AST) : Parser!AST
*** 4103,4109 ****
               *   struct { ... members ... };
               * C11 6.7.2.1-13
               */
!             if (!tt.id && tt.members)
              {
                  /* members of anonymous struct are considered members of
                   * the containing struct
--- 4155,4161 ----
               *   struct { ... members ... };
               * C11 6.7.2.1-13
               */
!             if (!tt.id && tt.members && tt.tok != TOK.enum_)
              {
                  /* members of anonymous struct are considered members of
                   * the containing struct
*************** final class CParser(AST) : Parser!AST
*** 4119,4135 ****
              /* `struct tag;` and `struct tag { ... };`
               * always result in a declaration in the current scope
               */
!             // TODO: merge in specifier
!             auto stag = (tt.tok == TOK.struct_)
!                 ? new AST.StructDeclaration(tt.loc, tt.id, false)
!                 : new AST.UnionDeclaration(tt.loc, tt.id);
!             stag.members = tt.members;
!             if (!symbols)
!                 symbols = new AST.Dsymbols();
!             auto s = applySpecifier(stag, specifier);
!             symbols.push(s);
              return;
          }
  
          while (1)
          {
--- 4171,4189 ----
              /* `struct tag;` and `struct tag { ... };`
               * always result in a declaration in the current scope
               */
!             Specifier spec;
!             declareTag(tt, spec);
              return;
          }
+         if (auto tt = tspec.isTypeTag())
+         {
+             // Declare the tagged type at this point.
+             if (tt.members)
+             {
+                 Specifier spec;
+                 declareTag(tt, spec);
+             }
+         }
  
          while (1)
          {
*************** final class CParser(AST) : Parser!AST
*** 4178,4185 ****
                  error("specifier-qualifier-list required");
              else if (width)
              {
!                 if (specifier.alignExps)
!                     error("no alignment-specifier for bit field declaration"); // C11 6.7.5-2
                  auto s = new AST.BitFieldDeclaration(width.loc, dt, id, width);
                  members.push(s);
              }
--- 4232,4239 ----
                  error("specifier-qualifier-list required");
              else if (width)
              {
!                 if (specifier.alignasExp)
!                     error(specifier.alignasExp.loc, "no alignment-specifier for bit field declaration"); // C11 6.7.5-2
                  auto s = new AST.BitFieldDeclaration(width.loc, dt, id, width);
                  members.push(s);
              }
*************** final class CParser(AST) : Parser!AST
*** 4998,5003 ****
--- 5052,5058 ----
                      return false;
                  break;
  
+             case TOK._Alignof:
              case TOK.sizeof_:
                  t = peek(t);
                  if (t.value == TOK.leftParenthesis)
*************** final class CParser(AST) : Parser!AST
*** 5015,5029 ****
                      return false;
                  break;
  
-             case TOK._Alignof:
-                 t = peek(t);
-                 if (t.value != TOK.leftParenthesis)
-                     return false;
-                 t = peek(t);
-                 if (!isTypeName(t) || t.value != TOK.rightParenthesis)
-                     return false;
-                 break;
- 
              default:
                  // Compound literals are handled by cast and sizeof expressions,
                  // so be content with just seeing a primary expression.
--- 5070,5075 ----
*************** final class CParser(AST) : Parser!AST
*** 5104,5109 ****
--- 5150,5156 ----
      /// Types of declarator to parse
      enum DTR
      {
+         xdirect_fd = 0, /// C11 6.7.6 direct-declarator, allow to start function definition
          xdirect    = 1, /// C11 6.7.6 direct-declarator
          xabstract  = 2, /// C11 6.7.7 abstract-declarator
          xparameter = 3, /// parameter declarator may be either direct or abstract
*************** final class CParser(AST) : Parser!AST
*** 5155,5160 ****
--- 5202,5208 ----
          SCW scw;        /// storage-class specifiers
          MOD mod;        /// type qualifiers
          AST.Expressions*  alignExps;  /// alignment
+         AST.Expression alignasExp; /// Last _Alignas() for errors
          structalign_t packalign;  /// #pragma pack alignment value
      }
  
*************** final class CParser(AST) : Parser!AST
*** 6049,6055 ****
          {
              //printf("addSym() %s\n", s.toChars());
              if (auto v = s.isVarDeclaration())
!                 v.isCmacro(true);       // mark it as coming from a C #define
              /* If it's already defined, replace the earlier
               * definition
               */
--- 6097,6105 ----
          {
              //printf("addSym() %s\n", s.toChars());
              if (auto v = s.isVarDeclaration())
!                 v.isCmacro = true;       // mark it as coming from a C #define
!             if (auto td = s.isTemplateDeclaration())
!                 td.isCmacro = true; // mark as coming from a C #define
              /* If it's already defined, replace the earlier
               * definition
               */
*************** final class CParser(AST) : Parser!AST
*** 6073,6078 ****
--- 6123,6136 ----
              }
          }
  
+         void nextLine()
+         {
+             // scan to end of line
+             while (*p)
+                 ++p;
+             ++p; // advance to start of next line
+         }
+ 
          while (p < endp)
          {
              //printf("|%s|\n", p);
*************** final class CParser(AST) : Parser!AST
*** 6084,6089 ****
--- 6142,6154 ----
                  if (token.value == TOK.identifier)
                  {
                      auto id = token.ident;
+                     // https://github.com/dlang/dmd/issues/20423
+                     // skip macros that could shadow special builtins
+                     if (id == Id.va_arg)
+                     {
+                         nextLine();
+                         continue;
+                     }
                      const params = *p == '(';
                      nextToken();
  
*************** final class CParser(AST) : Parser!AST
*** 6181,6187 ****
                                  /* Declare manifest constant:
                                   *  enum id = "string";
                                   */
!                                 AST.Expression e = new AST.StringExp(scanloc, str[0 .. len], len, 1, postfix);
                                  auto v = new AST.VarDeclaration(scanloc, null, id, new AST.ExpInitializer(scanloc, e), STC.manifest);
                                  addSym(v);
                                  ++p;
--- 6246,6252 ----
                                  /* Declare manifest constant:
                                   *  enum id = "string";
                                   */
!                                 AST.Expression e = new AST.StringExp(scanloc, str[0 .. len], len, 1, postfix, true);
                                  auto v = new AST.VarDeclaration(scanloc, null, id, new AST.ExpInitializer(scanloc, e), STC.manifest);
                                  addSym(v);
                                  ++p;
*************** final class CParser(AST) : Parser!AST
*** 6329,6338 ****
                  if (token.value == TOK.identifier)
                      removeSym(token.ident);
              }
!             // scan to end of line
!             while (*p)
!                 ++p;
!             ++p; // advance to start of next line
          }
  
          if (newSymbols.length)
--- 6394,6400 ----
                  if (token.value == TOK.identifier)
                      removeSym(token.ident);
              }
!             nextLine();
          }
  
          if (newSymbols.length)
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/ctfeexpr.d gcc-16-20260201/gcc/d/dmd/ctfeexpr.d
*** gcc-16-20260125/gcc/d/dmd/ctfeexpr.d	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/ctfeexpr.d	Sun Feb  1 22:32:07 2026
*************** import dmd.dtemplate;
*** 26,32 ****
  import dmd.errors;
  import dmd.expression;
  import dmd.func;
! import dmd.globals;
  import dmd.location;
  import dmd.mtype;
  import dmd.root.bitarray;
--- 26,32 ----
  import dmd.errors;
  import dmd.expression;
  import dmd.func;
! import dmd.globals : dinteger_t, sinteger_t, uinteger_t;
  import dmd.location;
  import dmd.mtype;
  import dmd.root.bitarray;
*************** UnionExp copyLiteral(Expression e)
*** 241,246 ****
--- 241,247 ----
          AssocArrayLiteralExp r = ue.exp().isAssocArrayLiteralExp();
          r.type = aae.type;
          r.lowering = aae.lowering;
+         r.loweringCtfe = aae.loweringCtfe;
          r.ownedByCtfe = OwnedBy.ctfe;
          return ue;
      }
*************** UnionExp ctfeCat(Loc loc, Type type, Exp
*** 1459,1465 ****
  /*  Given an AA literal 'ae', and a key 'e2':
   *  Return ae[e2] if present, or NULL if not found.
   */
! Expression findKeyInAA(Loc loc, AssocArrayLiteralExp ae, Expression e2)
  {
      /* Search the keys backwards, in case there are duplicate keys
       */
--- 1460,1466 ----
  /*  Given an AA literal 'ae', and a key 'e2':
   *  Return ae[e2] if present, or NULL if not found.
   */
! Expression findKeyInAA(Loc loc, AssocArrayLiteralExp ae, Expression e2, size_t* pidx = null)
  {
      /* Search the keys backwards, in case there are duplicate keys
       */
*************** Expression findKeyInAA(Loc loc, AssocArr
*** 1470,1475 ****
--- 1471,1478 ----
          const int eq = ctfeEqual(loc, EXP.equal, ekey, e2);
          if (eq)
          {
+             if (pidx)
+                 *pidx = i;
              return (*ae.values)[i];
          }
      }
*************** Expression ctfeCast(UnionExp* pue, Loc l
*** 1583,1593 ****
   */
  void assignInPlace(Expression dest, Expression src)
  {
-     if (!(dest.op == EXP.structLiteral || dest.op == EXP.arrayLiteral || dest.op == EXP.string_))
-     {
-         printf("invalid op %d %d\n", src.op, dest.op);
-         assert(0);
-     }
      Expressions* oldelems;
      Expressions* newelems;
      if (dest.op == EXP.structLiteral)
--- 1586,1591 ----
*************** void assignInPlace(Expression dest, Expr
*** 1622,1627 ****
--- 1620,1635 ----
          sliceAssignStringFromArrayLiteral(dest.isStringExp(), src.isArrayLiteralExp(), 0);
          return;
      }
+     else if (dest.op == EXP.int64 && src.op == EXP.int64)
+     {
+         dest.isIntegerExp().setInteger(src.isIntegerExp().getInteger());
+         return;
+     }
+     else if (dest.op == EXP.float64 && src.op == EXP.float64)
+     {
+         dest.isRealExp().value = src.isRealExp().value;
+         return;
+     }
      else
      {
          printf("invalid op %d %d\n", src.op, dest.op);
*************** bool isCtfeValueValid(Expression newval)
*** 1829,1834 ****
--- 1837,1845 ----
              (
                  (e1.op == EXP.structLiteral || e1.op == EXP.arrayLiteral) && isCtfeValueValid(e1) ||
                   e1.op == EXP.variable ||
+                  e1.op == EXP.int64 ||
+                  e1.op == EXP.float64 ||
+                  e1.op == EXP.string_ ||
                   e1.op == EXP.dotVariable && isCtfeReferenceValid(e1) ||
                   e1.op == EXP.index && isCtfeReferenceValid(e1) ||
                   e1.op == EXP.slice && e1.type.toBasetype().ty == Tsarray
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/cxxfrontend.d gcc-16-20260201/gcc/d/dmd/cxxfrontend.d
*** gcc-16-20260125/gcc/d/dmd/cxxfrontend.d	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/cxxfrontend.d	Sun Feb  1 22:32:07 2026
*************** import dmd.dtemplate /*: TemplateInstanc
*** 26,37 ****
  import dmd.errorsink : ErrorSink;
  import dmd.expression /*: Expression*/;
  import dmd.func : FuncDeclaration;
! import dmd.globals;
  import dmd.identifier : Identifier;
  import dmd.init : Initializer, NeedInterpret;
  import dmd.location : Loc;
  import dmd.mtype /*: Covariant, Type, Parameter, ParameterList*/;
  import dmd.rootobject : RootObject;
  import dmd.statement : Statement, AsmStatement, GccAsmStatement;
  
  // NB: At some point in the future, we can switch to shortened function syntax.
--- 26,38 ----
  import dmd.errorsink : ErrorSink;
  import dmd.expression /*: Expression*/;
  import dmd.func : FuncDeclaration;
! import dmd.globals : dinteger_t, uinteger_t, JsonFieldFlags;
  import dmd.identifier : Identifier;
  import dmd.init : Initializer, NeedInterpret;
  import dmd.location : Loc;
  import dmd.mtype /*: Covariant, Type, Parameter, ParameterList*/;
  import dmd.rootobject : RootObject;
+ import dmd.semantic3;
  import dmd.statement : Statement, AsmStatement, GccAsmStatement;
  
  // NB: At some point in the future, we can switch to shortened function syntax.
*************** void mangleToBuffer(TemplateInstance ti,
*** 112,122 ****
  /***********************************************************
   * dmodule.d
   */
- void getLocalClasses(Module mod, ref ClassDeclarations aclasses)
- {
-     return dmd.dmodule.getLocalClasses(mod, aclasses);
- }
- 
  FuncDeclaration findGetMembers(ScopeDsymbol dsym)
  {
      return dmd.dmodule.findGetMembers(dsym);
--- 113,118 ----
*************** void gendocfile(Module m, const char* dd
*** 137,143 ****
   */
  FuncDeclaration search_toString(StructDeclaration sd)
  {
!     return dmd.dstruct.search_toString(sd);
  }
  
  /***********************************************************
--- 133,139 ----
   */
  FuncDeclaration search_toString(StructDeclaration sd)
  {
!     return dmd.semantic3.search_toString(sd);
  }
  
  /***********************************************************
*************** Dsymbol vtblSymbol(ClassDeclaration cd)
*** 192,197 ****
--- 188,229 ----
      return dmd.dsymbolsem.vtblSymbol(cd);
  }
  
+ bool isAbstract(ClassDeclaration cd)
+ {
+     import dmd.dsymbolsem;
+     return dmd.dsymbolsem.isAbstract(cd);
+ }
+ 
+ bool hasPointers(Dsymbol d)
+ {
+     import dmd.dsymbolsem;
+     return dmd.dsymbolsem.hasPointers(d);
+ }
+ 
+ void getLocalClasses(Module mod, ref ClassDeclarations aclasses)
+ {
+     import dmd.dsymbolsem;
+     return dmd.dsymbolsem.getLocalClasses(mod, aclasses);
+ }
+ 
+ Dsymbol toAlias(Dsymbol s)
+ {
+     import dmd.dsymbolsem;
+     return dmd.dsymbolsem.toAlias(s);
+ }
+ 
+ Dsymbol toAlias2(Dsymbol s)
+ {
+     import dmd.dsymbolsem;
+     return dmd.dsymbolsem.toAlias2(s);
+ }
+ 
+ bool isPOD(StructDeclaration sd)
+ {
+     import dmd.dsymbolsem;
+     return dmd.dsymbolsem.isPOD(sd);
+ }
+ 
  /***********************************************************
   * dtemplate.d
   */
*************** void printTemplateStats(bool listInstanc
*** 235,240 ****
--- 267,277 ----
      return dmd.dtemplate.printTemplateStats(listInstances, eSink);
  }
  
+ void printInstantiationTrace(TemplateInstance ti)
+ {
+     return ti.printInstantiationTrace();
+ }
+ 
  /***********************************************************
   * dtoh.d
   */
*************** Expression getDefaultValue(EnumDeclarati
*** 256,262 ****
  /***********************************************************
   * expression.d
   */
! void expandTuples(Expressions* exps, Identifiers* names = null)
  {
      return dmd.expression.expandTuples(exps, names);
  }
--- 293,299 ----
  /***********************************************************
   * expression.d
   */
! void expandTuples(Expressions* exps, ArgumentLabels* names = null)
  {
      return dmd.expression.expandTuples(exps, names);
  }
*************** bool functionSemantic3(FuncDeclaration f
*** 305,311 ****
      return dmd.funcsem.functionSemantic3(fd);
  }
  
! MATCH leastAsSpecialized(FuncDeclaration fd, FuncDeclaration g, Identifiers* names)
  {
      import dmd.funcsem;
      return dmd.funcsem.leastAsSpecialized(fd, g, names);
--- 342,348 ----
      return dmd.funcsem.functionSemantic3(fd);
  }
  
! MATCH leastAsSpecialized(FuncDeclaration fd, FuncDeclaration g, ArgumentLabels* names)
  {
      import dmd.funcsem;
      return dmd.funcsem.leastAsSpecialized(fd, g, names);
*************** void asmSemantic(CAsmDeclaration d, Scop
*** 382,395 ****
   */
  Statement gccAsmSemantic(GccAsmStatement s, Scope* sc)
  {
!     import dmd.iasmgcc;
!     return dmd.iasmgcc.gccAsmSemantic(s, sc);
  }
  
  void gccAsmSemantic(CAsmDeclaration d, Scope* sc)
  {
!     import dmd.iasmgcc;
!     return dmd.iasmgcc.gccAsmSemantic(d, sc);
  }
  
  /***********************************************************
--- 419,432 ----
   */
  Statement gccAsmSemantic(GccAsmStatement s, Scope* sc)
  {
!     import dmd.iasm.gcc;
!     return dmd.iasm.gcc.gccAsmSemantic(s, sc);
  }
  
  void gccAsmSemantic(CAsmDeclaration d, Scope* sc)
  {
!     import dmd.iasm.gcc;
!     return dmd.iasm.gcc.gccAsmSemantic(d, sc);
  }
  
  /***********************************************************
*************** MATCH constConv(Type from, Type to)
*** 708,713 ****
--- 745,756 ----
      return dmd.typesem.constConv(from, to);
  }
  
+ Expression defaultInitLiteral(Type t, Loc loc)
+ {
+     import dmd.typesem;
+     return dmd.typesem.defaultInitLiteral(t, loc);
+ }
+ 
  /***********************************************************
   * typinf.d
   */
*************** TypeInfoDeclaration getTypeInfoAssocArra
*** 741,746 ****
--- 784,803 ----
      return dmd.typinf.getTypeInfoAssocArrayDeclaration(t, sc);
  }
  
+ /**
+  * templatesem.d
+  */
+ bool needsCodegen(TemplateInstance ti)
+ {
+     import dmd.templatesem;
+     return dmd.templatesem.needsCodegen(ti);
+ }
+ 
+ bool isDiscardable(TemplateInstance ti)
+ {
+     import dmd.templatesem;
+     return dmd.templatesem.isDiscardable(ti);
+ }
  version (IN_LLVM)
  {
      /***********************************************************
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/dcast.d gcc-16-20260201/gcc/d/dmd/dcast.d
*** gcc-16-20260125/gcc/d/dmd/dcast.d	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/dcast.d	Sun Feb  1 22:32:07 2026
*************** import dmd.dstruct;
*** 27,33 ****
  import dmd.dsymbol;
  import dmd.dsymbolsem;
  import dmd.errors;
- import dmd.escape;
  import dmd.expression;
  import dmd.expressionsem;
  import dmd.func;
--- 27,32 ----
*************** Expression implicitCastTo(Expression e,
*** 149,156 ****
                  //type = type.typeSemantic(loc, sc);
                  //printf("type %s t %s\n", type.deco, t.deco);
                  auto ts = toAutoQualChars(e.type, t);
!                 error(e.loc, "cannot implicitly convert expression `%s` of type `%s` to `%s`",
!                     e.toErrMsg(), ts[0], ts[1]);
              }
          }
          return ErrorExp.get();
--- 148,187 ----
                  //type = type.typeSemantic(loc, sc);
                  //printf("type %s t %s\n", type.deco, t.deco);
                  auto ts = toAutoQualChars(e.type, t);
! 
!                 // Special case for improved diagnostic when const to mutable conversion
!                 // fails due to struct/union having pointers
!                 if (e.type.ty == Tstruct && t.ty == Tstruct &&
!                     e.type.isTypeStruct().sym == t.isTypeStruct().sym &&
!                     e.type.mod == MODFlags.const_ && t.mod == 0 && e.type.hasPointers)
!                 {
!                     auto sym = e.type.isTypeStruct().sym;
!                     error(e.loc, "cannot implicitly convert expression `%s` of type `%s` to `%s` because %s `%s` contains pointers or references",
!                         e.toErrMsg(), ts[0], ts[1], sym.kind(), sym.toErrMsg());
!                     return ErrorExp.get();
!                 }
! 
!                 // Special case for pointer conversions
!                 if (e.type.toBasetype().ty == Tpointer && t.toBasetype().ty == Tpointer)
!                 {
!                     Type fromPointee = e.type.nextOf();
!                     Type toPointee = t.nextOf();
!                     // Const -> mutable conversion (disallowed)
!                     if (fromPointee.isConst() && !toPointee.isConst())
!                     {
!                         error(e.loc, "cannot implicitly convert `%s` to `%s`", e.type.toChars(), t.toChars());
!                         errorSupplemental(e.loc, "Note: Converting const to mutable requires an explicit cast (`cast(int*)`).");
!                         return ErrorExp.get();
!                     }
!                     // Incompatible pointee types (e.g., int* -> float* )
!                     else if (fromPointee.toBasetype().ty != toPointee.toBasetype().ty)
!                     {
!                         error(e.loc, "cannot implicitly convert `%s` to `%s`", e.type.toChars(), t.toChars());
!                         errorSupplemental(e.loc, "Note: Pointer types point to different base types (`%s` vs `%s`)", fromPointee.toChars(), toPointee.toChars());
!                         return ErrorExp.get();
!                     }
!                 }
!                 error(e.loc, "cannot implicitly convert expression `%s` of type `%s` to `%s`", e.toErrMsg(), ts[0], ts[1]);
              }
          }
          return ErrorExp.get();
*************** Expression castTo(Expression e, Scope* s
*** 2715,2727 ****
          ArrayLiteralExp ae = e;
  
          Type tb = t.toBasetype();
-         if (tb.ty == Tarray)
-         {
-             if (checkArrayLiteralEscape(*sc, ae, false))
-             {
-                 return ErrorExp.get();
-             }
-         }
  
          if (e.type == t)
          {
--- 2746,2751 ----
*************** Expression castTo(Expression e, Scope* s
*** 2838,2844 ****
                  (*ae.keys)[i] = ex;
              }
              ae.type = t;
!             semanticTypeInfo(sc, ae.type);
              return ae;
          }
          return visit(e);
--- 2862,2870 ----
                  (*ae.keys)[i] = ex;
              }
              ae.type = t;
!             ae.lowering = null; // we need a different lowering
!             ae.loweringCtfe = null;
!             ae.expressionSemantic(sc);
              return ae;
          }
          return visit(e);
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/dclass.d gcc-16-20260201/gcc/d/dmd/dclass.d
*** gcc-16-20260125/gcc/d/dmd/dclass.d	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/dclass.d	Sun Feb  1 22:32:07 2026
*************** import core.stdc.string;
*** 19,29 ****
  import dmd.aggregate;
  import dmd.arraytypes;
  import dmd.astenums;
- import dmd.gluelayer;
  import dmd.declaration;
  import dmd.dscope;
  import dmd.dsymbol;
- import dmd.dsymbolsem : dsymbolSemantic, addMember, setFieldOffset;
  import dmd.errors;
  import dmd.func;
  import dmd.id;
--- 19,27 ----
*************** import dmd.mtype;
*** 33,39 ****
  import dmd.objc;
  import dmd.root.rmem;
  import dmd.target;
- import dmd.typesem : covariant, immutableOf, sarrayOf;
  import dmd.visitor;
  
  /***********************************************************
--- 31,36 ----
*************** extern (C++) class ClassDeclaration : Ag
*** 196,203 ****
       */
      ObjcClassDeclaration objc;
  
-     Symbol* cpp_type_info_ptr_sym;      // cached instance of class Id.cpp_type_info_ptr
- 
      final extern (D) this(Loc loc, Identifier id, BaseClasses* baseclasses, Dsymbols* members, bool inObject)
      {
          objc = ObjcClassDeclaration(this);
--- 193,198 ----
*************** extern (C++) class ClassDeclaration : Ag
*** 496,611 ****
          return null;
      }
  
-     final override void finalizeSize()
-     {
-         assert(sizeok != Sizeok.done);
- 
-         // Set the offsets of the fields and determine the size of the class
-         if (baseClass)
-         {
-             assert(baseClass.sizeok == Sizeok.done);
- 
-             alignsize = baseClass.alignsize;
-             if (classKind == ClassKind.cpp)
-                 structsize = target.cpp.derivedClassOffset(baseClass);
-             else
-                 structsize = baseClass.structsize;
-         }
-         else if (classKind == ClassKind.objc)
-             structsize = 0; // no hidden member for an Objective-C class
-         else if (isInterfaceDeclaration())
-         {
-             if (interfaces.length == 0)
-             {
-                 alignsize = target.ptrsize;
-                 structsize = target.ptrsize;      // allow room for __vptr
-             }
-         }
-         else
-         {
-             alignsize = target.ptrsize;
-             structsize = target.ptrsize;      // allow room for __vptr
-             if (hasMonitor())
-                 structsize += target.ptrsize; // allow room for __monitor
-         }
- 
-         //printf("finalizeSize() %s, sizeok = %d\n", toChars(), sizeok);
-         size_t bi = 0;                  // index into vtblInterfaces[]
- 
-         /****
-          * Runs through the inheritance graph to set the BaseClass.offset fields.
-          * Recursive in order to account for the size of the interface classes, if they are
-          * more than just interfaces.
-          * Params:
-          *      cd = interface to look at
-          *      baseOffset = offset of where cd will be placed
-          * Returns:
-          *      subset of instantiated size used by cd for interfaces
-          */
-         uint membersPlace(ClassDeclaration cd, uint baseOffset)
-         {
-             //printf("    membersPlace(%s, %d)\n", cd.toChars(), baseOffset);
-             uint offset = baseOffset;
- 
-             foreach (BaseClass* b; cd.interfaces)
-             {
-                 if (b.sym.sizeok != Sizeok.done)
-                     b.sym.finalizeSize();
-                 assert(b.sym.sizeok == Sizeok.done);
- 
-                 if (!b.sym.alignsize)
-                     b.sym.alignsize = target.ptrsize;
-                 offset = alignmember(structalign_t(cast(ushort)b.sym.alignsize), b.sym.alignsize, offset);
-                 assert(bi < vtblInterfaces.length);
- 
-                 BaseClass* bv = (*vtblInterfaces)[bi];
-                 if (b.sym.interfaces.length == 0)
-                 {
-                     //printf("\tvtblInterfaces[%d] b=%p b.sym = %s, offset = %d\n", bi, bv, bv.sym.toChars(), offset);
-                     bv.offset = offset;
-                     ++bi;
-                     // All the base interfaces down the left side share the same offset
-                     for (BaseClass* b2 = bv; b2.baseInterfaces.length; )
-                     {
-                         b2 = &b2.baseInterfaces[0];
-                         b2.offset = offset;
-                         //printf("\tvtblInterfaces[%d] b=%p   sym = %s, offset = %d\n", bi, b2, b2.sym.toChars(), b2.offset);
-                     }
-                 }
-                 membersPlace(b.sym, offset);
-                 //printf(" %s size = %d\n", b.sym.toChars(), b.sym.structsize);
-                 offset += b.sym.structsize;
-                 if (alignsize < b.sym.alignsize)
-                     alignsize = b.sym.alignsize;
-             }
-             return offset - baseOffset;
-         }
- 
-         structsize += membersPlace(this, structsize);
- 
-         if (isInterfaceDeclaration())
-         {
-             sizeok = Sizeok.done;
-             return;
-         }
- 
-         // FIXME: Currently setFieldOffset functions need to increase fields
-         // to calculate each variable offsets. It can be improved later.
-         fields.setDim(0);
- 
-         FieldState fieldState;
-         fieldState.offset = structsize;
-         foreach (s; *members)
-         {
-             s.setFieldOffset(this, &fieldState, false);
-         }
- 
-         sizeok = Sizeok.done;
- 
-         // Calculate fields[i].overlapped
-         checkOverlappedFields();
-     }
- 
      /**************
       * Returns: true if there's a __monitor field
       */
--- 491,496 ----
*************** extern (C++) class ClassDeclaration : Ag
*** 758,863 ****
      }
  
      /****************************************
-      */
-     final bool isAbstract()
-     {
-         enum log = false;
-         if (isabstract != ThreeState.none)
-             return isabstract == ThreeState.yes;
- 
-         if (log) printf("isAbstract(%s)\n", toChars());
- 
-         bool no()  { if (log) printf("no\n");  isabstract = ThreeState.no;  return false; }
-         bool yes() { if (log) printf("yes\n"); isabstract = ThreeState.yes; return true;  }
- 
-         if (storage_class & STC.abstract_ || _scope && _scope.stc & STC.abstract_)
-             return yes();
- 
-         if (errors)
-             return no();
- 
-         /* https://issues.dlang.org/show_bug.cgi?id=11169
-          * Resolve forward references to all class member functions,
-          * and determine whether this class is abstract.
-          */
-         static int func(Dsymbol s, void*)
-         {
-             auto fd = s.isFuncDeclaration();
-             if (!fd)
-                 return 0;
-             if (fd.storage_class & STC.static_)
-                 return 0;
- 
-             if (fd.isAbstract())
-                 return 1;
-             return 0;
-         }
- 
-         // opaque class is not abstract if it is not declared abstract
-         if (!members)
-             return no();
- 
-         for (size_t i = 0; i < members.length; i++)
-         {
-             auto s = (*members)[i];
-             if (s.apply(&func, null))
-             {
-                 return yes();
-             }
-         }
- 
-         /* If the base class is not abstract, then this class cannot
-          * be abstract.
-          */
-         if (!isInterfaceDeclaration() && (!baseClass || !baseClass.isAbstract()))
-             return no();
- 
-         /* If any abstract functions are inherited, but not overridden,
-          * then the class is abstract. Do this by checking the vtbl[].
-          * Need to do semantic() on class to fill the vtbl[].
-          */
-         this.dsymbolSemantic(null);
- 
-         /* The next line should work, but does not because when ClassDeclaration.dsymbolSemantic()
-          * is called recursively it can set PASS.semanticdone without finishing it.
-          */
-         //if (semanticRun < PASS.semanticdone)
-         {
-             /* Could not complete semantic(). Try running semantic() on
-              * each of the virtual functions,
-              * which will fill in the vtbl[] overrides.
-              */
-             static int virtualSemantic(Dsymbol s, void*)
-             {
-                 auto fd = s.isFuncDeclaration();
-                 if (fd && !(fd.storage_class & STC.static_) && !fd.isUnitTestDeclaration())
-                     fd.dsymbolSemantic(null);
-                 return 0;
-             }
- 
-             for (size_t i = 0; i < members.length; i++)
-             {
-                 auto s = (*members)[i];
-                 s.apply(&virtualSemantic,null);
-             }
-         }
- 
-         /* Finally, check the vtbl[]
-          */
-         foreach (i; 1 .. vtbl.length)
-         {
-             auto fd = vtbl[i].isFuncDeclaration();
-             //if (fd) printf("\tvtbl[%d] = [%s] %s\n", i, fd.loc.toChars(), fd.toPrettyChars());
-             if (!fd || fd.isAbstract())
-             {
-                 return yes();
-             }
-         }
- 
-         return no();
-     }
- 
-     /****************************************
       * Determine if slot 0 of the vtbl[] is reserved for something else.
       * For class objects, yes, this is where the classinfo ptr goes.
       * For COM interfaces, no.
--- 643,648 ----
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/declaration.d gcc-16-20260201/gcc/d/dmd/declaration.d
*** gcc-16-20260125/gcc/d/dmd/declaration.d	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/declaration.d	Sun Feb  1 22:32:07 2026
*************** import dmd.delegatize;
*** 22,40 ****
  import dmd.dscope;
  import dmd.dstruct;
  import dmd.dsymbol;
! import dmd.dsymbolsem : dsymbolSemantic, aliasSemantic;
  import dmd.dtemplate;
  import dmd.errors;
  import dmd.expression;
  import dmd.func;
- import dmd.funcsem : overloadApply, getLevelAndCheck;
  import dmd.globals;
- import dmd.gluelayer;
  import dmd.hdrgen;
  import dmd.id;
  import dmd.identifier;
  import dmd.init;
- import dmd.initsem : initializerToExpression, initializerSemantic;
  import dmd.intrange;
  import dmd.location;
  import dmd.mtype;
--- 22,37 ----
  import dmd.dscope;
  import dmd.dstruct;
  import dmd.dsymbol;
! import dmd.dsymbolsem : toAlias;
  import dmd.dtemplate;
  import dmd.errors;
  import dmd.expression;
  import dmd.func;
  import dmd.globals;
  import dmd.hdrgen;
  import dmd.id;
  import dmd.identifier;
  import dmd.init;
  import dmd.intrange;
  import dmd.location;
  import dmd.mtype;
*************** import dmd.rootobject;
*** 43,49 ****
  import dmd.root.filename;
  import dmd.target;
  import dmd.tokens;
! import dmd.typesem : toDsymbol, typeSemantic, size, hasPointers;
  import dmd.visitor;
  
  version (IN_GCC) {}
--- 40,46 ----
  import dmd.root.filename;
  import dmd.target;
  import dmd.tokens;
! import dmd.typesem : typeSemantic, size;
  import dmd.visitor;
  
  version (IN_GCC) {}
*************** extern (C++) abstract class Declaration
*** 123,129 ****
          return "declaration";
      }
  
!     override final uinteger_t size(Loc loc)
      {
          assert(type);
          const sz = type.size();
--- 120,126 ----
          return "declaration";
      }
  
!     override final ulong size(Loc loc)
      {
          assert(type);
          const sz = type.size();
*************** extern (C++) final class TupleDeclaratio
*** 359,379 ****
          return tupletype;
      }
  
-     override Dsymbol toAlias2()
-     {
-         //printf("TupleDeclaration::toAlias2() '%s' objects = %s\n", toChars(), objects.toChars());
-         for (size_t i = 0; i < objects.length; i++)
-         {
-             RootObject o = (*objects)[i];
-             if (Dsymbol s = isDsymbol(o))
-             {
-                 s = s.toAlias2();
-                 (*objects)[i] = s;
-             }
-         }
-         return this;
-     }
- 
      override bool needThis()
      {
          //printf("TupleDeclaration::needThis(%s)\n", toChars());
--- 356,361 ----
*************** extern (C++) final class AliasDeclaratio
*** 602,718 ****
      {
          if (type)
              return type;
!         return toAlias().getType();
!     }
! 
!     override Dsymbol toAlias()
!     {
!         static if (0)
!         printf("[%s] AliasDeclaration::toAlias('%s', this = %p, aliassym: %s, kind: '%s', inuse = %d)\n",
!             loc.toChars(), toChars(), this, aliassym ? aliassym.toChars() : "", aliassym ? aliassym.kind() : "", inuse);
!         assert(this != aliassym);
!         //static int count; if (++count == 10) *(char*)0=0;
! 
!         Dsymbol err()
!         {
!             // Avoid breaking "recursive alias" state during errors gagged
!             if (global.gag)
!                 return this;
!             aliassym = new AliasDeclaration(loc, ident, Type.terror);
!             type = Type.terror;
!             return aliassym;
!         }
!         // Reading the AliasDeclaration
!         if (!this.ignoreRead)
!             this.wasRead = true;                 // can never assign to this AliasDeclaration again
! 
!         if (inuse == 1 && type && _scope)
!         {
!             inuse = 2;
!             const olderrors = global.errors;
!             Dsymbol s = type.toDsymbol(_scope);
!             //printf("[%s] type = %s, s = %p, this = %p\n", loc.toChars(), type.toChars(), s, this);
!             if (global.errors != olderrors)
!                 return err();
!             if (s)
!             {
!                 s = s.toAlias();
!                 if (global.errors != olderrors)
!                     return err();
!                 aliassym = s;
!                 inuse = 0;
!             }
!             else
!             {
!                 Type t = type.typeSemantic(loc, _scope);
!                 if (t.ty == Terror)
!                     return err();
!                 if (global.errors != olderrors)
!                     return err();
!                 //printf("t = %s\n", t.toChars());
!                 inuse = 0;
!             }
!         }
!         if (inuse)
!         {
!             .error(loc, "%s `%s` recursive alias declaration", kind, toPrettyChars);
!             return err();
!         }
! 
!         if (semanticRun >= PASS.semanticdone)
!         {
!             // semantic is already done.
! 
!             // Do not see aliassym !is null, because of lambda aliases.
! 
!             // Do not see type.deco !is null, even so "alias T = const int;` needs
!             // semantic analysis to take the storage class `const` as type qualifier.
!         }
!         else
!         {
!             // stop AliasAssign tuple building
!             if (aliassym)
!             {
!                 if (auto td = aliassym.isTupleDeclaration())
!                 {
!                     if (td.building)
!                     {
!                         td.building = false;
!                         semanticRun = PASS.semanticdone;
!                         return td;
!                     }
!                 }
!             }
!             if (_import && _import._scope)
!             {
!                 /* If this is an internal alias for selective/renamed import,
!                  * load the module first.
!                  */
!                 _import.dsymbolSemantic(null);
!             }
!             if (_scope)
!             {
!                 aliasSemantic(this, _scope);
!             }
!         }
! 
!         inuse = 1;
!         Dsymbol s = aliassym ? aliassym.toAlias() : this;
!         inuse = 0;
!         return s;
!     }
! 
!     override Dsymbol toAlias2()
!     {
!         if (inuse)
!         {
!             .error(loc, "%s `%s` recursive alias declaration", kind, toPrettyChars);
!             return this;
!         }
!         inuse = 1;
!         Dsymbol s = aliassym ? aliassym.toAlias2() : this;
!         inuse = 0;
!         return s;
      }
  
      override bool isOverloadable() const
--- 584,590 ----
      {
          if (type)
              return type;
!         return toAlias(this).getType();
      }
  
      override bool isOverloadable() const
*************** extern (C++) final class OverDeclaration
*** 783,807 ****
          return true;
      }
  
-     Dsymbol isUnique()
-     {
-         Dsymbol result = null;
-         overloadApply(aliassym, (Dsymbol s)
-         {
-             if (result)
-             {
-                 result = null;
-                 return 1; // ambiguous, done
-             }
-             else
-             {
-                 result = s;
-                 return 0;
-             }
-         });
-         return result;
-     }
- 
      override void accept(Visitor v)
      {
          v.visit(this);
--- 655,660 ----
*************** extern (C++) class VarDeclaration : Decl
*** 978,984 ****
          {
              isdataseg = 2; // The Variables does not go into the datasegment
  
!             if (!canTakeAddressOf())
              {
                  return false;
              }
--- 831,837 ----
          {
              isdataseg = 2; // The Variables does not go into the datasegment
  
!             if (!canTakeAddressOf() || (storage_class & STC.exptemp))
              {
                  return false;
              }
*************** extern (C++) class VarDeclaration : Decl
*** 1031,1037 ****
          auto bitoffset  =   offset * 8;
          auto vbitoffset = v.offset * 8;
  
!         // Bitsize of types are overridden by any bit-field widths.
          ulong tbitsize;
          if (auto bf = isBitFieldDeclaration())
          {
--- 884,890 ----
          auto bitoffset  =   offset * 8;
          auto vbitoffset = v.offset * 8;
  
!         // Bitsize of types are overridden by any bitfield widths.
          ulong tbitsize;
          if (auto bf = isBitFieldDeclaration())
          {
*************** extern (C++) class VarDeclaration : Decl
*** 1054,1065 ****
                  vbitoffset <  bitoffset + tbitsize;
      }
  
-     override final bool hasPointers()
-     {
-         //printf("VarDeclaration::hasPointers() %s, ty = %d\n", toChars(), type.ty);
-         return (!isDataseg() && type.hasPointers());
-     }
- 
      /*************************************
       * Return true if we can take the address of this variable.
       */
--- 907,912 ----
*************** extern (C++) class VarDeclaration : Decl
*** 1077,1202 ****
          return edtor && !(storage_class & STC.nodtor);
      }
  
-     /*******************************************
-      * If variable has a constant expression initializer, get it.
-      * Otherwise, return null.
-      */
-     extern (D) final Expression getConstInitializer(bool needFullType = true)
-     {
-         assert(type && _init);
- 
-         // Ungag errors when not speculative
-         const oldgag = global.gag;
-         if (global.gag)
-         {
-             Dsymbol sym = isMember();
-             if (sym && !sym.isSpeculative())
-                 global.gag = 0;
-         }
- 
-         if (_scope)
-         {
-             inuse++;
-             _init = _init.initializerSemantic(_scope, type, INITinterpret);
-             import dmd.semantic2 : lowerStaticAAs;
-             lowerStaticAAs(this, _scope);
-             _scope = null;
-             inuse--;
-         }
- 
-         Expression e = _init.initializerToExpression(needFullType ? type : null);
-         global.gag = oldgag;
-         return e;
-     }
- 
-     /************************************
-      * Check to see if this variable is actually in an enclosing function
-      * rather than the current one.
-      * Update nestedrefs[], closureVars[] and outerVars[].
-      * Returns: true if error occurs.
-      */
-     extern (D) final bool checkNestedReference(Scope* sc, Loc loc)
-     {
-         //printf("VarDeclaration::checkNestedReference() %s\n", toChars());
-         if (sc.intypeof == 1 || sc.ctfe)
-             return false;
-         if (!parent || parent == sc.parent)
-             return false;
-         if (isDataseg() || (storage_class & STC.manifest))
-             return false;
- 
-         // The current function
-         FuncDeclaration fdthis = sc.parent.isFuncDeclaration();
-         if (!fdthis)
-             return false; // out of function scope
- 
-         Dsymbol p = toParent2();
- 
-         // Function literals from fdthis to p must be delegates
-         ensureStaticLinkTo(fdthis, p);
- 
-         // The function that this variable is in
-         FuncDeclaration fdv = p.isFuncDeclaration();
-         if (!fdv || fdv == fdthis)
-             return false;
- 
-         // Add fdthis to nestedrefs[] if not already there
-         if (!nestedrefs.contains(fdthis))
-             nestedrefs.push(fdthis);
- 
-         //printf("\tfdv = %s\n", fdv.toChars());
-         //printf("\tfdthis = %s\n", fdthis.toChars());
-         if (loc.isValid())
-         {
-             if (fdthis.getLevelAndCheck(loc, sc, fdv, this) == fdthis.LevelError)
-                 return true;
-         }
- 
-         // Add this VarDeclaration to fdv.closureVars[] if not already there
-         if (!sc.intypeof && !sc.traitsCompiles &&
-             // https://issues.dlang.org/show_bug.cgi?id=17605
-             (fdv.skipCodegen || !fdthis.skipCodegen))
-         {
-             if (!fdv.closureVars.contains(this))
-                 fdv.closureVars.push(this);
-         }
- 
-         if (!fdthis.outerVars.contains(this))
-             fdthis.outerVars.push(this);
- 
-         //printf("fdthis is %s\n", fdthis.toChars());
-         //printf("var %s in function %s is nested ref\n", toChars(), fdv.toChars());
-         // __dollar creates problems because it isn't a real variable
-         // https://issues.dlang.org/show_bug.cgi?id=3326
-         if (ident == Id.dollar)
-         {
-             .error(loc, "cannnot use `$` inside a function literal");
-             return true;
-         }
-         if (ident == Id.withSym) // https://issues.dlang.org/show_bug.cgi?id=1759
-         {
-             ExpInitializer ez = _init.isExpInitializer();
-             assert(ez);
-             Expression e = ez.exp;
-             if (e.op == EXP.construct || e.op == EXP.blit)
-                 e = (cast(AssignExp)e).e2;
-             return lambdaCheckForNestedRef(e, sc);
-         }
- 
-         return false;
-     }
- 
-     override final Dsymbol toAlias()
-     {
-         //printf("VarDeclaration::toAlias('%s', this = %p, aliassym = %p)\n", toChars(), this, aliassym);
-         if ((!type || !type.deco) && _scope)
-             dsymbolSemantic(this, _scope);
- 
-         assert(this != aliasTuple);
-         Dsymbol s = aliasTuple ? aliasTuple.toAlias() : this;
-         return s;
-     }
- 
      override void accept(Visitor v)
      {
          v.visit(this);
--- 924,929 ----
*************** extern (C++) final class TypeInfoStaticA
*** 1499,1504 ****
--- 1226,1233 ----
  extern (C++) final class TypeInfoAssociativeArrayDeclaration : TypeInfoDeclaration
  {
      Type entry; // type of TypeInfo_AssociativeArray.Entry!(t.index, t.next)
+     Declaration xopEqual; // implementation of TypeInfo_AssociativeArray.equals
+     Declaration xtoHash;  // implementation of TypeInfo_AssociativeArray.getHash
  
      extern (D) this(Type tinfo)
      {
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/declaration.h gcc-16-20260201/gcc/d/dmd/declaration.h
*** gcc-16-20260125/gcc/d/dmd/declaration.h	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/declaration.h	Sun Feb  1 22:32:07 2026
*************** namespace dmd
*** 35,44 ****
      bool functionSemantic(FuncDeclaration* fd);
      bool functionSemantic3(FuncDeclaration* fd);
      bool checkClosure(FuncDeclaration* fd);
!     MATCH leastAsSpecialized(FuncDeclaration *f, FuncDeclaration *g, Identifiers *names);
      PURE isPure(FuncDeclaration *f);
      FuncDeclaration *genCfunc(Parameters *args, Type *treturn, const char *name, StorageClass stc=0);
      FuncDeclaration *genCfunc(Parameters *args, Type *treturn, Identifier *id, StorageClass stc=0);
  }
  
  //enum STC : ulong from astenums.d:
--- 35,45 ----
      bool functionSemantic(FuncDeclaration* fd);
      bool functionSemantic3(FuncDeclaration* fd);
      bool checkClosure(FuncDeclaration* fd);
!     MATCH leastAsSpecialized(FuncDeclaration *f, FuncDeclaration *g, ArgumentLabels *names);
      PURE isPure(FuncDeclaration *f);
      FuncDeclaration *genCfunc(Parameters *args, Type *treturn, const char *name, StorageClass stc=0);
      FuncDeclaration *genCfunc(Parameters *args, Type *treturn, Identifier *id, StorageClass stc=0);
+     bool isAbstract(ClassDeclaration *cd);
  }
  
  //enum STC : ulong from astenums.d:
*************** namespace dmd
*** 70,78 ****
      #define STCref                0x40000ULL    /// `ref`
      #define STCscope              0x80000ULL    /// `scope`
  
!     #define STCscopeinferred      0x200000ULL    /// `scope` has been inferred and should not be part of mangling, `scope` must also be set
!     #define STCreturn             0x400000ULL    /// 'return ref' or 'return scope' for function parameters
!     #define STCreturnScope        0x800000ULL    /// if `ref return scope` then resolve to `ref` and `return scope`
  
      #define STCreturninferred     0x1000000ULL    /// `return` has been inferred and should not be part of mangling, `return` must also be set
      #define STCimmutable          0x2000000ULL    /// `immutable`
--- 71,80 ----
      #define STCref                0x40000ULL    /// `ref`
      #define STCscope              0x80000ULL    /// `scope`
  
!     #define STCscopeinferred      0x100000ULL    /// `scope` has been inferred and should not be part of mangling, `scope` must also be set
!     #define STCreturn             0x200000ULL    /// 'return ref' or 'return scope' for function parameters
!     #define STCreturnScope        0x400000ULL    /// if `ref return scope` then resolve to `ref` and `return scope`
!     #define STCreturnRef          0x800000ULL,   /// if `return ref`
  
      #define STCreturninferred     0x1000000ULL    /// `return` has been inferred and should not be part of mangling, `return` must also be set
      #define STCimmutable          0x2000000ULL    /// `immutable`
*************** public:
*** 182,188 ****
      TupleDeclaration *syntaxCopy(Dsymbol *) override;
      const char *kind() const override;
      Type *getType() override;
-     Dsymbol *toAlias2() override;
      bool needThis() override;
  
      void accept(Visitor *v) override { v->visit(this); }
--- 184,189 ----
*************** public:
*** 202,209 ****
      bool overloadInsert(Dsymbol *s) override;
      const char *kind() const override;
      Type *getType() override;
-     Dsymbol *toAlias() override;
-     Dsymbol *toAlias2() override;
      bool isOverloadable() const override;
  
      void accept(Visitor *v) override { v->visit(this); }
--- 203,208 ----
*************** public:
*** 221,227 ****
      bool equals(const RootObject * const o) const override;
      bool overloadInsert(Dsymbol *s) override;
  
-     Dsymbol *toAlias() override;
      Dsymbol *isUnique();
      bool isOverloadable() const override;
  
--- 220,225 ----
*************** public:
*** 297,306 ****
      bool isThreadlocal() override final;
      bool isCTFE();
      bool isOverlappedWith(VarDeclaration *v);
-     bool hasPointers() override final;
      bool canTakeAddressOf();
      bool needsScopeDtor();
-     Dsymbol *toAlias() override final;
      // Eliminate need for dynamic_cast
      void accept(Visitor *v) override { v->visit(this); }
  };
--- 295,302 ----
*************** class TypeInfoAssociativeArrayDeclaratio
*** 395,400 ****
--- 391,398 ----
  {
  public:
      Type* entry;
+     Declaration* xopEqual;
+     Declaration* xtoHash;
  
      static TypeInfoAssociativeArrayDeclaration *create(Type *tinfo);
  
*************** public:
*** 727,733 ****
      virtual bool addPreInvariant();
      virtual bool addPostInvariant();
      const char *kind() const override;
-     bool isUnique();
      bool needsClosure();
      bool hasNestedFrameRefs();
      ParameterList getParameterList();
--- 725,730 ----
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/delegatize.d gcc-16-20260201/gcc/d/dmd/delegatize.d
*** gcc-16-20260125/gcc/d/dmd/delegatize.d	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/delegatize.d	Sun Feb  1 22:32:07 2026
*************** import dmd.dsymbol;
*** 21,26 ****
--- 21,27 ----
  import dmd.expression;
  import dmd.expressionsem;
  import dmd.func;
+ import dmd.funcsem : checkNestedReference;
  import dmd.init;
  import dmd.initsem;
  import dmd.location;
*************** private void lambdaSetParent(Expression
*** 179,184 ****
--- 180,190 ----
                      iz.accept(this);
              }
          }
+         override void visit(AssocArrayLiteralExp e)
+         {
+             if (e.lowering)
+                 walkPostorder(e.lowering, this);
+         }
      }
  
      scope LambdaSetParent lsp = new LambdaSetParent(fd);
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/denum.d gcc-16-20260201/gcc/d/dmd/denum.d
*** gcc-16-20260125/gcc/d/dmd/denum.d	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/denum.d	Sun Feb  1 22:32:07 2026
*************** import core.stdc.stdio;
*** 18,24 ****
  
  import dmd.astenums;
  import dmd.attrib;
- import dmd.gluelayer;
  import dmd.declaration;
  import dmd.dsymbol;
  import dmd.expression;
--- 18,23 ----
*************** extern (C++) final class EnumDeclaration
*** 62,68 ****
      import dmd.common.bitfields : generateBitFields;
      mixin(generateBitFields!(BitFields, ubyte));
  
!     Symbol* sinit;
  
      extern (D) this(Loc loc, Identifier ident, Type memtype)
      {
--- 61,67 ----
      import dmd.common.bitfields : generateBitFields;
      mixin(generateBitFields!(BitFields, ubyte));
  
!     void* sinit;
  
      extern (D) this(Loc loc, Identifier ident, Type memtype)
      {
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/dimport.d gcc-16-20260201/gcc/d/dmd/dimport.d
*** gcc-16-20260125/gcc/d/dmd/dimport.d	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/dimport.d	Sun Feb  1 22:32:07 2026
*************** extern (C++) final class Import : Dsymbo
*** 141,153 ****
          scopesym.addAccessiblePackage(mod, visibility); // d
       }
  
-     override Dsymbol toAlias()
-     {
-         if (aliasId)
-             return mod;
-         return this;
-     }
- 
      override bool overloadInsert(Dsymbol s)
      {
          /* Allow multiple imports with the same package base, but disallow
--- 141,146 ----
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/dinterpret.d gcc-16-20260201/gcc/d/dmd/dinterpret.d
*** gcc-16-20260125/gcc/d/dmd/dinterpret.d	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/dinterpret.d	Sun Feb  1 22:32:07 2026
*************** import dmd.rootobject;
*** 50,56 ****
  import dmd.root.utf;
  import dmd.statement;
  import dmd.tokens;
! import dmd.typesem : mutableOf, equivalent, pointerTo, sarrayOf, arrayOf, size;
  import dmd.utils : arrayCastBigEndian;
  import dmd.visitor;
  
--- 50,56 ----
  import dmd.root.utf;
  import dmd.statement;
  import dmd.tokens;
! import dmd.typesem : mutableOf, equivalent, pointerTo, sarrayOf, arrayOf, size, merge, defaultInitLiteral;
  import dmd.utils : arrayCastBigEndian;
  import dmd.visitor;
  
*************** private Expression interpretFunction(Uni
*** 569,575 ****
      istatex.caller = istate;
      istatex.fd = fd;
  
!     if (fd.hasDualContext())
      {
          Expression arg0 = thisarg;
          if (arg0 && arg0.type.ty == Tstruct)
--- 569,575 ----
      istatex.caller = istate;
      istatex.fd = fd;
  
!     if (fd.hasDualContext)
      {
          Expression arg0 = thisarg;
          if (arg0 && arg0.type.ty == Tstruct)
*************** private Expression interpretFunction(Uni
*** 722,728 ****
  
      if (tf.isRef && e.op == EXP.variable && e.isVarExp().var == fd.vthis)
          e = thisarg;
!     if (tf.isRef && fd.hasDualContext() && e.op == EXP.index)
      {
          auto ie = e.isIndexExp();
          auto pe = ie.e1.isPtrExp();
--- 722,728 ----
  
      if (tf.isRef && e.op == EXP.variable && e.isVarExp().var == fd.vthis)
          e = thisarg;
!     if (tf.isRef && fd.hasDualContext && e.op == EXP.index)
      {
          auto ie = e.isIndexExp();
          auto pe = ie.e1.isPtrExp();
*************** Expression interpretStatement(UnionExp*
*** 1027,1038 ****
           * assigning a larger array into a smaller one, such as:
           *    `a = [1, 2], a ~= [3]` => `[1, 2] ~= [3]` => `[1, 2] = [1, 2, 3]`
           */
-         if (isRuntimeHook(s.exp, Id._d_arrayappendT) || isRuntimeHook(s.exp, Id._d_arrayappendTTrace))
-         {
-             auto rs = new ReturnStatement(s.loc, e);
-             visitReturn(rs);
-             return;
-         }
  
          // Disallow returning pointers to stack-allocated variables (bug 7876)
          if (!stopPointersEscaping(s.loc, e))
--- 1027,1032 ----
*************** public:
*** 1751,1757 ****
              if (istate && istate.fd.vthis)
              {
                  result = ctfeEmplaceExp!VarExp(e.loc, istate.fd.vthis);
!                 if (istate.fd.hasDualContext())
                  {
                      result = ctfeEmplaceExp!PtrExp(e.loc, result);
                      result.type = Type.tvoidptr.sarrayOf(2);
--- 1745,1751 ----
              if (istate && istate.fd.vthis)
              {
                  result = ctfeEmplaceExp!VarExp(e.loc, istate.fd.vthis);
!                 if (istate.fd.hasDualContext)
                  {
                      result = ctfeEmplaceExp!PtrExp(e.loc, result);
                      result.type = Type.tvoidptr.sarrayOf(2);
*************** public:
*** 1767,1773 ****
          result = ctfeGlobals.stack.getThis();
          if (result)
          {
!             if (istate && istate.fd.hasDualContext())
              {
                  assert(result.op == EXP.address);
                  result = result.isAddrExp().e1;
--- 1761,1767 ----
          result = ctfeGlobals.stack.getThis();
          if (result)
          {
!             if (istate && istate.fd.hasDualContext)
              {
                  assert(result.op == EXP.address);
                  result = result.isAddrExp().e1;
*************** public:
*** 2354,2359 ****
--- 2348,2356 ----
                  if (ExpInitializer ie = v._init.isExpInitializer())
                  {
                      result = interpretRegion(ie.exp, istate, goal);
+                     if (result !is null && v.ctfeAdrOnStack != VarDeclaration.AdrOnStackNone)
+                         if (!getValue(v))
+                             setValueWithoutChecking(v, result); // a temporary from extractSideEffects can be a ref
                      return;
                  }
                  else if (v._init.isVoidInitializer())
*************** public:
*** 2368,2374 ****
--- 2365,2376 ----
                  {
                      result = v._init.initializerToExpression(v.type);
                      if (result !is null)
+                     {
+                         if (v.ctfeAdrOnStack != VarDeclaration.AdrOnStackNone)
+                             if (!getValue(v))
+                                 setValueWithoutChecking(v, result); // a temporary from extractSideEffects can be a ref
                          return;
+                     }
                  }
                  error(e.loc, "declaration `%s` is not yet implemented in CTFE", e.toChars());
                  result = CTFEExp.cantexp;
*************** public:
*** 2647,2652 ****
--- 2649,2656 ----
                     valuesx !is e.values);
              auto aae = ctfeEmplaceExp!AssocArrayLiteralExp(e.loc, keysx, valuesx);
              aae.type = e.type;
+             aae.lowering = e.lowering;
+             aae.loweringCtfe = e.loweringCtfe;
              aae.ownedByCtfe = OwnedBy.ctfe;
              result = aae;
          }
*************** public:
*** 3189,3195 ****
              if (cmp == -1)
              {
                  char dir = (e.op == EXP.greaterThan || e.op == EXP.greaterOrEqual) ? '<' : '>';
!                 error(e.loc, "the ordering of pointers to unrelated memory blocks is indeterminate in CTFE. To check if they point to the same memory block, use both `>` and `<` inside `&&` or `||`, eg `%s && %s %c= %s + 1`", e.toChars(), e.e1.toChars(), dir, e.e2.toChars());
                  result = CTFEExp.cantexp;
                  return;
              }
--- 3193,3200 ----
              if (cmp == -1)
              {
                  char dir = (e.op == EXP.greaterThan || e.op == EXP.greaterOrEqual) ? '<' : '>';
!                 error(e.loc, "the ordering of pointers to unrelated memory blocks is indeterminate in CTFE.");
!                 errorSupplemental(e.loc, "to check if they point to the same memory block, use both `>` and `<` inside `&&` or `||`, eg `%s && %s %c= %s + 1`", e.toChars(), e.e1.toChars(), dir, e.e2.toChars());
                  result = CTFEExp.cantexp;
                  return;
              }
*************** public:
*** 3411,3541 ****
          // ---------------------------------------
          //      Interpret left hand side
          // ---------------------------------------
-         AssocArrayLiteralExp existingAA = null;
-         Expression lastIndex = null;
          Expression oldval = null;
          if (e1.op == EXP.index && e1.isIndexExp().e1.type.toBasetype().ty == Taarray)
          {
!             // ---------------------------------------
!             //      Deal with AA index assignment
!             // ---------------------------------------
!             /* This needs special treatment if the AA doesn't exist yet.
!              * There are two special cases:
!              * (1) If the AA is itself an index of another AA, we may need to create
!              *     multiple nested AA literals before we can insert the new value.
!              * (2) If the ultimate AA is null, no insertion happens at all. Instead,
!              *     we create nested AA literals, and change it into a assignment.
!              */
!             IndexExp ie = e1.isIndexExp();
!             int depth = 0; // how many nested AA indices are there?
!             while (ie.e1.op == EXP.index && ie.e1.isIndexExp().e1.type.toBasetype().ty == Taarray)
!             {
!                 assert(ie.modifiable);
!                 ie = ie.e1.isIndexExp();
!                 ++depth;
!             }
! 
!             // Get the AA value to be modified.
!             Expression aggregate = interpretRegion(ie.e1, istate);
!             if (exceptionOrCant(aggregate))
!                 return;
!             if ((existingAA = aggregate.isAssocArrayLiteralExp()) !is null)
!             {
!                 // Normal case, ultimate parent AA already exists
!                 // We need to walk from the deepest index up, checking that an AA literal
!                 // already exists on each level.
!                 lastIndex = interpretRegion(e1.isIndexExp().e2, istate);
!                 lastIndex = resolveSlice(lastIndex); // only happens with AA assignment
!                 if (exceptionOrCant(lastIndex))
!                     return;
! 
!                 while (depth > 0)
!                 {
!                     // Walk the syntax tree to find the indexExp at this depth
!                     IndexExp xe = e1.isIndexExp();
!                     foreach (d; 0 .. depth)
!                         xe = xe.e1.isIndexExp();
! 
!                     Expression ekey = interpretRegion(xe.e2, istate);
!                     if (exceptionOrCant(ekey))
!                         return;
!                     UnionExp ekeyTmp = void;
!                     ekey = resolveSlice(ekey, &ekeyTmp); // only happens with AA assignment
! 
!                     // Look up this index in it up in the existing AA, to get the next level of AA.
!                     AssocArrayLiteralExp newAA = cast(AssocArrayLiteralExp)findKeyInAA(e.loc, existingAA, ekey);
!                     if (exceptionOrCant(newAA))
!                         return;
!                     if (!newAA)
!                     {
!                         // Doesn't exist yet, create an empty AA...
!                         auto keysx = new Expressions();
!                         auto valuesx = new Expressions();
!                         newAA = ctfeEmplaceExp!AssocArrayLiteralExp(e.loc, keysx, valuesx);
!                         newAA.type = xe.type;
!                         newAA.ownedByCtfe = OwnedBy.ctfe;
!                         //... and insert it into the existing AA.
!                         existingAA.keys.push(ekey);
!                         existingAA.values.push(newAA);
!                     }
!                     existingAA = newAA;
!                     --depth;
!                 }
! 
!                 if (fp)
!                 {
!                     oldval = findKeyInAA(e.loc, existingAA, lastIndex);
!                     if (!oldval)
!                         oldval = copyLiteral(e.e1.type.defaultInitLiteral(e.loc)).copy();
!                 }
!             }
!             else
!             {
!                 /* The AA is currently null. 'aggregate' is actually a reference to
!                  * whatever contains it. It could be anything: var, dotvarexp, ...
!                  * We rewrite the assignment from:
!                  *     aa[i][j] op= newval;
!                  * into:
!                  *     aa = [i:[j:T.init]];
!                  *     aa[j] op= newval;
!                  */
!                 oldval = copyLiteral(e.e1.type.defaultInitLiteral(e.loc)).copy();
! 
!                 Expression newaae = oldval;
!                 while (e1.op == EXP.index && e1.isIndexExp().e1.type.toBasetype().ty == Taarray)
!                 {
!                     Expression ekey = interpretRegion(e1.isIndexExp().e2, istate);
!                     if (exceptionOrCant(ekey))
!                         return;
!                     ekey = resolveSlice(ekey); // only happens with AA assignment
! 
!                     auto keysx = new Expressions();
!                     auto valuesx = new Expressions();
!                     keysx.push(ekey);
!                     valuesx.push(newaae);
! 
!                     auto aae = ctfeEmplaceExp!AssocArrayLiteralExp(e.loc, keysx, valuesx);
!                     aae.type = e1.isIndexExp().e1.type;
!                     aae.ownedByCtfe = OwnedBy.ctfe;
!                     if (!existingAA)
!                     {
!                         existingAA = aae;
!                         lastIndex = ekey;
!                     }
!                     newaae = aae;
!                     e1 = e1.isIndexExp().e1;
!                 }
! 
!                 // We must set to aggregate with newaae
!                 e1 = interpretRegion(e1, istate, CTFEGoal.LValue);
!                 if (exceptionOrCant(e1))
!                     return;
!                 e1 = assignToLvalue(e, e1, newaae);
!                 if (exceptionOrCant(e1))
!                     return;
!             }
!             assert(existingAA && lastIndex);
!             e1 = null; // stomp
          }
          else if (e1.op == EXP.arrayLength)
          {
--- 3416,3425 ----
          // ---------------------------------------
          //      Interpret left hand side
          // ---------------------------------------
          Expression oldval = null;
          if (e1.op == EXP.index && e1.isIndexExp().e1.type.toBasetype().ty == Taarray)
          {
!             assert(false, "indexing AA should have been lowered in semantic analysis");
          }
          else if (e1.op == EXP.arrayLength)
          {
*************** public:
*** 3575,3584 ****
  
              if (e1.op == EXP.index && e1.isIndexExp().e1.type.toBasetype().ty == Taarray)
              {
!                 IndexExp ie = e1.isIndexExp();
!                 assert(ie.e1.op == EXP.assocArrayLiteral);
!                 existingAA = ie.e1.isAssocArrayLiteralExp();
!                 lastIndex = ie.e2;
              }
          }
  
--- 3459,3465 ----
  
              if (e1.op == EXP.index && e1.isIndexExp().e1.type.toBasetype().ty == Taarray)
              {
!                 assert(false, "indexing AA should have been lowered in semantic analysis");
              }
          }
  
*************** public:
*** 3669,3691 ****
              }
          }
  
-         if (existingAA)
-         {
-             if (existingAA.ownedByCtfe != OwnedBy.ctfe)
-             {
-                 error(e.loc, "cannot modify read-only constant `%s`", existingAA.toChars());
-                 result = CTFEExp.cantexp;
-                 return;
-             }
- 
-             //printf("\t+L%d existingAA = %s, lastIndex = %s, oldval = %s, newval = %s\n",
-             //    __LINE__, existingAA.toChars(), lastIndex.toChars(), oldval ? oldval.toChars() : NULL, newval.toChars());
-             assignAssocArrayElement(e.loc, existingAA, lastIndex, newval);
- 
-             // Determine the return value
-             result = ctfeCast(pue, e.loc, e.type, e.type, fp && post ? oldval : newval);
-             return;
-         }
          if (e1.op == EXP.arrayLength)
          {
              /* Change the assignment from:
--- 3550,3555 ----
*************** public:
*** 3730,3736 ****
              if (newval == pue.exp())
                  newval = pue.copy();
  
!             e1 = assignToLvalue(e, e1, newval);
              if (exceptionOrCant(e1))
                  return;
  
--- 3594,3600 ----
              if (newval == pue.exp())
                  newval = pue.copy();
  
!             e1 = assignToLvalue(e, e1, newval, istate);
              if (exceptionOrCant(e1))
                  return;
  
*************** public:
*** 3804,3810 ****
  
          /* Assignment to a CTFE reference.
           */
!         if (Expression ex = assignToLvalue(e, e1, newval))
              result = ex;
  
          return;
--- 3668,3674 ----
  
          /* Assignment to a CTFE reference.
           */
!         if (Expression ex = assignToLvalue(e, e1, newval, istate))
              result = ex;
  
          return;
*************** public:
*** 3812,3818 ****
  
      /* Set all sibling fields which overlap with v to VoidExp.
       */
!     private void stompOverlappedFields(StructLiteralExp sle, VarDeclaration v)
      {
          if (!v.overlapped)
              return;
--- 3676,3682 ----
  
      /* Set all sibling fields which overlap with v to VoidExp.
       */
!     private static void stompOverlappedFields(StructLiteralExp sle, VarDeclaration v)
      {
          if (!v.overlapped)
              return;
*************** public:
*** 3826,3832 ****
          }
      }
  
!     private Expression assignToLvalue(BinExp e, Expression e1, Expression newval)
      {
          //printf("assignToLvalue() e: %s e1: %s newval: %s\n", e.toChars(), e1.toChars(), newval.toChars());
          VarDeclaration vd = null;
--- 3690,3696 ----
          }
      }
  
!     private static Expression assignToLvalue(BinExp e, Expression e1, Expression newval, InterState* istate)
      {
          //printf("assignToLvalue() e: %s e1: %s newval: %s\n", e.toChars(), e1.toChars(), newval.toChars());
          VarDeclaration vd = null;
*************** public:
*** 3920,3926 ****
              ArrayLiteralExp existingAE = aggregate.isArrayLiteralExp();
              if (existingAE.ownedByCtfe != OwnedBy.ctfe)
              {
!                 error(e.loc, "cannot modify read-only constant `%s`", existingAE.toChars());
                  return CTFEExp.cantexp;
              }
  
--- 3784,3791 ----
              ArrayLiteralExp existingAE = aggregate.isArrayLiteralExp();
              if (existingAE.ownedByCtfe != OwnedBy.ctfe)
              {
!                 Expression literal = existingAE.aaLiteral ? existingAE.aaLiteral : existingAE;
!                 error(e.loc, "cannot modify read-only constant `%s`", literal.toChars());
                  return CTFEExp.cantexp;
              }
  
*************** public:
*** 4938,4944 ****
              }
          }
  
!         if (fd && fd.semanticRun >= PASS.semantic3done && fd.hasSemantic3Errors())
          {
              error(e.loc, "CTFE failed because of previous errors in `%s`", fd.toChars());
              result = CTFEExp.cantexp;
--- 4803,4809 ----
              }
          }
  
!         if (fd && fd.semanticRun >= PASS.semantic3done && fd.hasSemantic3Errors)
          {
              error(e.loc, "CTFE failed because of previous errors in `%s`", fd.toChars());
              result = CTFEExp.cantexp;
*************** public:
*** 5001,5061 ****
              printf("%s CommaExp::interpret() %s\n", e.loc.toChars(), e.toChars());
          }
  
-         bool isNewThrowableHook()
-         {
-             auto de = e.e1.isDeclarationExp();
-             if (de is null)
-                 return false;
- 
-             auto vd = de.declaration.isVarDeclaration();
-             if (vd is null)
-                 return false;
- 
-             auto ei = vd._init.isExpInitializer();
-             if (ei is null)
-                 return false;
- 
-             auto ce = ei.exp.isConstructExp();
-             if (ce is null)
-                 return false;
- 
-             return isRuntimeHook(ce.e2, Id._d_newThrowable) !is null;
-         }
- 
-         if (auto ce = isRuntimeHook(e.e1, Id._d_arrayappendcTX))
-         {
-             // In expressionsem.d `arr ~= elem` was lowered to
-             // `_d_arrayappendcTX(arr, elem), arr[arr.length - 1] = elem, elem;`.
-             // The following code will rewrite it back to `arr ~= elem`
-             // and then interpret that expression.
-             assert(ce.arguments.length == 2);
- 
-             auto arr = (*ce.arguments)[0];
-             auto elem = e.e2.isConstructExp().e2;
-             assert(elem);
- 
-             auto cae = new CatAssignExp(e.loc, arr, elem);
-             cae.type = arr.type;
- 
-             result = interpret(cae, istate);
-             return;
-         }
-         else if (isNewThrowableHook())
-         {
-             // In expressionsem.d `throw new Exception(args)` was lowered to
-             // `throw (tmp = _d_newThrowable!Exception(), tmp.ctor(args), tmp)`.
-             // The following code will rewrite it back to `throw new Exception(args)`
-             // and then interpret this expression instead.
-             auto ce = e.e2.isCallExp();
-             assert(ce);
- 
-             auto ne = new NewExp(e.loc, null, null, e.type, ce.arguments);
-             ne.type = e.e1.type;
- 
-             result = interpret(ne, istate);
-             return;
-         }
- 
          // If it creates a variable, and there's no context for
          // the variable to be created in, we need to create one now.
          InterState istateComma;
--- 4866,4871 ----
*************** public:
*** 5299,5314 ****
              dinteger_t ofs;
              Expression agg = getAggregateFromPointer(e1, &ofs);
  
-             if (agg.op == EXP.null_)
-             {
-                 error(e.loc, "cannot index through null pointer `%s`", e.e1.toChars());
-                 return false;
-             }
-             if (agg.op == EXP.int64)
-             {
-                 error(e.loc, "cannot index through invalid pointer `%s` of value `%s`", e.e1.toChars(), e1.toChars());
-                 return false;
-             }
              // Pointer to a non-array variable
              if (agg.op == EXP.symbolOffset)
              {
--- 5109,5114 ----
*************** public:
*** 5327,5335 ****
              }
              else
              {
                  if (ofs + indx != 0)
                  {
!                     error(e.loc, "pointer index `[%lld]` lies outside memory block `[0..1]`", ofs + indx);
                      return false;
                  }
              }
--- 5127,5141 ----
              }
              else
              {
+                 // agg is the value accessed, it is not dereferenced again, so offset 0 is always ok
                  if (ofs + indx != 0)
                  {
!                     if (agg.op == EXP.null_)
!                         error(e.loc, "cannot index through null pointer `%s`", e.e1.toChars());
!                     else if (agg.op == EXP.int64)
!                         error(e.loc, "cannot index through invalid pointer `%s` of value `%s`", e.e1.toChars(), e1.toChars());
!                     else
!                         error(e.loc, "pointer index `[%lld]` lies outside memory block `[0..1]`", ofs + indx);
                      return false;
                  }
              }
*************** public:
*** 5454,5500 ****
  
          if (e.e1.type.toBasetype().ty == Taarray)
          {
!             Expression e1 = interpretRegion(e.e1, istate);
!             if (exceptionOrCant(e1))
!                 return;
!             if (e1.op == EXP.null_)
!             {
!                 if (goal == CTFEGoal.LValue && e1.type.ty == Taarray && e.modifiable)
!                 {
!                     assert(0); // does not reach here?
!                 }
!                 error(e.loc, "cannot index null array `%s`", e.e1.toChars());
!                 result = CTFEExp.cantexp;
!                 return;
!             }
!             Expression e2 = interpretRegion(e.e2, istate);
!             if (exceptionOrCant(e2))
!                 return;
! 
!             if (goal == CTFEGoal.LValue)
!             {
!                 // Pointer or reference of a scalar type
!                 if (e1 == e.e1 && e2 == e.e2)
!                     result = e;
!                 else
!                 {
!                     emplaceExp!(IndexExp)(pue, e.loc, e1, e2);
!                     result = pue.exp();
!                     result.type = e.type;
!                 }
!                 return;
!             }
! 
!             assert(e1.op == EXP.assocArrayLiteral);
!             UnionExp e2tmp = void;
!             e2 = resolveSlice(e2, &e2tmp);
!             result = findKeyInAA(e.loc, e1.isAssocArrayLiteralExp(), e2);
!             if (!result)
!             {
!                 error(e.loc, "key `%s` not found in associative array `%s`", e2.toChars(), e.e1.toChars());
!                 result = CTFEExp.cantexp;
!             }
!             return;
          }
  
          Expression agg;
--- 5260,5266 ----
  
          if (e.e1.type.toBasetype().ty == Taarray)
          {
!             assert(false, "indexing AA should have been lowered in semantic analysis");
          }
  
          Expression agg;
*************** public:
*** 5722,5771 ****
          result.type = e.type;
      }
  
-     override void visit(InExp e)
-     {
-         debug (LOG)
-         {
-             printf("%s InExp::interpret() %s\n", e.loc.toChars(), e.toChars());
-         }
-         Expression e1 = interpretRegion(e.e1, istate);
-         if (exceptionOrCant(e1))
-             return;
-         Expression e2 = interpretRegion(e.e2, istate);
-         if (exceptionOrCant(e2))
-             return;
-         if (e2.op == EXP.null_)
-         {
-             emplaceExp!(NullExp)(pue, e.loc, e.type);
-             result = pue.exp();
-             return;
-         }
-         if (e2.op != EXP.assocArrayLiteral)
-         {
-             error(e.loc, "`%s` cannot be interpreted at compile time", e.toChars());
-             result = CTFEExp.cantexp;
-             return;
-         }
- 
-         e1 = resolveSlice(e1);
-         result = findKeyInAA(e.loc, e2.isAssocArrayLiteralExp(), e1);
-         if (exceptionOrCant(result))
-             return;
-         if (!result)
-         {
-             emplaceExp!(NullExp)(pue, e.loc, e.type);
-             result = pue.exp();
-         }
-         else
-         {
-             // Create a CTFE pointer &aa[index]
-             result = ctfeEmplaceExp!IndexExp(e.loc, e2, e1);
-             result.type = e.type.nextOf();
-             emplaceExp!(AddrExp)(pue, e.loc, result, e.type);
-             result = pue.exp();
-         }
-     }
- 
      override void visit(CatExp e)
      {
          debug (LOG)
--- 5488,5493 ----
*************** public:
*** 6480,6524 ****
          }
      }
  
-     override void visit(RemoveExp e)
-     {
-         debug (LOG)
-         {
-             printf("%s RemoveExp::interpret() %s\n", e.loc.toChars(), e.toChars());
-         }
-         Expression agg = interpret(e.e1, istate);
-         if (exceptionOrCant(agg))
-             return;
-         Expression index = interpret(e.e2, istate);
-         if (exceptionOrCant(index))
-             return;
-         if (agg.op == EXP.null_)
-         {
-             result = CTFEExp.voidexp;
-             return;
-         }
- 
-         AssocArrayLiteralExp aae = agg.isAssocArrayLiteralExp();
-         Expressions* keysx = aae.keys;
-         Expressions* valuesx = aae.values;
-         size_t removed = 0;
-         foreach (j, evalue; *valuesx)
-         {
-             Expression ekey = (*keysx)[j];
-             int eq = ctfeEqual(e.loc, EXP.equal, ekey, index);
-             if (eq)
-                 ++removed;
-             else if (removed != 0)
-             {
-                 (*keysx)[j - removed] = ekey;
-                 (*valuesx)[j - removed] = evalue;
-             }
-         }
-         valuesx.length = valuesx.length - removed;
-         keysx.length = keysx.length - removed;
-         result = IntegerExp.createBool(removed != 0);
-     }
- 
      override void visit(ClassReferenceExp e)
      {
          //printf("ClassReferenceExp::interpret() %s\n", e.value.toChars());
--- 6202,6207 ----
*************** ThrownExceptionExp chainExceptions(Throw
*** 6763,6770 ****
      }
      // Little sanity check to make sure it's really a Throwable
      ClassReferenceExp boss = oldest.thrown;
!     const next = 5;                         // index of Throwable.next
!     assert((*boss.value.elements)[next].type.ty == Tclass); // Throwable.next
      ClassReferenceExp collateral = newest.thrown;
      if (collateral.originalClass().isErrorException() && !boss.originalClass().isErrorException())
      {
--- 6446,6454 ----
      }
      // Little sanity check to make sure it's really a Throwable
      ClassReferenceExp boss = oldest.thrown;
!     const next = 5;                          // index of Throwable._nextInChainPtr
!     with ((*boss.value.elements)[next].type) // Throwable._nextInChainPtr
!         assert(ty == Tpointer || ty == Tclass);
      ClassReferenceExp collateral = newest.thrown;
      if (collateral.originalClass().isErrorException() && !boss.originalClass().isErrorException())
      {
*************** private Expression interpret_values(Unio
*** 7210,7215 ****
--- 6894,6946 ----
      return pue.exp();
  }
  
+ // signature is bool _d_aaDel(V[K] aa, K key)
+ private Expression interpret_aaDel(UnionExp* pue, InterState* istate, Expression aa, Expression key)
+ {
+     Expression agg = interpret(aa, istate);
+     if (exceptionOrCantInterpret(agg))
+         return agg;
+     Expression index = interpret(key, istate);
+     if (exceptionOrCantInterpret(index))
+         return index;
+     if (agg.op == EXP.null_)
+         return CTFEExp.voidexp; //???
+ 
+     AssocArrayLiteralExp aae = agg.isAssocArrayLiteralExp();
+     Expressions* keysx = aae.keys;
+     Expressions* valuesx = aae.values;
+     size_t removed = 0;
+     foreach (j, evalue; *valuesx)
+     {
+         Expression ekey = (*keysx)[j];
+         int eq = ctfeEqual(aa.loc, EXP.equal, ekey, index);
+         if (eq)
+             ++removed;
+         else if (removed != 0)
+         {
+             (*keysx)[j - removed] = ekey;
+             (*valuesx)[j - removed] = evalue;
+         }
+     }
+     valuesx.length = valuesx.length - removed;
+     keysx.length = keysx.length - removed;
+     return IntegerExp.createBool(removed != 0);
+ }
+ 
+ // signature is bool _d_aaDel(V[K] aa1, V[K] aa2)
+ private Expression interpret_aaEqual(UnionExp* pue, InterState* istate, Expression aa1, Expression aa2)
+ {
+     Expression e1 = interpret(aa1, istate);
+     if (exceptionOrCantInterpret(e1))
+         return e1;
+     Expression e2 = interpret(aa2, istate);
+     if (exceptionOrCantInterpret(e2))
+         return e2;
+ 
+     bool equal = ctfeEqual(aa1.loc, EXP.equal, e1, e2);
+     return IntegerExp.createBool(equal);
+ }
+ 
  private Expression interpret_dup(UnionExp* pue, InterState* istate, Expression earg)
  {
      debug (LOG)
*************** private Expression interpret_dup(UnionEx
*** 7234,7244 ****
          if (Expression e = evaluatePostblit(istate, (*aae.values)[i]))
              return e;
      }
!     aae.type = earg.type.mutableOf(); // repaint type from const(int[int]) to const(int)[int]
      //printf("result is %s\n", aae.toChars());
      return aae;
  }
  
  // signature is int delegate(ref Value) OR int delegate(ref Key, ref Value)
  private Expression interpret_aaApply(UnionExp* pue, InterState* istate, Expression aa, Expression deleg)
  {
--- 6965,7095 ----
          if (Expression e = evaluatePostblit(istate, (*aae.values)[i]))
              return e;
      }
!     // repaint type from const(int[int]) to int[int]
!     if (auto taa = earg.type.toBasetype().isTypeAArray())
!     {
!         auto aatype = new TypeAArray(taa.next.mutableOf(), taa.index);
!         aae.type = aatype.merge();
!     }
!     else
!         aae.type = earg.type.mutableOf();
      //printf("result is %s\n", aae.toChars());
      return aae;
  }
  
+ // signature is bool V* _d_aaIn(V[K] aa, K key)
+ private Expression interpret_aaIn(UnionExp* pue, InterState* istate, Expression aa, Expression key)
+ {
+     debug (LOG)
+     {
+         printf("%s _d_aaIn::interpret() %s in %s\n", aa.loc.toChars(), key.toChars(), aa.toChars());
+     }
+     Expression eaa = interpretRegion(aa, istate);
+     if (exceptionOrCantInterpret(eaa))
+         return eaa;
+     Expression ekey = interpretRegion(key, istate);
+     if (exceptionOrCantInterpret(ekey))
+         return ekey;
+ 
+     if (eaa.op != EXP.null_)
+     {
+         auto aalit = eaa.isAssocArrayLiteralExp();
+         if (!aalit)
+         {
+             error(aa.loc, "`%s` cannot be interpreted at compile time", aa.toChars());
+             return CTFEExp.cantexp;
+         }
+ 
+         size_t idx;
+         auto result = findKeyInAA(aa.loc, aalit, ekey, &idx);
+         if (exceptionOrCantInterpret(result))
+             return result;
+         if (result)
+             return pointerToAAValue(pue, aa, aalit, idx);
+     }
+     emplaceExp!(NullExp)(pue, aa.loc, aa.type.nextOf().pointerTo());
+     return pue.exp();
+ }
+ 
+ // signature is V* _d_aaGetRvalueX(V[K] aa, K key)
+ private Expression interpret_aaGetRvalueX(UnionExp* pue, InterState* istate, Expression aa, Expression key)
+ {
+     Expression e1 = interpret(aa, istate);
+     if (exceptionOrCantInterpret(e1))
+         return e1;
+     Expression e2 = interpretRegion(key, istate);
+     if (exceptionOrCantInterpret(e2))
+         return e2;
+ 
+     auto aalit = e1.isAssocArrayLiteralExp();
+     if (!aalit)
+     {
+         error(aa.loc, "cannot index null array `%s`", aa.toChars());
+         return CTFEExp.cantexp;
+     }
+     size_t idx;
+     Expression result = findKeyInAA(aa.loc, aalit, e2, &idx);
+     if (!result)
+     {
+         error(aa.loc, "key `%s` not found in associative array `%s`", key.toChars(), aa.toChars());
+         return  CTFEExp.cantexp;
+     }
+ 
+     return pointerToAAValue(pue, aa, aalit, idx);
+ }
+ 
+ // signature is V* _d_aaGetY(ref V[K] aa, K key, out bool found)
+ private Expression interpret_aaGetY(UnionExp* pue, InterState* istate, Expression aa, Expression key, Expression found)
+ {
+     Expression eaa = interpretRegion(aa, istate, CTFEGoal.LValue);
+     if (exceptionOrCantInterpret(eaa))
+         return eaa;
+     Expression ekey = interpretRegion(key, istate);
+     if (exceptionOrCantInterpret(ekey))
+         return ekey;
+     Expression efound = interpretRegion(found, istate, CTFEGoal.LValue);
+     if (exceptionOrCantInterpret(efound))
+         return efound;
+ 
+     auto ie = ctfeEmplaceExp!IndexExp(aa.loc, aa, key); // any BinExp for location in assignToLvalue
+     Expression evalaa = interpretRegion(eaa, istate);
+     auto aalit = evalaa.isAssocArrayLiteralExp();
+     if (!aalit)
+     {
+         auto keysx = new Expressions();
+         auto valuesx = new Expressions();
+         aalit = ctfeEmplaceExp!AssocArrayLiteralExp(aa.loc, keysx, valuesx);
+         aalit.type = aa.type;
+         aalit.ownedByCtfe = OwnedBy.ctfe;
+         Interpreter.assignToLvalue(ie, eaa, aalit, istate);
+     }
+     size_t idx;
+     auto result = findKeyInAA(aa.loc, aalit, ekey, &idx);
+     if (found)
+         Interpreter.assignToLvalue(ie, efound, IntegerExp.createBool(result !is null), istate);
+     if (!result)
+     {
+         aalit.keys.push(ekey);
+         result = copyLiteral(aa.type.nextOf().defaultInitLiteral(aa.loc)).copy();
+         idx = aalit.values.length;
+         aalit.values.push(result);
+     }
+     return pointerToAAValue(pue, aa, aalit, idx);
+ }
+ 
+ private Expression pointerToAAValue(UnionExp* pue, Expression aa, AssocArrayLiteralExp aalit, size_t idx)
+ {
+     auto arr = ctfeEmplaceExp!(ArrayLiteralExp)(aa.loc, aa.type.nextOf().arrayOf(), aalit.values);
+     arr.ownedByCtfe = aalit.ownedByCtfe;
+     arr.aaLiteral = aalit;
+     auto len = ctfeEmplaceExp!(IntegerExp)(aa.loc, idx, Type.tsize_t);
+     auto idxexp = ctfeEmplaceExp!(IndexExp)(aa.loc, arr, len);
+     idxexp.type = arr.type.nextOf();
+     emplaceExp!(AddrExp)(pue, aa.loc, idxexp);
+     pue.exp().type = idxexp.type.pointerTo();
+     return pue.exp();
+ }
+ 
  // signature is int delegate(ref Value) OR int delegate(ref Key, ref Value)
  private Expression interpret_aaApply(UnionExp* pue, InterState* istate, Expression aa, Expression deleg)
  {
*************** private Expression interpret_aaApply(Uni
*** 7283,7289 ****
          if (wantRefValue)
          {
              Type t = evalue.type;
!             evalue = ctfeEmplaceExp!IndexExp(deleg.loc, ae, ekey);
              evalue.type = t;
          }
          args[numParams - 1] = evalue;
--- 7134,7143 ----
          if (wantRefValue)
          {
              Type t = evalue.type;
!             auto arr = ctfeEmplaceExp!(ArrayLiteralExp)(aa.loc, t.arrayOf(), ae.values);
!             arr.ownedByCtfe = ae.ownedByCtfe;
!             auto idx = ctfeEmplaceExp!(IntegerExp)(aa.loc, i, Type.tsize_t);
!             evalue = ctfeEmplaceExp!(IndexExp)(aa.loc, arr, idx);
              evalue.type = t;
          }
          args[numParams - 1] = evalue;
*************** private Expression evaluateIfBuiltin(Uni
*** 7541,7547 ****
      }
      if (!pthis)
      {
!         if (nargs == 1 || nargs == 3)
          {
              Expression firstarg = (*arguments)[0];
              if (auto firstAAtype = firstarg.type.toBasetype().isTypeAArray())
--- 7395,7401 ----
      }
      if (!pthis)
      {
!         if (nargs >= 1 && nargs <= 3)
          {
              Expression firstarg = (*arguments)[0];
              if (auto firstAAtype = firstarg.type.toBasetype().isTypeAArray())
*************** private Expression evaluateIfBuiltin(Uni
*** 7549,7555 ****
                  const id = fd.ident;
                  if (nargs == 1)
                  {
!                     if (id == Id.aaLen)
                          return interpret_length(pue, istate, firstarg);
  
                      if (fd.toParent2().ident == Id.object)
--- 7403,7409 ----
                  const id = fd.ident;
                  if (nargs == 1)
                  {
!                     if (id == Id._d_aaLen)
                          return interpret_length(pue, istate, firstarg);
  
                      if (fd.toParent2().ident == Id.object)
*************** private Expression evaluateIfBuiltin(Uni
*** 7564,7575 ****
                              return interpret_dup(pue, istate, firstarg);
                      }
                  }
                  else // (nargs == 3)
                  {
!                     if (id == Id._aaApply)
!                         return interpret_aaApply(pue, istate, firstarg, (*arguments)[2]);
!                     if (id == Id._aaApply2)
!                         return interpret_aaApply(pue, istate, firstarg, (*arguments)[2]);
                  }
              }
          }
--- 7418,7442 ----
                              return interpret_dup(pue, istate, firstarg);
                      }
                  }
+                 else if (nargs == 2)
+                 {
+                     if (id == Id._d_aaGetRvalueX)
+                         return interpret_aaGetRvalueX(pue, istate, firstarg, (*arguments)[1]);
+                     if (id == Id._d_aaIn)
+                         return interpret_aaIn(pue, istate, firstarg, (*arguments)[1]);
+                     if (id == Id._d_aaDel)
+                         return interpret_aaDel(pue, istate, firstarg, (*arguments)[1]);
+                     if (id == Id._d_aaEqual)
+                         return interpret_aaEqual(pue, istate, firstarg, (*arguments)[1]);
+                     if (id == Id._d_aaApply)
+                         return interpret_aaApply(pue, istate, firstarg, (*arguments)[1]);
+                     if (id == Id._d_aaApply2)
+                         return interpret_aaApply(pue, istate, firstarg, (*arguments)[1]);
+                 }
                  else // (nargs == 3)
                  {
!                     if (id == Id._d_aaGetY)
!                         return interpret_aaGetY(pue, istate, firstarg, (*arguments)[1], (*arguments)[2]);
                  }
              }
          }
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/dmodule.d gcc-16-20260201/gcc/d/dmd/dmodule.d
*** gcc-16-20260125/gcc/d/dmd/dmodule.d	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/dmodule.d	Sun Feb  1 22:32:07 2026
*************** import dmd.dmacro;
*** 30,48 ****
  import dmd.doc;
  import dmd.dscope;
  import dmd.dsymbol;
! import dmd.dsymbolsem : dsymbolSemantic, importAll, load, include;
  import dmd.errors;
  import dmd.errorsink;
  import dmd.expression;
- import dmd.expressionsem;
  import dmd.file_manager;
  import dmd.func;
  import dmd.globals;
- import dmd.gluelayer;
  import dmd.id;
  import dmd.identifier;
  import dmd.location;
  import dmd.parse;
  import dmd.root.array;
  import dmd.root.file;
  import dmd.root.filename;
--- 30,47 ----
  import dmd.doc;
  import dmd.dscope;
  import dmd.dsymbol;
! import dmd.dsymbolsem : dsymbolSemantic;
  import dmd.errors;
  import dmd.errorsink;
  import dmd.expression;
  import dmd.file_manager;
  import dmd.func;
  import dmd.globals;
  import dmd.id;
  import dmd.identifier;
  import dmd.location;
  import dmd.parse;
+ import dmd.root.aav;
  import dmd.root.array;
  import dmd.root.file;
  import dmd.root.filename;
*************** extern (C++) final class Module : Packag
*** 411,416 ****
--- 410,417 ----
      SearchOptFlags searchCacheFlags;       // cached flags
      bool insearch;
  
+     bool isExplicitlyOutOfBinary; // Is this module known to be out of binary, and must be DllImport'd?
+ 
      /**
       * A root module is one that will be compiled all the way to
       * object code.  This field holds the root module that caused
*************** extern (C++) final class Module : Packag
*** 455,460 ****
--- 456,462 ----
          else if (!FileName.equalsExt(srcfilename, mars_ext) &&
                   !FileName.equalsExt(srcfilename, hdr_ext) &&
                   !FileName.equalsExt(srcfilename, c_ext) &&
+                  !FileName.equalsExt(srcfilename, h_ext) &&
                   !FileName.equalsExt(srcfilename, i_ext) &&
                   !FileName.equalsExt(srcfilename, dd_ext))
          {
*************** extern (C++) final class Module : Packag
*** 473,479 ****
          if (doHdrGen)
              hdrfile = setOutfilename(global.params.dihdr.name, global.params.dihdr.dir, arg, hdr_ext);
  
!         this.edition = Edition.legacy;
      }
  
      extern (D) this(const(char)[] filename, Identifier ident, int doDocComment, int doHdrGen)
--- 475,481 ----
          if (doHdrGen)
              hdrfile = setOutfilename(global.params.dihdr.name, global.params.dihdr.dir, arg, hdr_ext);
  
!         this.edition = Edition.min;
      }
  
      extern (D) this(const(char)[] filename, Identifier ident, int doDocComment, int doHdrGen)
*************** extern (C++) final class Module : Packag
*** 491,502 ****
          return new Module(Loc.initial, filename, ident, doDocComment, doHdrGen);
      }
  
-     static const(char)* find(const(char)* filename)
-     {
-         ImportPathInfo pathThatFoundThis; // is this needed? In fact is this function needed still???
-         return find(filename.toDString, pathThatFoundThis).ptr;
-     }
- 
      extern (D) static const(char)[] find(const(char)[] filename, out ImportPathInfo pathThatFoundThis)
      {
          ptrdiff_t whichPathFoundThis;
--- 493,498 ----
*************** extern (C++) final class Module : Packag
*** 531,536 ****
--- 527,533 ----
          auto m = new Module(loc, filename, ident, 0, 0);
  
          // TODO: apply import path information (pathInfo) on to module
+         m.isExplicitlyOutOfBinary = importPathThatFindUs.isOutOfBinary;
  
          if (!m.read(loc))
              return null;
*************** extern (C++) final class Module : Packag
*** 544,549 ****
--- 541,548 ----
              }
              buf.printf("%s\t(%s)", ident.toChars(), m.srcfile.toChars());
              message("import    %s", buf.peekChars());
+             if (loc != Loc.initial)
+                 message("(imported from %s)", loc.toChars());
          }
          if((m = m.parse()) is null) return null;
  
*************** extern (C++) final class Module : Packag
*** 697,703 ****
  
          const(ubyte)[] srctext;
          if (global.preprocess &&
!             FileName.equalsExt(srcfile.toString(), c_ext) &&
              FileName.exists(srcfile.toString()))
          {
              /* Apply C preprocessor to the .c file, returning the contents
--- 696,703 ----
  
          const(ubyte)[] srctext;
          if (global.preprocess &&
!             (FileName.equalsExt(srcfile.toString(), c_ext) ||
!              FileName.equalsExt(srcfile.toString(), h_ext)) &&
              FileName.exists(srcfile.toString()))
          {
              /* Apply C preprocessor to the .c file, returning the contents
*************** extern (C++) final class Module : Packag
*** 780,789 ****
          DsymbolTable dst;
          Package ppack = null;
  
!         /* If it has the extension ".c", it is a "C" file.
           * If it has the extension ".i", it is a preprocessed "C" file.
           */
!         if (FileName.equalsExt(arg, c_ext) || FileName.equalsExt(arg, i_ext))
          {
              filetype = FileType.c;
  
--- 780,791 ----
          DsymbolTable dst;
          Package ppack = null;
  
!         /* If it has the extension ".c" or ".h", it is a "C" file.
           * If it has the extension ".i", it is a preprocessed "C" file.
           */
!         if (FileName.equalsExt(arg, c_ext) ||
!             FileName.equalsExt(arg, h_ext) ||
!             FileName.equalsExt(arg, i_ext))
          {
              filetype = FileType.c;
  
*************** extern (C++) final class Module : Packag
*** 950,981 ****
          return needmoduleinfo || global.params.cov;
      }
  
-     /*******************************************
-      * Print deprecation warning if we're deprecated, when
-      * this module is imported from scope sc.
-      *
-      * Params:
-      *  sc = the scope into which we are imported
-      *  loc = the location of the import statement
-      */
-     void checkImportDeprecation(Loc loc, Scope* sc)
-     {
-         if (md && md.isdeprecated && !sc.isDeprecated)
-         {
-             Expression msg = md.msg;
-             if (StringExp se = msg ? msg.toStringExp() : null)
-             {
-                 const slice = se.peekString();
-                 if (slice.length)
-                 {
-                     deprecation(loc, "%s `%s` is deprecated - %.*s", kind, toPrettyChars, cast(int)slice.length, slice.ptr);
-                     return;
-                 }
-             }
-             deprecation(loc, "%s `%s` is deprecated", kind, toPrettyChars);
-         }
-     }
- 
      override bool isPackageAccessible(Package p, Visibility visibility, SearchOptFlags flags = SearchOpt.all)
      {
          if (insearch) // don't follow import cycles
--- 952,957 ----
*************** extern (C++) final class Module : Packag
*** 1008,1029 ****
      extern (D) static void addDeferredSemantic(Dsymbol s)
      {
          //printf("Module::addDeferredSemantic('%s')\n", s.toChars());
!         if (!deferred.contains(s))
              deferred.push(s);
      }
  
      extern (D) static void addDeferredSemantic2(Dsymbol s)
      {
          //printf("Module::addDeferredSemantic2('%s')\n", s.toChars());
!         if (!deferred2.contains(s))
              deferred2.push(s);
      }
  
      extern (D) static void addDeferredSemantic3(Dsymbol s)
      {
          //printf("Module::addDeferredSemantic3('%s')\n", s.toChars());
!         if (!deferred.contains(s))
              deferred3.push(s);
      }
  
      /******************************************
--- 984,1014 ----
      extern (D) static void addDeferredSemantic(Dsymbol s)
      {
          //printf("Module::addDeferredSemantic('%s')\n", s.toChars());
!         if (!s.deferred)
!         {
!             s.deferred = true;
              deferred.push(s);
+         }
      }
  
      extern (D) static void addDeferredSemantic2(Dsymbol s)
      {
          //printf("Module::addDeferredSemantic2('%s')\n", s.toChars());
!         if (!s.deferred2)
!         {
!             s.deferred2 = true;
              deferred2.push(s);
+         }
      }
  
      extern (D) static void addDeferredSemantic3(Dsymbol s)
      {
          //printf("Module::addDeferredSemantic3('%s')\n", s.toChars());
!         if (!s.deferred3)
!         {
!             s.deferred3 = true;
              deferred3.push(s);
+         }
      }
  
      /******************************************
*************** extern (C++) final class Module : Packag
*** 1057,1062 ****
--- 1042,1049 ----
                  todoalloc = todo;
              }
              memcpy(todo, deferred.tdata(), len * Dsymbol.sizeof);
+             foreach (Dsymbol s; Module.deferred[])
+                 s.deferred = false;
              deferred.setDim(0);
  
              foreach (i; 0..len)
*************** extern (C++) final class Module : Packag
*** 1082,1087 ****
--- 1069,1075 ----
          for (size_t i = 0; i < a.length; i++)
          {
              Dsymbol s = (*a)[i];
+             s.deferred2 = false;
              //printf("[%d] %s semantic2a\n", i, s.toPrettyChars());
              s.semantic2(null);
  
*************** extern (C++) final class Module : Packag
*** 1099,1104 ****
--- 1087,1093 ----
          for (size_t i = 0; i < a.length; i++)
          {
              Dsymbol s = (*a)[i];
+             s.deferred3 = false;
              //printf("[%d] %s semantic3a\n", i, s.toPrettyChars());
              s.semantic3(null);
  
*************** extern (C++) final class Module : Packag
*** 1154,1169 ****
      }
  
      // Back end
!     int doppelganger; // sub-module
!     Symbol* cov; // private uint[] __coverage;
      uint[] covb; // bit array of valid code line numbers
!     Symbol* sictor; // module order independent constructor
!     Symbol* sctor; // module constructor
!     Symbol* sdtor; // module destructor
!     Symbol* ssharedctor; // module shared constructor
!     Symbol* sshareddtor; // module shared destructor
!     Symbol* stest; // module unit test
!     Symbol* sfilename; // symbol for filename
  
      uint[uint] ctfe_cov; /// coverage information from ctfe execution_count[line]
  
--- 1143,1152 ----
      }
  
      // Back end
!     void* cov; // private uint[] __coverage;
      uint[] covb; // bit array of valid code line numbers
!     void* sfilename; // symbol for filename
!     bool hasCDtor; // this module has a (shared) module constructor or destructor and we are codegenning it
  
      uint[uint] ctfe_cov; /// coverage information from ctfe execution_count[line]
  
*************** extern (C++) final class Module : Packag
*** 1197,1271 ****
              _escapetable = new Escape();
          return _escapetable;
      }
- 
-     /****************************
-      * A Singleton that loads core.stdc.config
-      * Returns:
-      *  Module of core.stdc.config, null if couldn't find it
-      */
-     extern (D) static Module loadCoreStdcConfig()
-     {
-         __gshared Module core_stdc_config;
-         auto pkgids = new Identifier[2];
-         pkgids[0] = Id.core;
-         pkgids[1] = Id.stdc;
-         return loadModuleFromLibrary(core_stdc_config, pkgids, Id.config);
-     }
- 
-     /****************************
-      * A Singleton that loads core.atomic
-      * Returns:
-      *  Module of core.atomic, null if couldn't find it
-      */
-     extern (D) static Module loadCoreAtomic()
-     {
-         __gshared Module core_atomic;
-         auto pkgids = new Identifier[1];
-         pkgids[0] = Id.core;
-         return loadModuleFromLibrary(core_atomic, pkgids, Id.atomic);
-     }
- 
-     /****************************
-      * A Singleton that loads std.math
-      * Returns:
-      *  Module of std.math, null if couldn't find it
-      */
-     extern (D) static Module loadStdMath()
-     {
-         __gshared Module std_math;
-         auto pkgids = new Identifier[1];
-         pkgids[0] = Id.std;
-         return loadModuleFromLibrary(std_math, pkgids, Id.math);
-     }
- 
-     /**********************************
-      * Load a Module from the library.
-      * Params:
-      *  mod = cached return value of this call
-      *  pkgids = package identifiers
-      *  modid = module id
-      * Returns:
-      *  Module loaded, null if cannot load it
-      */
-     extern (D) private static Module loadModuleFromLibrary(ref Module mod, Identifier[] pkgids, Identifier modid)
-     {
-         if (mod)
-             return mod;
- 
-         auto imp = new Import(Loc.initial, pkgids[], modid, null, true);
-         // Module.load will call fatal() if there's no module available.
-         // Gag the error here, pushing the error handling to the caller.
-         const errors = global.startGagging();
-         imp.load(null);
-         if (imp.mod)
-         {
-             imp.mod.importAll(null);
-             imp.mod.dsymbolSemantic(null);
-         }
-         global.endGagging(errors);
-         mod = imp.mod;
-         return mod;
-     }
  }
  
  /***********************************************************
--- 1180,1185 ----
*************** extern (C++) struct ModuleDeclaration
*** 1306,1388 ****
      }
  }
  
- /****************************************
-  * Create array of the local classes in the Module, suitable
-  * for inclusion in ModuleInfo
-  * Params:
-  *      mod = the Module
-  *      aclasses = array to fill in
-  * Returns: array of local classes
-  */
- void getLocalClasses(Module mod, ref ClassDeclarations aclasses)
- {
-     //printf("members.length = %d\n", mod.members.length);
-     int pushAddClassDg(size_t n, Dsymbol sm)
-     {
-         if (!sm)
-             return 0;
- 
-         if (auto cd = sm.isClassDeclaration())
-         {
-             // compatibility with previous algorithm
-             if (cd.parent && cd.parent.isTemplateMixin())
-                 return 0;
- 
-             if (cd.classKind != ClassKind.objc)
-                 aclasses.push(cd);
-         }
-         return 0;
-     }
- 
-     _foreach(null, mod.members, &pushAddClassDg);
- }
- 
- 
  alias ForeachDg = int delegate(size_t idx, Dsymbol s);
  
- /***************************************
-  * Expands attribute declarations in members in depth first
-  * order. Calls dg(size_t symidx, Dsymbol *sym) for each
-  * member.
-  * If dg returns !=0, stops and returns that value else returns 0.
-  * Use this function to avoid the O(N + N^2/2) complexity of
-  * calculating dim and calling N times getNth.
-  * Returns:
-  *  last value returned by dg()
-  */
- int _foreach(Scope* sc, Dsymbols* members, scope ForeachDg dg, size_t* pn = null)
- {
-     assert(dg);
-     if (!members)
-         return 0;
-     size_t n = pn ? *pn : 0; // take over index
-     int result = 0;
-     foreach (size_t i; 0 .. members.length)
-     {
-         import dmd.attrib : AttribDeclaration;
-         import dmd.dtemplate : TemplateMixin;
- 
-         Dsymbol s = (*members)[i];
-         if (AttribDeclaration a = s.isAttribDeclaration())
-             result = _foreach(sc, a.include(sc), dg, &n);
-         else if (TemplateMixin tm = s.isTemplateMixin())
-             result = _foreach(sc, tm.members, dg, &n);
-         else if (s.isTemplateInstance())
-         {
-         }
-         else if (s.isUnitTestDeclaration())
-         {
-         }
-         else
-             result = dg(n++, s);
-         if (result)
-             break;
-     }
-     if (pn)
-         *pn = n; // update index
-     return result;
- }
- 
  /**
   * Process the content of a source file
   *
--- 1220,1227 ----
*************** private const(char)[] processSource (con
*** 1445,1451 ****
                  dbuf.writeUTF8(u);
              }
              else
!                 dbuf.writeByte(u);
          }
          dbuf.writeByte(0); //add null terminator
          return dbuf.extractSlice();
--- 1284,1290 ----
                  dbuf.writeUTF8(u);
              }
              else
!                 dbuf.writeByte(cast(ubyte)u);
          }
          dbuf.writeByte(0); //add null terminator
          return dbuf.extractSlice();
*************** private const(char)[] processSource (con
*** 1514,1520 ****
                  dbuf.writeUTF8(u);
              }
              else
!                 dbuf.writeByte(u);
          }
          dbuf.writeByte(0); //add a terminating null byte
          return dbuf.extractSlice();
--- 1353,1359 ----
                  dbuf.writeUTF8(u);
              }
              else
!                 dbuf.writeByte(cast(ubyte)u);
          }
          dbuf.writeByte(0); //add a terminating null byte
          return dbuf.extractSlice();
*************** FuncDeclaration findGetMembers(ScopeDsym
*** 1592,1600 ****
          {
              Scope sc;
              sc.eSink = global.errorSink;
-             auto parameters = new Parameters();
              Parameters* p = new Parameter(STC.in_, Type.tchar.constOf().arrayOf(), null, null);
!             parameters.push(p);
              Type tret = null;
              TypeFunction tf = new TypeFunction(parameters, tret, VarArg.none, LINK.d);
              tfgetmembers = tf.dsymbolSemantic(Loc.initial, &sc).isTypeFunction();
--- 1431,1438 ----
          {
              Scope sc;
              sc.eSink = global.errorSink;
              Parameters* p = new Parameter(STC.in_, Type.tchar.constOf().arrayOf(), null, null);
!             auto parameters = new Parameters(p);
              Type tret = null;
              TypeFunction tf = new TypeFunction(parameters, tret, VarArg.none, LINK.d);
              tfgetmembers = tf.dsymbolSemantic(Loc.initial, &sc).isTypeFunction();
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/dscope.d gcc-16-20260201/gcc/d/dmd/dscope.d
*** gcc-16-20260125/gcc/d/dmd/dscope.d	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/dscope.d	Sun Feb  1 22:32:07 2026
*************** enum Contract : ubyte
*** 55,61 ****
      ensure = 3, // out contract
  }
  
! private extern (D) struct BitFields
  {
      bool ctor;              /// constructor type
      bool noAccessCheck;     /// don't do access checks
--- 55,62 ----
      ensure = 3, // out contract
  }
  
! /// Bitfield for settable/copyable flags, see `copyFlagsFrom`, `resetAllFlags`
! private extern (D) struct FlagBitFields
  {
      bool ctor;              /// constructor type
      bool noAccessCheck;     /// don't do access checks
*************** private extern (D) struct BitFields
*** 64,70 ****
      bool inTemplateConstraint; /// inside template constraint
      Contract contract;
      bool ctfe;              /// inside a ctfe-only expression
!     bool traitsCompiles;    /// inside __traits(compile)
      /// ignore symbol visibility
      /// https://issues.dlang.org/show_bug.cgi?id=15907
      bool ignoresymbolvisibility;
--- 65,71 ----
      bool inTemplateConstraint; /// inside template constraint
      Contract contract;
      bool ctfe;              /// inside a ctfe-only expression
!     bool traitsCompiles;    /// inside __traits(compile) or is-expression
      /// ignore symbol visibility
      /// https://issues.dlang.org/show_bug.cgi?id=15907
      bool ignoresymbolvisibility;
*************** private extern (D) struct BitFields
*** 74,79 ****
--- 75,88 ----
      bool ctfeBlock;         /// inside a `if (__ctfe)` block
  }
  
+ private extern (D) struct NonFlagBitFields
+ {
+     ubyte intypeof;                 /// in typeof(exp)
+     bool nofree;                    /// true if shouldn't free it
+     bool inLoop;                    /// true if inside a loop (where constructor calls aren't allowed)
+     bool inDefaultArg;              /// true if inside a default argument (where __FILE__, etc are evaluated at the call site)
+     bool explicitVisibility;        /// set if in an explicit visibility attribute
+ }
  /// State of -preview switches
  ///
  /// By making them part of a Scope, we reduce reliance on dmd.globals,
*************** extern (C++) struct Scope
*** 140,149 ****
      ForeachStatement fes;           /// if nested function for ForeachStatement, this is it
      Scope* callsc;                  /// used for __FUNCTION__, __PRETTY_FUNCTION__ and __MODULE__
      Dsymbol inunion;                /// != null if processing members of a union
-     bool nofree;                    /// true if shouldn't free it
-     bool inLoop;                    /// true if inside a loop (where constructor calls aren't allowed)
-     bool inDefaultArg;              /// true if inside a default argument (where __FILE__, etc are evaluated at the call site)
-     int intypeof;                   /// in typeof(exp)
      VarDeclaration lastVar;         /// Previous symbol used to prevent goto-skips-init
      ErrorSink eSink;                /// sink for error messages
  
--- 149,154 ----
*************** extern (C++) struct Scope
*** 174,188 ****
  
      /// visibility for class members
      Visibility visibility = Visibility(Visibility.Kind.public_);
-     int explicitVisibility;         /// set if in an explicit visibility attribute
  
      STC stc;                        /// storage class
  
      DeprecatedDeclaration depdecl;  /// customized deprecation message
  
      import dmd.common.bitfields : generateBitFields;
!     mixin(generateBitFields!(BitFields, ushort));
! 
      Previews previews;
  
      // user defined attributes
--- 179,193 ----
  
      /// visibility for class members
      Visibility visibility = Visibility(Visibility.Kind.public_);
  
      STC stc;                        /// storage class
  
      DeprecatedDeclaration depdecl;  /// customized deprecation message
  
      import dmd.common.bitfields : generateBitFields;
!     mixin(generateBitFields!(FlagBitFields, ushort));
!     private ushort bitFields2;
!     mixin(generateBitFields!(NonFlagBitFields, ushort, "bitFields2"));
      Previews previews;
  
      // user defined attributes
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/dstruct.d gcc-16-20260201/gcc/d/dmd/dstruct.d
*** gcc-16-20260125/gcc/d/dmd/dstruct.d	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/dstruct.d	Sun Feb  1 22:32:07 2026
*************** import dmd.declaration;
*** 23,35 ****
  import dmd.dmodule;
  import dmd.dscope;
  import dmd.dsymbol;
- import dmd.dsymbolsem : search, setFieldOffset;
  import dmd.dtemplate;
- import dmd.errors;
  import dmd.expression;
  import dmd.func;
- import dmd.funcsem;
- import dmd.globals;
  import dmd.id;
  import dmd.identifier;
  import dmd.location;
--- 23,31 ----
*************** import dmd.mtype;
*** 37,71 ****
  import dmd.opover;
  import dmd.target;
  import dmd.tokens;
- import dmd.typesem : isZeroInit, merge, size, hasPointers;
  import dmd.typinf;
  import dmd.visitor;
  
- /***************************************
-  * Search sd for a member function of the form:
-  *   `extern (D) string toString();`
-  * Params:
-  *   sd = struct declaration to search
-  * Returns:
-  *   FuncDeclaration of `toString()` if found, `null` if not
-  */
- FuncDeclaration search_toString(StructDeclaration sd)
- {
-     Dsymbol s = search_function(sd, Id.tostring);
-     FuncDeclaration fd = s ? s.isFuncDeclaration() : null;
-     if (fd)
-     {
-         __gshared TypeFunction tftostring;
-         if (!tftostring)
-         {
-             tftostring = new TypeFunction(ParameterList(), Type.tstring, LINK.d);
-             tftostring = tftostring.merge().toTypeFunction();
-         }
-         fd = fd.overloadExactMatch(tftostring);
-     }
-     return fd;
- }
- 
  enum StructFlags : int
  {
      none        = 0x0,
--- 33,41 ----
*************** extern (C++) class StructDeclaration : A
*** 151,370 ****
          return "struct";
      }
  
-     override final void finalizeSize()
-     {
-         //printf("StructDeclaration::finalizeSize() %s, sizeok = %d\n", toChars(), sizeok);
-         assert(sizeok != Sizeok.done);
- 
-         if (sizeok == Sizeok.inProcess)
-         {
-             return;
-         }
-         sizeok = Sizeok.inProcess;
- 
-         //printf("+StructDeclaration::finalizeSize() %s, fields.length = %d, sizeok = %d\n", toChars(), fields.length, sizeok);
- 
-         fields.setDim(0);   // workaround
- 
-         // Set the offsets of the fields and determine the size of the struct
-         FieldState fieldState;
-         bool isunion = isUnionDeclaration() !is null;
-         for (size_t i = 0; i < members.length; i++)
-         {
-             Dsymbol s = (*members)[i];
-             s.setFieldOffset(this, &fieldState, isunion);
-             if (type.ty == Terror)
-             {
-                 errorSupplemental(s.loc, "error on member `%s`", s.toPrettyChars);
-                 errors = true;
-                 return;
-             }
-         }
- 
-         if (structsize == 0)
-         {
-             hasNoFields = true;
-             alignsize = 1;
- 
-             // A fine mess of what size a zero sized struct should be
-             final switch (classKind)
-             {
-                 case ClassKind.d:
-                 case ClassKind.cpp:
-                     structsize = 1;
-                     break;
- 
-                 case ClassKind.c:
-                 case ClassKind.objc:
-                     if (target.c.bitFieldStyle == TargetC.BitFieldStyle.MS)
-                     {
-                         /* Undocumented MS behavior for:
-                          *   struct S { int :0; };
-                          */
-                         structsize = 4;
-                     }
-                     else
-                         structsize = 0;
-                     break;
-             }
-         }
- 
-         // Round struct size up to next alignsize boundary.
-         // This will ensure that arrays of structs will get their internals
-         // aligned properly.
-         if (alignment.isDefault() || alignment.isPack())
-             structsize = (structsize + alignsize - 1) & ~(alignsize - 1);
-         else
-             structsize = (structsize + alignment.get() - 1) & ~(alignment.get() - 1);
- 
-         sizeok = Sizeok.done;
- 
-         //printf("-StructDeclaration::finalizeSize() %s, fields.length = %d, structsize = %d\n", toChars(), cast(int)fields.length, cast(int)structsize);
- 
-         if (errors)
-             return;
- 
-         // Calculate fields[i].overlapped
-         if (checkOverlappedFields())
-         {
-             errors = true;
-             return;
-         }
- 
-         // Determine if struct is all zeros or not
-         zeroInit = true;
-         auto lastOffset = -1;
-         foreach (vd; fields)
-         {
-             // First skip zero sized fields
-             if (vd.type.size(vd.loc) == 0)
-                 continue;
- 
-             // only consider first sized member of an (anonymous) union
-             if (vd.overlapped && vd.offset == lastOffset)
-                 continue;
-             lastOffset = vd.offset;
- 
-             if (vd._init)
-             {
-                 if (vd._init.isVoidInitializer())
-                     /* Treat as 0 for the purposes of putting the initializer
-                      * in the BSS segment, or doing a mass set to 0
-                      */
-                     continue;
- 
-                 // Examine init to see if it is all 0s.
-                 auto exp = vd.getConstInitializer();
-                 if (!exp || !_isZeroInit(exp))
-                 {
-                     zeroInit = false;
-                     break;
-                 }
-             }
-             else if (!vd.type.isZeroInit(loc))
-             {
-                 zeroInit = false;
-                 break;
-             }
-         }
- 
- 
-         argTypes = target.toArgTypes(type);
-     }
- 
-     /// Compute cached type properties for `TypeStruct`
-     extern(D) final void determineTypeProperties()
-     {
-         if (computedTypeProperties)
-             return;
-         foreach (vd; fields)
-         {
-             if (vd.storage_class & STC.ref_ || vd.hasPointers())
-             {
-                 hasPointerField = true;
-                 hasUnsafeBitpatterns = true;
-             }
- 
-             if (vd._init && vd._init.isVoidInitializer() && vd.type.hasPointers())
-                 hasVoidInitPointers = true;
- 
-             if (vd.storage_class & STC.system || vd.type.hasUnsafeBitpatterns())
-                 hasUnsafeBitpatterns = true;
- 
-             if (!vd._init && vd.type.hasVoidInitPointers())
-                 hasVoidInitPointers = true;
- 
-             if (vd.type.hasInvariant())
-                 hasFieldWithInvariant = true;
-         }
-         computedTypeProperties = true;
-     }
- 
-     /***************************************
-      * Determine if struct is POD (Plain Old Data).
-      *
-      * POD is defined as:
-      *      $(OL
-      *      $(LI not nested)
-      *      $(LI no postblits, destructors, or assignment operators)
-      *      $(LI no `ref` fields or fields that are themselves non-POD)
-      *      )
-      * The idea being these are compatible with C structs.
-      *
-      * Returns:
-      *     true if struct is POD
-      */
-     final bool isPOD()
-     {
-         // If we've already determined whether this struct is POD.
-         if (ispod != ThreeState.none)
-             return (ispod == ThreeState.yes);
- 
-         import dmd.clone;
- 
-         bool hasCpCtorLocal;
-         bool hasMoveCtorLocal;
-         bool needCopyCtor;
-         bool needMoveCtor;
-         needCopyOrMoveCtor(this, hasCpCtorLocal, hasMoveCtorLocal, needCopyCtor, needMoveCtor);
- 
-         if (enclosing                      || // is nested
-             search(this, loc, Id.postblit) || // has postblit
-             search(this, loc, Id.dtor)     || // has destructor
-             /* This is commented out because otherwise buildkite vibe.d:
-                `canCAS!Task` fails to compile
-              */
-             //hasMoveCtorLocal               || // has move constructor
-             hasCpCtorLocal)                   // has copy constructor
-         {
-             ispod = ThreeState.no;
-             return false;
-         }
- 
-         // Recursively check all fields are POD.
-         for (size_t i = 0; i < fields.length; i++)
-         {
-             VarDeclaration v = fields[i];
-             if (v.storage_class & STC.ref_)
-             {
-                 ispod = ThreeState.no;
-                 return false;
-             }
- 
-             if (auto ts = v.type.baseElemOf().isTypeStruct())
-             {
-                 if (!ts.sym.isPOD())
-                 {
-                     ispod = ThreeState.no;
-                     return false;
-                 }
-             }
-         }
- 
-         ispod = ThreeState.yes;
-         return true;
-     }
- 
      /***************************************
       * Determine if struct has copy construction (copy constructor or postblit)
       * Returns:
--- 121,126 ----
*************** extern (C++) class StructDeclaration : A
*** 389,535 ****
      {
          return index < numArgTypes() ? (*argTypes.arguments)[index].type : null;
      }
- 
- 
-     /***************************************
-      * Verifies whether the struct declaration has a
-      * constructor that is not a copy constructor.
-      * Optionally, it can check whether the struct
-      * declaration has a regular constructor, that
-      * is not disabled.
-      *
-      * Params:
-      *      checkDisabled = if the struct has a regular
-                             non-disabled constructor
-      * Returns:
-      *      true, if the struct has a regular (optionally,
-      *      not disabled) constructor, false otherwise.
-      */
-     final bool hasRegularCtor(bool checkDisabled = false)
-     {
-         if (!ctor)
-             return false;
- 
-         bool result;
-         overloadApply(ctor, (Dsymbol s)
-         {
-             if (auto td = s.isTemplateDeclaration())
-             {
-                 if (checkDisabled && td.onemember)
-                 {
-                     if (auto ctorDecl = td.onemember.isCtorDeclaration())
-                     {
-                         if (ctorDecl.storage_class & STC.disable)
-                             return 0;
-                     }
-                 }
-                 result = true;
-                 return 1;
-             }
-             if (auto ctorDecl = s.isCtorDeclaration())
-             {
-                 if (!ctorDecl.isCpCtor && (!checkDisabled || !(ctorDecl.storage_class & STC.disable)))
-                 {
-                     result = true;
-                     return 1;
-                 }
-             }
-             return 0;
-         });
-         return result;
-     }
  }
  
- /**********************************
-  * Determine if exp is all binary zeros.
-  * Params:
-  *      exp = expression to check
-  * Returns:
-  *      true if it's all binary 0
-  */
- bool _isZeroInit(Expression exp)
- {
-     switch (exp.op)
-     {
-         case EXP.int64:
-             return exp.toInteger() == 0;
- 
-         case EXP.null_:
-             return true;
- 
-         case EXP.structLiteral:
-         {
-             auto sle = exp.isStructLiteralExp();
-             if (sle.sd.isNested())
-                 return false;
-             const isCstruct = sle.sd.isCsymbol();  // C structs are default initialized to all zeros
-             foreach (i; 0 .. sle.sd.fields.length)
-             {
-                 auto field = sle.sd.fields[i];
-                 if (field.type.size(field.loc))
-                 {
-                     auto e = sle.elements && i < sle.elements.length ? (*sle.elements)[i] : null;
-                     if (e ? !_isZeroInit(e)
-                           : !isCstruct && !field.type.isZeroInit(field.loc))
-                         return false;
-                 }
-             }
-             return true;
-         }
- 
-         case EXP.arrayLiteral:
-         {
-             auto ale = cast(ArrayLiteralExp)exp;
- 
-             const dim = ale.elements ? ale.elements.length : 0;
- 
-             if (ale.type.toBasetype().ty == Tarray) // if initializing a dynamic array
-                 return dim == 0;
- 
-             foreach (i; 0 .. dim)
-             {
-                 if (!_isZeroInit(ale[i]))
-                     return false;
-             }
- 
-             /* Note that true is returned for all T[0]
-              */
-             return true;
-         }
- 
-         case EXP.string_:
-         {
-             auto se = cast(StringExp)exp;
- 
-             if (se.type.toBasetype().ty == Tarray) // if initializing a dynamic array
-                 return se.len == 0;
- 
-             foreach (i; 0 .. se.len)
-             {
-                 if (se.getIndex(i) != 0)
-                     return false;
-             }
-             return true;
-         }
- 
-         case EXP.vector:
-         {
-             auto ve = cast(VectorExp) exp;
-             return _isZeroInit(ve.e1);
-         }
- 
-         case EXP.float64:
-         case EXP.complex80:
-         {
-             import dmd.root.ctfloat : CTFloat;
-             return (exp.toReal()      is CTFloat.zero) &&
-                    (exp.toImaginary() is CTFloat.zero);
-         }
- 
-         default:
-             return false;
-     }
- }
  
  /***********************************************************
   * Unions are a variation on structs.
--- 145,152 ----
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/dsymbol.d gcc-16-20260201/gcc/d/dmd/dsymbol.d
*** gcc-16-20260125/gcc/d/dmd/dsymbol.d	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/dsymbol.d	Sun Feb  1 22:32:07 2026
*************** import dmd.arraytypes;
*** 22,28 ****
  import dmd.attrib;
  import dmd.astenums;
  import dmd.ast_node;
- import dmd.gluelayer;
  import dmd.dclass;
  import dmd.declaration;
  import dmd.denum;
--- 22,27 ----
*************** import dmd.dmodule;
*** 31,41 ****
  import dmd.dversion;
  import dmd.dscope;
  import dmd.dstruct;
  import dmd.dtemplate;
  import dmd.errors;
  import dmd.expression;
  import dmd.func;
- import dmd.globals;
  import dmd.id;
  import dmd.identifier;
  import dmd.init;
--- 30,41 ----
  import dmd.dversion;
  import dmd.dscope;
  import dmd.dstruct;
+ import dmd.dsymbolsem : toAlias;
  import dmd.dtemplate;
  import dmd.errors;
  import dmd.expression;
+ import dmd.expressionsem : getDsymbol;
  import dmd.func;
  import dmd.id;
  import dmd.identifier;
  import dmd.init;
*************** import dmd.statement;
*** 51,57 ****
  import dmd.staticassert;
  import dmd.tokens;
  import dmd.visitor;
- import dmd.dsymbolsem;
  
  import dmd.common.outbuffer;
  
--- 51,56 ----
*************** void foreachDsymbol(Dsymbols* symbols, s
*** 107,128 ****
      }
  }
  
- 
- struct Ungag
- {
-     uint oldgag;
- 
-     extern (D) this(uint old) nothrow @safe
-     {
-         this.oldgag = old;
-     }
- 
-     extern (C++) ~this() nothrow
-     {
-         global.gag = oldgag;
-     }
- }
- 
  struct Visibility
  {
      ///
--- 106,111 ----
*************** extern (C++) class Dsymbol : ASTNode
*** 335,341 ****
  {
      Identifier ident;
      Dsymbol parent;
!     Symbol* csym;           // symbol for code generator
      Scope* _scope;          // !=null means context to use for semantic()
      private DsymbolAttributes* atts; /// attached attribute declarations
      const Loc loc;          // where defined
--- 318,324 ----
  {
      Identifier ident;
      Dsymbol parent;
!     void* csym;             // symbol for code generator
      Scope* _scope;          // !=null means context to use for semantic()
      private DsymbolAttributes* atts; /// attached attribute declarations
      const Loc loc;          // where defined
*************** extern (C++) class Dsymbol : ASTNode
*** 344,349 ****
--- 327,337 ----
      {
          bool errors;            // this symbol failed to pass semantic()
          PASS semanticRun = PASS.initial;
+ 
+         // Queued for deferred semantics:
+         bool deferred;  // In Module.deferred
+         bool deferred2; // In Module.deferred2
+         bool deferred3; // In Module.deferred3
      }
      import dmd.common.bitfields;
      mixin(generateBitFields!(BitFields, ubyte));
*************** extern (C++) class Dsymbol : ASTNode
*** 633,639 ****
          static bool has2This(Dsymbol s)
          {
              if (auto f = s.isFuncDeclaration())
!                 return f.hasDualContext();
              if (auto ad = s.isAggregateDeclaration())
                  return ad.vthis2 !is null;
              return false;
--- 621,627 ----
          static bool has2This(Dsymbol s)
          {
              if (auto f = s.isFuncDeclaration())
!                 return f.hasDualContext;
              if (auto ad = s.isAggregateDeclaration())
                  return ad.vthis2 !is null;
              return false;
*************** extern (C++) class Dsymbol : ASTNode
*** 684,697 ****
          return parent.isSpeculative();
      }
  
-     final Ungag ungagSpeculative() const
-     {
-         const oldgag = global.gag;
-         if (global.gag && !isSpeculative() && !toParent2().isFuncDeclaration())
-             global.gag = 0;
-         return Ungag(oldgag);
-     }
- 
      // kludge for template.isSymbol()
      override final DYNCAST dyncast() const
      {
--- 672,677 ----
*************** extern (C++) class Dsymbol : ASTNode
*** 753,776 ****
          return "symbol";
      }
  
-     /*********************************
-      * If this symbol is really an alias for another,
-      * return that other.
-      * If needed, semantic() is invoked due to resolve forward reference.
-      */
-     Dsymbol toAlias()
-     {
-         return this;
-     }
- 
-     /*********************************
-      * Resolve recursive tuple expansion in eponymous template.
-      */
-     Dsymbol toAlias2()
-     {
-         return toAlias();
-     }
- 
      bool overloadInsert(Dsymbol s)
      {
          //printf("Dsymbol::overloadInsert('%s')\n", s.toChars());
--- 733,738 ----
*************** extern (C++) class Dsymbol : ASTNode
*** 781,787 ****
       * Returns:
       *  SIZE_INVALID when the size cannot be determined
       */
!     uinteger_t size(Loc loc)
      {
          .error(loc, "%s `%s` symbol `%s` has no size", kind, toPrettyChars, toChars());
          return SIZE_INVALID;
--- 743,749 ----
       * Returns:
       *  SIZE_INVALID when the size cannot be determined
       */
!     ulong size(Loc loc)
      {
          .error(loc, "%s `%s` symbol `%s` has no size", kind, toPrettyChars, toChars());
          return SIZE_INVALID;
*************** extern (C++) class Dsymbol : ASTNode
*** 900,977 ****
          assert(0);
      }
  
-     /*****************************************
-      * Same as Dsymbol::oneMember(), but look at an array of Dsymbols.
-      */
-     extern (D) static bool oneMembers(Dsymbols* members, out Dsymbol ps, Identifier ident)
-     {
-         //printf("Dsymbol::oneMembers() %d\n", members ? members.length : 0);
-         Dsymbol s = null;
-         if (!members)
-         {
-             ps = null;
-             return true;
-         }
- 
-         for (size_t i = 0; i < members.length; i++)
-         {
-             Dsymbol sx = (*members)[i];
-             bool x = sx.oneMember(ps, ident); //MYTODO: this temporarily creates a new dependency to dsymbolsem, will need to extract oneMembers() later
-             //printf("\t[%d] kind %s = %d, s = %p\n", i, sx.kind(), x, *ps);
-             if (!x)
-             {
-                 //printf("\tfalse 1\n");
-                 assert(ps is null);
-                 return false;
-             }
-             if (ps)
-             {
-                 assert(ident);
-                 if (!ps.ident || !ps.ident.equals(ident))
-                     continue;
-                 if (!s)
-                     s = ps;
-                 else if (s.isOverloadable() && ps.isOverloadable())
-                 {
-                     // keep head of overload set
-                     FuncDeclaration f1 = s.isFuncDeclaration();
-                     FuncDeclaration f2 = ps.isFuncDeclaration();
-                     if (f1 && f2)
-                     {
-                         assert(!f1.isFuncAliasDeclaration());
-                         assert(!f2.isFuncAliasDeclaration());
-                         for (; f1 != f2; f1 = f1.overnext0)
-                         {
-                             if (f1.overnext0 is null)
-                             {
-                                 f1.overnext0 = f2;
-                                 break;
-                             }
-                         }
-                     }
-                 }
-                 else // more than one symbol
-                 {
-                     ps = null;
-                     //printf("\tfalse 2\n");
-                     return false;
-                 }
-             }
-         }
-         ps = s; // s is the one symbol, null if none
-         //printf("\ttrue\n");
-         return true;
-     }
- 
-     /*****************************************
-      * Is Dsymbol a variable that contains pointers?
-      */
-     bool hasPointers()
-     {
-         //printf("Dsymbol::hasPointers() %s\n", toChars());
-         return false;
-     }
- 
      void addObjcSymbols(ClassDeclarations* classes, ClassDeclarations* categories)
      {
      }
--- 862,867 ----
*************** extern (C++) class Dsymbol : ASTNode
*** 1235,1240 ****
--- 1125,1131 ----
              return null;
          }
      }
+     inout(AlignDeclaration)            isAlignDeclaration()            inout { return dsym == DSYM.alignDeclaration ? cast(inout(AlignDeclaration)) cast(void*) this : null; }
      inout(AnonDeclaration)             isAnonDeclaration()             inout { return dsym == DSYM.anonDeclaration ? cast(inout(AnonDeclaration)) cast(void*) this : null; }
      inout(CPPNamespaceDeclaration)     isCPPNamespaceDeclaration()     inout { return dsym == DSYM.cppNamespaceDeclaration ? cast(inout(CPPNamespaceDeclaration)) cast(void*) this : null; }
      inout(VisibilityDeclaration)       isVisibilityDeclaration()       inout { return dsym == DSYM.visibilityDeclaration ? cast(inout(VisibilityDeclaration)) cast(void*) this : null; }
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/dsymbol.h gcc-16-20260201/gcc/d/dmd/dsymbol.h
*** gcc-16-20260125/gcc/d/dmd/dsymbol.h	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/dsymbol.h	Sun Feb  1 22:32:07 2026
*************** class AliasDeclaration;
*** 29,34 ****
--- 29,35 ----
  class AggregateDeclaration;
  class EnumDeclaration;
  class ClassDeclaration;
+ class StructDeclaration;
  class InterfaceDeclaration;
  class StructDeclaration;
  class UnionDeclaration;
*************** namespace dmd
*** 101,110 ****
--- 102,114 ----
      void dsymbolSemantic(Dsymbol *dsym, Scope *sc);
      void semantic2(Dsymbol *dsym, Scope *sc);
      void semantic3(Dsymbol *dsym, Scope* sc);
+     Dsymbol *toAlias(Dsymbol* s);
+     Dsymbol *toAlias2(Dsymbol* s);
      // in iasm.d
      void asmSemantic(CAsmDeclaration *ad, Scope *sc);
      // in iasmgcc.d
      void gccAsmSemantic(CAsmDeclaration *ad, Scope *sc);
+     bool isPOD(StructDeclaration *sd);
  }
  
  struct Visibility
*************** public:
*** 223,230 ****
      virtual Identifier *getIdent();
      virtual const char *toPrettyChars(bool QualifyTypes = false);
      virtual const char *kind() const;
-     virtual Dsymbol *toAlias();                 // resolve real symbol
-     virtual Dsymbol *toAlias2();
      virtual bool overloadInsert(Dsymbol *s);
      virtual uinteger_t size(Loc loc);
      virtual bool isforwardRef();
--- 227,232 ----
*************** public:
*** 243,249 ****
      virtual bool needThis();                    // need a 'this' pointer?
      virtual Visibility visible();
      virtual Dsymbol *syntaxCopy(Dsymbol *s);    // copy only syntax trees
-     virtual bool hasPointers();
      virtual void addObjcSymbols(ClassDeclarations *, ClassDeclarations *) { }
  
      virtual void addComment(const utf8_t *comment);
--- 245,250 ----
*************** namespace dmd
*** 428,434 ****
      Dsymbols *include(Dsymbol *d, Scope *sc);
      void setScope(Dsymbol *d, Scope *sc);
      void importAll(Dsymbol *d, Scope *sc);
!     void addComment(Dsymbol *d, const char *comment);
!     bool oneMember(Dsymbol *d, Dsymbol *&ps, Identifier *ident);
!     bool hasStaticCtorOrDtor(Dsymbol *d);
  }
--- 429,433 ----
      Dsymbols *include(Dsymbol *d, Scope *sc);
      void setScope(Dsymbol *d, Scope *sc);
      void importAll(Dsymbol *d, Scope *sc);
!     bool hasPointers(Dsymbol *d);
  }
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/dsymbolsem.d gcc-16-20260201/gcc/d/dmd/dsymbolsem.d
*** gcc-16-20260125/gcc/d/dmd/dsymbolsem.d	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/dsymbolsem.d	Sun Feb  1 22:32:07 2026
*************** AlignDeclaration getAlignment(AlignDecla
*** 154,159 ****
--- 154,352 ----
      return ad;
  }
  
+ 
+ /*********************************
+  * Resolve recursive tuple expansion in eponymous template.
+  */
+ Dsymbol toAlias2(Dsymbol s)
+ {
+     if (auto ad = s.isAliasDeclaration())
+     {
+         if (ad.inuse)
+         {
+             .error(ad.loc, "%s `%s` recursive alias declaration", ad.kind, ad.toPrettyChars);
+             return ad;
+         }
+         ad.inuse = 1;
+         Dsymbol ds = ad.aliassym ? ad.aliassym.toAlias2() : ad;
+         ad.inuse = 0;
+         return ds;
+     }
+     if (auto td = s.isTupleDeclaration())
+     {
+         //printf("TupleDeclaration::toAlias2() '%s' objects = %s\n", toChars(), objects.toChars());
+         for (size_t i = 0; i < td.objects.length; i++)
+         {
+             RootObject o = (*td.objects)[i];
+             if (Dsymbol ds = isDsymbol(o))
+             {
+                 ds = ds.toAlias2();
+                 (*td.objects)[i] = ds;
+             }
+         }
+         return td;
+     }
+     return toAlias(s);
+ }
+ 
+ private Dsymbol toAliasImpl(AliasDeclaration ad)
+ {
+     static if (0)
+     printf("[%s] AliasDeclaration::toAlias('%s', this = %p, aliassym: %s, kind: '%s', inuse = %d)\n",
+         ad.loc.toChars(), ad.toChars(), ad, ad.aliassym ? ad.aliassym.toChars() : "", ad.aliassym ? ad.aliassym.kind() : "", ad.inuse);
+     assert(ad != ad.aliassym);
+     //static int count; if (++count == 10) *(char*)0=0;
+ 
+     Dsymbol err()
+     {
+         // Avoid breaking "recursive alias" state during errors gagged
+         if (global.gag)
+             return ad;
+         ad.aliassym = new AliasDeclaration(ad.loc, ad.ident, Type.terror);
+         ad.type = Type.terror;
+         return ad.aliassym;
+     }
+     // Reading the AliasDeclaration
+     if (!ad.ignoreRead)
+         ad.wasRead = true;                 // can never assign to this AliasDeclaration again
+ 
+     if (ad.inuse == 1 && ad.type && ad._scope)
+     {
+         ad.inuse = 2;
+         const olderrors = global.errors;
+         Dsymbol s = ad.type.toDsymbol(ad._scope);
+         //printf("[%s] type = %s, s = %p, this = %p\n", loc.toChars(), type.toChars(), s, this);
+         if (global.errors != olderrors)
+             return err();
+         if (s)
+         {
+             s = s.toAlias();
+             if (global.errors != olderrors)
+                 return err();
+             ad.aliassym = s;
+             ad.inuse = 0;
+         }
+         else
+         {
+             Type t = ad.type.typeSemantic(ad.loc, ad._scope);
+             if (t.ty == Terror)
+                 return err();
+             if (global.errors != olderrors)
+                 return err();
+             //printf("t = %s\n", t.toChars());
+             ad.inuse = 0;
+         }
+     }
+     if (ad.inuse)
+     {
+         .error(ad.loc, "%s `%s` recursive alias declaration", ad.kind, ad.toPrettyChars);
+         return err();
+     }
+ 
+     if (ad.semanticRun >= PASS.semanticdone)
+     {
+         // semantic is already done.
+ 
+         // Do not see aliassym !is null, because of lambda aliases.
+ 
+         // Do not see type.deco !is null, even so "alias T = const int;` needs
+         // semantic analysis to take the storage class `const` as type qualifier.
+     }
+     else
+     {
+         // stop AliasAssign tuple building
+         if (ad.aliassym)
+         {
+             if (auto td = ad.aliassym.isTupleDeclaration())
+             {
+                 if (td.building)
+                 {
+                     td.building = false;
+                     ad.semanticRun = PASS.semanticdone;
+                     return td;
+                 }
+             }
+         }
+         if (ad._import && ad._import._scope)
+         {
+             /* If this is an internal alias for selective/renamed import,
+              * load the module first.
+              */
+             ad._import.dsymbolSemantic(null);
+         }
+         if (ad._scope)
+         {
+             aliasSemantic(ad, ad._scope);
+         }
+     }
+ 
+     ad.inuse = 1;
+     Dsymbol s = ad.aliassym ? ad.aliassym.toAlias() : ad;
+     ad.inuse = 0;
+     return s;
+ }
+ 
+ /*********************************
+  * If this symbol is really an alias for another,
+  * return that other.
+  * If needed, semantic() is invoked due to resolve forward reference.
+  */
+ Dsymbol toAlias(Dsymbol s)
+ {
+     if (auto ad = s.isAliasDeclaration())
+     {
+         return ad.toAliasImpl();
+     }
+     if (auto imp = s.isImport())
+     {
+         if (imp.aliasId)
+             return imp.mod;
+         return imp;
+     }
+     if (auto vd = s.isVarDeclaration())
+     {
+         //printf("VarDeclaration::toAlias('%s', this = %p, aliassym = %p)\n", toChars(), this, aliassym);
+         if ((!vd.type || !vd.type.deco) && vd._scope)
+             dsymbolSemantic(vd, vd._scope);
+ 
+         assert(vd != vd.aliasTuple);
+         return vd.aliasTuple ? vd.aliasTuple.toAlias() : vd;
+     }
+     // resolve real symbol
+     if (auto ti = s.isTemplateInstance())
+     {
+         static if (LOG)
+         {
+             printf("TemplateInstance.toAlias()\n");
+         }
+         if (!ti.inst)
+         {
+             // Maybe we can resolve it
+             if (ti._scope)
+             {
+                 dsymbolSemantic(ti, ti._scope);
+             }
+             if (!ti.inst)
+             {
+                 .error(ti.loc, "%s `%s` cannot resolve forward reference", ti.kind, ti.toPrettyChars);
+                 ti.errors = true;
+                 return ti;
+             }
+         }
+ 
+         if (ti.inst != ti)
+             return ti.inst.toAlias();
+ 
+         if (ti.aliasdecl)
+         {
+             return ti.aliasdecl.toAlias();
+         }
+ 
+         return ti.inst;
+     }
+     return s;
+ }
+ 
  const(char)* getMessage(DeprecatedDeclaration dd)
  {
      if (auto sc = dd._scope)
*************** package bool allowsContractWithoutBody(F
*** 244,249 ****
--- 437,507 ----
      return true;
  }
  
+ /***************************************
+  * Determine if struct is POD (Plain Old Data).
+  *
+  * POD is defined as:
+  *      $(OL
+  *      $(LI not nested)
+  *      $(LI no postblits, destructors, or assignment operators)
+  *      $(LI no `ref` fields or fields that are themselves non-POD)
+  *      )
+  * The idea being these are compatible with C structs.
+  *
+  * Returns:
+  *     true if struct is POD
+  */
+ bool isPOD(StructDeclaration sd)
+ {
+     // If we've already determined whether this struct is POD.
+     if (sd.ispod != ThreeState.none)
+         return (sd.ispod == ThreeState.yes);
+ 
+     import dmd.clone;
+ 
+     bool hasCpCtorLocal;
+     bool hasMoveCtorLocal;
+     bool needCopyCtor;
+     bool needMoveCtor;
+     needCopyOrMoveCtor(sd, hasCpCtorLocal, hasMoveCtorLocal, needCopyCtor, needMoveCtor);
+ 
+     if (sd.enclosing                    || // is nested
+         search(sd, sd.loc, Id.postblit) || // has postblit
+         search(sd, sd.loc, Id.dtor)     || // has destructor
+         /* This is commented out because otherwise buildkite vibe.d:
+            `canCAS!Task` fails to compile
+          */
+         //hasMoveCtorLocal               || // has move constructor
+         hasCpCtorLocal)                   // has copy constructor
+     {
+         sd.ispod = ThreeState.no;
+         return false;
+     }
+ 
+     // Recursively check all fields are POD.
+     for (size_t i = 0; i < sd.fields.length; i++)
+     {
+         VarDeclaration v = sd.fields[i];
+         if (v.storage_class & STC.ref_)
+         {
+             sd.ispod = ThreeState.no;
+             return false;
+         }
+ 
+         if (auto ts = v.type.baseElemOf().isTypeStruct())
+         {
+             if (!ts.sym.isPOD())
+             {
+                 sd.ispod = ThreeState.no;
+                 return false;
+             }
+         }
+     }
+ 
+     sd.ispod = ThreeState.yes;
+     return true;
+ }
+ 
  /*
  If sd has a copy constructor and ctor is an rvalue constructor,
  issue an error.
*************** Expression resolveAliasThis(Scope* sc, E
*** 351,357 ****
                   * so resolve it ahead.
                   */
                  {
!                     int save = sc.intypeof;
                      sc.intypeof = 1; // bypass "need this" error check
                      e = resolveProperties(sc, e);
                      sc.intypeof = save;
--- 609,615 ----
                   * so resolve it ahead.
                   */
                  {
!                     ubyte save = sc.intypeof;
                      sc.intypeof = 1; // bypass "need this" error check
                      e = resolveProperties(sc, e);
                      sc.intypeof = save;
*************** void deferDsymbolSemantic(Scope* sc, Dsy
*** 431,436 ****
--- 689,743 ----
      Module.addDeferredSemantic(s);
  }
  
+ struct Ungag
+ {
+     uint oldgag;
+ 
+     extern (D) this(uint old) nothrow @safe
+     {
+         this.oldgag = old;
+     }
+ 
+     extern (C++) ~this() nothrow
+     {
+         global.gag = oldgag;
+     }
+ }
+ 
+ Ungag ungagSpeculative(const Dsymbol s)
+ {
+     const oldgag = global.gag;
+     if (global.gag && !s.isSpeculative() && !s.toParent2().isFuncDeclaration())
+         global.gag = 0;
+     return Ungag(oldgag);
+ }
+ 
+ /*******************************************
+  * Print deprecation warning if we're deprecated, when
+  * this module is imported from scope sc.
+  *
+  * Params:
+  *  m = the module
+  *  sc = the scope into which we are imported
+  *  loc = the location of the import statement
+  */
+ private void checkImportDeprecation(Module m, Loc loc, Scope* sc)
+ {
+     if (!m.md || !m.md.isdeprecated || sc.isDeprecated)
+         return;
+ 
+     Expression msg = m.md.msg;
+     if (StringExp se = msg ? msg.toStringExp() : null)
+     {
+         const slice = se.peekString();
+         if (slice.length)
+         {
+             deprecation(m.loc, "%s `%s` is deprecated - %.*s", m.kind, m.toPrettyChars, cast(int)slice.length, slice.ptr);
+             return;
+         }
+     }
+     deprecation(m.loc, "%s `%s` is deprecated", m.kind, m.toPrettyChars);
+ }
  
  private extern(C++) final class DsymbolSemanticVisitor : Visitor
  {
*************** private extern(C++) final class DsymbolS
*** 779,786 ****
                  ie = ie.expressionSemantic(sc);
              if (nelems > 0 && ie)
              {
!                 auto iexps = new Expressions();
!                 iexps.push(ie);
                  auto exps = new Expressions();
                  for (size_t pos = 0; pos < iexps.length; pos++)
                  {
--- 1086,1092 ----
                  ie = ie.expressionSemantic(sc);
              if (nelems > 0 && ie)
              {
!                 auto iexps = new Expressions(ie);
                  auto exps = new Expressions();
                  for (size_t pos = 0; pos < iexps.length; pos++)
                  {
*************** private extern(C++) final class DsymbolS
*** 953,958 ****
--- 1259,1266 ----
          if (dsym.storage_class & STC.constscoperef)
              dsym.storage_class |= STC.scope_;
  
+         import dmd.typesem : hasPointers;
+ 
          if (dsym.storage_class & STC.scope_)
          {
              STC stc = dsym.storage_class & (STC.static_ | STC.extern_ | STC.manifest | STC.gshared);
*************** private extern(C++) final class DsymbolS
*** 1395,1400 ****
--- 1703,1721 ----
                                  exp = ErrorExp.get();
                              }
                          }
+                         else if (exp.isBitField())
+                         {
+                             if (dsym.storage_class & STC.autoref)
+                             {
+                                 dsym.storage_class &= ~STC.ref_;
+                                 constructInit(false);
+                             }
+                             else
+                             {
+                                 .error(dsym.loc, "bitfield `%s` cannot be assigned to `ref %s`", exp.toChars(), dsym.toChars());
+                                 exp = ErrorExp.get();
+                             }
+                         }
                          else
                          {
                              constructInit(false);
*************** private extern(C++) final class DsymbolS
*** 1590,1596 ****
  
          if (!dsym.parent.isStructDeclaration() && !dsym.parent.isClassDeclaration())
          {
!             .error(dsym.loc, "%s `%s` - bit-field must be member of struct, union, or class", dsym.kind, dsym.toPrettyChars);
          }
  
          sc = sc.startCTFE();
--- 1911,1917 ----
  
          if (!dsym.parent.isStructDeclaration() && !dsym.parent.isClassDeclaration())
          {
!             .error(dsym.loc, "%s `%s` - bitfield must be member of struct, union, or class", dsym.kind, dsym.toPrettyChars);
          }
  
          sc = sc.startCTFE();
*************** private extern(C++) final class DsymbolS
*** 1600,1617 ****
          if (!dsym.type.isIntegral())
          {
              // C11 6.7.2.1-5
!             error(width.loc, "bit-field type `%s` is not an integer type", dsym.type.toChars());
              dsym.errors = true;
          }
          if (!width.isIntegerExp())
          {
!             error(width.loc, "bit-field width `%s` is not an integer constant", dsym.width.toChars());
              dsym.errors = true;
          }
          const uwidth = width.toInteger(); // uwidth is unsigned
          if (uwidth == 0 && !dsym.isAnonymous())
          {
!             error(width.loc, "bit-field `%s` has zero width", dsym.toChars());
              dsym.errors = true;
          }
          const sz = dsym.type.size();
--- 1921,1938 ----
          if (!dsym.type.isIntegral())
          {
              // C11 6.7.2.1-5
!             error(width.loc, "bitfield type `%s` is not an integer type", dsym.type.toChars());
              dsym.errors = true;
          }
          if (!width.isIntegerExp())
          {
!             error(width.loc, "bitfield width `%s` is not an integer constant", dsym.width.toChars());
              dsym.errors = true;
          }
          const uwidth = width.toInteger(); // uwidth is unsigned
          if (uwidth == 0 && !dsym.isAnonymous())
          {
!             error(width.loc, "bitfield `%s` has zero width", dsym.toChars());
              dsym.errors = true;
          }
          const sz = dsym.type.size();
*************** private extern(C++) final class DsymbolS
*** 1620,1626 ****
          const max_width = sz * 8;
          if (uwidth > max_width)
          {
!             error(width.loc, "width `%lld` of bit-field `%s` does not fit in type `%s`", cast(long)uwidth, dsym.toChars(), dsym.type.toChars());
              dsym.errors = true;
          }
          dsym.fieldWidth = cast(uint)uwidth;
--- 1941,1947 ----
          const max_width = sz * 8;
          if (uwidth > max_width)
          {
!             error(width.loc, "width `%lld` of bitfield `%s` does not fit in type `%s`", cast(long)uwidth, dsym.toChars(), dsym.type.toChars());
              dsym.errors = true;
          }
          dsym.fieldWidth = cast(uint)uwidth;
*************** private extern(C++) final class DsymbolS
*** 2102,2108 ****
          /* Run semantic on each argument, place results in tiargs[],
           * then find best match template with tiargs
           */
!         if (!tm.findTempDecl(sc) || !tm.semanticTiargs(sc) || !tm.findBestMatch(sc, ArgumentList()))
          {
              if (tm.semanticRun == PASS.initial) // forward reference had occurred
              {
--- 2423,2429 ----
          /* Run semantic on each argument, place results in tiargs[],
           * then find best match template with tiargs
           */
!         if (!tm.findMixinTempDecl(sc) || !tm.semanticTiargs(sc) || !tm.findBestMatch(sc, ArgumentList()))
          {
              if (tm.semanticRun == PASS.initial) // forward reference had occurred
              {
*************** private extern(C++) final class DsymbolS
*** 2684,2692 ****
              auto v = new VarDeclaration(Loc.initial, Type.tint32, Id.gate, null);
              v.storage_class = STC.temp | STC.static_ | (isShared ? STC.shared_ : STC.none);
  
-             auto sa = new Statements();
              Statement s = new ExpStatement(Loc.initial, v);
!             sa.push(s);
  
              Expression e;
              if (isShared)
--- 3005,3012 ----
              auto v = new VarDeclaration(Loc.initial, Type.tint32, Id.gate, null);
              v.storage_class = STC.temp | STC.static_ | (isShared ? STC.shared_ : STC.none);
  
              Statement s = new ExpStatement(Loc.initial, v);
!             auto sa = new Statements(s);
  
              Expression e;
              if (isShared)
*************** private extern(C++) final class DsymbolS
*** 3089,3098 ****
              StructDeclaration sym = ts.sym;
              if (sd.isCsymbol() && sym.isCsymbol())
              {
!                 /* This is two structs imported from different C files.
!                  * Just ignore sd, the second one. The first one will always
!                  * be found when going through the type.
!                  */
              }
              else
              {
--- 3409,3426 ----
              StructDeclaration sym = ts.sym;
              if (sd.isCsymbol() && sym.isCsymbol())
              {
! 
!                 if (!isCCompatible(sd, sym))
!                 {
!                     // Already issued an error.
!                     errorSupplemental(sd.loc, "C %ss with the same name from different imports are merged", sd.kind);
!                 }
!                 else {
!                     /* This is two structs imported from different C files.
!                      * Just ignore sd, the second one. The first one will always
!                      * be found when going through the type.
!                      */
!                 }
              }
              else
              {
*************** private extern(C++) final class DsymbolS
*** 3132,3137 ****
--- 3460,3693 ----
          //printf("-StructDeclaration::semantic(this=%p, '%s', sizeok = %d)\n", sd, sd.toPrettyChars(), sd.sizeok);
      }
  
+     //
+     // Checks if two structs are compatible
+     // Implements the rules according to C23 6.2.7
+     //
+     static bool isCCompatible(StructDeclaration a, StructDeclaration b)
+     {
+         // Get the name of a type, while avoiding exposing "__tagXXX" anonymous structs
+         static const(char)* typeName(Type t)
+         {
+             if (TypeStruct ts = t.isTypeStruct())
+             {
+                 if (ts.sym.ident.toString().startsWith("__tag"))
+                     return ts.sym.isUnionDeclaration() ? "(anonymous union)".ptr: "(anonymous struct)".ptr;
+             }
+             return t.toChars();
+         }
+ 
+         void incompatError()
+         {
+             .error(a.loc, "%s `%s` already exists with an incompatible definition.",
+                     a.kind, typeName(a.type));
+             errorSupplemental(b.loc, "previously declared here");
+         }
+ 
+ 
+         // For recursive calls into unnamed structs (so Type.equals() doesn't work).
+         static bool isCCompatibleUnnamedStruct(Type a, Type b)
+         {
+             TypeStruct ats = a.isTypeStruct();
+             if (!ats) return false;
+             TypeStruct bts = b.isTypeStruct();
+             if (!bts) return false;
+             // Hack, anonymous structs within a struct are given
+             // an anonymous id starting with __tag.
+             if (!ats.sym.ident.toString().startsWith("__tag"))
+                 return false;
+             if (!bts.sym.ident.toString().startsWith("__tag"))
+                 return false;
+             return isCCompatible(ats.sym, bts.sym);
+         }
+ 
+         if (a.fields.length != b.fields.length)
+         {
+             incompatError();
+             errorSupplemental(a.loc, "`%s` has %zu field(s) while `%s` has %zu field(s)",
+                     a.toPrettyChars(), a.fields.length, b.toPrettyChars(), b.fields.length);
+             return false;
+         }
+         // both are structs or both are unions
+         if ((a.isUnionDeclaration() is null) != (b.isUnionDeclaration() is null))
+         {
+             incompatError();
+             errorSupplemental(a.loc, "`%s` is a %s while `%s` is a %s",
+                     a.toPrettyChars(), a.kind, b.toPrettyChars(), b.kind);
+             return false;
+         }
+         if (a.alignment != b.alignment)
+         {
+             incompatError();
+             errorSupplemental(a.loc, "`%s` has different alignment or packing", a.toPrettyChars());
+             if (a.alignment.isDefault() && ! b.alignment.isDefault())
+             {
+                 errorSupplemental(a.loc, "`%s` alignment: default", a.toPrettyChars());
+                 errorSupplemental(b.loc, "`%s` alignment: %u",
+                         b.toPrettyChars(), cast(uint)b.alignment.get());
+             }
+             else if (!a.alignment.isDefault() && b.alignment.isDefault())
+             {
+                 errorSupplemental(a.loc, "`%s` alignment: %u",
+                         a.toPrettyChars(), cast(uint)a.alignment.get());
+                 errorSupplemental(b.loc, "`%s` alignment: default",
+                         b.toPrettyChars());
+             }
+             else if (a.alignment.get() != b.alignment.get())
+             {
+                 errorSupplemental(a.loc, "`%s` alignment: %u",
+                         a.toPrettyChars(), cast(uint)a.alignment.get());
+                 errorSupplemental(b.loc, "`%s` alignment: %u",
+                         b.toPrettyChars(), cast(uint)b.alignment.get());
+             }
+             if (a.alignment.isPack() != b.alignment.isPack())
+             {
+                 errorSupplemental(a.loc, "`%s` packed: %s",
+                         a.toPrettyChars(), a.alignment.isPack()?"true".ptr:"false".ptr);
+                 errorSupplemental(b.loc, "`%s` packed: %s",
+                         b.toPrettyChars(), b.alignment.isPack()?"true".ptr:"false".ptr);
+             }
+             return false;
+         }
+         foreach (size_t i, VarDeclaration a_field; a.fields[])
+         {
+             VarDeclaration b_field = b.fields[i];
+             //
+             // — there shall be a one-to-one correspondence between
+             //   their members such that each pair of corresponding
+             //   members are declared with compatible types;
+             //
+             if (!a_field.type.equals(b_field.type) && !isCCompatibleUnnamedStruct(a_field.type, b_field.type))
+             {
+                 // Already errored, just bail
+                 incompatError();
+                 if (a_field.type.isTypeError()) return false;
+                 if (b_field.type.isTypeError()) return false;
+ 
+                 errorSupplemental(a_field.loc, "Field %zu differs in type", i);
+                 errorSupplemental(a_field.loc, "typeof(%s): %s",
+                         a_field.toChars(), typeName(a_field.type));
+                 errorSupplemental(b_field.loc, "typeof(%s): %s",
+                         b_field.toChars(), typeName(b_field.type));
+                 return false;
+             }
+             //
+             // — if one member of the pair is declared with an
+             //   alignment specifier, the second is declared with an
+             //   equivalent alignment specifier;
+             //
+             if (a_field.alignment != b_field.alignment)
+             {
+                 incompatError();
+                 errorSupplemental(a_field.loc, "Field %zu differs in alignment or packing", i);
+                 if (a_field.alignment.isDefault() && ! b_field.alignment.isDefault())
+                 {
+                     errorSupplemental(a_field.loc, "`%s.%s` alignment: default",
+                             a.toPrettyChars(),a_field.toChars());
+                     errorSupplemental(b_field.loc, "`%s.%s` alignment: %u",
+                             b.toPrettyChars(), b_field.toChars(), cast(uint)b_field.alignment.get());
+                 }
+                 else if (!a_field.alignment.isDefault() && b_field.alignment.isDefault())
+                 {
+                     errorSupplemental(a_field.loc, "`%s.%s` alignment: %u",
+                             a.toPrettyChars(), a_field.toChars(), cast(uint)a_field.alignment.get());
+                     errorSupplemental(b_field.loc, "`%s.%s` alignment: default",
+                             b.toPrettyChars(), b_field.toChars());
+                 }
+                 else if (a_field.alignment.get() != b_field.alignment.get())
+                 {
+                     errorSupplemental(a_field.loc, "`%s.%s` alignment: %u",
+                             a.toPrettyChars(), a_field.toChars(),
+                             cast(uint)a_field.alignment.get());
+                     errorSupplemental(b_field.loc, "`%s.%s` alignment: %u",
+                             b.toPrettyChars(), b_field.toChars(),
+                             cast(uint)b_field.alignment.get());
+                 }
+                 if (a_field.alignment.isPack() != b_field.alignment.isPack())
+                 {
+                     errorSupplemental(a_field.loc, "`%s.%s` packed: %s",
+                             a.toPrettyChars(), a_field.toChars(),
+                             a_field.alignment.isPack()?"true".ptr:"false".ptr);
+                     errorSupplemental(b_field.loc, "`%s.%s` packed: %s",
+                             b.toPrettyChars(), b_field.toChars(),
+                             b_field.alignment.isPack()?"true".ptr:"false".ptr);
+                 }
+                 return false;
+             }
+             //
+             // - and, if one member of the pair is declared with a
+             //   name, the second is declared with the same name.
+             //
+             if (a_field.ident.isAnonymous())
+             {
+                 if (!b_field.ident.isAnonymous())
+                 {
+                     incompatError();
+                     errorSupplemental(a_field.loc, "Field %zu differs in name", i);
+                     errorSupplemental(a_field.loc, "(anonymous)", a_field.ident.toChars());
+                     errorSupplemental(b_field.loc, "%s", b_field.ident.toChars());
+                     return false;
+                 }
+             }
+             else if (b_field.ident.isAnonymous())
+             {
+                 incompatError();
+                 errorSupplemental(a_field.loc, "Field %zu differs in name", i);
+                 errorSupplemental(a_field.loc, "%s", a_field.ident.toChars());
+                 errorSupplemental(b_field.loc, "(anonymous)");
+                 return false;
+             }
+             else if (a_field.ident != b_field.ident)
+             {
+                 incompatError();
+                 errorSupplemental(a_field.loc, "Field %zu differs in name", i);
+                 errorSupplemental(a_field.loc, "%s", a_field.ident.toChars());
+                 errorSupplemental(b_field.loc, "%s", b_field.ident.toChars());
+                 return false;
+             }
+ 
+             //
+             // For two structures or unions, corresponding bitfields shall have the same widths.
+             //
+             BitFieldDeclaration bfa = a_field.isBitFieldDeclaration();
+             BitFieldDeclaration bfb = b_field.isBitFieldDeclaration();
+             if ((bfa is null) != (bfb is null))
+             {
+                 incompatError();
+                 errorSupplemental(a_field.loc, "Field %zu differs in being a bitfield", i);
+                 if (bfa is null)
+                 {
+                     errorSupplemental(a_field.loc, "`%s.%s` is not a bitfield",
+                             a.toPrettyChars(), a_field.toChars());
+                     errorSupplemental(b_field.loc, "`%s.%s` is a bitfield",
+                             b.toPrettyChars(), b_field.toChars());
+                 }
+                 else if (bfb is null)
+                 {
+                     errorSupplemental(a_field.loc, "`%s.%s` *is a bitfield",
+                             a.toPrettyChars(), a_field.toChars());
+                     errorSupplemental(b_field.loc, "`%s.%s` is not a bitfield",
+                             b.toPrettyChars(), b_field.toChars());
+                 }
+                 return false;
+             }
+             if (bfa !is null && bfb !is null)
+             {
+                 if (bfa.fieldWidth != bfb.fieldWidth)
+                 {
+                     incompatError();
+                     errorSupplemental(a_field.loc, "Field %zu differs in bitfield width", i);
+                     errorSupplemental(a_field.loc, "`%s.%s`: %u",
+                             a.toPrettyChars(), a_field.toChars(), bfa.fieldWidth);
+                     errorSupplemental(b_field.loc, "`%s.%s`: %u",
+                             b.toPrettyChars(), b_field.toChars(), bfb.fieldWidth);
+                     return false;
+                 }
+             }
+         }
+         return true;
+     }
+ 
      void interfaceSemantic(ClassDeclaration cd)
      {
          cd.vtblInterfaces = new BaseClasses();
*************** private void attribAddMember(AttribDecla
*** 4139,4144 ****
--- 4695,4717 ----
      }
  }
  
+ /****************************************************
+  * Declare parameters of template instance, initialize them with the
+  * template instance arguments.
+  */
+ private void declareParameters(TemplateInstance ti, Scope* sc)
+ {
+     TemplateDeclaration tempdecl = ti.tempdecl.isTemplateDeclaration();
+     assert(tempdecl);
+ 
+     //printf("TemplateInstance.declareParameters()\n");
+     foreach (i, o; ti.tdtypes) // initializer for tp
+     {
+         TemplateParameter tp = (*tempdecl.parameters)[i];
+         //printf("\ttdtypes[%d] = %p\n", i, o);
+         declareParameter(tempdecl, sc, tp, o);
+     }
+ }
  private extern(C++) class AddMemberVisitor : Visitor
  {
      alias visit = Visitor.visit;
*************** private bool isDRuntimeHook(Identifier i
*** 4520,4531 ****
          id == Id._d_arrayassign_l || id == Id._d_arrayassign_r ||
          id == Id._d_arraysetassign || id == Id._d_arraysetctor ||
          id == Id._d_arrayctor ||
!         id == Id._d_arraysetlengthTImpl || id == Id._d_arraysetlengthT ||
          id == Id._d_arraysetlengthTTrace ||
          id == Id._d_arrayappendT || id == Id._d_arrayappendTTrace ||
          id == Id._d_arrayappendcTX;
  }
  
  void templateInstanceSemantic(TemplateInstance tempinst, Scope* sc, ArgumentList argumentList)
  {
      //printf("[%s] TemplateInstance.dsymbolSemantic('%s', this=%p, gag = %d, sc = %p)\n", tempinst.loc.toChars(), tempinst.toChars(), tempinst, global.gag, sc);
--- 5093,5271 ----
          id == Id._d_arrayassign_l || id == Id._d_arrayassign_r ||
          id == Id._d_arraysetassign || id == Id._d_arraysetctor ||
          id == Id._d_arrayctor ||
!         id == Id._d_arraysetlengthT ||
          id == Id._d_arraysetlengthTTrace ||
          id == Id._d_arrayappendT || id == Id._d_arrayappendTTrace ||
          id == Id._d_arrayappendcTX;
  }
  
+ /*****************************************
+  * Append `ti` to the specific module `ti.members[]`
+  */
+ private Dsymbols* appendToModuleMember(TemplateInstance ti)
+ {
+     Module mi = ti.minst; // instantiated . inserted module
+ 
+     //printf("%s.appendToModuleMember() enclosing = %s mi = %s\n",
+     //    toPrettyChars(),
+     //    enclosing ? enclosing.toPrettyChars() : null,
+     //    mi ? mi.toPrettyChars() : null);
+     if (global.params.allInst || !mi || mi.isRoot())
+     {
+         /* If the instantiated module is speculative or root, insert to the
+          * member of a root module. Then:
+          *  - semantic3 pass will get called on the instance members.
+          *  - codegen pass will get a selection chance to do/skip it (needsCodegen()).
+          */
+         static Dsymbol getStrictEnclosing(TemplateInstance ti)
+         {
+             do
+             {
+                 if (ti.enclosing)
+                     return ti.enclosing;
+                 ti = ti.tempdecl.isInstantiated();
+             } while (ti);
+             return null;
+         }
+ 
+         Dsymbol enc = getStrictEnclosing(ti);
+         // insert target is made stable by using the module
+         // where tempdecl is declared.
+         mi = (enc ? enc : ti.tempdecl).getModule();
+         if (!mi.isRoot())
+         {
+             if (mi.importedFrom)
+             {
+                 mi = mi.importedFrom;
+                 assert(mi.isRoot());
+             }
+             else
+             {
+                 // This can happen when using the frontend as a library.
+                 // Append it to the non-root module.
+             }
+         }
+     }
+     else
+     {
+         /* If the instantiated module is non-root, insert to the member of the
+          * non-root module. Then:
+          *  - semantic3 pass won't be called on the instance.
+          *  - codegen pass won't reach to the instance.
+          * Unless it is re-appended to a root module later (with changed minst).
+          */
+     }
+     //printf("\t-. mi = %s\n", mi.toPrettyChars());
+ 
+     if (ti.memberOf) // already appended to some module
+     {
+         assert(mi.isRoot(), "can only re-append to a root module");
+         if (ti.memberOf.isRoot())
+             return null; // no need to move to another root module
+     }
+ 
+     Dsymbols* a = mi.members;
+     a.push(ti);
+     ti.memberOf = mi;
+     if (mi.semanticRun >= PASS.semantic2done && mi.isRoot())
+         Module.addDeferredSemantic2(ti);
+     if (mi.semanticRun >= PASS.semantic3done && mi.isRoot())
+         Module.addDeferredSemantic3(ti);
+     return a;
+ }
+ 
+ private void expandMembers(TemplateInstance ti,Scope* sc2)
+ {
+     ti.members.foreachDsymbol( (s) { s.setScope (sc2); } );
+ 
+     ti.members.foreachDsymbol( (s) { s.importAll(sc2); } );
+ 
+     if (!ti.aliasdecl)
+     {
+         /* static if's are crucial to evaluating aliasdecl correctly. But
+          * evaluating the if/else bodies may require aliasdecl.
+          * So, evaluate the condition for static if's, but not their if/else bodies.
+          * Then try to set aliasdecl.
+          * Later do the if/else bodies.
+          * https://issues.dlang.org/show_bug.cgi?id=23598
+          * It might be better to do this by attaching a lambda to the StaticIfDeclaration
+          * to do the oneMembers call after the sid.include(sc2) is run as part of dsymbolSemantic().
+          */
+         bool done;
+         void staticIfDg(Dsymbol s)
+         {
+             if (done || ti.aliasdecl)
+                 return;
+             //printf("\t staticIfDg on '%s %s' in '%s'\n",  s.kind(), s.toChars(), this.toChars());
+             if (!s.isStaticIfDeclaration())
+             {
+                 //s.dsymbolSemantic(sc2);
+                 done = true;
+                 return;
+             }
+             auto sid = s.isStaticIfDeclaration();
+             sid.include(sc2);
+             if (ti.members.length)
+             {
+                 Dsymbol sa;
+                 if (oneMembers(ti.members, sa, ti.tempdecl.ident) && sa)
+                     ti.aliasdecl = sa;
+             }
+             done = true;
+         }
+ 
+         ti.members.foreachDsymbol(&staticIfDg);
+     }
+ 
+     void symbolDg(Dsymbol s)
+     {
+         //printf("\t semantic on '%s' %p kind %s in '%s'\n",  s.toChars(), s, s.kind(), this.toChars());
+         //printf("test: enclosing = %d, sc2.parent = %s\n", enclosing, sc2.parent.toChars());
+         //if (enclosing)
+         //    s.parent = sc.parent;
+         //printf("test3: enclosing = %d, s.parent = %s\n", enclosing, s.parent.toChars());
+         s.dsymbolSemantic(sc2);
+         //printf("test4: enclosing = %d, s.parent = %s\n", enclosing, s.parent.toChars());
+         Module.runDeferredSemantic();
+     }
+ 
+     ti.members.foreachDsymbol(&symbolDg);
+ }
+ 
+ private void tryExpandMembers(TemplateInstance ti, Scope* sc2)
+ {
+     __gshared int nest;
+     // extracted to a function to allow windows SEH to work without destructors in the same function
+     //printf("%d\n", nest);
+     if (++nest > global.recursionLimit)
+     {
+         global.gag = 0; // ensure error message gets printed
+         .error(ti.loc, "%s `%s` recursive expansion exceeded allowed nesting limit", ti.kind, ti.toPrettyChars);
+         fatal();
+     }
+ 
+     ti.expandMembers(sc2);
+ 
+     nest--;
+ }
+ 
+ private void trySemantic3(TemplateInstance ti, Scope* sc2)
+ {
+     // extracted to a function to allow windows SEH to work without destructors in the same function
+     __gshared int nest;
+     //printf("%d\n", nest);
+     if (++nest > global.recursionLimit)
+     {
+         global.gag = 0; // ensure error message gets printed
+         .error(ti.loc, "%s `%s` recursive expansion exceeded allowed nesting limit", ti.kind, ti.toPrettyChars);
+         fatal();
+     }
+ 
+     semantic3(ti, sc2);
+ 
+     --nest;
+ }
+ 
  void templateInstanceSemantic(TemplateInstance tempinst, Scope* sc, ArgumentList argumentList)
  {
      //printf("[%s] TemplateInstance.dsymbolSemantic('%s', this=%p, gag = %d, sc = %p)\n", tempinst.loc.toChars(), tempinst.toChars(), tempinst, global.gag, sc);
*************** void templateInstanceSemantic(TemplateIn
*** 4842,4849 ****
          if (STC stc = ModToStc(t.mod))
          {
              //printf("t = %s, stc = x%llx\n", t.toChars(), stc);
!             auto s = new Dsymbols();
!             s.push(new StorageClassDeclaration(stc, tempinst.members));
              tempinst.members = s;
          }
          break;
--- 5582,5588 ----
          if (STC stc = ModToStc(t.mod))
          {
              //printf("t = %s, stc = x%llx\n", t.toChars(), stc);
!             auto s = new Dsymbols(new StorageClassDeclaration(stc, tempinst.members));
              tempinst.members = s;
          }
          break;
*************** void templateInstanceSemantic(TemplateIn
*** 4903,4909 ****
      if (tempinst.members.length)
      {
          Dsymbol s;
!         if (Dsymbol.oneMembers(tempinst.members, s, tempdecl.ident) && s)
          {
              //printf("tempdecl.ident = %s, s = `%s %s`\n", tempdecl.ident.toChars(), s.kind(), s.toPrettyChars());
              //printf("setting aliasdecl\n");
--- 5642,5648 ----
      if (tempinst.members.length)
      {
          Dsymbol s;
!         if (oneMembers(tempinst.members, s, tempdecl.ident) && s)
          {
              //printf("tempdecl.ident = %s, s = `%s %s`\n", tempdecl.ident.toChars(), s.kind(), s.toPrettyChars());
              //printf("setting aliasdecl\n");
*************** void templateInstanceSemantic(TemplateIn
*** 4948,4954 ****
      if (tempinst.members.length)
      {
          Dsymbol s;
!         if (Dsymbol.oneMembers(tempinst.members, s, tempdecl.ident) && s)
          {
              if (!tempinst.aliasdecl || tempinst.aliasdecl != s)
              {
--- 5687,5693 ----
      if (tempinst.members.length)
      {
          Dsymbol s;
!         if (oneMembers(tempinst.members, s, tempdecl.ident) && s)
          {
              if (!tempinst.aliasdecl || tempinst.aliasdecl != s)
              {
*************** void aliasSemantic(AliasDeclaration ds,
*** 5439,5444 ****
--- 6178,6373 ----
      normalRet();
  }
  
+ /**********************************************
+  * Find template declaration corresponding to template instance.
+  *
+  * Returns:
+  *      false if finding fails.
+  * Note:
+  *      This function is reentrant against error occurrence. If returns false,
+  *      any members of this object won't be modified, and repetition call will
+  *      reproduce same error.
+  */
+ bool findTempDecl(TemplateInstance ti, Scope* sc, WithScopeSymbol* pwithsym)
+ {
+     if (pwithsym)
+         *pwithsym = null;
+ 
+     if (ti.havetempdecl)
+         return true;
+ 
+     //printf("TemplateInstance.findTempDecl() %s\n", toChars());
+     if (!ti.tempdecl)
+     {
+         /* Given:
+          *    foo!( ... )
+          * figure out which TemplateDeclaration foo refers to.
+          */
+         Identifier id = ti.name;
+         Dsymbol scopesym;
+         Dsymbol s = sc.search(ti.loc, id, scopesym);
+         if (!s)
+         {
+             s = sc.search_correct(id);
+             if (s)
+                 .error(ti.loc, "%s `%s` template `%s` is not defined, did you mean %s?", ti.kind, ti.toPrettyChars(), id.toChars(), s.toChars());
+             else
+                 .error(ti.loc, "%s `%s` template `%s` is not defined", ti.kind, ti.toPrettyChars(), id.toChars());
+             return false;
+         }
+         static if (LOG)
+         {
+             printf("It's an instance of '%s' kind '%s'\n", s.toChars(), s.kind());
+             if (s.parent)
+                 printf("s.parent = '%s'\n", s.parent.toChars());
+         }
+         if (pwithsym)
+             *pwithsym = scopesym.isWithScopeSymbol();
+ 
+         /* We might have found an alias within a template when
+          * we really want the template.
+          */
+         TemplateInstance ti2;
+         if (s.parent && (ti2 = s.parent.isTemplateInstance()) !is null)
+         {
+             if (ti2.tempdecl && ti2.tempdecl.ident == id)
+             {
+                 /* This is so that one can refer to the enclosing
+                  * template, even if it has the same name as a member
+                  * of the template, if it has a !(arguments)
+                  */
+                 TemplateDeclaration td = ti2.tempdecl.isTemplateDeclaration();
+                 assert(td);
+                 if (td.overroot) // if not start of overloaded list of TemplateDeclaration's
+                     td = td.overroot; // then get the start
+                 s = td;
+             }
+         }
+ 
+         // The template might originate from a selective import which implies that
+         // s is a lowered AliasDeclaration of the actual TemplateDeclaration.
+         // This is the last place where we see the deprecated alias because it is
+         // stripped below, so check if the selective import was deprecated.
+         // See https://issues.dlang.org/show_bug.cgi?id=20840.
+         if (s.isAliasDeclaration())
+             s.checkDeprecated(ti.loc, sc);
+ 
+         if (!ti.updateTempDecl(sc, s))
+         {
+             return false;
+         }
+     }
+     assert(ti.tempdecl);
+ 
+     // Look for forward references
+     auto tovers = ti.tempdecl.isOverloadSet();
+     foreach (size_t oi; 0 .. tovers ? tovers.a.length : 1)
+     {
+         Dsymbol dstart = tovers ? tovers.a[oi] : ti.tempdecl;
+         int r = overloadApply(dstart, (Dsymbol s)
+         {
+             auto td = s.isTemplateDeclaration();
+             if (!td)
+                 return 0;
+ 
+             if (td.semanticRun == PASS.initial)
+             {
+                 if (td._scope)
+                 {
+                     // Try to fix forward reference. Ungag errors while doing so.
+                     auto ungag = td.ungagSpeculative();
+                     td.dsymbolSemantic(td._scope);
+                 }
+                 if (td.semanticRun == PASS.initial)
+                 {
+                     .error(ti.loc, "%s `%s` `%s` forward references template declaration `%s`",
+                            ti.kind, ti.toPrettyChars(), ti.toChars(), td.toChars());
+                     return 1;
+                 }
+             }
+             return 0;
+         });
+         if (r)
+             return false;
+     }
+     return true;
+ }
+ 
+ private bool findMixinTempDecl(TemplateMixin tm, Scope* sc)
+ {
+     // Follow qualifications to find the TemplateDeclaration
+     if (!tm.tempdecl)
+     {
+         Expression e;
+         Type t;
+         Dsymbol s;
+         tm.tqual.resolve(tm.loc, sc, e, t, s);
+         if (!s)
+         {
+             .error(tm.loc, "%s `%s` is not defined", tm.kind, tm.toPrettyChars);
+             return false;
+         }
+         s = s.toAlias();
+         tm.tempdecl = s.isTemplateDeclaration();
+         OverloadSet os = s.isOverloadSet();
+ 
+         /* If an OverloadSet, look for a unique member that is a template declaration
+          */
+         if (os)
+         {
+             Dsymbol ds = null;
+             foreach (i, sym; os.a)
+             {
+                 Dsymbol s2 = sym.isTemplateDeclaration();
+                 if (s2)
+                 {
+                     if (ds)
+                     {
+                         tm.tempdecl = os;
+                         break;
+                     }
+                     ds = s2;
+                 }
+             }
+         }
+         if (!tm.tempdecl)
+         {
+             .error(tm.loc, "%s `%s` - `%s` is a %s, not a template", tm.kind,
+                    tm.toPrettyChars, s.toChars(), s.kind());
+             return false;
+         }
+     }
+     assert(tm.tempdecl);
+ 
+     // Look for forward references
+     auto tovers = tm.tempdecl.isOverloadSet();
+     foreach (size_t oi; 0 .. tovers ? tovers.a.length : 1)
+     {
+         Dsymbol dstart = tovers ? tovers.a[oi] : tm.tempdecl;
+         int r = overloadApply(dstart, (Dsymbol s)
+         {
+             auto td = s.isTemplateDeclaration();
+             if (!td)
+                 return 0;
+ 
+             if (td.semanticRun == PASS.initial)
+             {
+                 if (td._scope)
+                     td.dsymbolSemantic(td._scope);
+                 else
+                 {
+                     tm.semanticRun = PASS.initial;
+                     return 1;
+                 }
+             }
+             return 0;
+         });
+         if (r)
+             return false;
+     }
+     return true;
+ }
+ 
  /********************
   * Perform semantic on AliasAssignment.
   * Has a lot of similarities to aliasSemantic(). Perhaps they should share code.
*************** private TupleDeclaration aliasAssignInPl
*** 5701,5707 ****
      if (td)
          aliassym.aliassym = td;
      aliassym.semanticRun = PASS.semanticdone;
!     if (!TemplateInstance.semanticTiargs(tempinst.loc, sc, tempinst.tiargs, 0, td))
      {
          tempinst.errors = true;
          return null;
--- 6630,6636 ----
      if (td)
          aliassym.aliassym = td;
      aliassym.semanticRun = PASS.semanticdone;
!     if (!TemplateInstance_semanticTiargs(tempinst.loc, sc, tempinst.tiargs, 0, td))
      {
          tempinst.errors = true;
          return null;
*************** private TupleDeclaration aliasAssignInPl
*** 5755,5760 ****
--- 6684,6722 ----
      return td;
  }
  
+ /*********************************
+  * Iterate this dsymbol or members of this scoped dsymbol, then
+  * call `fp` with the found symbol and `params`.
+  * Params:
+  *  symbol = the dsymbol or parent of members to call fp on
+  *  fp = function pointer to process the iterated symbol.
+  *       If it returns nonzero, the iteration will be aborted.
+  *  ctx = context parameter passed to fp.
+  * Returns:
+  *  nonzero if the iteration is aborted by the return value of fp,
+  *  or 0 if it's completed.
+  */
+ int apply(Dsymbol symbol, int function(Dsymbol, void*) fp, void* ctx)
+ {
+     if (auto nd = symbol.isNspace())
+     {
+         return nd.members.foreachDsymbol( (s) { return s && s.apply(fp, ctx); } );
+     }
+     if (auto ad = symbol.isAttribDeclaration())
+     {
+         return ad.include(ad._scope).foreachDsymbol( (s) { return s && s.apply(fp, ctx); } );
+     }
+     if (auto tm = symbol.isTemplateMixin())
+     {
+         if (tm._scope) // if fwd reference
+             dsymbolSemantic(tm, null); // try to resolve it
+ 
+         return tm.members.foreachDsymbol( (s) { return s && s.apply(fp, ctx); } );
+     }
+ 
+     return fp(symbol, ctx);
+ }
+ 
  /***************************************
   * Check if a template instance is a trivial AliasSeq but without other overloads.
   * We can only be 100% sure of being AliasSeq after running semanticTiargs()
*************** bool determineFields(AggregateDeclaratio
*** 5871,5882 ****
      return true;
  }
  
  /// Do an atomic operation (currently tailored to [shared] static ctors|dtors) needs
  private CallExp doAtomicOp (string op, Identifier var, Expression arg)
  {
      assert(op == "-=" || op == "+=");
  
!     Module mod = Module.loadCoreAtomic();
      if (!mod)
          return null;    // core.atomic couldn't be loaded
  
--- 6833,6913 ----
      return true;
  }
  
+ /****************************
+  * A Singleton that loads core.stdc.config
+  * Returns:
+  *  Module of core.stdc.config, null if couldn't find it
+  */
+ Module loadCoreStdcConfig()
+ {
+     __gshared Module core_stdc_config;
+     auto pkgids = new Identifier[2];
+     pkgids[0] = Id.core;
+     pkgids[1] = Id.stdc;
+     return loadModuleFromLibrary(core_stdc_config, pkgids, Id.config);
+ }
+ 
+ /****************************
+  * A Singleton that loads core.atomic
+  * Returns:
+  *  Module of core.atomic, null if couldn't find it
+  */
+ private Module loadCoreAtomic()
+ {
+     __gshared Module core_atomic;
+     auto pkgids = new Identifier[1];
+     pkgids[0] = Id.core;
+     return loadModuleFromLibrary(core_atomic, pkgids, Id.atomic);
+ }
+ 
+ /****************************
+  * A Singleton that loads std.math
+  * Returns:
+  *  Module of std.math, null if couldn't find it
+  */
+ Module loadStdMath()
+ {
+     __gshared Module std_math;
+     auto pkgids = new Identifier[1];
+     pkgids[0] = Id.std;
+     return loadModuleFromLibrary(std_math, pkgids, Id.math);
+ }
+ 
+ /**********************************
+  * Load a Module from the library.
+  * Params:
+  *  mod = cached return value of this call
+  *  pkgids = package identifiers
+  *  modid = module id
+  * Returns:
+  *  Module loaded, null if cannot load it
+  */
+ extern (D) private static Module loadModuleFromLibrary(ref Module mod, Identifier[] pkgids, Identifier modid)
+ {
+     if (mod)
+         return mod;
+ 
+     auto imp = new Import(Loc.initial, pkgids[], modid, null, true);
+     // Module.load will call fatal() if there's no module available.
+     // Gag the error here, pushing the error handling to the caller.
+     const errors = global.startGagging();
+     imp.load(null);
+     if (imp.mod)
+     {
+         imp.mod.importAll(null);
+         imp.mod.dsymbolSemantic(null);
+     }
+     global.endGagging(errors);
+     mod = imp.mod;
+     return mod;
+ }
+ 
  /// Do an atomic operation (currently tailored to [shared] static ctors|dtors) needs
  private CallExp doAtomicOp (string op, Identifier var, Expression arg)
  {
      assert(op == "-=" || op == "+=");
  
!     Module mod = loadCoreAtomic();
      if (!mod)
          return null;    // core.atomic couldn't be loaded
  
*************** private extern(C++) class SearchVisitor
*** 6250,6256 ****
      {
          //printf("ArrayScopeSymbol::search('%s', flags = %d)\n", ident.toChars(), flags);
          if (ident != Id.dollar)
!             return setResult(null);
  
          VarDeclaration* pvar;
          Expression ce;
--- 7281,7287 ----
      {
          //printf("ArrayScopeSymbol::search('%s', flags = %d)\n", ident.toChars(), flags);
          if (ident != Id.dollar)
!             return visit(cast(ScopeDsymbol)ass);
  
          VarDeclaration* pvar;
          Expression ce;
*************** private extern(C++) class SearchVisitor
*** 6370,6379 ****
                      {
                          assert(0);
                      }
-                     auto tiargs = new Objects();
                      Expression edim = new IntegerExp(Loc.initial, dim, Type.tsize_t);
                      edim = edim.expressionSemantic(ass._scope);
!                     tiargs.push(edim);
                      e = new DotTemplateInstanceExp(loc, ce, td.ident, tiargs);
                  }
                  else
--- 7401,7409 ----
                      {
                          assert(0);
                      }
                      Expression edim = new IntegerExp(Loc.initial, dim, Type.tsize_t);
                      edim = edim.expressionSemantic(ass._scope);
!                     auto tiargs = new Objects(edim);
                      e = new DotTemplateInstanceExp(loc, ce, td.ident, tiargs);
                  }
                  else
*************** private extern(C++) class SetFieldOffset
*** 7168,7174 ****
  
          const style = target.c.bitFieldStyle;
          if (style != TargetC.BitFieldStyle.MS && style != TargetC.BitFieldStyle.Gcc_Clang)
!             assert(0, "unsupported bit-field style");
  
          const isMicrosoftStyle = style == TargetC.BitFieldStyle.MS;
          const contributesToAggregateAlignment = target.c.contributesToAggregateAlignment(bfd);
--- 8198,8204 ----
  
          const style = target.c.bitFieldStyle;
          if (style != TargetC.BitFieldStyle.MS && style != TargetC.BitFieldStyle.Gcc_Clang)
!             assert(0, "unsupported bitfield style");
  
          const isMicrosoftStyle = style == TargetC.BitFieldStyle.MS;
          const contributesToAggregateAlignment = target.c.contributesToAggregateAlignment(bfd);
*************** private extern(C++) class SetFieldOffset
*** 7238,7244 ****
          }
          else if (!isMicrosoftStyle)
          {
!             // If the bit-field spans more units of alignment than its type
              // and is at the alignment boundary, start a new field at the
              // next alignment boundary. This affects when offsetof reports
              // a higher number and bitoffsetof starts at zero again.
--- 8268,8274 ----
          }
          else if (!isMicrosoftStyle)
          {
!             // If the bitfield spans more units of alignment than its type
              // and is at the alignment boundary, start a new field at the
              // next alignment boundary. This affects when offsetof reports
              // a higher number and bitoffsetof starts at zero again.
*************** private extern(C++) class SetFieldOffset
*** 7384,7397 ****
                  isunion);
  
              // Add to the anon fields the base offset of this anonymous aggregate
!             //printf("anon fields, anonoffset = %d\n", anonoffset);
!             foreach (const i; fieldstart .. ad.fields.length)
              {
!                 VarDeclaration v = ad.fields[i];
!                 //printf("\t[%d] %s %d\n", i, v.toChars(), v.offset);
!                 v.offset += anond.anonoffset;
              }
!         }
      }
  }
  
--- 8414,8469 ----
                  isunion);
  
              // Add to the anon fields the base offset of this anonymous aggregate
!             //printf("anon fields, anonoffset = %d\n", anond.anonoffset);
!             if (anond.anonoffset)
!                 anond.decl.foreachDsymbol( (s) => s.adjustBaseOffset(anond.anonoffset) );
!         }
!     }
! }
! 
! // Adds `offset` as the new base offset of all field members in `d`.
! private void adjustBaseOffset(Dsymbol d, uint offset)
! {
!     switch (d.dsym)
!     {
!         case DSYM.nspace:
!             auto ns = cast(Nspace)d;
!             ns.members.foreachDsymbol( s => s.adjustBaseOffset(offset) );
!             break;
! 
!         case DSYM.templateMixin:
!             auto tm = cast(TemplateMixin)d;
!             tm.members.foreachDsymbol( s => s.adjustBaseOffset(offset) );
!             break;
! 
!         case DSYM.anonDeclaration:
!             auto ad = cast(AnonDeclaration)d;
!             if (ad.decl)
!                 ad.decl.foreachDsymbol( s => s.adjustBaseOffset(offset) );
!             break;
! 
!         case DSYM.bitFieldDeclaration:
!             auto bfd = cast(BitFieldDeclaration)d;
!             bfd.offset += offset;
!             //printf("\t%s %d : %d\n", bfd.toChars(), bfd.offset, bfd.bitOffset);
!             break;
! 
!         default:
!             if (auto vd = d.isVarDeclaration())
              {
!                 if (vd.aliasTuple)
!                     vd.aliasTuple.foreachVar( s => s.adjustBaseOffset(offset) );
!                 else if (vd.isField())
!                 {
!                     vd.offset += offset;
!                     //printf("\t%s %d\n", vd.toChars(), vd.offset);
!                 }
              }
!             else if (auto atd = d.isAttribDeclaration())
!             {
!                 atd.include(null).foreachDsymbol( s => s.adjustBaseOffset(offset) );
!             }
!             break;
      }
  }
  
*************** private extern(C++) class NewScopeVisito
*** 7531,7544 ****
  }
  
  
! extern(C++) Dsymbols* include(Dsymbol d, Scope* sc)
  {
!     scope icv = new IncludeVisitor(sc);
      d.accept(icv);
      return icv.symbols;
  }
  
! extern(C++) class IncludeVisitor : Visitor
  {
      alias visit = typeof(super).visit;
      Scope* sc;
--- 8603,8616 ----
  }
  
  
! Dsymbols* include(Dsymbol d, Scope* sc)
  {
!     scope icv = new ConditionIncludeVisitor(sc);
      d.accept(icv);
      return icv.symbols;
  }
  
! extern(C++) class ConditionIncludeVisitor : Visitor
  {
      alias visit = typeof(super).visit;
      Scope* sc;
*************** extern(C++) class IncludeVisitor : Visit
*** 7570,7576 ****
              return;
          }
          assert(cdc.condition);
!         symbols = cdc.condition.include(cdc._scope ? cdc._scope : sc) ? cdc.decl : cdc.elsedecl;
      }
  
      override void visit(StaticIfDeclaration sif)
--- 8642,8648 ----
              return;
          }
          assert(cdc.condition);
!         symbols = dmd.expressionsem.include(cdc.condition, cdc._scope ? cdc._scope : sc) ? cdc.decl : cdc.elsedecl;
      }
  
      override void visit(StaticIfDeclaration sif)
*************** private Expression callScopeDtor(VarDecl
*** 7751,7758 ****
  
          const sz = vd.type.size();
          assert(sz != SIZE_INVALID);
-         if (!sz)
-             return null;
  
          if (vd.type.toBasetype().ty == Tstruct)
          {
--- 8823,8828 ----
*************** Lfail:
*** 7891,7897 ****
      return false;
  }
  
! extern (C++) void addComment(Dsymbol d, const(char)* comment)
  {
      scope v = new AddCommentVisitor(comment);
      d.accept(v);
--- 8961,8967 ----
      return false;
  }
  
! void addComment(Dsymbol d, const(char)* comment)
  {
      scope v = new AddCommentVisitor(comment);
      d.accept(v);
*************** private extern(C++) class OneMemberVisit
*** 8004,8010 ****
      override void visit(AttribDeclaration atb)
      {
          Dsymbols* d = atb.include(null);
!         result = Dsymbol.oneMembers(d, *ps, ident);
      }
  
      override void visit(StaticForeachDeclaration sfd)
--- 9074,9080 ----
      override void visit(AttribDeclaration atb)
      {
          Dsymbols* d = atb.include(null);
!         result = oneMembers(d, *ps, ident);
      }
  
      override void visit(StaticForeachDeclaration sfd)
*************** private extern(C++) class OneMemberVisit
*** 8027,8033 ****
  
      override void visit(StorageClassDeclaration scd)
      {
!         bool t = Dsymbol.oneMembers(scd.decl, *ps, ident);
          if (t && *ps)
          {
              /* This is to deal with the following case:
--- 9097,9103 ----
  
      override void visit(StorageClassDeclaration scd)
      {
!         bool t = oneMembers(scd.decl, *ps, ident);
          if (t && *ps)
          {
              /* This is to deal with the following case:
*************** private extern(C++) class OneMemberVisit
*** 8056,8067 ****
          //printf("ConditionalDeclaration::oneMember(), inc = %d\n", condition.inc);
          if (cd.condition.inc != Include.notComputed)
          {
!             Dsymbols* d = cd.condition.include(null) ? cd.decl : cd.elsedecl;
!             result = Dsymbol.oneMembers(d, *ps, ident);
          }
          else
          {
!             bool res = (Dsymbol.oneMembers(cd.decl, *ps, ident) && *ps is null && Dsymbol.oneMembers(cd.elsedecl, *ps, ident) && *ps is null);
              *ps = null;
              result = res;
          }
--- 9126,9137 ----
          //printf("ConditionalDeclaration::oneMember(), inc = %d\n", condition.inc);
          if (cd.condition.inc != Include.notComputed)
          {
!             Dsymbols* d = dmd.expressionsem.include(cd.condition, null) ? cd.decl : cd.elsedecl;
!             result = oneMembers(d, *ps, ident);
          }
          else
          {
!             bool res = (oneMembers(cd.decl, *ps, ident) && *ps is null && oneMembers(cd.elsedecl, *ps, ident) && *ps is null);
              *ps = null;
              result = res;
          }
*************** private extern(C++) class OneMemberVisit
*** 8070,8076 ****
      override void visit(ScopeDsymbol sd)
      {
          if (sd.isAnonymous())
!             result = Dsymbol.oneMembers(sd.members, *ps, ident);
          else {
              // visit(Dsymbol dsym)
              *ps = sd;
--- 9140,9146 ----
      override void visit(ScopeDsymbol sd)
      {
          if (sd.isAnonymous())
!             result = oneMembers(sd.members, *ps, ident);
          else {
              // visit(Dsymbol dsym)
              *ps = sd;
*************** private extern(C++) class OneMemberVisit
*** 8108,8114 ****
  * Return true if any of the members are static ctors or static dtors, or if
  * any members have members that are.
  */
! extern(C++) bool hasStaticCtorOrDtor(Dsymbol d)
  {
      scope v = new HasStaticCtorOrDtor();
      d.accept(v);
--- 9178,9184 ----
  * Return true if any of the members are static ctors or static dtors, or if
  * any members have members that are.
  */
! bool hasStaticCtorOrDtor(Dsymbol d)
  {
      scope v = new HasStaticCtorOrDtor();
      d.accept(v);
*************** private extern(C++) class HasStaticCtorO
*** 8162,8168 ****
      }
  }
  
! extern(C++) bool isFuncHidden(ClassDeclaration cd, FuncDeclaration fd)
  {
      import dmd.funcsem : overloadApply;
      //printf("ClassDeclaration.isFuncHidden(class = %s, fd = %s)\n", toChars(), fd.toPrettyChars());
--- 9232,9238 ----
      }
  }
  
! bool isFuncHidden(ClassDeclaration cd, FuncDeclaration fd)
  {
      import dmd.funcsem : overloadApply;
      //printf("ClassDeclaration.isFuncHidden(class = %s, fd = %s)\n", toChars(), fd.toPrettyChars());
*************** Dsymbol vtblSymbol(ClassDeclaration cd)
*** 8210,8212 ****
--- 9280,9978 ----
      }
      return cd.vtblsym;
  }
+ 
+ bool isAbstract(ClassDeclaration cd)
+ {
+     enum log = false;
+     if (cd.isabstract != ThreeState.none)
+         return cd.isabstract == ThreeState.yes;
+ 
+     if (log) printf("isAbstract(%s)\n", cd.toChars());
+ 
+     bool no()  { if (log) printf("no\n");  cd.isabstract = ThreeState.no;  return false; }
+     bool yes() { if (log) printf("yes\n"); cd.isabstract = ThreeState.yes; return true;  }
+ 
+     if (cd.storage_class & STC.abstract_ || cd._scope && cd._scope.stc & STC.abstract_)
+         return yes();
+ 
+     if (cd.errors)
+         return no();
+ 
+     /* https://issues.dlang.org/show_bug.cgi?id=11169
+         * Resolve forward references to all class member functions,
+         * and determine whether this class is abstract.
+         */
+     static int func(Dsymbol s, void*)
+     {
+         auto fd = s.isFuncDeclaration();
+         if (!fd)
+             return 0;
+         if (fd.storage_class & STC.static_)
+             return 0;
+ 
+         if (fd.isAbstract())
+             return 1;
+         return 0;
+     }
+ 
+     // opaque class is not abstract if it is not declared abstract
+     if (!(cd.members))
+         return no();
+ 
+     for (size_t i = 0; i < cd.members.length; i++)
+     {
+         auto s = (*(cd.members))[i];
+         if (s.apply(&func, null))
+         {
+             return yes();
+         }
+     }
+ 
+     /* If the base class is not abstract, then this class cannot
+         * be abstract.
+         */
+     if (!cd.isInterfaceDeclaration() && (!cd.baseClass || !cd.baseClass.isAbstract()))
+         return no();
+ 
+     /* If any abstract functions are inherited, but not overridden,
+         * then the class is abstract. Do this by checking the vtbl[].
+         * Need to do semantic() on class to fill the vtbl[].
+         */
+     cd.dsymbolSemantic(null);
+ 
+     /* The next line should work, but does not because when ClassDeclaration.dsymbolSemantic()
+         * is called recursively it can set PASS.semanticdone without finishing it.
+         */
+     //if (semanticRun < PASS.semanticdone)
+     {
+         /* Could not complete semantic(). Try running semantic() on
+             * each of the virtual functions,
+             * which will fill in the vtbl[] overrides.
+             */
+         static int virtualSemantic(Dsymbol s, void*)
+         {
+             auto fd = s.isFuncDeclaration();
+             if (fd && !(fd.storage_class & STC.static_) && !fd.isUnitTestDeclaration())
+                 fd.dsymbolSemantic(null);
+             return 0;
+         }
+ 
+         for (size_t i = 0; i < cd.members.length; i++)
+         {
+             auto s = (*(cd.members))[i];
+             s.apply(&virtualSemantic,null);
+         }
+     }
+ 
+     /* Finally, check the vtbl[]
+         */
+     foreach (i; 1 .. cd.vtbl.length)
+     {
+         auto fd = cd.vtbl[i].isFuncDeclaration();
+         //if (fd) printf("\tvtbl[%d] = [%s] %s\n", i, fd.loc.toChars(), fd.toPrettyChars());
+         if (!fd || fd.isAbstract())
+         {
+             return yes();
+         }
+     }
+ 
+     return no();
+ }
+ 
+ void finalizeSize(AggregateDeclaration ad)
+ {
+     scope v = new FinalizeSizeVisitor();
+     ad.accept(v);
+ }
+ 
+ /**********************************
+  * Determine if exp is all binary zeros.
+  * Params:
+  *      exp = expression to check
+  * Returns:
+  *      true if it's all binary 0
+  */
+ bool _isZeroInit(Expression exp)
+ {
+     switch (exp.op)
+     {
+         case EXP.int64:
+             return exp.toInteger() == 0;
+ 
+         case EXP.null_:
+             return true;
+ 
+         case EXP.structLiteral:
+         {
+             auto sle = exp.isStructLiteralExp();
+             if (sle.sd.isNested())
+                 return false;
+             const isCstruct = sle.sd.isCsymbol();  // C structs are default initialized to all zeros
+             foreach (i; 0 .. sle.sd.fields.length)
+             {
+                 auto field = sle.sd.fields[i];
+                 if (field.type.size(field.loc))
+                 {
+                     auto e = sle.elements && i < sle.elements.length ? (*sle.elements)[i] : null;
+                     if (e ? !_isZeroInit(e)
+                           : !isCstruct && !field.type.isZeroInit(field.loc))
+                         return false;
+                 }
+             }
+             return true;
+         }
+ 
+         case EXP.arrayLiteral:
+         {
+             auto ale = cast(ArrayLiteralExp)exp;
+ 
+             const dim = ale.elements ? ale.elements.length : 0;
+ 
+             if (ale.type.toBasetype().ty == Tarray) // if initializing a dynamic array
+                 return dim == 0;
+ 
+             foreach (i; 0 .. dim)
+             {
+                 if (!_isZeroInit(ale[i]))
+                     return false;
+             }
+ 
+             /* Note that true is returned for all T[0]
+              */
+             return true;
+         }
+ 
+         case EXP.string_:
+         {
+             auto se = cast(StringExp)exp;
+ 
+             if (se.type.toBasetype().ty == Tarray) // if initializing a dynamic array
+                 return se.len == 0;
+ 
+             foreach (i; 0 .. se.len)
+             {
+                 if (se.getIndex(i) != 0)
+                     return false;
+             }
+             return true;
+         }
+ 
+         case EXP.vector:
+         {
+             auto ve = cast(VectorExp) exp;
+             return _isZeroInit(ve.e1);
+         }
+ 
+         case EXP.float64:
+         case EXP.complex80:
+         {
+             import dmd.root.ctfloat : CTFloat;
+             return (exp.toReal()      is CTFloat.zero) &&
+                    (exp.toImaginary() is CTFloat.zero);
+         }
+ 
+         default:
+             return false;
+     }
+ }
+ 
+ /***************************************
+  * Calculate `ad.field[i].overlapped` and `overlapUnsafe`, and check that all of explicit
+  * field initializers have unique memory space on instance.
+  * Returns:
+  *      true if any errors happen.
+  */
+ private bool checkOverlappedFields(AggregateDeclaration ad)
+ {
+     //printf("AggregateDeclaration::checkOverlappedFields() %s\n", toChars());
+     assert(ad.sizeok == Sizeok.done);
+     size_t nfields = ad.fields.length;
+     if (ad.isNested())
+     {
+         auto cd = ad.isClassDeclaration();
+         if (!cd || !cd.baseClass || !cd.baseClass.isNested())
+             nfields--;
+         if (ad.vthis2 && !(cd && cd.baseClass && cd.baseClass.vthis2))
+             nfields--;
+     }
+     bool errors = false;
+ 
+     // Fill in missing any elements with default initializers
+     foreach (i; 0 .. nfields)
+     {
+         auto vd = ad.fields[i];
+         if (vd.errors)
+         {
+             errors = true;
+             continue;
+         }
+ 
+         const vdIsVoidInit = vd._init && vd._init.isVoidInitializer();
+ 
+         // Find overlapped fields with the hole [vd.offset .. vd.offset.size()].
+         foreach (j; 0 .. nfields)
+         {
+             if (i == j)
+                 continue;
+             auto v2 = ad.fields[j];
+             if (v2.errors)
+             {
+                 errors = true;
+                 continue;
+             }
+             if (!vd.isOverlappedWith(v2))
+                 continue;
+ 
+             // vd and v2 are overlapping.
+             vd.overlapped = true;
+             v2.overlapped = true;
+ 
+             if (!MODimplicitConv(vd.type.mod, v2.type.mod))
+                 v2.overlapUnsafe = true;
+             if (!MODimplicitConv(v2.type.mod, vd.type.mod))
+                 vd.overlapUnsafe = true;
+ 
+             if (i > j)
+                 continue;
+ 
+             if (!v2._init)
+                 continue;
+ 
+             if (v2._init.isVoidInitializer())
+                 continue;
+ 
+             if (vd._init && !vdIsVoidInit && v2._init)
+             {
+                 .error(ad.loc, "overlapping default initialization for field `%s` and `%s`", v2.toChars(), vd.toChars());
+                 errors = true;
+             }
+             else if (v2._init && i < j)
+             {
+                 .error(v2.loc, "union field `%s` with default initialization `%s` must be before field `%s`",
+                     v2.toChars(), dmd.hdrgen.toChars(v2._init), vd.toChars());
+                 errors = true;
+             }
+         }
+     }
+     return errors;
+ }
+ 
+ private extern(C++) class FinalizeSizeVisitor : Visitor
+ {
+     alias visit = Visitor.visit;
+ 
+     override void visit(ClassDeclaration outerCd)
+     {
+         assert(outerCd.sizeok != Sizeok.done);
+ 
+         // Set the offsets of the fields and determine the size of the class
+         if (outerCd.baseClass)
+         {
+             assert(outerCd.baseClass.sizeok == Sizeok.done);
+ 
+             outerCd.alignsize = outerCd.baseClass.alignsize;
+             if (outerCd.classKind == ClassKind.cpp)
+                 outerCd.structsize = target.cpp.derivedClassOffset(outerCd.baseClass);
+             else
+                 outerCd.structsize = outerCd.baseClass.structsize;
+         }
+         else if (outerCd.classKind == ClassKind.objc)
+             outerCd.structsize = 0; // no hidden member for an Objective-C class
+         else if (outerCd.isInterfaceDeclaration())
+         {
+             if (outerCd.interfaces.length == 0)
+             {
+                 outerCd.alignsize = target.ptrsize;
+                 outerCd.structsize = target.ptrsize;      // allow room for __vptr
+             }
+         }
+         else
+         {
+             outerCd.alignsize = target.ptrsize;
+             outerCd.structsize = target.ptrsize;      // allow room for __vptr
+             if (outerCd.hasMonitor())
+                 outerCd.structsize += target.ptrsize; // allow room for __monitor
+         }
+ 
+         //printf("finalizeSize() %s, sizeok = %d\n", toChars(), sizeok);
+         size_t bi = 0;                  // index into vtblInterfaces[]
+ 
+         /****
+             * Runs through the inheritance graph to set the BaseClass.offset fields.
+             * Recursive in order to account for the size of the interface classes, if they are
+             * more than just interfaces.
+             * Params:
+             *      cd = interface to look at
+             *      baseOffset = offset of where cd will be placed
+             * Returns:
+             *      subset of instantiated size used by cd for interfaces
+             */
+         uint membersPlace(ClassDeclaration cd, uint baseOffset)
+         {
+             //printf("    membersPlace(%s, %d)\n", cd.toChars(), baseOffset);
+             uint offset = baseOffset;
+ 
+             foreach (BaseClass* b; cd.interfaces)
+             {
+                 if (b.sym.sizeok != Sizeok.done)
+                     b.sym.finalizeSize();
+                 assert(b.sym.sizeok == Sizeok.done);
+ 
+                 if (!b.sym.alignsize)
+                     b.sym.alignsize = target.ptrsize;
+                 offset = alignmember(structalign_t(cast(ushort)b.sym.alignsize), b.sym.alignsize, offset);
+                 assert(bi < outerCd.vtblInterfaces.length);
+ 
+                 BaseClass* bv = (*(outerCd.vtblInterfaces))[bi];
+                 if (b.sym.interfaces.length == 0)
+                 {
+                     //printf("\tvtblInterfaces[%d] b=%p b.sym = %s, offset = %d\n", bi, bv, bv.sym.toChars(), offset);
+                     bv.offset = offset;
+                     ++bi;
+                     // All the base interfaces down the left side share the same offset
+                     for (BaseClass* b2 = bv; b2.baseInterfaces.length; )
+                     {
+                         b2 = &b2.baseInterfaces[0];
+                         b2.offset = offset;
+                         //printf("\tvtblInterfaces[%d] b=%p   sym = %s, offset = %d\n", bi, b2, b2.sym.toChars(), b2.offset);
+                     }
+                 }
+                 membersPlace(b.sym, offset);
+                 //printf(" %s size = %d\n", b.sym.toChars(), b.sym.structsize);
+                 offset += b.sym.structsize;
+                 if (outerCd.alignsize < b.sym.alignsize)
+                     outerCd.alignsize = b.sym.alignsize;
+             }
+             return offset - baseOffset;
+         }
+ 
+         outerCd.structsize += membersPlace(outerCd, outerCd.structsize);
+ 
+         if (outerCd.isInterfaceDeclaration())
+         {
+             outerCd.sizeok = Sizeok.done;
+             return;
+         }
+ 
+         // FIXME: Currently setFieldOffset functions need to increase fields
+         // to calculate each variable offsets. It can be improved later.
+         outerCd.fields.setDim(0);
+ 
+         FieldState fieldState;
+         fieldState.offset = outerCd.structsize;
+         foreach (s; *(outerCd.members))
+         {
+             s.setFieldOffset(outerCd, &fieldState, false);
+         }
+ 
+         outerCd.sizeok = Sizeok.done;
+ 
+         // Calculate fields[i].overlapped
+         outerCd.checkOverlappedFields();
+     }
+ 
+     override void visit(StructDeclaration sd)
+     {
+         //printf("StructDeclaration::finalizeSize() %s, sizeok = %d\n", toChars(), sizeok);
+         assert(sd.sizeok != Sizeok.done);
+ 
+         if (sd.sizeok == Sizeok.inProcess)
+         {
+             return;
+         }
+         sd.sizeok = Sizeok.inProcess;
+ 
+         //printf("+StructDeclaration::finalizeSize() %s, fields.length = %d, sizeok = %d\n", toChars(), fields.length, sizeok);
+ 
+         sd.fields.setDim(0);   // workaround
+ 
+         // Set the offsets of the fields and determine the size of the struct
+         FieldState fieldState;
+         bool isunion = sd.isUnionDeclaration() !is null;
+         for (size_t i = 0; i < sd.members.length; i++)
+         {
+             Dsymbol s = (*sd.members)[i];
+             s.setFieldOffset(sd, &fieldState, isunion);
+             if (sd.type.ty == Terror)
+             {
+                 errorSupplemental(s.loc, "error on member `%s`", s.toPrettyChars);
+                 sd.errors = true;
+                 return;
+             }
+         }
+ 
+         if (sd.structsize == 0)
+         {
+             sd.hasNoFields = true;
+             sd.alignsize = 1;
+ 
+             // A fine mess of what size a zero sized struct should be
+             final switch (sd.classKind)
+             {
+                 case ClassKind.d:
+                 case ClassKind.cpp:
+                     sd.structsize = 1;
+                     break;
+ 
+                 case ClassKind.c:
+                 case ClassKind.objc:
+                     if (target.c.bitFieldStyle == TargetC.BitFieldStyle.MS)
+                     {
+                         /* Undocumented MS behavior for:
+                          *   struct S { int :0; };
+                          */
+                         sd.structsize = 4;
+                     }
+                     else
+                         sd.structsize = 0;
+                     break;
+             }
+         }
+ 
+         // Round struct size up to next alignsize boundary.
+         // This will ensure that arrays of structs will get their internals
+         // aligned properly.
+         if (sd.alignment.isDefault() || sd.alignment.isPack())
+             sd.structsize = (sd.structsize + sd.alignsize - 1) & ~(sd.alignsize - 1);
+         else
+             sd.structsize = (sd.structsize + sd.alignment.get() - 1) & ~(sd.alignment.get() - 1);
+ 
+         sd.sizeok = Sizeok.done;
+ 
+         //printf("-StructDeclaration::finalizeSize() %s, fields.length = %d, structsize = %d\n", toChars(), cast(int)fields.length, cast(int)structsize);
+ 
+         if (sd.errors)
+             return;
+ 
+         // Calculate fields[i].overlapped
+         if (sd.checkOverlappedFields())
+         {
+             sd.errors = true;
+             return;
+         }
+ 
+         // Determine if struct is all zeros or not
+         sd.zeroInit = true;
+         auto lastOffset = -1;
+         foreach (vd; sd.fields)
+         {
+             // First skip zero sized fields
+             if (vd.type.size(vd.loc) == 0)
+                 continue;
+ 
+             // only consider first sized member of an (anonymous) union
+             if (vd.overlapped && vd.offset == lastOffset)
+                 continue;
+             lastOffset = vd.offset;
+ 
+             if (vd._init)
+             {
+                 if (vd._init.isVoidInitializer())
+                     /* Treat as 0 for the purposes of putting the initializer
+                      * in the BSS segment, or doing a mass set to 0
+                      */
+                     continue;
+ 
+                 // Examine init to see if it is all 0s.
+                 auto exp = vd.getConstInitializer();
+                 if (!exp || !_isZeroInit(exp))
+                 {
+                     sd.zeroInit = false;
+                     break;
+                 }
+             }
+             else if (!vd.type.isZeroInit(sd.loc))
+             {
+                 sd.zeroInit = false;
+                 break;
+             }
+         }
+ 
+ 
+         sd.argTypes = target.toArgTypes(sd.type);
+     }
+ }
+ 
+ /*****************************************
+ * Is Dsymbol a variable that contains pointers?
+ */
+ bool hasPointers(Dsymbol d)
+ {
+     scope v = new HasPointersVisitor();
+     d.accept(v);
+     return v.result;
+ }
+ 
+ private extern(C++) class HasPointersVisitor : Visitor
+ {
+     import dmd.mtype : Type;
+ 
+     alias visit = Visitor.visit;
+     bool result;
+ 
+     override void visit(AttribDeclaration ad)
+     {
+         result = ad.include(null).foreachDsymbol( (s) { return s.hasPointers(); } ) != 0;
+     }
+ 
+     override void visit(VarDeclaration vd)
+     {
+         import dmd.typesem : hasPointers;
+         result = (!vd.isDataseg() && vd.type.hasPointers());
+     }
+ 
+     override void visit(Dsymbol d)
+     {
+         //printf("Dsymbol::hasPointers() %s\n", toChars());
+         result = false;
+     }
+ 
+     override void visit(TemplateMixin tm)
+     {
+         //printf("TemplateMixin.hasPointers() %s\n", toChars());
+         result = tm.members.foreachDsymbol( (s) { return s.hasPointers(); } ) != 0;
+     }
+ 
+     override void visit(Nspace ns)
+     {
+         //printf("Nspace::hasPointers() %s\n", toChars());
+         result = ns.members.foreachDsymbol( (s) { return s.hasPointers(); } ) != 0;
+     }
+ }
+ 
+ /***************************************
+  * Expands attribute declarations in members in depth first
+  * order. Calls dg(size_t symidx, Dsymbol *sym) for each
+  * member.
+  * If dg returns !=0, stops and returns that value else returns 0.
+  * Use this function to avoid the O(N + N^2/2) complexity of
+  * calculating dim and calling N times getNth.
+  * Returns:
+  *  last value returned by dg()
+  */
+ int _foreach(Scope* sc, Dsymbols* members, scope ForeachDg dg, size_t* pn = null)
+ {
+     assert(dg);
+     if (!members)
+         return 0;
+     size_t n = pn ? *pn : 0; // take over index
+     int result = 0;
+     foreach (size_t i; 0 .. members.length)
+     {
+         import dmd.attrib : AttribDeclaration;
+         import dmd.dtemplate : TemplateMixin;
+ 
+         Dsymbol s = (*members)[i];
+         if (AttribDeclaration a = s.isAttribDeclaration())
+             result = _foreach(sc, a.include(sc), dg, &n);
+         else if (TemplateMixin tm = s.isTemplateMixin())
+             result = _foreach(sc, tm.members, dg, &n);
+         else if (s.isTemplateInstance())
+         {
+         }
+         else if (s.isUnitTestDeclaration())
+         {
+         }
+         else
+             result = dg(n++, s);
+         if (result)
+             break;
+     }
+     if (pn)
+         *pn = n; // update index
+     return result;
+ }
+ 
+ /****************************************
+  * Create array of the local classes in the Module, suitable
+  * for inclusion in ModuleInfo
+  * Params:
+  *      mod = the Module
+  *      aclasses = array to fill in
+  * Returns: array of local classes
+  */
+ void getLocalClasses(Module mod, ref ClassDeclarations aclasses)
+ {
+     //printf("members.length = %d\n", mod.members.length);
+     int pushAddClassDg(size_t n, Dsymbol sm)
+     {
+         if (!sm)
+             return 0;
+ 
+         if (auto cd = sm.isClassDeclaration())
+         {
+             // compatibility with previous algorithm
+             if (cd.parent && cd.parent.isTemplateMixin())
+                 return 0;
+ 
+             if (cd.classKind != ClassKind.objc)
+                 aclasses.push(cd);
+         }
+         return 0;
+     }
+ 
+     _foreach(null, mod.members, &pushAddClassDg);
+ }
+ 
+ /*****************************************
+ * Same as Dsymbol::oneMember(), but look at an array of Dsymbols.
+ */
+ extern (D) bool oneMembers(Dsymbols* members, out Dsymbol ps, Identifier ident)
+ {
+     //printf("Dsymbol::oneMembers() %d\n", members ? members.length : 0);
+     Dsymbol s = null;
+     if (!members)
+     {
+         ps = null;
+         return true;
+     }
+ 
+     for (size_t i = 0; i < members.length; i++)
+     {
+         Dsymbol sx = (*members)[i];
+         bool x = sx.oneMember(ps, ident); //MYTODO: this temporarily creates a new dependency to dsymbolsem, will need to extract oneMembers() later
+         //printf("\t[%d] kind %s = %d, s = %p\n", i, sx.kind(), x, *ps);
+         if (!x)
+         {
+             //printf("\tfalse 1\n");
+             assert(ps is null);
+             return false;
+         }
+         if (ps)
+         {
+             assert(ident);
+             if (!ps.ident || !ps.ident.equals(ident))
+                 continue;
+             if (!s)
+                 s = ps;
+             else if (s.isOverloadable() && ps.isOverloadable())
+             {
+                 // keep head of overload set
+                 FuncDeclaration f1 = s.isFuncDeclaration();
+                 FuncDeclaration f2 = ps.isFuncDeclaration();
+                 if (f1 && f2)
+                 {
+                     assert(!f1.isFuncAliasDeclaration());
+                     assert(!f2.isFuncAliasDeclaration());
+                     for (; f1 != f2; f1 = f1.overnext0)
+                     {
+                         if (f1.overnext0 is null)
+                         {
+                             f1.overnext0 = f2;
+                             break;
+                         }
+                     }
+                 }
+             }
+             else // more than one symbol
+             {
+                 ps = null;
+                 //printf("\tfalse 2\n");
+                 return false;
+             }
+         }
+     }
+     ps = s; // s is the one symbol, null if none
+     //printf("\ttrue\n");
+     return true;
+ }
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/dtemplate.d gcc-16-20260201/gcc/d/dmd/dtemplate.d
*** gcc-16-20260125/gcc/d/dmd/dtemplate.d	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/dtemplate.d	Sun Feb  1 22:32:07 2026
*************** import dmd.dinterpret;
*** 53,65 ****
  import dmd.dmodule;
  import dmd.dscope;
  import dmd.dsymbol;
! import dmd.dsymbolsem : dsymbolSemantic, checkDeprecated, aliasSemantic, search, search_correct, setScope, importAll, include, hasStaticCtorOrDtor;
  import dmd.errors;
  import dmd.errorsink;
  import dmd.expression;
- import dmd.expressionsem : resolveLoc, expressionSemantic, resolveProperties, checkValue;
  import dmd.func;
- import dmd.funcsem : functionSemantic, leastAsSpecialized, overloadApply;
  import dmd.globals;
  import dmd.hdrgen;
  import dmd.id;
--- 53,63 ----
  import dmd.dmodule;
  import dmd.dscope;
  import dmd.dsymbol;
! import dmd.dsymbolsem : aliasSemantic, oneMembers, toAlias;
  import dmd.errors;
  import dmd.errorsink;
  import dmd.expression;
  import dmd.func;
  import dmd.globals;
  import dmd.hdrgen;
  import dmd.id;
*************** import dmd.optimize;
*** 74,89 ****
  import dmd.root.array;
  import dmd.common.outbuffer;
  import dmd.rootobject;
! import dmd.semantic3 : semantic3;
! import dmd.templatesem : matchWithInstance, formatParamsWithTiargs, leastAsSpecialized, declareParameter;
  import dmd.tokens;
! import dmd.typesem : hasPointers, typeSemantic, merge, merge2, resolve, toDsymbol,
!                      addStorageClass, isBaseOf, equivalent, sarrayOf, constOf, mutableOf, unSharedOf,
!                      unqualify, aliasthisOf, castMod, substWildTo, addMod;
  import dmd.visitor;
  
- import dmd.templateparamsem;
- 
  //debug = FindExistingInstance; // print debug stats of findExistingInstance
  private enum LOG = false;
  
--- 72,82 ----
  import dmd.root.array;
  import dmd.common.outbuffer;
  import dmd.rootobject;
! import dmd.templatesem : getExpression, TemplateInstance_semanticTiargs;
  import dmd.tokens;
! import dmd.typesem : typeSemantic, isBaseOf, resolveNamedArgs;
  import dmd.visitor;
  
  //debug = FindExistingInstance; // print debug stats of findExistingInstance
  private enum LOG = false;
  
*************** inout(Type) getType(inout RootObject o)
*** 202,277 ****
  
  }
  
- /***********************************
-  * If oarg represents a Dsymbol, return that Dsymbol
-  * Params:
-  *      oarg = argument to check
-  * Returns:
-  *      Dsymbol if a symbol, null if not
-  */
- Dsymbol getDsymbol(RootObject oarg)
- {
-     //printf("getDsymbol()\n");
-     //printf("e %p s %p t %p v %p\n", isExpression(oarg), isDsymbol(oarg), isType(oarg), isTuple(oarg));
-     if (auto ea = isExpression(oarg))
-     {
-         // Try to convert Expression to symbol
-         if (auto ve = ea.isVarExp())
-             return ve.var;
-         if (auto fe = ea.isFuncExp())
-             return fe.td ? fe.td : fe.fd;
-         if (auto te = ea.isTemplateExp())
-             return te.td;
-         if (auto te = ea.isScopeExp())
-             return te.sds;
-         return null;
-     }
-     // Try to convert Type to symbol
-     if (auto ta = isType(oarg))
-         return ta.toDsymbol(null);
-     return isDsymbol(oarg); // if already a symbol
- }
- 
- 
- private Expression getValue(ref Dsymbol s)
- {
-     if (s)
-     {
-         if (VarDeclaration v = s.isVarDeclaration())
-         {
-             if (v.storage_class & STC.manifest)
-                 return v.getConstInitializer();
-         }
-     }
-     return null;
- }
- 
- /***********************
-  * Try to get value from manifest constant
-  */
- private Expression getValue(Expression e)
- {
-     if (!e)
-         return null;
-     if (auto ve = e.isVarExp())
-     {
-         if (auto v = ve.var.isVarDeclaration())
-         {
-             if (v.storage_class & STC.manifest)
-             {
-                 e = v.getConstInitializer();
-             }
-         }
-     }
-     return e;
- }
- 
- private Expression getExpression(RootObject o)
- {
-     auto s = isDsymbol(o);
-     return s ? .getValue(s) : .getValue(isExpression(o));
- }
- 
  /******************************
   * See if two objects match
   * Params:
--- 195,200 ----
*************** private Expression getExpression(RootObj
*** 279,285 ****
   *      o2 = second object
   * Returns: true if they match
   */
! private bool match(RootObject o1, RootObject o2)
  {
      enum log = false;
  
--- 202,208 ----
   *      o2 = second object
   * Returns: true if they match
   */
! bool match(RootObject o1, RootObject o2)
  {
      enum log = false;
  
*************** extern (C++) final class TemplateDeclara
*** 593,598 ****
--- 516,522 ----
      bool isTrivialAliasSeq; /// matches pattern `template AliasSeq(T...) { alias AliasSeq = T; }`
      bool isTrivialAlias;    /// matches pattern `template Alias(T) { alias Alias = qualifiers(T); }`
      bool deprecated_;       /// this template declaration is deprecated
+     bool isCmacro;          /// Whether this template is a translation of a C macro
      Visibility visibility;
  
      // threaded list of previous instantiation attempts on stack
*************** extern (C++) final class TemplateDeclara
*** 639,645 ****
              return;
  
          Dsymbol s;
!         if (!Dsymbol.oneMembers(members, s, ident) || !s)
              return;
  
          onemember = s;
--- 563,569 ----
              return;
  
          Dsymbol s;
!         if (!oneMembers(members, s, ident) || !s)
              return;
  
          onemember = s;
*************** extern (C++) final class TemplateDeclara
*** 765,830 ****
          return visibility;
      }
  
-     /****************************
-      * Destructively get the error message from the last constraint evaluation
-      * Params:
-      *      tip = tip to show after printing all overloads
-      */
-     const(char)* getConstraintEvalError(ref const(char)* tip)
-     {
-         import dmd.staticcond;
- 
-         // there will be a full tree view in verbose mode, and more compact list in the usual
-         const full = global.params.v.verbose;
-         uint count;
-         const msg = visualizeStaticCondition(constraint, lastConstraint, lastConstraintNegs[], full, count);
-         scope (exit)
-         {
-             lastConstraint = null;
-             lastConstraintTiargs = null;
-             lastConstraintNegs.setDim(0);
-         }
-         if (!msg)
-             return null;
- 
-         OutBuffer buf;
- 
-         assert(parameters && lastConstraintTiargs);
-         if (parameters.length > 0)
-         {
-             formatParamsWithTiargs(*parameters, *lastConstraintTiargs, isVariadic() !is null, buf);
-             buf.writenl();
-         }
-         if (!full)
-         {
-             // choosing singular/plural
-             const s = (count == 1) ?
-                 "  must satisfy the following constraint:" :
-                 "  must satisfy one of the following constraints:";
-             buf.writestring(s);
-             buf.writenl();
-             // the constraints
-             buf.writeByte('`');
-             buf.writestring(msg);
-             buf.writeByte('`');
-         }
-         else
-         {
-             buf.writestring("  whose parameters have the following constraints:");
-             buf.writenl();
-             const sep = "  `~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~`";
-             buf.writestring(sep);
-             buf.writenl();
-             // the constraints
-             buf.writeByte('`');
-             buf.writestring(msg);
-             buf.writeByte('`');
-             buf.writestring(sep);
-             tip = "not satisfied constraints are marked with `>`";
-         }
-         return buf.extractChars();
-     }
- 
      debug (FindExistingInstance)
      {
          __gshared uint nFound, nNotFound, nAdded, nRemoved;
--- 689,694 ----
*************** extern (C++) final class TypeDeduced : T
*** 946,2781 ****
          argexps.push(e);
          tparams.push(tparam);
      }
- 
-     MATCH matchAll(Type tt)
-     {
-         MATCH match = MATCH.exact;
-         foreach (j, e; argexps)
-         {
-             assert(e);
-             if (e == emptyArrayElement)
-                 continue;
- 
-             Type t = tt.addMod(tparams[j].mod).substWildTo(MODFlags.const_);
- 
-             MATCH m = e.implicitConvTo(t);
-             if (match > m)
-                 match = m;
-             if (match == MATCH.nomatch)
-                 break;
-         }
-         return match;
-     }
  }
  
- 
  /* ======================== Type ============================================ */
  
- /****
-  * Given an identifier, figure out which TemplateParameter it is.
-  * Return IDX_NOTFOUND if not found.
-  */
- private size_t templateIdentifierLookup(Identifier id, TemplateParameters* parameters)
- {
-     for (size_t i = 0; i < parameters.length; i++)
-     {
-         TemplateParameter tp = (*parameters)[i];
-         if (tp.ident.equals(id))
-             return i;
-     }
-     return IDX_NOTFOUND;
- }
- 
- size_t templateParameterLookup(Type tparam, TemplateParameters* parameters)
- {
-     if (TypeIdentifier tident = tparam.isTypeIdentifier())
-     {
-         //printf("\ttident = '%s'\n", tident.toChars());
-         return templateIdentifierLookup(tident.ident, parameters);
-     }
-     return IDX_NOTFOUND;
- }
- 
- private auto X(T, U)(T m, U n)
- {
-     return (m << 4) | n;
- }
- 
- ubyte deduceWildHelper(Type t, Type* at, Type tparam)
- {
-     if ((tparam.mod & MODFlags.wild) == 0)
-         return 0;
- 
-     *at = null;
- 
-     switch (X(tparam.mod, t.mod))
-     {
-     case X(MODFlags.wild, 0):
-     case X(MODFlags.wild, MODFlags.const_):
-     case X(MODFlags.wild, MODFlags.shared_):
-     case X(MODFlags.wild, MODFlags.shared_ | MODFlags.const_):
-     case X(MODFlags.wild, MODFlags.immutable_):
-     case X(MODFlags.wildconst, 0):
-     case X(MODFlags.wildconst, MODFlags.const_):
-     case X(MODFlags.wildconst, MODFlags.shared_):
-     case X(MODFlags.wildconst, MODFlags.shared_ | MODFlags.const_):
-     case X(MODFlags.wildconst, MODFlags.immutable_):
-     case X(MODFlags.shared_ | MODFlags.wild, MODFlags.shared_):
-     case X(MODFlags.shared_ | MODFlags.wild, MODFlags.shared_ | MODFlags.const_):
-     case X(MODFlags.shared_ | MODFlags.wild, MODFlags.immutable_):
-     case X(MODFlags.shared_ | MODFlags.wildconst, MODFlags.shared_):
-     case X(MODFlags.shared_ | MODFlags.wildconst, MODFlags.shared_ | MODFlags.const_):
-     case X(MODFlags.shared_ | MODFlags.wildconst, MODFlags.immutable_):
-         {
-             ubyte wm = (t.mod & ~MODFlags.shared_);
-             if (wm == 0)
-                 wm = MODFlags.mutable;
-             ubyte m = (t.mod & (MODFlags.const_ | MODFlags.immutable_)) | (tparam.mod & t.mod & MODFlags.shared_);
-             *at = t.unqualify(m);
-             return wm;
-         }
-     case X(MODFlags.wild, MODFlags.wild):
-     case X(MODFlags.wild, MODFlags.wildconst):
-     case X(MODFlags.wild, MODFlags.shared_ | MODFlags.wild):
-     case X(MODFlags.wild, MODFlags.shared_ | MODFlags.wildconst):
-     case X(MODFlags.wildconst, MODFlags.wild):
-     case X(MODFlags.wildconst, MODFlags.wildconst):
-     case X(MODFlags.wildconst, MODFlags.shared_ | MODFlags.wild):
-     case X(MODFlags.wildconst, MODFlags.shared_ | MODFlags.wildconst):
-     case X(MODFlags.shared_ | MODFlags.wild, MODFlags.shared_ | MODFlags.wild):
-     case X(MODFlags.shared_ | MODFlags.wild, MODFlags.shared_ | MODFlags.wildconst):
-     case X(MODFlags.shared_ | MODFlags.wildconst, MODFlags.shared_ | MODFlags.wild):
-     case X(MODFlags.shared_ | MODFlags.wildconst, MODFlags.shared_ | MODFlags.wildconst):
-         {
-             *at = t.unqualify(tparam.mod & t.mod);
-             return MODFlags.wild;
-         }
-     default:
-         return 0;
-     }
- }
- 
- /**
-  * Returns the common type of the 2 types.
-  */
- private Type rawTypeMerge(Type t1, Type t2)
- {
-     if (t1.equals(t2))
-         return t1;
-     if (t1.equivalent(t2))
-         return t1.castMod(MODmerge(t1.mod, t2.mod));
- 
-     auto t1b = t1.toBasetype();
-     auto t2b = t2.toBasetype();
-     if (t1b.equals(t2b))
-         return t1b;
-     if (t1b.equivalent(t2b))
-         return t1b.castMod(MODmerge(t1b.mod, t2b.mod));
- 
-     auto ty = implicitConvCommonTy(t1b.ty, t2b.ty);
-     if (ty != Terror)
-         return Type.basic[ty];
- 
-     return null;
- }
- 
- MATCH deduceTypeHelper(Type t, out Type at, Type tparam)
- {
-     // 9*9 == 81 cases
-     switch (X(tparam.mod, t.mod))
-     {
-     case X(0, 0):
-     case X(0, MODFlags.const_):
-     case X(0, MODFlags.wild):
-     case X(0, MODFlags.wildconst):
-     case X(0, MODFlags.shared_):
-     case X(0, MODFlags.shared_ | MODFlags.const_):
-     case X(0, MODFlags.shared_ | MODFlags.wild):
-     case X(0, MODFlags.shared_ | MODFlags.wildconst):
-     case X(0, MODFlags.immutable_):
-         // foo(U)                       T                       => T
-         // foo(U)                       const(T)                => const(T)
-         // foo(U)                       inout(T)                => inout(T)
-         // foo(U)                       inout(const(T))         => inout(const(T))
-         // foo(U)                       shared(T)               => shared(T)
-         // foo(U)                       shared(const(T))        => shared(const(T))
-         // foo(U)                       shared(inout(T))        => shared(inout(T))
-         // foo(U)                       shared(inout(const(T))) => shared(inout(const(T)))
-         // foo(U)                       immutable(T)            => immutable(T)
-         {
-             at = t;
-             return MATCH.exact;
-         }
-     case X(MODFlags.const_, MODFlags.const_):
-     case X(MODFlags.wild, MODFlags.wild):
-     case X(MODFlags.wildconst, MODFlags.wildconst):
-     case X(MODFlags.shared_, MODFlags.shared_):
-     case X(MODFlags.shared_ | MODFlags.const_, MODFlags.shared_ | MODFlags.const_):
-     case X(MODFlags.shared_ | MODFlags.wild, MODFlags.shared_ | MODFlags.wild):
-     case X(MODFlags.shared_ | MODFlags.wildconst, MODFlags.shared_ | MODFlags.wildconst):
-     case X(MODFlags.immutable_, MODFlags.immutable_):
-         // foo(const(U))                const(T)                => T
-         // foo(inout(U))                inout(T)                => T
-         // foo(inout(const(U)))         inout(const(T))         => T
-         // foo(shared(U))               shared(T)               => T
-         // foo(shared(const(U)))        shared(const(T))        => T
-         // foo(shared(inout(U)))        shared(inout(T))        => T
-         // foo(shared(inout(const(U)))) shared(inout(const(T))) => T
-         // foo(immutable(U))            immutable(T)            => T
-         {
-             at = t.mutableOf().unSharedOf();
-             return MATCH.exact;
-         }
-     case X(MODFlags.const_, MODFlags.shared_ | MODFlags.const_):
-     case X(MODFlags.wild, MODFlags.shared_ | MODFlags.wild):
-     case X(MODFlags.wildconst, MODFlags.shared_ | MODFlags.wildconst):
-         // foo(const(U))                shared(const(T))        => shared(T)
-         // foo(inout(U))                shared(inout(T))        => shared(T)
-         // foo(inout(const(U)))         shared(inout(const(T))) => shared(T)
-         {
-             at = t.mutableOf();
-             return MATCH.exact;
-         }
-     case X(MODFlags.const_, 0):
-     case X(MODFlags.const_, MODFlags.wild):
-     case X(MODFlags.const_, MODFlags.wildconst):
-     case X(MODFlags.const_, MODFlags.shared_ | MODFlags.wild):
-     case X(MODFlags.const_, MODFlags.shared_ | MODFlags.wildconst):
-     case X(MODFlags.const_, MODFlags.immutable_):
-     case X(MODFlags.shared_ | MODFlags.const_, MODFlags.immutable_):
-         // foo(const(U))                T                       => T
-         // foo(const(U))                inout(T)                => T
-         // foo(const(U))                inout(const(T))         => T
-         // foo(const(U))                shared(inout(T))        => shared(T)
-         // foo(const(U))                shared(inout(const(T))) => shared(T)
-         // foo(const(U))                immutable(T)            => T
-         // foo(shared(const(U)))        immutable(T)            => T
-         {
-             at = t.mutableOf();
-             return MATCH.constant;
-         }
-     case X(MODFlags.const_, MODFlags.shared_):
-         // foo(const(U))                shared(T)               => shared(T)
-         {
-             at = t;
-             return MATCH.constant;
-         }
-     case X(MODFlags.shared_, MODFlags.shared_ | MODFlags.const_):
-     case X(MODFlags.shared_, MODFlags.shared_ | MODFlags.wild):
-     case X(MODFlags.shared_, MODFlags.shared_ | MODFlags.wildconst):
-         // foo(shared(U))               shared(const(T))        => const(T)
-         // foo(shared(U))               shared(inout(T))        => inout(T)
-         // foo(shared(U))               shared(inout(const(T))) => inout(const(T))
-         {
-             at = t.unSharedOf();
-             return MATCH.exact;
-         }
-     case X(MODFlags.shared_ | MODFlags.const_, MODFlags.shared_):
-         // foo(shared(const(U)))        shared(T)               => T
-         {
-             at = t.unSharedOf();
-             return MATCH.constant;
-         }
-     case X(MODFlags.wildconst, MODFlags.immutable_):
-     case X(MODFlags.shared_ | MODFlags.const_, MODFlags.shared_ | MODFlags.wildconst):
-     case X(MODFlags.shared_ | MODFlags.wildconst, MODFlags.immutable_):
-     case X(MODFlags.shared_ | MODFlags.wildconst, MODFlags.shared_ | MODFlags.wild):
-         // foo(inout(const(U)))         immutable(T)            => T
-         // foo(shared(const(U)))        shared(inout(const(T))) => T
-         // foo(shared(inout(const(U)))) immutable(T)            => T
-         // foo(shared(inout(const(U)))) shared(inout(T))        => T
-         {
-             at = t.unSharedOf().mutableOf();
-             return MATCH.constant;
-         }
-     case X(MODFlags.shared_ | MODFlags.const_, MODFlags.shared_ | MODFlags.wild):
-         // foo(shared(const(U)))        shared(inout(T))        => T
-         {
-             at = t.unSharedOf().mutableOf();
-             return MATCH.constant;
-         }
-     case X(MODFlags.wild, 0):
-     case X(MODFlags.wild, MODFlags.const_):
-     case X(MODFlags.wild, MODFlags.wildconst):
-     case X(MODFlags.wild, MODFlags.immutable_):
-     case X(MODFlags.wild, MODFlags.shared_):
-     case X(MODFlags.wild, MODFlags.shared_ | MODFlags.const_):
-     case X(MODFlags.wild, MODFlags.shared_ | MODFlags.wildconst):
-     case X(MODFlags.wildconst, 0):
-     case X(MODFlags.wildconst, MODFlags.const_):
-     case X(MODFlags.wildconst, MODFlags.wild):
-     case X(MODFlags.wildconst, MODFlags.shared_):
-     case X(MODFlags.wildconst, MODFlags.shared_ | MODFlags.const_):
-     case X(MODFlags.wildconst, MODFlags.shared_ | MODFlags.wild):
-     case X(MODFlags.shared_, 0):
-     case X(MODFlags.shared_, MODFlags.const_):
-     case X(MODFlags.shared_, MODFlags.wild):
-     case X(MODFlags.shared_, MODFlags.wildconst):
-     case X(MODFlags.shared_, MODFlags.immutable_):
-     case X(MODFlags.shared_ | MODFlags.const_, 0):
-     case X(MODFlags.shared_ | MODFlags.const_, MODFlags.const_):
-     case X(MODFlags.shared_ | MODFlags.const_, MODFlags.wild):
-     case X(MODFlags.shared_ | MODFlags.const_, MODFlags.wildconst):
-     case X(MODFlags.shared_ | MODFlags.wild, 0):
-     case X(MODFlags.shared_ | MODFlags.wild, MODFlags.const_):
-     case X(MODFlags.shared_ | MODFlags.wild, MODFlags.wild):
-     case X(MODFlags.shared_ | MODFlags.wild, MODFlags.wildconst):
-     case X(MODFlags.shared_ | MODFlags.wild, MODFlags.immutable_):
-     case X(MODFlags.shared_ | MODFlags.wild, MODFlags.shared_):
-     case X(MODFlags.shared_ | MODFlags.wild, MODFlags.shared_ | MODFlags.const_):
-     case X(MODFlags.shared_ | MODFlags.wild, MODFlags.shared_ | MODFlags.wildconst):
-     case X(MODFlags.shared_ | MODFlags.wildconst, 0):
-     case X(MODFlags.shared_ | MODFlags.wildconst, MODFlags.const_):
-     case X(MODFlags.shared_ | MODFlags.wildconst, MODFlags.wild):
-     case X(MODFlags.shared_ | MODFlags.wildconst, MODFlags.wildconst):
-     case X(MODFlags.shared_ | MODFlags.wildconst, MODFlags.shared_):
-     case X(MODFlags.shared_ | MODFlags.wildconst, MODFlags.shared_ | MODFlags.const_):
-     case X(MODFlags.immutable_, 0):
-     case X(MODFlags.immutable_, MODFlags.const_):
-     case X(MODFlags.immutable_, MODFlags.wild):
-     case X(MODFlags.immutable_, MODFlags.wildconst):
-     case X(MODFlags.immutable_, MODFlags.shared_):
-     case X(MODFlags.immutable_, MODFlags.shared_ | MODFlags.const_):
-     case X(MODFlags.immutable_, MODFlags.shared_ | MODFlags.wild):
-     case X(MODFlags.immutable_, MODFlags.shared_ | MODFlags.wildconst):
-         // foo(inout(U))                T                       => nomatch
-         // foo(inout(U))                const(T)                => nomatch
-         // foo(inout(U))                inout(const(T))         => nomatch
-         // foo(inout(U))                immutable(T)            => nomatch
-         // foo(inout(U))                shared(T)               => nomatch
-         // foo(inout(U))                shared(const(T))        => nomatch
-         // foo(inout(U))                shared(inout(const(T))) => nomatch
-         // foo(inout(const(U)))         T                       => nomatch
-         // foo(inout(const(U)))         const(T)                => nomatch
-         // foo(inout(const(U)))         inout(T)                => nomatch
-         // foo(inout(const(U)))         shared(T)               => nomatch
-         // foo(inout(const(U)))         shared(const(T))        => nomatch
-         // foo(inout(const(U)))         shared(inout(T))        => nomatch
-         // foo(shared(U))               T                       => nomatch
-         // foo(shared(U))               const(T)                => nomatch
-         // foo(shared(U))               inout(T)                => nomatch
-         // foo(shared(U))               inout(const(T))         => nomatch
-         // foo(shared(U))               immutable(T)            => nomatch
-         // foo(shared(const(U)))        T                       => nomatch
-         // foo(shared(const(U)))        const(T)                => nomatch
-         // foo(shared(const(U)))        inout(T)                => nomatch
-         // foo(shared(const(U)))        inout(const(T))         => nomatch
-         // foo(shared(inout(U)))        T                       => nomatch
-         // foo(shared(inout(U)))        const(T)                => nomatch
-         // foo(shared(inout(U)))        inout(T)                => nomatch
-         // foo(shared(inout(U)))        inout(const(T))         => nomatch
-         // foo(shared(inout(U)))        immutable(T)            => nomatch
-         // foo(shared(inout(U)))        shared(T)               => nomatch
-         // foo(shared(inout(U)))        shared(const(T))        => nomatch
-         // foo(shared(inout(U)))        shared(inout(const(T))) => nomatch
-         // foo(shared(inout(const(U)))) T                       => nomatch
-         // foo(shared(inout(const(U)))) const(T)                => nomatch
-         // foo(shared(inout(const(U)))) inout(T)                => nomatch
-         // foo(shared(inout(const(U)))) inout(const(T))         => nomatch
-         // foo(shared(inout(const(U)))) shared(T)               => nomatch
-         // foo(shared(inout(const(U)))) shared(const(T))        => nomatch
-         // foo(immutable(U))            T                       => nomatch
-         // foo(immutable(U))            const(T)                => nomatch
-         // foo(immutable(U))            inout(T)                => nomatch
-         // foo(immutable(U))            inout(const(T))         => nomatch
-         // foo(immutable(U))            shared(T)               => nomatch
-         // foo(immutable(U))            shared(const(T))        => nomatch
-         // foo(immutable(U))            shared(inout(T))        => nomatch
-         // foo(immutable(U))            shared(inout(const(T))) => nomatch
-         return MATCH.nomatch;
- 
-     default:
-         assert(0);
-     }
- }
- 
- __gshared Expression emptyArrayElement = null;
- 
- /* These form the heart of template argument deduction.
-  * Given 'this' being the type argument to the template instance,
-  * it is matched against the template declaration parameter specialization
-  * 'tparam' to determine the type to be used for the parameter.
-  * Example:
-  *      template Foo(T:T*)      // template declaration
-  *      Foo!(int*)              // template instantiation
-  * Input:
-  *      this = int*
-  *      tparam = T*
-  *      parameters = [ T:T* ]   // Array of TemplateParameter's
-  * Output:
-  *      dedtypes = [ int ]      // Array of Expression/Type's
-  */
- MATCH deduceType(RootObject o, Scope* sc, Type tparam, ref TemplateParameters parameters, ref Objects dedtypes, uint* wm = null, size_t inferStart = 0, bool ignoreAliasThis = false)
- {
-     extern (C++) final class DeduceType : Visitor
-     {
-         alias visit = Visitor.visit;
-     public:
-         MATCH result;
- 
-         extern (D) this() @safe
-         {
-             result = MATCH.nomatch;
-         }
- 
-         override void visit(Type t)
-         {
-             if (!tparam)
-                 goto Lnomatch;
- 
-             if (t == tparam)
-                 goto Lexact;
- 
-             if (tparam.ty == Tident)
-             {
-                 // Determine which parameter tparam is
-                 size_t i = templateParameterLookup(tparam, &parameters);
-                 if (i == IDX_NOTFOUND)
-                 {
-                     if (!sc)
-                         goto Lnomatch;
- 
-                     /* Need a loc to go with the semantic routine.
-                      */
-                     Loc loc;
-                     if (parameters.length)
-                     {
-                         TemplateParameter tp = parameters[0];
-                         loc = tp.loc;
-                     }
- 
-                     /* BUG: what if tparam is a template instance, that
-                      * has as an argument another Tident?
-                      */
-                     tparam = tparam.typeSemantic(loc, sc);
-                     assert(tparam.ty != Tident);
-                     result = deduceType(t, sc, tparam, parameters, dedtypes, wm);
-                     return;
-                 }
- 
-                 TemplateParameter tp = parameters[i];
- 
-                 TypeIdentifier tident = tparam.isTypeIdentifier();
-                 if (tident.idents.length > 0)
-                 {
-                     //printf("matching %s to %s\n", tparam.toChars(), t.toChars());
-                     Dsymbol s = t.toDsymbol(sc);
-                     for (size_t j = tident.idents.length; j-- > 0;)
-                     {
-                         RootObject id = tident.idents[j];
-                         if (id.dyncast() == DYNCAST.identifier)
-                         {
-                             if (!s || !s.parent)
-                                 goto Lnomatch;
-                             Dsymbol s2 = s.parent.search(Loc.initial, cast(Identifier)id);
-                             if (!s2)
-                                 goto Lnomatch;
-                             s2 = s2.toAlias();
-                             //printf("[%d] s = %s %s, s2 = %s %s\n", j, s.kind(), s.toChars(), s2.kind(), s2.toChars());
-                             if (s != s2)
-                             {
-                                 if (Type tx = s2.getType())
-                                 {
-                                     if (s != tx.toDsymbol(sc))
-                                         goto Lnomatch;
-                                 }
-                                 else
-                                     goto Lnomatch;
-                             }
-                             s = s.parent;
-                         }
-                         else
-                             goto Lnomatch;
-                     }
-                     //printf("[e] s = %s\n", s?s.toChars():"(null)");
-                     if (tp.isTemplateTypeParameter())
-                     {
-                         Type tt = s.getType();
-                         if (!tt)
-                             goto Lnomatch;
-                         Type at = cast(Type)dedtypes[i];
-                         if (at && at.ty == Tnone)
-                             at = (cast(TypeDeduced)at).tded;
-                         if (!at || tt.equals(at))
-                         {
-                             dedtypes[i] = tt;
-                             goto Lexact;
-                         }
-                     }
-                     if (tp.isTemplateAliasParameter())
-                     {
-                         Dsymbol s2 = cast(Dsymbol)dedtypes[i];
-                         if (!s2 || s == s2)
-                         {
-                             dedtypes[i] = s;
-                             goto Lexact;
-                         }
-                     }
-                     goto Lnomatch;
-                 }
- 
-                 // Found the corresponding parameter tp
-                 /+
-                     https://issues.dlang.org/show_bug.cgi?id=23578
-                     To pattern match:
-                     static if (is(S!int == S!av, alias av))
- 
-                     We eventually need to deduce `int` (Tint32 [0]) and `av` (Tident).
-                     Previously this would not get pattern matched at all, but now we check if the
-                     template parameter `av` came from.
- 
-                     This note has been left to serve as a hint for further explorers into
-                     how IsExp matching works.
-                 +/
-                 if (auto ta = tp.isTemplateAliasParameter())
-                 {
-                     dedtypes[i] = t;
-                     goto Lexact;
-                 }
-                 // (23578) - ensure previous behaviour for non-alias template params
-                 if (!tp.isTemplateTypeParameter())
-                 {
-                     goto Lnomatch;
-                 }
- 
-                 Type at = cast(Type)dedtypes[i];
-                 Type tt;
-                 if (ubyte wx = wm ? deduceWildHelper(t, &tt, tparam) : 0)
-                 {
-                     // type vs (none)
-                     if (!at)
-                     {
-                         dedtypes[i] = tt;
-                         *wm |= wx;
-                         result = MATCH.constant;
-                         return;
-                     }
- 
-                     // type vs expressions
-                     if (at.ty == Tnone)
-                     {
-                         auto xt = cast(TypeDeduced)at;
-                         result = xt.matchAll(tt);
-                         if (result > MATCH.nomatch)
-                         {
-                             dedtypes[i] = tt;
-                             if (result > MATCH.constant)
-                                 result = MATCH.constant; // limit level for inout matches
-                         }
-                         return;
-                     }
- 
-                     // type vs type
-                     if (tt.equals(at))
-                     {
-                         dedtypes[i] = tt; // Prefer current type match
-                         goto Lconst;
-                     }
-                     if (tt.implicitConvTo(at.constOf()))
-                     {
-                         dedtypes[i] = at.constOf().mutableOf();
-                         *wm |= MODFlags.const_;
-                         goto Lconst;
-                     }
-                     if (at.implicitConvTo(tt.constOf()))
-                     {
-                         dedtypes[i] = tt.constOf().mutableOf();
-                         *wm |= MODFlags.const_;
-                         goto Lconst;
-                     }
-                     goto Lnomatch;
-                 }
-                 else if (MATCH m = deduceTypeHelper(t, tt, tparam))
-                 {
-                     // type vs (none)
-                     if (!at)
-                     {
-                         dedtypes[i] = tt;
-                         result = m;
-                         return;
-                     }
- 
-                     // type vs expressions
-                     if (at.ty == Tnone)
-                     {
-                         auto xt = cast(TypeDeduced)at;
-                         result = xt.matchAll(tt);
-                         if (result > MATCH.nomatch)
-                         {
-                             dedtypes[i] = tt;
-                         }
-                         return;
-                     }
- 
-                     // type vs type
-                     if (tt.equals(at))
-                     {
-                         goto Lexact;
-                     }
-                     if (tt.ty == Tclass && at.ty == Tclass)
-                     {
-                         result = tt.implicitConvTo(at);
-                         return;
-                     }
-                     if (tt.ty == Tsarray && at.ty == Tarray && tt.nextOf().implicitConvTo(at.nextOf()) >= MATCH.constant)
-                     {
-                         goto Lexact;
-                     }
-                 }
-                 goto Lnomatch;
-             }
- 
-             if (tparam.ty == Ttypeof)
-             {
-                 /* Need a loc to go with the semantic routine.
-                  */
-                 Loc loc;
-                 if (parameters.length)
-                 {
-                     TemplateParameter tp = parameters[0];
-                     loc = tp.loc;
-                 }
- 
-                 tparam = tparam.typeSemantic(loc, sc);
-             }
-             if (t.ty != tparam.ty)
-             {
-                 if (Dsymbol sym = t.toDsymbol(sc))
-                 {
-                     if (sym.isforwardRef() && !tparam.deco)
-                         goto Lnomatch;
-                 }
- 
-                 MATCH m = t.implicitConvTo(tparam);
-                 if (m == MATCH.nomatch && !ignoreAliasThis)
-                 {
-                     if (auto tc = t.isTypeClass())
-                     {
-                         if (tc.sym.aliasthis && !(tc.att & AliasThisRec.tracingDT))
-                         {
-                             if (auto ato = t.aliasthisOf())
-                             {
-                                 tc.att = cast(AliasThisRec)(tc.att | AliasThisRec.tracingDT);
-                                 m = deduceType(ato, sc, tparam, parameters, dedtypes, wm);
-                                 tc.att = cast(AliasThisRec)(tc.att & ~AliasThisRec.tracingDT);
-                             }
-                         }
-                     }
-                     else if (auto ts = t.isTypeStruct())
-                     {
-                         if (ts.sym.aliasthis && !(ts.att & AliasThisRec.tracingDT))
-                         {
-                             if (auto ato = t.aliasthisOf())
-                             {
-                                 ts.att = cast(AliasThisRec)(ts.att | AliasThisRec.tracingDT);
-                                 m = deduceType(ato, sc, tparam, parameters, dedtypes, wm);
-                                 ts.att = cast(AliasThisRec)(ts.att & ~AliasThisRec.tracingDT);
-                             }
-                         }
-                     }
-                 }
-                 result = m;
-                 return;
-             }
- 
-             if (t.nextOf())
-             {
-                 if (tparam.deco && !tparam.hasWild())
-                 {
-                     result = t.implicitConvTo(tparam);
-                     return;
-                 }
- 
-                 Type tpn = tparam.nextOf();
-                 if (wm && t.ty == Taarray && tparam.isWild())
-                 {
-                     // https://issues.dlang.org/show_bug.cgi?id=12403
-                     // In IFTI, stop inout matching on transitive part of AA types.
-                     tpn = tpn.substWildTo(MODFlags.mutable);
-                 }
- 
-                 result = deduceType(t.nextOf(), sc, tpn, parameters, dedtypes, wm);
-                 return;
-             }
- 
-         Lexact:
-             result = MATCH.exact;
-             return;
- 
-         Lnomatch:
-             result = MATCH.nomatch;
-             return;
- 
-         Lconst:
-             result = MATCH.constant;
-         }
- 
-         override void visit(TypeVector t)
-         {
-             if (auto tp = tparam.isTypeVector())
-             {
-                 result = deduceType(t.basetype, sc, tp.basetype, parameters, dedtypes, wm);
-                 return;
-             }
-             visit(cast(Type)t);
-         }
- 
-         override void visit(TypeDArray t)
-         {
-             visit(cast(Type)t);
-         }
- 
-         override void visit(TypeSArray t)
-         {
-             // Extra check that array dimensions must match
-             if (!tparam)
-             {
-                 visit(cast(Type)t);
-                 return;
-             }
- 
-             if (tparam.ty == Tarray)
-             {
-                 MATCH m = deduceType(t.next, sc, tparam.nextOf(), parameters, dedtypes, wm);
-                 result = (m >= MATCH.constant) ? MATCH.convert : MATCH.nomatch;
-                 return;
-             }
- 
-             TemplateParameter tp = null;
-             Expression edim = null;
-             size_t i;
-             if (auto tsa = tparam.isTypeSArray())
-             {
-                 if (tsa.dim.isVarExp() && tsa.dim.isVarExp().var.storage_class & STC.templateparameter)
-                 {
-                     Identifier id = tsa.dim.isVarExp().var.ident;
-                     i = templateIdentifierLookup(id, &parameters);
-                     assert(i != IDX_NOTFOUND);
-                     tp = parameters[i];
-                 }
-                 else
-                     edim = tsa.dim;
-             }
-             else if (auto taa = tparam.isTypeAArray())
-             {
-                 i = templateParameterLookup(taa.index, &parameters);
-                 if (i != IDX_NOTFOUND)
-                     tp = parameters[i];
-                 else
-                 {
-                     Loc loc;
-                     // The "type" (it hasn't been resolved yet) of the function parameter
-                     // does not have a location but the parameter it is related to does,
-                     // so we use that for the resolution (better error message).
-                     if (inferStart < parameters.length)
-                     {
-                         TemplateParameter loctp = parameters[inferStart];
-                         loc = loctp.loc;
-                     }
- 
-                     Expression e;
-                     Type tx;
-                     Dsymbol s;
-                     taa.index.resolve(loc, sc, e, tx, s);
-                     edim = s ? getValue(s) : getValue(e);
-                 }
-             }
-             if ((tp && tp.matchArg(sc, t.dim, i, &parameters, dedtypes, null)) ||
-                 (edim && edim.isIntegerExp() && edim.toInteger() == t.dim.toInteger())
-             )
-             {
-                 result = deduceType(t.next, sc, tparam.nextOf(), parameters, dedtypes, wm);
-                 return;
-             }
- 
-             visit(cast(Type)t);
-         }
- 
-         override void visit(TypeAArray t)
-         {
-             // Extra check that index type must match
-             if (tparam && tparam.ty == Taarray)
-             {
-                 TypeAArray tp = tparam.isTypeAArray();
-                 if (!deduceType(t.index, sc, tp.index, parameters, dedtypes))
-                 {
-                     result = MATCH.nomatch;
-                     return;
-                 }
-             }
-             visit(cast(Type)t);
-         }
- 
-         override void visit(TypeFunction t)
-         {
-             // Extra check that function characteristics must match
-             if (!tparam)
-                 return visit(cast(Type)t);
- 
-             auto tp = tparam.isTypeFunction();
-             if (!tp)
-             {
-                 visit(cast(Type)t);
-                 return;
-             }
- 
-             if (t.parameterList.varargs != tp.parameterList.varargs || t.linkage != tp.linkage)
-             {
-                 result = MATCH.nomatch;
-                 return;
-             }
- 
-             foreach (fparam; *tp.parameterList.parameters)
-             {
-                 // https://issues.dlang.org/show_bug.cgi?id=2579
-                 // Apply function parameter storage classes to parameter types
-                 fparam.type = fparam.type.addStorageClass(fparam.storageClass);
-                 fparam.storageClass &= ~STC.TYPECTOR;
- 
-                 // https://issues.dlang.org/show_bug.cgi?id=15243
-                 // Resolve parameter type if it's not related with template parameters
-                 if (!reliesOnTemplateParameters(fparam.type, parameters[inferStart .. parameters.length]))
-                 {
-                     auto tx = fparam.type.typeSemantic(Loc.initial, sc);
-                     if (tx.ty == Terror)
-                     {
-                         result = MATCH.nomatch;
-                         return;
-                     }
-                     fparam.type = tx;
-                 }
-             }
- 
-             const size_t nfargs = t.parameterList.length;
-             size_t nfparams = tp.parameterList.length;
- 
-             /* See if tuple match
-              */
-             if (nfparams > 0 && nfargs >= nfparams - 1)
-             {
-                 /* See if 'A' of the template parameter matches 'A'
-                  * of the type of the last function parameter.
-                  */
-                 Parameter fparam = tp.parameterList[nfparams - 1];
-                 assert(fparam);
-                 assert(fparam.type);
-                 if (fparam.type.ty != Tident)
-                     goto L1;
-                 TypeIdentifier tid = fparam.type.isTypeIdentifier();
-                 if (tid.idents.length)
-                     goto L1;
- 
-                 /* Look through parameters to find tuple matching tid.ident
-                  */
-                 size_t tupi = 0;
-                 for (; 1; tupi++)
-                 {
-                     if (tupi == parameters.length)
-                         goto L1;
-                     TemplateParameter tx = parameters[tupi];
-                     TemplateTupleParameter tup = tx.isTemplateTupleParameter();
-                     if (tup && tup.ident.equals(tid.ident))
-                         break;
-                 }
- 
-                 /* The types of the function arguments [nfparams - 1 .. nfargs]
-                  * now form the tuple argument.
-                  */
-                 size_t tuple_dim = nfargs - (nfparams - 1);
- 
-                 /* See if existing tuple, and whether it matches or not
-                  */
-                 RootObject o = dedtypes[tupi];
-                 if (o)
-                 {
-                     // Existing deduced argument must be a tuple, and must match
-                     Tuple tup = isTuple(o);
-                     if (!tup || tup.objects.length != tuple_dim)
-                     {
-                         result = MATCH.nomatch;
-                         return;
-                     }
-                     for (size_t i = 0; i < tuple_dim; i++)
-                     {
-                         Parameter arg = t.parameterList[nfparams - 1 + i];
-                         if (!arg.type.equals(tup.objects[i]))
-                         {
-                             result = MATCH.nomatch;
-                             return;
-                         }
-                     }
-                 }
-                 else
-                 {
-                     // Create new tuple
-                     auto tup = new Tuple(tuple_dim);
-                     for (size_t i = 0; i < tuple_dim; i++)
-                     {
-                         Parameter arg = t.parameterList[nfparams - 1 + i];
-                         tup.objects[i] = arg.type;
-                     }
-                     dedtypes[tupi] = tup;
-                 }
-                 nfparams--; // don't consider the last parameter for type deduction
-                 goto L2;
-             }
- 
-         L1:
-             if (nfargs != nfparams)
-             {
-                 result = MATCH.nomatch;
-                 return;
-             }
-         L2:
-             assert(nfparams <= tp.parameterList.length);
-             foreach (i, ap; tp.parameterList)
-             {
-                 if (i == nfparams)
-                     break;
- 
-                 Parameter a = t.parameterList[i];
- 
-                 if (!a.isCovariant(t.isRef, ap) ||
-                     !deduceType(a.type, sc, ap.type, parameters, dedtypes))
-                 {
-                     result = MATCH.nomatch;
-                     return;
-                 }
-             }
- 
-             visit(cast(Type)t);
-         }
- 
-         override void visit(TypeIdentifier t)
-         {
-             // Extra check
-             if (tparam && tparam.ty == Tident)
-             {
-                 TypeIdentifier tp = tparam.isTypeIdentifier();
-                 for (size_t i = 0; i < t.idents.length; i++)
-                 {
-                     RootObject id1 = t.idents[i];
-                     RootObject id2 = tp.idents[i];
-                     if (!id1.equals(id2))
-                     {
-                         result = MATCH.nomatch;
-                         return;
-                     }
-                 }
-             }
-             visit(cast(Type)t);
-         }
- 
-         override void visit(TypeInstance t)
-         {
-             // Extra check
-             if (!tparam || tparam.ty != Tinstance || !t.tempinst.tempdecl)
-             {
-                 visit(cast(Type)t);
-                 return;
-             }
- 
-             TemplateDeclaration tempdecl = t.tempinst.tempdecl.isTemplateDeclaration();
-             assert(tempdecl);
- 
-             TypeInstance tp = tparam.isTypeInstance();
- 
-             //printf("tempinst.tempdecl = %p\n", tempdecl);
-             //printf("tp.tempinst.tempdecl = %p\n", tp.tempinst.tempdecl);
-             if (!tp.tempinst.tempdecl)
-             {
-                 //printf("tp.tempinst.name = '%s'\n", tp.tempinst.name.toChars());
- 
-                 /* Handle case of:
-                  *  template Foo(T : sa!(T), alias sa)
-                  */
-                 size_t i = templateIdentifierLookup(tp.tempinst.name, &parameters);
-                 if (i == IDX_NOTFOUND)
-                 {
-                     /* Didn't find it as a parameter identifier. Try looking
-                      * it up and seeing if is an alias.
-                      * https://issues.dlang.org/show_bug.cgi?id=1454
-                      */
-                     auto tid = new TypeIdentifier(tp.loc, tp.tempinst.name);
-                     Type tx;
-                     Expression e;
-                     Dsymbol s;
-                     tid.resolve(tp.loc, sc, e, tx, s);
-                     if (tx)
-                     {
-                         s = tx.toDsymbol(sc);
-                         if (TemplateInstance ti = s ? s.parent.isTemplateInstance() : null)
-                         {
-                             // https://issues.dlang.org/show_bug.cgi?id=14290
-                             // Try to match with ti.tempecl,
-                             // only when ti is an enclosing instance.
-                             Dsymbol p = sc.parent;
-                             while (p && p != ti)
-                                 p = p.parent;
-                             if (p)
-                                 s = ti.tempdecl;
-                         }
-                     }
-                     if (s)
-                     {
-                         s = s.toAlias();
-                         TemplateDeclaration td = s.isTemplateDeclaration();
-                         if (td)
-                         {
-                             if (td.overroot)
-                                 td = td.overroot;
-                             for (; td; td = td.overnext)
-                             {
-                                 if (td == tempdecl)
-                                     goto L2;
-                             }
-                         }
-                     }
-                     goto Lnomatch;
-                 }
- 
-                 TemplateParameter tpx = parameters[i];
-                 if (!tpx.matchArg(sc, tempdecl, i, &parameters, dedtypes, null))
-                     goto Lnomatch;
-             }
-             else if (tempdecl != tp.tempinst.tempdecl)
-                 goto Lnomatch;
- 
-         L2:
-             if (!resolveTemplateInstantiation(sc, &parameters, t.tempinst.tiargs, &t.tempinst.tdtypes, tempdecl, tp, &dedtypes))
-                 goto Lnomatch;
- 
-             visit(cast(Type)t);
-             return;
- 
-         Lnomatch:
-             //printf("no match\n");
-             result = MATCH.nomatch;
-         }
- 
-         override void visit(TypeStruct t)
-         {
-             /* If this struct is a template struct, and we're matching
-              * it against a template instance, convert the struct type
-              * to a template instance, too, and try again.
-              */
-             TemplateInstance ti = t.sym.parent.isTemplateInstance();
- 
-             if (tparam && tparam.ty == Tinstance)
-             {
-                 if (ti && ti.toAlias() == t.sym)
-                 {
-                     auto tx = new TypeInstance(Loc.initial, ti);
-                     auto m = deduceType(tx, sc, tparam, parameters, dedtypes, wm);
-                     // if we have a no match we still need to check alias this
-                     if (m != MATCH.nomatch)
-                     {
-                         result = m;
-                         return;
-                     }
-                 }
- 
-                 /* Match things like:
-                  *  S!(T).foo
-                  */
-                 TypeInstance tpi = tparam.isTypeInstance();
-                 if (tpi.idents.length)
-                 {
-                     RootObject id = tpi.idents[tpi.idents.length - 1];
-                     if (id.dyncast() == DYNCAST.identifier && t.sym.ident.equals(cast(Identifier)id))
-                     {
-                         Type tparent = t.sym.parent.getType();
-                         if (tparent)
-                         {
-                             /* Slice off the .foo in S!(T).foo
-                              */
-                             tpi.idents.length--;
-                             result = deduceType(tparent, sc, tpi, parameters, dedtypes, wm);
-                             tpi.idents.length++;
-                             return;
-                         }
-                     }
-                 }
-             }
- 
-             // Extra check
-             if (tparam && tparam.ty == Tstruct)
-             {
-                 TypeStruct tp = tparam.isTypeStruct();
- 
-                 //printf("\t%d\n", cast(MATCH) t.implicitConvTo(tp));
-                 if (wm && t.deduceWild(tparam, false))
-                 {
-                     result = MATCH.constant;
-                     return;
-                 }
-                 result = t.implicitConvTo(tp);
-                 return;
-             }
-             visit(cast(Type)t);
-         }
- 
-         override void visit(TypeEnum t)
-         {
-             // Extra check
-             if (tparam && tparam.ty == Tenum)
-             {
-                 TypeEnum tp = tparam.isTypeEnum();
-                 if (t.sym == tp.sym)
-                     visit(cast(Type)t);
-                 else
-                     result = MATCH.nomatch;
-                 return;
-             }
-             Type tb = t.toBasetype();
-             if (tb.ty == tparam.ty || tb.ty == Tsarray && tparam.ty == Taarray)
-             {
-                 result = deduceType(tb, sc, tparam, parameters, dedtypes, wm);
-                 if (result == MATCH.exact)
-                     result = MATCH.convert;
-                 return;
-             }
-             visit(cast(Type)t);
-         }
- 
-         override void visit(TypeClass t)
-         {
-             //printf("TypeClass.deduceType(this = %s)\n", t.toChars());
- 
-             /* If this class is a template class, and we're matching
-              * it against a template instance, convert the class type
-              * to a template instance, too, and try again.
-              */
-             TemplateInstance ti = t.sym.parent.isTemplateInstance();
- 
-             if (tparam && tparam.ty == Tinstance)
-             {
-                 if (ti && ti.toAlias() == t.sym)
-                 {
-                     auto tx = new TypeInstance(Loc.initial, ti);
-                     MATCH m = deduceType(tx, sc, tparam, parameters, dedtypes, wm);
-                     // Even if the match fails, there is still a chance it could match
-                     // a base class.
-                     if (m != MATCH.nomatch)
-                     {
-                         result = m;
-                         return;
-                     }
-                 }
- 
-                 /* Match things like:
-                  *  S!(T).foo
-                  */
-                 TypeInstance tpi = tparam.isTypeInstance();
-                 if (tpi.idents.length)
-                 {
-                     RootObject id = tpi.idents[tpi.idents.length - 1];
-                     if (id.dyncast() == DYNCAST.identifier && t.sym.ident.equals(cast(Identifier)id))
-                     {
-                         Type tparent = t.sym.parent.getType();
-                         if (tparent)
-                         {
-                             /* Slice off the .foo in S!(T).foo
-                              */
-                             tpi.idents.length--;
-                             result = deduceType(tparent, sc, tpi, parameters, dedtypes, wm);
-                             tpi.idents.length++;
-                             return;
-                         }
-                     }
-                 }
- 
-                 // If it matches exactly or via implicit conversion, we're done
-                 visit(cast(Type)t);
-                 if (result != MATCH.nomatch)
-                     return;
- 
-                 /* There is still a chance to match via implicit conversion to
-                  * a base class or interface. Because there could be more than one such
-                  * match, we need to check them all.
-                  */
- 
-                 int numBaseClassMatches = 0; // Have we found an interface match?
- 
-                 // Our best guess at dedtypes
-                 auto best = new Objects(dedtypes.length);
- 
-                 ClassDeclaration s = t.sym;
-                 while (s && s.baseclasses.length > 0)
-                 {
-                     // Test the base class
-                     deduceBaseClassParameters(*(*s.baseclasses)[0], sc, tparam, parameters, dedtypes, *best, numBaseClassMatches);
- 
-                     // Test the interfaces inherited by the base class
-                     foreach (b; s.interfaces)
-                     {
-                         deduceBaseClassParameters(*b, sc, tparam, parameters, dedtypes, *best, numBaseClassMatches);
-                     }
-                     s = (*s.baseclasses)[0].sym;
-                 }
- 
-                 if (numBaseClassMatches == 0)
-                 {
-                     result = MATCH.nomatch;
-                     return;
-                 }
- 
-                 // If we got at least one match, copy the known types into dedtypes
-                 memcpy(dedtypes.tdata(), best.tdata(), best.length * (void*).sizeof);
-                 result = MATCH.convert;
-                 return;
-             }
- 
-             // Extra check
-             if (tparam && tparam.ty == Tclass)
-             {
-                 TypeClass tp = tparam.isTypeClass();
- 
-                 //printf("\t%d\n", cast(MATCH) t.implicitConvTo(tp));
-                 if (wm && t.deduceWild(tparam, false))
-                 {
-                     result = MATCH.constant;
-                     return;
-                 }
-                 result = t.implicitConvTo(tp);
-                 return;
-             }
-             visit(cast(Type)t);
-         }
- 
-         override void visit(Expression e)
-         {
-             //printf("Expression.deduceType(e = %s)\n", e.toChars());
-             size_t i = templateParameterLookup(tparam, &parameters);
-             if (i == IDX_NOTFOUND || tparam.isTypeIdentifier().idents.length > 0)
-             {
-                 if (e == emptyArrayElement && tparam.ty == Tarray)
-                 {
-                     Type tn = (cast(TypeNext)tparam).next;
-                     result = deduceType(emptyArrayElement, sc, tn, parameters, dedtypes, wm);
-                     return;
-                 }
-                 e.type.accept(this);
-                 return;
-             }
- 
-             TemplateTypeParameter tp = parameters[i].isTemplateTypeParameter();
-             if (!tp)
-                 return; // nomatch
- 
-             if (e == emptyArrayElement)
-             {
-                 if (dedtypes[i])
-                 {
-                     result = MATCH.exact;
-                     return;
-                 }
-                 if (tp.defaultType)
-                 {
-                     tp.defaultType.accept(this);
-                     return;
-                 }
-             }
- 
-             /* Returns `true` if `t` is a reference type, or an array of reference types
-              */
-             bool isTopRef(Type t)
-             {
-                 auto tb = t.baseElemOf();
-                 return tb.ty == Tclass ||
-                        tb.ty == Taarray ||
-                        tb.ty == Tstruct && tb.hasPointers();
-             }
- 
-             Type at = cast(Type)dedtypes[i];
-             Type tt;
-             if (ubyte wx = deduceWildHelper(e.type, &tt, tparam))
-             {
-                 *wm |= wx;
-                 result = MATCH.constant;
-             }
-             else if (MATCH m = deduceTypeHelper(e.type, tt, tparam))
-             {
-                 result = m;
-             }
-             else if (!isTopRef(e.type))
-             {
-                 /* https://issues.dlang.org/show_bug.cgi?id=15653
-                  * In IFTI, recognize top-qualifier conversions
-                  * through the value copy, e.g.
-                  *      int --> immutable(int)
-                  *      immutable(string[]) --> immutable(string)[]
-                  */
-                 tt = e.type.mutableOf();
-                 result = MATCH.convert;
-             }
-             else
-                 return; // nomatch
- 
-             // expression vs (none)
-             if (!at)
-             {
-                 dedtypes[i] = new TypeDeduced(tt, e, tparam);
-                 return;
-             }
- 
-             TypeDeduced xt = null;
-             if (at.ty == Tnone)
-             {
-                 xt = cast(TypeDeduced)at;
-                 at = xt.tded;
-             }
- 
-             // From previous matched expressions to current deduced type
-             MATCH match1 = xt ? xt.matchAll(tt) : MATCH.nomatch;
- 
-             // From current expressions to previous deduced type
-             Type pt = at.addMod(tparam.mod);
-             if (*wm)
-                 pt = pt.substWildTo(*wm);
-             MATCH match2 = e.implicitConvTo(pt);
- 
-             if (match1 > MATCH.nomatch && match2 > MATCH.nomatch)
-             {
-                 if (at.implicitConvTo(tt) == MATCH.nomatch)
-                     match1 = MATCH.nomatch; // Prefer at
-                 else if (tt.implicitConvTo(at) == MATCH.nomatch)
-                     match2 = MATCH.nomatch; // Prefer tt
-                 else if (tt.isTypeBasic() && tt.ty == at.ty && tt.mod != at.mod)
-                 {
-                     if (!tt.isMutable() && !at.isMutable())
-                         tt = tt.mutableOf().addMod(MODmerge(tt.mod, at.mod));
-                     else if (tt.isMutable())
-                     {
-                         if (at.mod == 0) // Prefer unshared
-                             match1 = MATCH.nomatch;
-                         else
-                             match2 = MATCH.nomatch;
-                     }
-                     else if (at.isMutable())
-                     {
-                         if (tt.mod == 0) // Prefer unshared
-                             match2 = MATCH.nomatch;
-                         else
-                             match1 = MATCH.nomatch;
-                     }
-                     //printf("tt = %s, at = %s\n", tt.toChars(), at.toChars());
-                 }
-                 else
-                 {
-                     match1 = MATCH.nomatch;
-                     match2 = MATCH.nomatch;
-                 }
-             }
-             if (match1 > MATCH.nomatch)
-             {
-                 // Prefer current match: tt
-                 if (xt)
-                     xt.update(tt, e, tparam);
-                 else
-                     dedtypes[i] = tt;
-                 result = match1;
-                 return;
-             }
-             if (match2 > MATCH.nomatch)
-             {
-                 // Prefer previous match: (*dedtypes)[i]
-                 if (xt)
-                     xt.update(e, tparam);
-                 result = match2;
-                 return;
-             }
- 
-             /* Deduce common type
-              */
-             if (Type t = rawTypeMerge(at, tt))
-             {
-                 if (xt)
-                     xt.update(t, e, tparam);
-                 else
-                     dedtypes[i] = t;
- 
-                 pt = tt.addMod(tparam.mod);
-                 if (*wm)
-                     pt = pt.substWildTo(*wm);
-                 result = e.implicitConvTo(pt);
-                 return;
-             }
- 
-             result = MATCH.nomatch;
-         }
- 
-         MATCH deduceEmptyArrayElement()
-         {
-             if (!emptyArrayElement)
-             {
-                 emptyArrayElement = new IdentifierExp(Loc.initial, Id.p); // dummy
-                 emptyArrayElement.type = Type.tvoid;
-             }
-             assert(tparam.ty == Tarray);
- 
-             Type tn = (cast(TypeNext)tparam).next;
-             return deduceType(emptyArrayElement, sc, tn, parameters, dedtypes, wm);
-         }
- 
-         override void visit(NullExp e)
-         {
-             if (tparam.ty == Tarray && e.type.ty == Tnull)
-             {
-                 // tparam:T[] <- e:null (void[])
-                 result = deduceEmptyArrayElement();
-                 return;
-             }
-             visit(cast(Expression)e);
-         }
- 
-         override void visit(StringExp e)
-         {
-             Type taai;
-             if (e.type.ty == Tarray && (tparam.ty == Tsarray || tparam.ty == Taarray && (taai = (cast(TypeAArray)tparam).index).ty == Tident && (cast(TypeIdentifier)taai).idents.length == 0))
-             {
-                 // Consider compile-time known boundaries
-                 e.type.nextOf().sarrayOf(e.len).accept(this);
-                 return;
-             }
-             visit(cast(Expression)e);
-         }
- 
-         override void visit(ArrayLiteralExp e)
-         {
-             // https://issues.dlang.org/show_bug.cgi?id=20092
-             if (e.elements && e.elements.length && e.type.toBasetype().nextOf().ty == Tvoid)
-             {
-                 result = deduceEmptyArrayElement();
-                 return;
-             }
-             if ((!e.elements || !e.elements.length) && e.type.toBasetype().nextOf().ty == Tvoid && tparam.ty == Tarray)
-             {
-                 // tparam:T[] <- e:[] (void[])
-                 result = deduceEmptyArrayElement();
-                 return;
-             }
- 
-             if (tparam.ty == Tarray && e.elements && e.elements.length)
-             {
-                 Type tn = (cast(TypeDArray)tparam).next;
-                 result = MATCH.exact;
-                 if (e.basis)
-                 {
-                     MATCH m = deduceType(e.basis, sc, tn, parameters, dedtypes, wm);
-                     if (m < result)
-                         result = m;
-                 }
-                 foreach (el; *e.elements)
-                 {
-                     if (result == MATCH.nomatch)
-                         break;
-                     if (!el)
-                         continue;
-                     MATCH m = deduceType(el, sc, tn, parameters, dedtypes, wm);
-                     if (m < result)
-                         result = m;
-                 }
-                 return;
-             }
- 
-             Type taai;
-             if (e.type.ty == Tarray && (tparam.ty == Tsarray || tparam.ty == Taarray && (taai = (cast(TypeAArray)tparam).index).ty == Tident && (cast(TypeIdentifier)taai).idents.length == 0))
-             {
-                 // Consider compile-time known boundaries
-                 e.type.nextOf().sarrayOf(e.elements.length).accept(this);
-                 return;
-             }
-             visit(cast(Expression)e);
-         }
- 
-         override void visit(AssocArrayLiteralExp e)
-         {
-             if (tparam.ty == Taarray && e.keys && e.keys.length)
-             {
-                 TypeAArray taa = cast(TypeAArray)tparam;
-                 result = MATCH.exact;
-                 foreach (i, key; *e.keys)
-                 {
-                     MATCH m1 = deduceType(key, sc, taa.index, parameters, dedtypes, wm);
-                     if (m1 < result)
-                         result = m1;
-                     if (result == MATCH.nomatch)
-                         break;
-                     MATCH m2 = deduceType((*e.values)[i], sc, taa.next, parameters, dedtypes, wm);
-                     if (m2 < result)
-                         result = m2;
-                     if (result == MATCH.nomatch)
-                         break;
-                 }
-                 return;
-             }
-             visit(cast(Expression)e);
-         }
- 
-         override void visit(FuncExp e)
-         {
-             //printf("e.type = %s, tparam = %s\n", e.type.toChars(), tparam.toChars());
-             if (e.td)
-             {
-                 Type to = tparam;
-                 if (!to.nextOf())
-                     return;
-                 auto tof = to.nextOf().isTypeFunction();
-                 if (!tof)
-                     return;
- 
-                 // Parameter types inference from 'tof'
-                 assert(e.td._scope);
-                 TypeFunction tf = e.fd.type.isTypeFunction();
-                 //printf("\ttof = %s\n", tof.toChars());
-                 //printf("\ttf  = %s\n", tf.toChars());
-                 const dim = tf.parameterList.length;
- 
-                 if (tof.parameterList.length != dim || tof.parameterList.varargs != tf.parameterList.varargs)
-                     return;
- 
-                 auto tiargs = new Objects();
-                 tiargs.reserve(e.td.parameters.length);
- 
-                 foreach (tp; *e.td.parameters)
-                 {
-                     size_t u = 0;
-                     foreach (i, p; tf.parameterList)
-                     {
-                         if (p.type.ty == Tident && (cast(TypeIdentifier)p.type).ident == tp.ident)
-                             break;
-                         ++u;
-                     }
-                     assert(u < dim);
-                     Parameter pto = tof.parameterList[u];
-                     if (!pto)
-                         break;
-                     Type t = pto.type.syntaxCopy(); // https://issues.dlang.org/show_bug.cgi?id=11774
-                     if (reliesOnTemplateParameters(t, parameters[inferStart .. parameters.length]))
-                         return;
-                     t = t.typeSemantic(e.loc, sc);
-                     if (t.ty == Terror)
-                         return;
-                     tiargs.push(t);
-                 }
- 
-                 // Set target of return type inference
-                 if (!tf.next && tof.next)
-                     e.fd.treq = tparam;
- 
-                 auto ti = new TemplateInstance(e.loc, e.td, tiargs);
-                 Expression ex = (new ScopeExp(e.loc, ti)).expressionSemantic(e.td._scope);
- 
-                 // Reset inference target for the later re-semantic
-                 e.fd.treq = null;
- 
-                 if (ex.op == EXP.error)
-                     return;
-                 if (ex.op != EXP.function_)
-                     return;
-                 visit(ex.type);
-                 return;
-             }
- 
-             Type t = e.type;
- 
-             if (t.ty == Tdelegate && tparam.ty == Tpointer)
-                 return;
- 
-             // Allow conversion from implicit function pointer to delegate
-             if (e.tok == TOK.reserved && t.ty == Tpointer && tparam.ty == Tdelegate)
-             {
-                 TypeFunction tf = t.nextOf().isTypeFunction();
-                 t = (new TypeDelegate(tf)).merge();
-             }
-             //printf("tparam = %s <= e.type = %s, t = %s\n", tparam.toChars(), e.type.toChars(), t.toChars());
-             visit(t);
-         }
- 
-         override void visit(SliceExp e)
-         {
-             Type taai;
-             if (e.type.ty == Tarray && (tparam.ty == Tsarray || tparam.ty == Taarray && (taai = (cast(TypeAArray)tparam).index).ty == Tident && (cast(TypeIdentifier)taai).idents.length == 0))
-             {
-                 // Consider compile-time known boundaries
-                 if (Type tsa = toStaticArrayType(e))
-                 {
-                     tsa.accept(this);
-                     if (result > MATCH.convert)
-                         result = MATCH.convert; // match with implicit conversion at most
-                     return;
-                 }
-             }
-             visit(cast(Expression)e);
-         }
- 
-         override void visit(CommaExp e)
-         {
-             e.e2.accept(this);
-         }
-     }
- 
-     scope DeduceType v = new DeduceType();
-     if (Type t = isType(o))
-         t.accept(v);
-     else if (Expression e = isExpression(o))
-     {
-         assert(wm);
-         e.accept(v);
-     }
-     else
-         assert(0);
-     return v.result;
- }
- 
- 
- /* Helper for TypeClass.deduceType().
-  * Classes can match with implicit conversion to a base class or interface.
-  * This is complicated, because there may be more than one base class which
-  * matches. In such cases, one or more parameters remain ambiguous.
-  * For example,
-  *
-  *   interface I(X, Y) {}
-  *   class C : I(uint, double), I(char, double) {}
-  *   C x;
-  *   foo(T, U)( I!(T, U) x)
-  *
-  *   deduces that U is double, but T remains ambiguous (could be char or uint).
-  *
-  * Given a baseclass b, and initial deduced types 'dedtypes', this function
-  * tries to match tparam with b, and also tries all base interfaces of b.
-  * If a match occurs, numBaseClassMatches is incremented, and the new deduced
-  * types are ANDed with the current 'best' estimate for dedtypes.
-  */
- private void deduceBaseClassParameters(ref BaseClass b, Scope* sc, Type tparam, ref TemplateParameters parameters, ref Objects dedtypes, ref Objects best, ref int numBaseClassMatches)
- {
-     if (TemplateInstance parti = b.sym ? b.sym.parent.isTemplateInstance() : null)
-     {
-         // Make a temporary copy of dedtypes so we don't destroy it
-         auto tmpdedtypes = new Objects(dedtypes.length);
-         memcpy(tmpdedtypes.tdata(), dedtypes.tdata(), dedtypes.length * (void*).sizeof);
- 
-         auto t = new TypeInstance(Loc.initial, parti);
-         MATCH m = deduceType(t, sc, tparam, parameters, *tmpdedtypes);
-         if (m > MATCH.nomatch)
-         {
-             // If this is the first ever match, it becomes our best estimate
-             if (numBaseClassMatches == 0)
-                 memcpy(best.tdata(), tmpdedtypes.tdata(), tmpdedtypes.length * (void*).sizeof);
-             else
-                 for (size_t k = 0; k < tmpdedtypes.length; ++k)
-                 {
-                     // If we've found more than one possible type for a parameter,
-                     // mark it as unknown.
-                     if ((*tmpdedtypes)[k] != best[k])
-                         best[k] = dedtypes[k];
-                 }
-             ++numBaseClassMatches;
-         }
-     }
- 
-     // Now recursively test the inherited interfaces
-     foreach (ref bi; b.baseInterfaces)
-     {
-         deduceBaseClassParameters(bi, sc, tparam, parameters, dedtypes, best, numBaseClassMatches);
-     }
- }
- 
- /********************
-  * Match template `parameters` to the target template instance.
-  * Example:
-  *    struct Temp(U, int Z) {}
-  *    void foo(T)(Temp!(T, 3));
-  *    foo(Temp!(int, 3)());
-  * Input:
-  *    sc               = context
-  *    parameters       = template params of foo -> [T]
-  *    tiargs           = <Temp!(int, 3)>.tiargs  -> [int, 3]
-  *    tdtypes          = <Temp!(int, 3)>.tdtypes -> [int, 3]
-  *    tempdecl         = <struct Temp!(T, int Z)> -> [T, Z]
-  *    tp               = <Temp!(T, 3)>
-  * Output:
-  *    dedtypes         = deduced params of `foo(Temp!(int, 3)())` -> [int]
-  */
- private bool resolveTemplateInstantiation(Scope* sc, TemplateParameters* parameters, Objects* tiargs, Objects* tdtypes, TemplateDeclaration tempdecl, TypeInstance tp, Objects* dedtypes)
- {
-     for (size_t i = 0; 1; i++)
-     {
-         //printf("\ttest: tempinst.tiargs[%zu]\n", i);
-         RootObject o1 = null;
-         if (i < tiargs.length)
-             o1 = (*tiargs)[i];
-         else if (i < tdtypes.length && i < tp.tempinst.tiargs.length)
-         {
-             // Pick up default arg
-             o1 = (*tdtypes)[i];
-         }
-         else if (i >= tp.tempinst.tiargs.length)
-             break;
-         //printf("\ttest: o1 = %s\n", o1.toChars());
-         if (i >= tp.tempinst.tiargs.length)
-         {
-             size_t dim = tempdecl.parameters.length - (tempdecl.isVariadic() ? 1 : 0);
-             while (i < dim && ((*tempdecl.parameters)[i].dependent || (*tempdecl.parameters)[i].hasDefaultArg()))
-             {
-                 i++;
-             }
-             if (i >= dim)
-                 break; // match if all remained parameters are dependent
-             return false;
-         }
- 
-         RootObject o2 = (*tp.tempinst.tiargs)[i];
-         Type t2 = isType(o2);
-         //printf("\ttest: o2 = %s\n", o2.toChars());
-         size_t j = (t2 && t2.ty == Tident && i == tp.tempinst.tiargs.length - 1)
-             ? templateParameterLookup(t2, parameters) : IDX_NOTFOUND;
-         if (j != IDX_NOTFOUND && j == parameters.length - 1 &&
-             (*parameters)[j].isTemplateTupleParameter())
-         {
-             /* Given:
-                  *  struct A(B...) {}
-                  *  alias A!(int, float) X;
-                  *  static if (is(X Y == A!(Z), Z...)) {}
-                  * deduce that Z is a tuple(int, float)
-                  */
- 
-             /* Create tuple from remaining args
-                  */
-             size_t vtdim = (tempdecl.isVariadic() ? tiargs.length : tdtypes.length) - i;
-             auto vt = new Tuple(vtdim);
-             for (size_t k = 0; k < vtdim; k++)
-             {
-                 RootObject o;
-                 if (k < tiargs.length)
-                     o = (*tiargs)[i + k];
-                 else // Pick up default arg
-                     o = (*tdtypes)[i + k];
-                 vt.objects[k] = o;
-             }
- 
-             Tuple v = cast(Tuple)(*dedtypes)[j];
-             if (v)
-             {
-                 if (!match(v, vt))
-                     return false;
-             }
-             else
-                 (*dedtypes)[j] = vt;
-             break;
-         }
-         else if (!o1)
-             break;
- 
-         Type t1 = isType(o1);
-         Dsymbol s1 = isDsymbol(o1);
-         Dsymbol s2 = isDsymbol(o2);
-         Expression e1 = s1 ? getValue(s1) : getValue(isExpression(o1));
-         Expression e2 = isExpression(o2);
-         version (none)
-         {
-             Tuple v1 = isTuple(o1);
-             Tuple v2 = isTuple(o2);
-             if (t1)
-                 printf("t1 = %s\n", t1.toChars());
-             if (t2)
-                 printf("t2 = %s\n", t2.toChars());
-             if (e1)
-                 printf("e1 = %s\n", e1.toChars());
-             if (e2)
-                 printf("e2 = %s\n", e2.toChars());
-             if (s1)
-                 printf("s1 = %s\n", s1.toChars());
-             if (s2)
-                 printf("s2 = %s\n", s2.toChars());
-             if (v1)
-                 printf("v1 = %s\n", v1.toChars());
-             if (v2)
-                 printf("v2 = %s\n", v2.toChars());
-         }
- 
-         if (t1 && t2)
-         {
-             if (!deduceType(t1, sc, t2, *parameters, *dedtypes))
-                 return false;
-         }
-         else if (e1 && e2)
-         {
-         Le:
-             e1 = e1.ctfeInterpret();
- 
-             /* If it is one of the template parameters for this template,
-                  * we should not attempt to interpret it. It already has a value.
-                  */
-             if (e2.op == EXP.variable && (e2.isVarExp().var.storage_class & STC.templateparameter))
-             {
-                 /*
-                      * (T:Number!(e2), int e2)
-                      */
-                 j = templateIdentifierLookup(e2.isVarExp().var.ident, parameters);
-                 if (j != IDX_NOTFOUND)
-                     goto L1;
-                 // The template parameter was not from this template
-                 // (it may be from a parent template, for example)
-             }
- 
-             e2 = e2.expressionSemantic(sc); // https://issues.dlang.org/show_bug.cgi?id=13417
-             e2 = e2.ctfeInterpret();
- 
-             //printf("e1 = %s, type = %s %d\n", e1.toChars(), e1.type.toChars(), e1.type.ty);
-             //printf("e2 = %s, type = %s %d\n", e2.toChars(), e2.type.toChars(), e2.type.ty);
-             if (!e1.equals(e2))
-             {
-                 if (!e2.implicitConvTo(e1.type))
-                     return false;
- 
-                 e2 = e2.implicitCastTo(sc, e1.type);
-                 e2 = e2.ctfeInterpret();
-                 if (!e1.equals(e2))
-                     return false;
-             }
-         }
-         else if (e1 && t2 && t2.ty == Tident)
-         {
-             j = templateParameterLookup(t2, parameters);
-         L1:
-             if (j == IDX_NOTFOUND)
-             {
-                 t2.resolve((cast(TypeIdentifier)t2).loc, sc, e2, t2, s2);
-                 if (e2)
-                     goto Le;
-                 return false;
-             }
-             if (!(*parameters)[j].matchArg(sc, e1, j, parameters, *dedtypes, null))
-                 return false;
-         }
-         else if (s1 && s2)
-         {
-         Ls:
-             if (!s1.equals(s2))
-                 return false;
-         }
-         else if (s1 && t2 && t2.ty == Tident)
-         {
-             j = templateParameterLookup(t2, parameters);
-             if (j == IDX_NOTFOUND)
-             {
-                 t2.resolve((cast(TypeIdentifier)t2).loc, sc, e2, t2, s2);
-                 if (s2)
-                     goto Ls;
-                 return false;
-             }
-             if (!(*parameters)[j].matchArg(sc, s1, j, parameters, *dedtypes, null))
-                 return false;
-         }
-         else
-             return false;
-     }
-     return true;
- }
- 
- 
  /***********************************************************
   * Check whether the type t representation relies on one or more the template parameters.
   * Params:
--- 810,819 ----
*************** extern (C++) class TemplateParameter : A
*** 3210,3217 ****
  
      abstract RootObject specialization();
  
-     abstract RootObject defaultArg(Loc instLoc, Scope* sc);
- 
      abstract bool hasDefaultArg();
  
      override const(char)* toChars() const
--- 1248,1253 ----
*************** extern (C++) class TemplateTypeParameter
*** 3288,3304 ****
          return specType;
      }
  
-     override final RootObject defaultArg(Loc instLoc, Scope* sc)
-     {
-         Type t = defaultType;
-         if (t)
-         {
-             t = t.syntaxCopy();
-             t = t.typeSemantic(loc, sc); // use the parameter loc
-         }
-         return t;
-     }
- 
      override final bool hasDefaultArg()
      {
          return defaultType !is null;
--- 1324,1329 ----
*************** extern (C++) final class TemplateValuePa
*** 3408,3448 ****
          return specValue;
      }
  
-     override RootObject defaultArg(Loc instLoc, Scope* sc)
-     {
-         Expression e = defaultValue;
-         if (!e)
-             return null;
- 
-         e = e.syntaxCopy();
-         Scope* sc2 = sc.push();
-         sc2.inDefaultArg = true;
-         e = e.expressionSemantic(sc2);
-         sc2.pop();
-         if (e is null)
-             return null;
-         if (auto te = e.isTemplateExp())
-         {
-             assert(sc && sc.tinst);
-             if (te.td == sc.tinst.tempdecl)
-             {
-                 // defaultValue is a reference to its template declaration
-                 // i.e: `template T(int arg = T)`
-                 // Raise error now before calling resolveProperties otherwise we'll
-                 // start looping on the expansion of the template instance.
-                 auto td = sc.tinst.tempdecl;
-                 .error(td.loc, "%s `%s` recursive template expansion", td.kind, td.toPrettyChars);
-                 return ErrorExp.get();
-             }
-         }
-         if ((e = resolveProperties(sc, e)) is null)
-             return null;
-         e = e.resolveLoc(instLoc, sc); // use the instantiated loc
-         e = e.optimize(WANTvalue);
- 
-         return e;
-     }
- 
      override bool hasDefaultArg()
      {
          return defaultValue !is null;
--- 1433,1438 ----
*************** extern (C++) final class TemplateAliasPa
*** 3505,3533 ****
          return specAlias;
      }
  
-     override RootObject defaultArg(Loc instLoc, Scope* sc)
-     {
-         RootObject da = defaultAlias;
-         if (auto ta = isType(defaultAlias))
-         {
-             switch (ta.ty)
-             {
-             // If the default arg is a template, instantiate for each type
-             case Tinstance :
-             // same if the default arg is a mixin, traits, typeof
-             // since the content might rely on a previous parameter
-             // (https://issues.dlang.org/show_bug.cgi?id=23686)
-             case Tmixin, Ttypeof, Ttraits :
-                 da = ta.syntaxCopy();
-                 break;
-             default:
-             }
-         }
- 
-         RootObject o = aliasParameterSemantic(loc, sc, da, null); // use the parameter loc
-         return o;
-     }
- 
      override bool hasDefaultArg()
      {
          return defaultAlias !is null;
--- 1495,1500 ----
*************** extern (C++) final class TemplateTuplePa
*** 3600,3610 ****
          return null;
      }
  
-     override RootObject defaultArg(Loc instLoc, Scope* sc)
-     {
-         return null;
-     }
- 
      override bool hasDefaultArg()
      {
          return false;
--- 1567,1572 ----
*************** extern (C++) class TemplateInstance : Sc
*** 3661,3671 ****
      ScopeDsymbol argsym;        // argument symbol table
      size_t hash;                // cached result of toHash()
  
!     /// For function template, these are the function names and arguments
      /// Relevant because different resolutions of `auto ref` parameters
      /// create different template instances even with the same template arguments
      Expressions* fargs;
!     Identifiers* fnames;
  
      TemplateInstances* deferred;
  
--- 1623,1633 ----
      ScopeDsymbol argsym;        // argument symbol table
      size_t hash;                // cached result of toHash()
  
!     /// For function template, these are the function fnames(name and loc of it) and arguments
      /// Relevant because different resolutions of `auto ref` parameters
      /// create different template instances even with the same template arguments
      Expressions* fargs;
!     ArgumentLabels* fnames;
  
      TemplateInstances* deferred;
  
*************** extern (C++) class TemplateInstance : Sc
*** 3780,3818 ****
          return ti;
      }
  
-     // resolve real symbol
-     override final Dsymbol toAlias()
-     {
-         static if (LOG)
-         {
-             printf("TemplateInstance.toAlias()\n");
-         }
-         if (!inst)
-         {
-             // Maybe we can resolve it
-             if (_scope)
-             {
-                 dsymbolSemantic(this, _scope);
-             }
-             if (!inst)
-             {
-                 .error(loc, "%s `%s` cannot resolve forward reference", kind, toPrettyChars);
-                 errors = true;
-                 return this;
-             }
-         }
- 
-         if (inst != this)
-             return inst.toAlias();
- 
-         if (aliasdecl)
-         {
-             return aliasdecl.toAlias();
-         }
- 
-         return inst;
-     }
- 
      override const(char)* kind() const
      {
          return "template instance";
--- 1742,1747 ----
*************** extern (C++) class TemplateInstance : Sc
*** 4018,4743 ****
          return hash;
      }
  
-     /**
-         Returns: true if the instances' innards are discardable.
- 
-         The idea of this function is to see if the template instantiation
-         can be 100% replaced with its eponymous member. All other members
-         can be discarded, even in the compiler to free memory (for example,
-         the template could be expanded in a region allocator, deemed trivial,
-         the end result copied back out independently and the entire region freed),
-         and can be elided entirely from the binary.
- 
-         The current implementation affects code that generally looks like:
- 
-         ---
-         template foo(args...) {
-             some_basic_type_or_string helper() { .... }
-             enum foo = helper();
-         }
-         ---
- 
-         since it was the easiest starting point of implementation but it can and
-         should be expanded more later.
-     */
-     final bool isDiscardable()
-     {
-         if (aliasdecl is null)
-             return false;
- 
-         auto v = aliasdecl.isVarDeclaration();
-         if (v is null)
-             return false;
- 
-         if (!(v.storage_class & STC.manifest))
-             return false;
- 
-         // Currently only doing basic types here because it is the easiest proof-of-concept
-         // implementation with minimal risk of side effects, but it could likely be
-         // expanded to any type that already exists outside this particular instance.
-         if (!(v.type.equals(Type.tstring) || (v.type.isTypeBasic() !is null)))
-             return false;
- 
-         // Static ctors and dtors, even in an eponymous enum template, are still run,
-         // so if any of them are in here, we'd better not assume it is trivial lest
-         // we break useful code
-         foreach(member; *members)
-         {
-             if(member.hasStaticCtorOrDtor())
-                 return false;
-             if(member.isStaticDtorDeclaration())
-                 return false;
-             if(member.isStaticCtorDeclaration())
-                 return false;
-         }
- 
-         // but if it passes through this gauntlet... it should be fine. D code will
-         // see only the eponymous member, outside stuff can never access it, even through
-         // reflection; the outside world ought to be none the wiser. Even dmd should be
-         // able to simply free the memory of everything except the final result.
- 
-         return true;
-     }
- 
- 
-     /***********************************************
-      * Returns true if this is not instantiated in non-root module, and
-      * is a part of non-speculative instantiatiation.
-      *
-      * Note: minst does not stabilize until semantic analysis is completed,
-      * so don't call this function during semantic analysis to return precise result.
-      */
-     final bool needsCodegen()
-     {
-         //printf("needsCodegen() %s\n", toChars());
- 
-         // minst is finalized after the 1st invocation.
-         // tnext is only needed for the 1st invocation and
-         // cleared for further invocations.
-         TemplateInstance tnext = this.tnext;
-         TemplateInstance tinst = this.tinst;
-         this.tnext = null;
- 
-         // Don't do codegen if the instance has errors,
-         // is a dummy instance (see evaluateConstraint),
-         // or is determined to be discardable.
-         if (errors || inst is null || inst.isDiscardable())
-         {
-             minst = null; // mark as speculative
-             return false;
-         }
- 
-         // This should only be called on the primary instantiation.
-         assert(this is inst);
- 
-         if (global.params.allInst)
-         {
-             // Do codegen if there is an instantiation from a root module, to maximize link-ability.
-             static ThreeState needsCodegenAllInst(TemplateInstance tithis, TemplateInstance tinst)
-             {
-                 // Do codegen if `this` is instantiated from a root module.
-                 if (tithis.minst && tithis.minst.isRoot())
-                     return ThreeState.yes;
- 
-                 // Do codegen if the ancestor needs it.
-                 if (tinst && tinst.inst && tinst.inst.needsCodegen())
-                 {
-                     tithis.minst = tinst.inst.minst; // cache result
-                     assert(tithis.minst);
-                     assert(tithis.minst.isRoot());
-                     return ThreeState.yes;
-                 }
-                 return ThreeState.none;
-             }
- 
-             if (const needsCodegen = needsCodegenAllInst(this, tinst))
-                 return needsCodegen == ThreeState.yes ? true : false;
- 
-             // Do codegen if a sibling needs it.
-             for (; tnext; tnext = tnext.tnext)
-             {
-                 const needsCodegen = needsCodegenAllInst(tnext, tnext.tinst);
-                 if (needsCodegen == ThreeState.yes)
-                 {
-                     minst = tnext.minst; // cache result
-                     assert(minst);
-                     assert(minst.isRoot());
-                     return true;
-                 }
-                 else if (!minst && tnext.minst)
-                 {
-                     minst = tnext.minst; // cache result from non-speculative sibling
-                     // continue searching
-                 }
-                 else if (needsCodegen != ThreeState.none)
-                     break;
-             }
- 
-             // Elide codegen because there's no instantiation from any root modules.
-             return false;
-         }
- 
-         // Prefer instantiations from non-root modules, to minimize object code size.
- 
-         /* If a TemplateInstance is ever instantiated from a non-root module,
-          * we do not have to generate code for it,
-          * because it will be generated when the non-root module is compiled.
-          *
-          * But, if the non-root 'minst' imports any root modules, it might still need codegen.
-          *
-          * The problem is if A imports B, and B imports A, and both A
-          * and B instantiate the same template, does the compilation of A
-          * or the compilation of B do the actual instantiation?
-          *
-          * See https://issues.dlang.org/show_bug.cgi?id=2500.
-          *
-          * => Elide codegen if there is at least one instantiation from a non-root module
-          *    which doesn't import any root modules.
-          */
-         static ThreeState needsCodegenRootOnly(TemplateInstance tithis, TemplateInstance tinst)
-         {
-             // If the ancestor isn't speculative,
-             // 1. do codegen if the ancestor needs it
-             // 2. elide codegen if the ancestor doesn't need it (non-root instantiation of ancestor incl. subtree)
-             if (tinst && tinst.inst)
-             {
-                 tinst = tinst.inst;
-                 const needsCodegen = tinst.needsCodegen(); // sets tinst.minst
-                 if (tinst.minst) // not speculative
-                 {
-                     tithis.minst = tinst.minst; // cache result
-                     return needsCodegen ? ThreeState.yes : ThreeState.no;
-                 }
-             }
- 
-             // Elide codegen if `this` doesn't need it.
-             if (tithis.minst && !tithis.minst.isRoot() && !tithis.minst.rootImports())
-                 return ThreeState.no;
- 
-             return ThreeState.none;
-         }
- 
-         if (const needsCodegen = needsCodegenRootOnly(this, tinst))
-             return needsCodegen == ThreeState.yes ? true : false;
- 
-         // Elide codegen if a (non-speculative) sibling doesn't need it.
-         for (; tnext; tnext = tnext.tnext)
-         {
-             const needsCodegen = needsCodegenRootOnly(tnext, tnext.tinst); // sets tnext.minst
-             if (tnext.minst) // not speculative
-             {
-                 if (needsCodegen == ThreeState.no)
-                 {
-                     minst = tnext.minst; // cache result
-                     assert(!minst.isRoot() && !minst.rootImports());
-                     return false;
-                 }
-                 else if (!minst)
-                 {
-                     minst = tnext.minst; // cache result from non-speculative sibling
-                     // continue searching
-                 }
-                 else if (needsCodegen != ThreeState.none)
-                     break;
-             }
-         }
- 
-         // Unless `this` is still speculative (=> all further siblings speculative too),
-         // do codegen because we found no guaranteed-codegen'd non-root instantiation.
-         return minst !is null;
-     }
- 
-     /**********************************************
-      * Find template declaration corresponding to template instance.
-      *
-      * Returns:
-      *      false if finding fails.
-      * Note:
-      *      This function is reentrant against error occurrence. If returns false,
-      *      any members of this object won't be modified, and repetition call will
-      *      reproduce same error.
-      */
-     extern (D) final bool findTempDecl(Scope* sc, WithScopeSymbol* pwithsym)
-     {
-         if (pwithsym)
-             *pwithsym = null;
- 
-         if (havetempdecl)
-             return true;
- 
-         //printf("TemplateInstance.findTempDecl() %s\n", toChars());
-         if (!tempdecl)
-         {
-             /* Given:
-              *    foo!( ... )
-              * figure out which TemplateDeclaration foo refers to.
-              */
-             Identifier id = name;
-             Dsymbol scopesym;
-             Dsymbol s = sc.search(loc, id, scopesym);
-             if (!s)
-             {
-                 s = sc.search_correct(id);
-                 if (s)
-                     .error(loc, "%s `%s` template `%s` is not defined, did you mean %s?", kind, toPrettyChars, id.toChars(), s.toChars());
-                 else
-                     .error(loc, "%s `%s` template `%s` is not defined", kind, toPrettyChars, id.toChars());
-                 return false;
-             }
-             static if (LOG)
-             {
-                 printf("It's an instance of '%s' kind '%s'\n", s.toChars(), s.kind());
-                 if (s.parent)
-                     printf("s.parent = '%s'\n", s.parent.toChars());
-             }
-             if (pwithsym)
-                 *pwithsym = scopesym.isWithScopeSymbol();
- 
-             /* We might have found an alias within a template when
-              * we really want the template.
-              */
-             TemplateInstance ti;
-             if (s.parent && (ti = s.parent.isTemplateInstance()) !is null)
-             {
-                 if (ti.tempdecl && ti.tempdecl.ident == id)
-                 {
-                     /* This is so that one can refer to the enclosing
-                      * template, even if it has the same name as a member
-                      * of the template, if it has a !(arguments)
-                      */
-                     TemplateDeclaration td = ti.tempdecl.isTemplateDeclaration();
-                     assert(td);
-                     if (td.overroot) // if not start of overloaded list of TemplateDeclaration's
-                         td = td.overroot; // then get the start
-                     s = td;
-                 }
-             }
- 
-             // The template might originate from a selective import which implies that
-             // s is a lowered AliasDeclaration of the actual TemplateDeclaration.
-             // This is the last place where we see the deprecated alias because it is
-             // stripped below, so check if the selective import was deprecated.
-             // See https://issues.dlang.org/show_bug.cgi?id=20840.
-             if (s.isAliasDeclaration())
-                 s.checkDeprecated(this.loc, sc);
- 
-             if (!updateTempDecl(sc, s))
-             {
-                 return false;
-             }
-         }
-         assert(tempdecl);
- 
-         // Look for forward references
-         auto tovers = tempdecl.isOverloadSet();
-         foreach (size_t oi; 0 .. tovers ? tovers.a.length : 1)
-         {
-             Dsymbol dstart = tovers ? tovers.a[oi] : tempdecl;
-             int r = overloadApply(dstart, (Dsymbol s)
-             {
-                 auto td = s.isTemplateDeclaration();
-                 if (!td)
-                     return 0;
- 
-                 if (td.semanticRun == PASS.initial)
-                 {
-                     if (td._scope)
-                     {
-                         // Try to fix forward reference. Ungag errors while doing so.
-                         Ungag ungag = td.ungagSpeculative();
-                         td.dsymbolSemantic(td._scope);
-                     }
-                     if (td.semanticRun == PASS.initial)
-                     {
-                         .error(loc, "%s `%s` `%s` forward references template declaration `%s`", kind, toPrettyChars,
-                             toChars(), td.toChars());
-                         return 1;
-                     }
-                 }
-                 return 0;
-             });
-             if (r)
-                 return false;
-         }
-         return true;
-     }
- 
-     /**********************************************
-      * Confirm s is a valid template, then store it.
-      * Input:
-      *      sc
-      *      s   candidate symbol of template. It may be:
-      *          TemplateDeclaration
-      *          FuncDeclaration with findTemplateDeclRoot() != NULL
-      *          OverloadSet which contains candidates
-      * Returns:
-      *      true if updating succeeds.
-      */
-     extern (D) final bool updateTempDecl(Scope* sc, Dsymbol s)
-     {
-         if (!s)
-             return tempdecl !is null;
- 
-         Identifier id = name;
-         s = s.toAlias();
- 
-         /* If an OverloadSet, look for a unique member that is a template declaration
-          */
-         if (OverloadSet os = s.isOverloadSet())
-         {
-             s = null;
-             foreach (s2; os.a)
-             {
-                 if (FuncDeclaration f = s2.isFuncDeclaration())
-                     s2 = f.findTemplateDeclRoot();
-                 else
-                     s2 = s2.isTemplateDeclaration();
-                 if (s2)
-                 {
-                     if (s)
-                     {
-                         tempdecl = os;
-                         return true;
-                     }
-                     s = s2;
-                 }
-             }
-             if (!s)
-             {
-                 .error(loc, "%s `%s` template `%s` is not defined", kind, toPrettyChars, id.toChars());
-                 return false;
-             }
-         }
- 
-         if (OverDeclaration od = s.isOverDeclaration())
-         {
-             tempdecl = od; // TODO: more strict check
-             return true;
-         }
- 
-         /* It should be a TemplateDeclaration, not some other symbol
-          */
-         if (FuncDeclaration f = s.isFuncDeclaration())
-             tempdecl = f.findTemplateDeclRoot();
-         else
-             tempdecl = s.isTemplateDeclaration();
- 
-         // We're done
-         if (tempdecl)
-             return true;
- 
-         // Error already issued, just return `false`
-         if (!s.parent && global.errors)
-             return false;
- 
-         if (!s.parent && s.getType())
-         {
-             Dsymbol s2 = s.getType().toDsymbol(sc);
-             if (!s2)
-             {
-                 .error(loc, "`%s` is not a valid template instance, because `%s` is not a template declaration but a type (`%s == %s`)", toChars(), id.toChars(), id.toChars(), s.getType.kind());
-                 return false;
-             }
-             // because s can be the alias created for a TemplateParameter
-             const AliasDeclaration ad = s.isAliasDeclaration();
-             version (none)
-             {
-                 if (ad && ad.isAliasedTemplateParameter())
-                     printf("`%s` is an alias created from a template parameter\n", s.toChars());
-             }
-             if (!ad || !ad.isAliasedTemplateParameter())
-                 s = s2;
-         }
- 
-         TemplateInstance ti = s.parent ? s.parent.isTemplateInstance() : null;
- 
-         /* This avoids the VarDeclaration.toAlias() which runs semantic() too soon
-          */
-         static bool matchId(TemplateInstance ti, Identifier id)
-         {
-             if (ti.aliasdecl && ti.aliasdecl.isVarDeclaration())
-                 return ti.aliasdecl.isVarDeclaration().ident == id;
-             return ti.toAlias().ident == id;
-         }
- 
-         if (ti && (ti.name == s.ident || matchId(ti, s.ident)) && ti.tempdecl)
-         {
-             /* This is so that one can refer to the enclosing
-              * template, even if it has the same name as a member
-              * of the template, if it has a !(arguments)
-              */
-             TemplateDeclaration td = ti.tempdecl.isTemplateDeclaration();
-             assert(td);
-             if (td.overroot) // if not start of overloaded list of TemplateDeclaration's
-                 td = td.overroot; // then get the start
-             tempdecl = td;
-             return true;
-         }
-         else
-         {
-             .error(loc, "%s `%s` `%s` is not a template declaration, it is a %s", kind, toPrettyChars, id.toChars(), s.kind());
-             return false;
-         }
-     }
- 
-     /**********************************
-      * Run semantic of tiargs as arguments of template.
-      * Input:
-      *      loc
-      *      sc
-      *      tiargs  array of template arguments
-      *      flags   1: replace const variables with their initializers
-      *              2: don't devolve Parameter to Type
-      *      atd     tuple being optimized. If found, it's not expanded here
-      *              but in AliasAssign semantic.
-      * Returns:
-      *      false if one or more arguments have errors.
-      */
-     extern (D) static bool semanticTiargs(Loc loc, Scope* sc, Objects* tiargs, int flags, TupleDeclaration atd = null)
-     {
-         // Run semantic on each argument, place results in tiargs[]
-         //printf("+TemplateInstance.semanticTiargs()\n");
-         if (!tiargs)
-             return true;
-         bool err = false;
- 
-         // The arguments are not treated as part of a default argument,
-         // because they are evaluated at compile time.
-         const inCondition = sc.condition;
-         sc = sc.push();
-         sc.inDefaultArg = false;
- 
-         // https://issues.dlang.org/show_bug.cgi?id=24699
-         sc.condition = inCondition;
- 
-         for (size_t j = 0; j < tiargs.length; j++)
-         {
-             RootObject o = (*tiargs)[j];
-             Type ta = isType(o);
-             Expression ea = isExpression(o);
-             Dsymbol sa = isDsymbol(o);
- 
-             //printf("1: (*tiargs)[%d] = %p, s=%p, v=%p, ea=%p, ta=%p\n", j, o, isDsymbol(o), isTuple(o), ea, ta);
-             if (ta)
-             {
-                 //printf("type %s\n", ta.toChars());
- 
-                 // It might really be an Expression or an Alias
-                 ta.resolve(loc, sc, ea, ta, sa, (flags & 1) != 0);
-                 if (ea)
-                     goto Lexpr;
-                 if (sa)
-                     goto Ldsym;
-                 if (ta is null)
-                 {
-                     assert(global.errors);
-                     ta = Type.terror;
-                 }
- 
-             Ltype:
-                 if (TypeTuple tt = ta.isTypeTuple())
-                 {
-                     // Expand tuple
-                     size_t dim = tt.arguments.length;
-                     tiargs.remove(j);
-                     if (dim)
-                     {
-                         tiargs.reserve(dim);
-                         foreach (i, arg; *tt.arguments)
-                         {
-                             if (flags & 2 && (arg.storageClass & STC.parameter))
-                                 tiargs.insert(j + i, arg);
-                             else
-                                 tiargs.insert(j + i, arg.type);
-                         }
-                     }
-                     j--;
-                     continue;
-                 }
-                 if (ta.ty == Terror)
-                 {
-                     err = true;
-                     continue;
-                 }
-                 (*tiargs)[j] = ta.merge2();
-             }
-             else if (ea)
-             {
-             Lexpr:
-                 //printf("+[%d] ea = %s %s\n", j, EXPtoString(ea.op).ptr, ea.toChars());
-                 if (flags & 1) // only used by __traits
-                 {
-                     ea = ea.expressionSemantic(sc);
- 
-                     // must not interpret the args, excepting template parameters
-                     if (!ea.isVarExp() || (ea.isVarExp().var.storage_class & STC.templateparameter))
-                     {
-                         ea = ea.optimize(WANTvalue);
-                     }
-                 }
-                 else
-                 {
-                     sc = sc.startCTFE();
-                     ea = ea.expressionSemantic(sc);
-                     sc = sc.endCTFE();
- 
-                     if (auto varExp = ea.isVarExp())
-                     {
-                         /* If the parameter is a function that is not called
-                          * explicitly, i.e. `foo!func` as opposed to `foo!func()`,
-                          * then it is a dsymbol, not the return value of `func()`
-                          */
-                         Declaration vd = varExp.var;
-                         if (auto fd = vd.isFuncDeclaration())
-                         {
-                             sa = fd;
-                             goto Ldsym;
-                         }
-                         /* Otherwise skip substituting a const var with
-                          * its initializer. The problem is the initializer won't
-                          * match with an 'alias' parameter. Instead, do the
-                          * const substitution in TemplateValueParameter.matchArg().
-                          */
-                     }
-                     else if (definitelyValueParameter(ea))
-                     {
-                         if (ea.checkValue()) // check void expression
-                             ea = ErrorExp.get();
-                         const olderrs = global.errors;
-                         ea = ea.ctfeInterpret();
-                         if (global.errors != olderrs)
-                             ea = ErrorExp.get();
-                     }
-                 }
-                 //printf("-[%d] ea = %s %s\n", j, EXPtoString(ea.op).ptr, ea.toChars());
-                 if (TupleExp te = ea.isTupleExp())
-                 {
-                     // Expand tuple
-                     size_t dim = te.exps.length;
-                     tiargs.remove(j);
-                     if (dim)
-                     {
-                         tiargs.reserve(dim);
-                         foreach (i, exp; *te.exps)
-                             tiargs.insert(j + i, exp);
-                     }
-                     j--;
-                     continue;
-                 }
-                 if (ea.op == EXP.error)
-                 {
-                     err = true;
-                     continue;
-                 }
-                 (*tiargs)[j] = ea;
- 
-                 if (ea.op == EXP.type)
-                 {
-                     ta = ea.type;
-                     goto Ltype;
-                 }
-                 if (ea.op == EXP.scope_)
-                 {
-                     sa = ea.isScopeExp().sds;
-                     goto Ldsym;
-                 }
-                 if (FuncExp fe = ea.isFuncExp())
-                 {
-                     /* A function literal, that is passed to template and
-                      * already semanticed as function pointer, never requires
-                      * outer frame. So convert it to global function is valid.
-                      */
-                     if (fe.fd.tok == TOK.reserved && fe.type.ty == Tpointer)
-                     {
-                         // change to non-nested
-                         fe.fd.tok = TOK.function_;
-                         fe.fd.vthis = null;
-                     }
-                     else if (fe.td)
-                     {
-                         /* If template argument is a template lambda,
-                          * get template declaration itself. */
-                         //sa = fe.td;
-                         //goto Ldsym;
-                     }
-                 }
-                 if (ea.op == EXP.dotVariable && !(flags & 1))
-                 {
-                     // translate expression to dsymbol.
-                     sa = ea.isDotVarExp().var;
-                     goto Ldsym;
-                 }
-                 if (auto te = ea.isTemplateExp())
-                 {
-                     sa = te.td;
-                     goto Ldsym;
-                 }
-                 if (ea.op == EXP.dotTemplateDeclaration && !(flags & 1))
-                 {
-                     // translate expression to dsymbol.
-                     sa = ea.isDotTemplateExp().td;
-                     goto Ldsym;
-                 }
-                 if (auto de = ea.isDotExp())
-                 {
-                     if (auto se = de.e2.isScopeExp())
-                     {
-                         sa = se.sds;
-                         goto Ldsym;
-                     }
-                 }
-             }
-             else if (sa)
-             {
-             Ldsym:
-                 //printf("dsym %s %s\n", sa.kind(), sa.toChars());
-                 if (sa.errors)
-                 {
-                     err = true;
-                     continue;
-                 }
- 
-                 TupleDeclaration d = sa.toAlias().isTupleDeclaration();
-                 if (d)
-                 {
-                     if (d is atd)
-                     {
-                         (*tiargs)[j] = d;
-                         continue;
-                     }
-                     // Expand tuple
-                     tiargs.remove(j);
-                     tiargs.insert(j, d.objects);
-                     j--;
-                     continue;
-                 }
-                 if (FuncAliasDeclaration fa = sa.isFuncAliasDeclaration())
-                 {
-                     FuncDeclaration f = fa.toAliasFunc();
-                     if (!fa.hasOverloads && f.isUnique())
-                     {
-                         // Strip FuncAlias only when the aliased function
-                         // does not have any overloads.
-                         sa = f;
-                     }
-                 }
-                 (*tiargs)[j] = sa;
- 
-                 TemplateDeclaration td = sa.isTemplateDeclaration();
-                 if (td && td.semanticRun == PASS.initial && td.literal)
-                 {
-                     td.dsymbolSemantic(sc);
-                 }
-                 FuncDeclaration fd = sa.isFuncDeclaration();
-                 if (fd)
-                     functionSemantic(fd);
-             }
-             else if (isParameter(o))
-             {
-             }
-             else
-             {
-                 assert(0);
-             }
-             //printf("1: (*tiargs)[%d] = %p\n", j, (*tiargs)[j]);
-         }
-         sc.pop();
-         version (none)
-         {
-             printf("-TemplateInstance.semanticTiargs()\n");
-             for (size_t j = 0; j < tiargs.length; j++)
-             {
-                 RootObject o = (*tiargs)[j];
-                 Type ta = isType(o);
-                 Expression ea = isExpression(o);
-                 Dsymbol sa = isDsymbol(o);
-                 Tuple va = isTuple(o);
-                 printf("\ttiargs[%d] = ta %p, ea %p, sa %p, va %p\n", j, ta, ea, sa, va);
-             }
-         }
-         return !err;
-     }
- 
      /**********************************
       * Run semantic on the elements of tiargs.
       * Input:
--- 1947,1952 ----
*************** extern (C++) class TemplateInstance : Sc
*** 4753,4759 ****
          //printf("+TemplateInstance.semanticTiargs() %s\n", toChars());
          if (semantictiargsdone)
              return true;
!         if (semanticTiargs(loc, sc, tiargs, 0))
          {
              // cache the result iff semantic analysis succeeded entirely
              semantictiargsdone = 1;
--- 1962,1968 ----
          //printf("+TemplateInstance.semanticTiargs() %s\n", toChars());
          if (semantictiargsdone)
              return true;
!         if (TemplateInstance_semanticTiargs(loc, sc, tiargs, 0))
          {
              // cache the result iff semantic analysis succeeded entirely
              semantictiargsdone = 1;
*************** extern (C++) class TemplateInstance : Sc
*** 4762,5015 ****
          return false;
      }
  
-     /**********************************
-      * Find the TemplateDeclaration that matches this TemplateInstance best.
-      *
-      * Params:
-      *   sc    = the scope this TemplateInstance resides in
-      *   argumentList = function arguments in case of a template function
-      *
-      * Returns:
-      *   `true` if a match was found, `false` otherwise
-      */
-     extern (D) final bool findBestMatch(Scope* sc, ArgumentList argumentList)
-     {
-         if (havetempdecl)
-         {
-             TemplateDeclaration tempdecl = this.tempdecl.isTemplateDeclaration();
-             assert(tempdecl);
-             assert(tempdecl._scope);
-             // Deduce tdtypes
-             tdtypes.setDim(tempdecl.parameters.length);
-             if (!matchWithInstance(sc, tempdecl, this, tdtypes, argumentList, 2))
-             {
-                 .error(loc, "%s `%s` incompatible arguments for template instantiation", kind, toPrettyChars);
-                 return false;
-             }
-             // TODO: Normalizing tiargs for https://issues.dlang.org/show_bug.cgi?id=7469 is necessary?
-             return true;
-         }
- 
-         static if (LOG)
-         {
-             printf("TemplateInstance.findBestMatch()\n");
-         }
- 
-         const errs = global.errors;
-         TemplateDeclaration td_last = null;
-         Objects dedtypes;
- 
-         /* Since there can be multiple TemplateDeclaration's with the same
-          * name, look for the best match.
-          */
-         auto tovers = tempdecl.isOverloadSet();
-         foreach (size_t oi; 0 .. tovers ? tovers.a.length : 1)
-         {
-             TemplateDeclaration td_best;
-             TemplateDeclaration td_ambig;
-             MATCH m_best = MATCH.nomatch;
- 
-             Dsymbol dstart = tovers ? tovers.a[oi] : tempdecl;
-             overloadApply(dstart, (Dsymbol s)
-             {
-                 auto td = s.isTemplateDeclaration();
-                 if (!td)
-                     return 0;
-                 if (td == td_best)   // skip duplicates
-                     return 0;
- 
-                 //printf("td = %s\n", td.toPrettyChars());
-                 // If more arguments than parameters,
-                 // then this is no match.
-                 if (td.parameters.length < tiargs.length)
-                 {
-                     if (!td.isVariadic())
-                         return 0;
-                 }
- 
-                 dedtypes.setDim(td.parameters.length);
-                 dedtypes.zero();
-                 assert(td.semanticRun != PASS.initial);
- 
-                 MATCH m = matchWithInstance(sc, td, this, dedtypes, argumentList, 0);
-                 //printf("matchWithInstance = %d\n", m);
-                 if (m == MATCH.nomatch) // no match at all
-                     return 0;
-                 if (m < m_best) goto Ltd_best;
-                 if (m > m_best) goto Ltd;
- 
-                 // Disambiguate by picking the most specialized TemplateDeclaration
-                 {
-                 MATCH c1 = leastAsSpecialized(sc, td, td_best, argumentList);
-                 MATCH c2 = leastAsSpecialized(sc, td_best, td, argumentList);
-                 //printf("c1 = %d, c2 = %d\n", c1, c2);
-                 if (c1 > c2) goto Ltd;
-                 if (c1 < c2) goto Ltd_best;
-                 }
- 
-                 td_ambig = td;
-                 return 0;
- 
-             Ltd_best:
-                 // td_best is the best match so far
-                 td_ambig = null;
-                 return 0;
- 
-             Ltd:
-                 // td is the new best match
-                 td_ambig = null;
-                 td_best = td;
-                 m_best = m;
-                 tdtypes.setDim(dedtypes.length);
-                 memcpy(tdtypes.tdata(), dedtypes.tdata(), tdtypes.length * (void*).sizeof);
-                 return 0;
-             });
- 
-             if (td_ambig)
-             {
-                 .error(loc, "%s `%s.%s` matches more than one template declaration:",
-                     td_best.kind(), td_best.parent.toPrettyChars(), td_best.ident.toChars());
-                 .errorSupplemental(td_best.loc, "`%s`\nand:", td_best.toChars());
-                 .errorSupplemental(td_ambig.loc, "`%s`", td_ambig.toChars());
-                 return false;
-             }
-             if (td_best)
-             {
-                 if (!td_last)
-                     td_last = td_best;
-                 else if (td_last != td_best)
-                 {
-                     ScopeDsymbol.multiplyDefined(loc, td_last, td_best);
-                     return false;
-                 }
-             }
-         }
- 
-         if (td_last)
-         {
-             /* https://issues.dlang.org/show_bug.cgi?id=7469
-              * Normalize tiargs by using corresponding deduced
-              * template value parameters and tuples for the correct mangling.
-              *
-              * By doing this before hasNestedArgs, CTFEable local variable will be
-              * accepted as a value parameter. For example:
-              *
-              *  void foo() {
-              *    struct S(int n) {}   // non-global template
-              *    const int num = 1;   // CTFEable local variable
-              *    S!num s;             // S!1 is instantiated, not S!num
-              *  }
-              */
-             size_t dim = td_last.parameters.length - (td_last.isVariadic() ? 1 : 0);
-             for (size_t i = 0; i < dim; i++)
-             {
-                 if (tiargs.length <= i)
-                     tiargs.push(tdtypes[i]);
-                 assert(i < tiargs.length);
- 
-                 auto tvp = (*td_last.parameters)[i].isTemplateValueParameter();
-                 if (!tvp)
-                     continue;
-                 assert(tdtypes[i]);
-                 // tdtypes[i] is already normalized to the required type in matchArg
- 
-                 (*tiargs)[i] = tdtypes[i];
-             }
-             if (td_last.isVariadic() && tiargs.length == dim && tdtypes[dim])
-             {
-                 Tuple va = isTuple(tdtypes[dim]);
-                 assert(va);
-                 tiargs.pushSlice(va.objects[]);
-             }
-         }
-         else if (errors && inst)
-         {
-             // instantiation was failed with error reporting
-             assert(global.errors);
-             return false;
-         }
-         else
-         {
-             auto tdecl = tempdecl.isTemplateDeclaration();
- 
-             if (errs != global.errors)
-                 errorSupplemental(loc, "while looking for match for `%s`", toChars());
-             else if (tdecl && !tdecl.overnext)
-             {
-                 // Only one template, so we can give better error message
-                 const(char)* msg = "does not match template declaration";
-                 const(char)* tip;
-                 OutBuffer buf;
-                 HdrGenState hgs;
-                 hgs.skipConstraints = true;
-                 toCharsMaybeConstraints(tdecl, buf, hgs);
-                 const tmsg = buf.peekChars();
-                 const cmsg = tdecl.getConstraintEvalError(tip);
-                 if (cmsg)
-                 {
-                     .error(loc, "%s `%s` %s `%s`\n%s", kind, toPrettyChars, msg, tmsg, cmsg);
-                     if (tip)
-                         .tip(tip);
-                 }
-                 else
-                 {
-                     .error(loc, "%s `%s` %s `%s`", kind, toPrettyChars, msg, tmsg);
- 
-                     if (tdecl.parameters.length == tiargs.length)
-                     {
-                         // https://issues.dlang.org/show_bug.cgi?id=7352
-                         // print additional information, e.g. `foo` is not a type
-                         foreach (i, param; *tdecl.parameters)
-                         {
-                             MATCH match = param.matchArg(loc, sc, tiargs, i, tdecl.parameters, dedtypes, null);
-                             auto arg = (*tiargs)[i];
-                             auto sym = arg.isDsymbol;
-                             auto exp = arg.isExpression;
- 
-                             if (exp)
-                                 exp = exp.optimize(WANTvalue);
- 
-                             if (match == MATCH.nomatch &&
-                                 ((sym && sym.isFuncDeclaration) ||
-                                  (exp && exp.isVarExp)))
-                             {
-                                 if (param.isTemplateTypeParameter)
-                                     errorSupplemental(loc, "`%s` is not a type", arg.toChars);
-                                 else if (auto tvp = param.isTemplateValueParameter)
-                                     errorSupplemental(loc, "`%s` is not of a value of type `%s`",
-                                                       arg.toChars, tvp.valType.toChars);
- 
-                             }
-                         }
-                     }
-                 }
-             }
-             else
-             {
-                 .error(loc, "%s `%s` does not match any template declaration", kind(), toPrettyChars());
-                 bool found;
-                 overloadApply(tempdecl, (s){
-                     if (!found)
-                         errorSupplemental(loc, "Candidates are:");
-                     found = true;
-                     errorSupplemental(s.loc, "%s", s.toChars());
-                     return 0;
-                 });
-             }
-             return false;
-         }
- 
-         /* The best match is td_last
-          */
-         tempdecl = td_last;
- 
-         static if (LOG)
-         {
-             printf("\tIt's a match with template declaration '%s'\n", tempdecl.toChars());
-         }
-         return (errs == global.errors);
-     }
- 
      /*****************************************
       * Determines if a TemplateInstance will need a nested
       * generation of the TemplateDeclaration.
--- 1971,1976 ----
*************** extern (C++) class TemplateInstance : Sc
*** 5131,5229 ****
          return nested != 0;
      }
  
-     /*****************************************
-      * Append 'this' to the specific module members[]
-      */
-     extern (D) final Dsymbols* appendToModuleMember()
-     {
-         Module mi = minst; // instantiated . inserted module
- 
-         //printf("%s.appendToModuleMember() enclosing = %s mi = %s\n",
-         //    toPrettyChars(),
-         //    enclosing ? enclosing.toPrettyChars() : null,
-         //    mi ? mi.toPrettyChars() : null);
-         if (global.params.allInst || !mi || mi.isRoot())
-         {
-             /* If the instantiated module is speculative or root, insert to the
-              * member of a root module. Then:
-              *  - semantic3 pass will get called on the instance members.
-              *  - codegen pass will get a selection chance to do/skip it (needsCodegen()).
-              */
-             static Dsymbol getStrictEnclosing(TemplateInstance ti)
-             {
-                 do
-                 {
-                     if (ti.enclosing)
-                         return ti.enclosing;
-                     ti = ti.tempdecl.isInstantiated();
-                 } while (ti);
-                 return null;
-             }
- 
-             Dsymbol enc = getStrictEnclosing(this);
-             // insert target is made stable by using the module
-             // where tempdecl is declared.
-             mi = (enc ? enc : tempdecl).getModule();
-             if (!mi.isRoot())
-             {
-                 if (mi.importedFrom)
-                 {
-                     mi = mi.importedFrom;
-                     assert(mi.isRoot());
-                 }
-                 else
-                 {
-                     // This can happen when using the frontend as a library.
-                     // Append it to the non-root module.
-                 }
-             }
-         }
-         else
-         {
-             /* If the instantiated module is non-root, insert to the member of the
-              * non-root module. Then:
-              *  - semantic3 pass won't be called on the instance.
-              *  - codegen pass won't reach to the instance.
-              * Unless it is re-appended to a root module later (with changed minst).
-              */
-         }
-         //printf("\t-. mi = %s\n", mi.toPrettyChars());
- 
-         if (memberOf) // already appended to some module
-         {
-             assert(mi.isRoot(), "can only re-append to a root module");
-             if (memberOf.isRoot())
-                 return null; // no need to move to another root module
-         }
- 
-         Dsymbols* a = mi.members;
-         a.push(this);
-         memberOf = mi;
-         if (mi.semanticRun >= PASS.semantic2done && mi.isRoot())
-             Module.addDeferredSemantic2(this);
-         if (mi.semanticRun >= PASS.semantic3done && mi.isRoot())
-             Module.addDeferredSemantic3(this);
-         return a;
-     }
- 
-     /****************************************************
-      * Declare parameters of template instance, initialize them with the
-      * template instance arguments.
-      */
-     extern (D) final void declareParameters(Scope* sc)
-     {
-         TemplateDeclaration tempdecl = this.tempdecl.isTemplateDeclaration();
-         assert(tempdecl);
- 
-         //printf("TemplateInstance.declareParameters()\n");
-         foreach (i, o; tdtypes) // initializer for tp
-         {
-             TemplateParameter tp = (*tempdecl.parameters)[i];
-             //printf("\ttdtypes[%d] = %p\n", i, o);
-             declareParameter(tempdecl, sc, tp, o);
-         }
-     }
- 
      /****************************************
       * This instance needs an identifier for name mangling purposes.
       * Create one by taking the template declaration name and adding
--- 2092,2097 ----
*************** extern (C++) class TemplateInstance : Sc
*** 5239,5404 ****
          return Identifier.idPool(buf[]);
      }
  
-     extern (D) final void expandMembers(Scope* sc2)
-     {
-         members.foreachDsymbol( (s) { s.setScope (sc2); } );
- 
-         members.foreachDsymbol( (s) { s.importAll(sc2); } );
- 
-         if (!aliasdecl)
-         {
-             /* static if's are crucial to evaluating aliasdecl correctly. But
-              * evaluating the if/else bodies may require aliasdecl.
-              * So, evaluate the condition for static if's, but not their if/else bodies.
-              * Then try to set aliasdecl.
-              * Later do the if/else bodies.
-              * https://issues.dlang.org/show_bug.cgi?id=23598
-              * It might be better to do this by attaching a lambda to the StaticIfDeclaration
-              * to do the oneMembers call after the sid.include(sc2) is run as part of dsymbolSemantic().
-              */
-             bool done;
-             void staticIfDg(Dsymbol s)
-             {
-                 if (done || aliasdecl)
-                     return;
-                 //printf("\t staticIfDg on '%s %s' in '%s'\n",  s.kind(), s.toChars(), this.toChars());
-                 if (!s.isStaticIfDeclaration())
-                 {
-                     //s.dsymbolSemantic(sc2);
-                     done = true;
-                     return;
-                 }
-                 auto sid = s.isStaticIfDeclaration();
-                 sid.include(sc2);
-                 if (members.length)
-                 {
-                     Dsymbol sa;
-                     if (Dsymbol.oneMembers(members, sa, tempdecl.ident) && sa)
-                         aliasdecl = sa;
-                 }
-                 done = true;
-             }
- 
-             members.foreachDsymbol(&staticIfDg);
-         }
- 
-         void symbolDg(Dsymbol s)
-         {
-             //printf("\t semantic on '%s' %p kind %s in '%s'\n",  s.toChars(), s, s.kind(), this.toChars());
-             //printf("test: enclosing = %d, sc2.parent = %s\n", enclosing, sc2.parent.toChars());
-             //if (enclosing)
-             //    s.parent = sc.parent;
-             //printf("test3: enclosing = %d, s.parent = %s\n", enclosing, s.parent.toChars());
-             s.dsymbolSemantic(sc2);
-             //printf("test4: enclosing = %d, s.parent = %s\n", enclosing, s.parent.toChars());
-             Module.runDeferredSemantic();
-         }
- 
-         members.foreachDsymbol(&symbolDg);
-     }
- 
-     extern (D) final void tryExpandMembers(Scope* sc2)
-     {
-         __gshared int nest;
-         // extracted to a function to allow windows SEH to work without destructors in the same function
-         //printf("%d\n", nest);
-         if (++nest > global.recursionLimit)
-         {
-             global.gag = 0; // ensure error message gets printed
-             .error(loc, "%s `%s` recursive expansion exceeded allowed nesting limit", kind, toPrettyChars);
-             fatal();
-         }
- 
-         expandMembers(sc2);
- 
-         nest--;
-     }
- 
-     extern (D) final void trySemantic3(Scope* sc2)
-     {
-         // extracted to a function to allow windows SEH to work without destructors in the same function
-         __gshared int nest;
-         //printf("%d\n", nest);
-         if (++nest > global.recursionLimit)
-         {
-             global.gag = 0; // ensure error message gets printed
-             .error(loc, "%s `%s` recursive expansion exceeded allowed nesting limit", kind, toPrettyChars);
-             fatal();
-         }
- 
-         semantic3(this, sc2);
- 
-         --nest;
-     }
- 
      override void accept(Visitor v)
      {
          v.visit(this);
      }
  }
  
- /**************************************
-  * IsExpression can evaluate the specified type speculatively, and even if
-  * it instantiates any symbols, they are normally unnecessary for the
-  * final executable.
-  * However, if those symbols leak to the actual code, compiler should remark
-  * them as non-speculative to generate their code and link to the final executable.
-  */
- void unSpeculative(Scope* sc, RootObject o)
- {
-     if (!o)
-         return;
- 
-     if (Tuple tup = isTuple(o))
-     {
-         foreach (obj; tup.objects)
-         {
-             unSpeculative(sc, obj);
-         }
-         return;
-     }
- 
-     Dsymbol s = getDsymbol(o);
-     if (!s)
-         return;
- 
-     if (Declaration d = s.isDeclaration())
-     {
-         if (VarDeclaration vd = d.isVarDeclaration())
-             o = vd.type;
-         else if (AliasDeclaration ad = d.isAliasDeclaration())
-         {
-             o = ad.getType();
-             if (!o)
-                 o = ad.toAlias();
-         }
-         else
-             o = d.toAlias();
- 
-         s = getDsymbol(o);
-         if (!s)
-             return;
-     }
- 
-     if (TemplateInstance ti = s.isTemplateInstance())
-     {
-         // If the instance is already non-speculative,
-         // or it is leaked to the speculative scope.
-         if (ti.minst !is null || sc.minst is null)
-             return;
- 
-         // Remark as non-speculative instance.
-         ti.minst = sc.minst;
-         if (!ti.tinst)
-             ti.tinst = sc.tinst;
- 
-         unSpeculative(sc, ti.tempdecl);
-     }
- 
-     if (TemplateInstance ti = s.isInstantiated())
-         unSpeculative(sc, ti);
- }
- 
  /**********************************
   * Return true if e could be valid only as a template value parameter.
   * Return false if it might be an alias or tuple.
--- 2107,2118 ----
*************** extern (C++) final class TemplateMixin :
*** 5490,5575 ****
          return "mixin";
      }
  
-     override bool hasPointers()
-     {
-         //printf("TemplateMixin.hasPointers() %s\n", toChars());
-         return members.foreachDsymbol( (s) { return s.hasPointers(); } ) != 0;
-     }
- 
-     extern (D) bool findTempDecl(Scope* sc)
-     {
-         // Follow qualifications to find the TemplateDeclaration
-         if (!tempdecl)
-         {
-             Expression e;
-             Type t;
-             Dsymbol s;
-             tqual.resolve(loc, sc, e, t, s);
-             if (!s)
-             {
-                 .error(loc, "%s `%s` is not defined", kind, toPrettyChars);
-                 return false;
-             }
-             s = s.toAlias();
-             tempdecl = s.isTemplateDeclaration();
-             OverloadSet os = s.isOverloadSet();
- 
-             /* If an OverloadSet, look for a unique member that is a template declaration
-              */
-             if (os)
-             {
-                 Dsymbol ds = null;
-                 foreach (i, sym; os.a)
-                 {
-                     Dsymbol s2 = sym.isTemplateDeclaration();
-                     if (s2)
-                     {
-                         if (ds)
-                         {
-                             tempdecl = os;
-                             break;
-                         }
-                         ds = s2;
-                     }
-                 }
-             }
-             if (!tempdecl)
-             {
-                 .error(loc, "%s `%s` - `%s` is a %s, not a template", kind, toPrettyChars, s.toChars(), s.kind());
-                 return false;
-             }
-         }
-         assert(tempdecl);
- 
-         // Look for forward references
-         auto tovers = tempdecl.isOverloadSet();
-         foreach (size_t oi; 0 .. tovers ? tovers.a.length : 1)
-         {
-             Dsymbol dstart = tovers ? tovers.a[oi] : tempdecl;
-             int r = overloadApply(dstart, (Dsymbol s)
-             {
-                 auto td = s.isTemplateDeclaration();
-                 if (!td)
-                     return 0;
- 
-                 if (td.semanticRun == PASS.initial)
-                 {
-                     if (td._scope)
-                         td.dsymbolSemantic(td._scope);
-                     else
-                     {
-                         semanticRun = PASS.initial;
-                         return 1;
-                     }
-                 }
-                 return 0;
-             });
-             if (r)
-                 return false;
-         }
-         return true;
-     }
- 
      override void accept(Visitor v)
      {
          v.visit(this);
--- 2204,2209 ----
*************** struct TemplateInstanceBox
*** 5634,6099 ****
      }
  }
  
- /*******************************************
-  * Match to a particular TemplateParameter.
-  * Input:
-  *      instLoc         location that the template is instantiated.
-  *      tiargs[]        actual arguments to template instance
-  *      i               i'th argument
-  *      parameters[]    template parameters
-  *      dedtypes[]      deduced arguments to template instance
-  *      *psparam        set to symbol declared and initialized to dedtypes[i]
-  */
- MATCH matchArg(TemplateParameter tp, Loc instLoc, Scope* sc, Objects* tiargs, size_t i, TemplateParameters* parameters, ref Objects dedtypes, Declaration* psparam)
- {
-     MATCH matchArgNoMatch()
-     {
-         if (psparam)
-             *psparam = null;
-         return MATCH.nomatch;
-     }
- 
-     MATCH matchArgParameter()
-     {
-         RootObject oarg;
- 
-         if (i < tiargs.length)
-             oarg = (*tiargs)[i];
-         else
-         {
-             // Get default argument instead
-             oarg = tp.defaultArg(instLoc, sc);
-             if (!oarg)
-             {
-                 assert(i < dedtypes.length);
-                 // It might have already been deduced
-                 oarg = dedtypes[i];
-                 if (!oarg)
-                     return matchArgNoMatch();
-             }
-         }
-         return tp.matchArg(sc, oarg, i, parameters, dedtypes, psparam);
-     }
- 
-     MATCH matchArgTuple(TemplateTupleParameter ttp)
-     {
-         /* The rest of the actual arguments (tiargs[]) form the match
-          * for the variadic parameter.
-          */
-         assert(i + 1 == dedtypes.length); // must be the last one
-         Tuple ovar;
- 
-         if (Tuple u = isTuple(dedtypes[i]))
-         {
-             // It has already been deduced
-             ovar = u;
-         }
-         else if (i + 1 == tiargs.length && isTuple((*tiargs)[i]))
-             ovar = isTuple((*tiargs)[i]);
-         else
-         {
-             ovar = new Tuple();
-             //printf("ovar = %p\n", ovar);
-             if (i < tiargs.length)
-             {
-                 //printf("i = %d, tiargs.length = %d\n", i, tiargs.length);
-                 ovar.objects.setDim(tiargs.length - i);
-                 foreach (j, ref obj; ovar.objects)
-                     obj = (*tiargs)[i + j];
-             }
-         }
-         return ttp.matchArg(sc, ovar, i, parameters, dedtypes, psparam);
-     }
- 
-     if (auto ttp = tp.isTemplateTupleParameter())
-         return matchArgTuple(ttp);
- 
-     return matchArgParameter();
- }
- 
- MATCH matchArg(TemplateParameter tp, Scope* sc, RootObject oarg, size_t i, TemplateParameters* parameters, ref Objects dedtypes, Declaration* psparam)
- {
-     MATCH matchArgNoMatch()
-     {
-         //printf("\tm = %d\n", MATCH.nomatch);
-         if (psparam)
-             *psparam = null;
-         return MATCH.nomatch;
-     }
- 
-     MATCH matchArgType(TemplateTypeParameter ttp)
-     {
-         //printf("TemplateTypeParameter.matchArg('%s')\n", ttp.ident.toChars());
-         MATCH m = MATCH.exact;
-         Type ta = isType(oarg);
-         if (!ta)
-         {
-             //printf("%s %p %p %p\n", oarg.toChars(), isExpression(oarg), isDsymbol(oarg), isTuple(oarg));
-             return matchArgNoMatch();
-         }
-         //printf("ta is %s\n", ta.toChars());
- 
-         if (ttp.specType)
-         {
-             if (!ta || ta == TemplateTypeParameter.tdummy)
-                 return matchArgNoMatch();
- 
-             //printf("\tcalling deduceType(): ta is %s, specType is %s\n", ta.toChars(), ttp.specType.toChars());
-             MATCH m2 = deduceType(ta, sc, ttp.specType, *parameters, dedtypes);
-             if (m2 == MATCH.nomatch)
-             {
-                 //printf("\tfailed deduceType\n");
-                 return matchArgNoMatch();
-             }
- 
-             if (m2 < m)
-                 m = m2;
-             if (dedtypes[i])
-             {
-                 Type t = cast(Type)dedtypes[i];
- 
-                 if (ttp.dependent && !t.equals(ta)) // https://issues.dlang.org/show_bug.cgi?id=14357
-                     return matchArgNoMatch();
- 
-                 /* This is a self-dependent parameter. For example:
-                  *  template X(T : T*) {}
-                  *  template X(T : S!T, alias S) {}
-                  */
-                 //printf("t = %s ta = %s\n", t.toChars(), ta.toChars());
-                 ta = t;
-             }
-         }
-         else
-         {
-             if (dedtypes[i])
-             {
-                 // Must match already deduced type
-                 Type t = cast(Type)dedtypes[i];
- 
-                 if (!t.equals(ta))
-                 {
-                     //printf("t = %s ta = %s\n", t.toChars(), ta.toChars());
-                     return matchArgNoMatch();
-                 }
-             }
-             else
-             {
-                 // So that matches with specializations are better
-                 m = MATCH.convert;
-             }
-         }
-         dedtypes[i] = ta;
- 
-         if (psparam)
-             *psparam = new AliasDeclaration(ttp.loc, ttp.ident, ta);
-         //printf("\tm = %d\n", m);
-         return ttp.dependent ? MATCH.exact : m;
-     }
- 
-     MATCH matchArgValue(TemplateValueParameter tvp)
-     {
-         //printf("TemplateValueParameter.matchArg('%s')\n", tvp.ident.toChars());
-         MATCH m = MATCH.exact;
- 
-         Expression ei = isExpression(oarg);
-         Type vt;
- 
-         if (!ei && oarg)
-         {
-             Dsymbol si = isDsymbol(oarg);
-             FuncDeclaration f = si ? si.isFuncDeclaration() : null;
-             if (!f || !f.fbody || f.needThis())
-                 return matchArgNoMatch();
- 
-             ei = new VarExp(tvp.loc, f);
-             ei = ei.expressionSemantic(sc);
- 
-             /* If a function is really property-like, and then
-              * it's CTFEable, ei will be a literal expression.
-              */
-             const olderrors = global.startGagging();
-             ei = resolveProperties(sc, ei);
-             ei = ei.ctfeInterpret();
-             if (global.endGagging(olderrors) || ei.op == EXP.error)
-                 return matchArgNoMatch();
- 
-             /* https://issues.dlang.org/show_bug.cgi?id=14520
-              * A property-like function can match to both
-              * TemplateAlias and ValueParameter. But for template overloads,
-              * it should always prefer alias parameter to be consistent
-              * template match result.
-              *
-              *   template X(alias f) { enum X = 1; }
-              *   template X(int val) { enum X = 2; }
-              *   int f1() { return 0; }  // CTFEable
-              *   int f2();               // body-less function is not CTFEable
-              *   enum x1 = X!f1;    // should be 1
-              *   enum x2 = X!f2;    // should be 1
-              *
-              * e.g. The x1 value must be same even if the f1 definition will be moved
-              *      into di while stripping body code.
-              */
-             m = MATCH.convert;
-         }
- 
-         if (ei && ei.op == EXP.variable)
-         {
-             // Resolve const variables that we had skipped earlier
-             ei = ei.ctfeInterpret();
-         }
- 
-         //printf("\tvalType: %s, ty = %d\n", tvp.valType.toChars(), tvp.valType.ty);
-         vt = tvp.valType.typeSemantic(tvp.loc, sc);
-         //printf("ei: %s, ei.type: %s\n", ei.toChars(), ei.type.toChars());
-         //printf("vt = %s\n", vt.toChars());
- 
-         if (ei.type)
-         {
-             MATCH m2 = ei.implicitConvTo(vt);
-             //printf("m: %d\n", m);
-             if (m2 < m)
-                 m = m2;
-             if (m == MATCH.nomatch)
-                 return matchArgNoMatch();
-             ei = ei.implicitCastTo(sc, vt);
-             ei = ei.ctfeInterpret();
-         }
- 
-         if (tvp.specValue)
-         {
-             if (ei is null || (cast(void*)ei.type in TemplateValueParameter.edummies &&
-                                TemplateValueParameter.edummies[cast(void*)ei.type] == ei))
-                 return matchArgNoMatch();
- 
-             Expression e = tvp.specValue;
- 
-             sc = sc.startCTFE();
-             e = e.expressionSemantic(sc);
-             e = resolveProperties(sc, e);
-             sc = sc.endCTFE();
-             e = e.implicitCastTo(sc, vt);
-             e = e.ctfeInterpret();
- 
-             ei = ei.syntaxCopy();
-             sc = sc.startCTFE();
-             ei = ei.expressionSemantic(sc);
-             sc = sc.endCTFE();
-             ei = ei.implicitCastTo(sc, vt);
-             ei = ei.ctfeInterpret();
-             //printf("\tei: %s, %s\n", ei.toChars(), ei.type.toChars());
-             //printf("\te : %s, %s\n", e.toChars(), e.type.toChars());
-             if (!ei.equals(e))
-                 return matchArgNoMatch();
-         }
-         else
-         {
-             if (dedtypes[i])
-             {
-                 // Must match already deduced value
-                 Expression e = cast(Expression)dedtypes[i];
-                 if (!ei || !ei.equals(e))
-                     return matchArgNoMatch();
-             }
-         }
-         dedtypes[i] = ei;
- 
-         if (psparam)
-         {
-             Initializer _init = new ExpInitializer(tvp.loc, ei);
-             Declaration sparam = new VarDeclaration(tvp.loc, vt, tvp.ident, _init);
-             sparam.storage_class = STC.manifest;
-             *psparam = sparam;
-         }
-         return tvp.dependent ? MATCH.exact : m;
-     }
- 
-     MATCH matchArgAlias(TemplateAliasParameter tap)
-     {
-         //printf("TemplateAliasParameter.matchArg('%s')\n", tap.ident.toChars());
-         MATCH m = MATCH.exact;
-         Type ta = isType(oarg);
-         RootObject sa = ta && !ta.deco ? null : getDsymbol(oarg);
-         Expression ea = isExpression(oarg);
-         if (ea)
-         {
-             if (auto te = ea.isThisExp())
-                 sa = te.var;
-             else if (auto se = ea.isSuperExp())
-                 sa = se.var;
-             else if (auto se = ea.isScopeExp())
-                 sa = se.sds;
-         }
-         if (sa)
-         {
-             if ((cast(Dsymbol)sa).isAggregateDeclaration())
-                 m = MATCH.convert;
- 
-             /* specType means the alias must be a declaration with a type
-              * that matches specType.
-              */
-             if (tap.specType)
-             {
-                 tap.specType = typeSemantic(tap.specType, tap.loc, sc);
-                 Declaration d = (cast(Dsymbol)sa).isDeclaration();
-                 if (!d)
-                     return matchArgNoMatch();
-                 if (!d.type.equals(tap.specType))
-                     return matchArgNoMatch();
-             }
-         }
-         else
-         {
-             sa = oarg;
-             if (ea)
-             {
-                 if (tap.specType)
-                 {
-                     if (!ea.type.equals(tap.specType))
-                         return matchArgNoMatch();
-                 }
-             }
-             else if (ta && ta.ty == Tinstance && !tap.specAlias)
-             {
-                 /* Specialized parameter should be preferred
-                  * match to the template type parameter.
-                  *  template X(alias a) {}                      // a == this
-                  *  template X(alias a : B!A, alias B, A...) {} // B!A => ta
-                  */
-             }
-             else if (sa && sa == TemplateTypeParameter.tdummy)
-             {
-                 /* https://issues.dlang.org/show_bug.cgi?id=2025
-                  * Aggregate Types should preferentially
-                  * match to the template type parameter.
-                  *  template X(alias a) {}  // a == this
-                  *  template X(T) {}        // T => sa
-                  */
-             }
-             else if (ta && ta.ty != Tident)
-             {
-                 /* Match any type that's not a TypeIdentifier to alias parameters,
-                  * but prefer type parameter.
-                  * template X(alias a) { }  // a == ta
-                  *
-                  * TypeIdentifiers are excluded because they might be not yet resolved aliases.
-                  */
-                 m = MATCH.convert;
-             }
-             else
-                 return matchArgNoMatch();
-         }
- 
-         if (tap.specAlias)
-         {
-             if (sa == TemplateAliasParameter.sdummy)
-                 return matchArgNoMatch();
-             // check specialization if template arg is a symbol
-             Dsymbol sx = isDsymbol(sa);
-             if (sa != tap.specAlias && sx)
-             {
-                 Type talias = isType(tap.specAlias);
-                 if (!talias)
-                     return matchArgNoMatch();
- 
-                 TemplateInstance ti = sx.isTemplateInstance();
-                 if (!ti && sx.parent)
-                 {
-                     ti = sx.parent.isTemplateInstance();
-                     if (ti && ti.name != sx.ident)
-                         return matchArgNoMatch();
-                 }
-                 if (!ti)
-                     return matchArgNoMatch();
- 
-                 Type t = new TypeInstance(Loc.initial, ti);
-                 MATCH m2 = deduceType(t, sc, talias, *parameters, dedtypes);
-                 if (m2 == MATCH.nomatch)
-                     return matchArgNoMatch();
-             }
-             // check specialization if template arg is a type
-             else if (ta)
-             {
-                 if (Type tspec = isType(tap.specAlias))
-                 {
-                     MATCH m2 = ta.implicitConvTo(tspec);
-                     if (m2 == MATCH.nomatch)
-                         return matchArgNoMatch();
-                 }
-                 else
-                 {
-                     error(tap.loc, "template parameter specialization for a type must be a type and not `%s`",
-                         tap.specAlias.toChars());
-                     return matchArgNoMatch();
-                 }
-             }
-         }
-         else if (dedtypes[i])
-         {
-             // Must match already deduced symbol
-             RootObject si = dedtypes[i];
-             if (!sa || si != sa)
-                 return matchArgNoMatch();
-         }
-         dedtypes[i] = sa;
- 
-         if (psparam)
-         {
-             if (Dsymbol s = isDsymbol(sa))
-             {
-                 *psparam = new AliasDeclaration(tap.loc, tap.ident, s);
-             }
-             else if (Type t = isType(sa))
-             {
-                 *psparam = new AliasDeclaration(tap.loc, tap.ident, t);
-             }
-             else
-             {
-                 assert(ea);
- 
-                 // Declare manifest constant
-                 Initializer _init = new ExpInitializer(tap.loc, ea);
-                 auto v = new VarDeclaration(tap.loc, null, tap.ident, _init);
-                 v.storage_class = STC.manifest;
-                 v.dsymbolSemantic(sc);
-                 *psparam = v;
-             }
-         }
-         return tap.dependent ? MATCH.exact : m;
-     }
- 
-     MATCH matchArgTuple(TemplateTupleParameter ttp)
-     {
-         //printf("TemplateTupleParameter.matchArg('%s')\n", ttp.ident.toChars());
-         Tuple ovar = isTuple(oarg);
-         if (!ovar)
-             return MATCH.nomatch;
-         if (dedtypes[i])
-         {
-             Tuple tup = isTuple(dedtypes[i]);
-             if (!tup)
-                 return MATCH.nomatch;
-             if (!match(tup, ovar))
-                 return MATCH.nomatch;
-         }
-         dedtypes[i] = ovar;
- 
-         if (psparam)
-             *psparam = new TupleDeclaration(ttp.loc, ttp.ident, &ovar.objects);
-         return ttp.dependent ? MATCH.exact : MATCH.convert;
-     }
- 
-     if (auto ttp = tp.isTemplateTypeParameter())
-         return matchArgType(ttp);
-     if (auto tvp = tp.isTemplateValueParameter())
-         return matchArgValue(tvp);
-     if (auto tap = tp.isTemplateAliasParameter())
-         return matchArgAlias(tap);
-     if (auto ttp = tp.isTemplateTupleParameter())
-         return matchArgTuple(ttp);
-     assert(0);
- }
- 
- 
  /***********************************************
   * Collect and print statistics on template instantiations.
   */
--- 2268,2273 ----
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/dtoh.d gcc-16-20260201/gcc/d/dmd/dtoh.d
*** gcc-16-20260125/gcc/d/dmd/dtoh.d	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/dtoh.d	Sun Feb  1 22:32:07 2026
*************** public:
*** 895,901 ****
      {
          // Omit redundant declarations - the slot was already
          // reserved in the base class
!         if (fd.isVirtual() && fd.isIntroducing())
          {
              // Hide placeholders because they are not ABI compatible
              writeProtection(AST.Visibility.Kind.private_);
--- 895,901 ----
      {
          // Omit redundant declarations - the slot was already
          // reserved in the base class
!         if (fd.isVirtual() && fd.isIntroducing)
          {
              // Hide placeholders because they are not ABI compatible
              writeProtection(AST.Visibility.Kind.private_);
*************** public:
*** 1164,1170 ****
  
          auto fd = ad.aliassym.isFuncDeclaration();
  
!         if (fd && (fd.isGenerated() || fd.isDtorDeclaration()))
          {
              // Ignore. It's taken care of while visiting FuncDeclaration
              return;
--- 1164,1170 ----
  
          auto fd = ad.aliassym.isFuncDeclaration();
  
!         if (fd && (fd.isGenerated || fd.isDtorDeclaration()))
          {
              // Ignore. It's taken care of while visiting FuncDeclaration
              return;
*************** public:
*** 1197,1203 ****
                  // Print prefix of the base class if this function originates from a superclass
                  // because alias might be resolved through multiple classes, e.g.
                  // e.g. for alias visit = typeof(super).visit in the visitors
!                 if (!fd.isIntroducing())
                      printPrefix(ad.toParent().isClassDeclaration().baseClass);
                  else
                      printPrefix(pd);
--- 1197,1203 ----
                  // Print prefix of the base class if this function originates from a superclass
                  // because alias might be resolved through multiple classes, e.g.
                  // e.g. for alias visit = typeof(super).visit in the visitors
!                 if (!fd.isIntroducing)
                      printPrefix(ad.toParent().isClassDeclaration().baseClass);
                  else
                      printPrefix(pd);
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/dversion.d gcc-16-20260201/gcc/d/dmd/dversion.d
*** gcc-16-20260125/gcc/d/dmd/dversion.d	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/dversion.d	Sun Feb  1 22:32:07 2026
*************** import dmd.dmodule;
*** 20,26 ****
  import dmd.dscope;
  import dmd.dsymbol;
  import dmd.dsymbolsem;
- import dmd.globals;
  import dmd.identifier;
  import dmd.location;
  import dmd.common.outbuffer;
--- 20,25 ----
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/enum.h gcc-16-20260201/gcc/d/dmd/enum.h
*** gcc-16-20260125/gcc/d/dmd/enum.h	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/enum.h	Sun Feb  1 22:32:07 2026
*************** public:
*** 59,65 ****
      bool isSpecial() const;
  
  
!     Symbol *sinit;
      void accept(Visitor *v) override { v->visit(this); }
  };
  
--- 59,65 ----
      bool isSpecial() const;
  
  
!     void *sinit;
      void accept(Visitor *v) override { v->visit(this); }
  };
  
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/enumsem.d gcc-16-20260201/gcc/d/dmd/enumsem.d
*** gcc-16-20260125/gcc/d/dmd/enumsem.d	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/enumsem.d	Sun Feb  1 22:32:07 2026
*************** import dmd.visitor;
*** 81,87 ****
  
  
  /*********************************
!  * Perform semantic analysis on enum declaration `em`
   */
  void enumSemantic(Scope* sc, EnumDeclaration ed)
  {
--- 81,87 ----
  
  
  /*********************************
!  * Perform semantic analysis on enum declaration `ed`
   */
  void enumSemantic(Scope* sc, EnumDeclaration ed)
  {
*************** void enumSemantic(Scope* sc, EnumDeclara
*** 158,166 ****
                  ed.semanticRun = PASS.initial;
                  return;
              }
!             else
!                 // Ensure that semantic is run to detect. e.g. invalid forward references
!                 sym.dsymbolSemantic(sc);
          }
          if (ed.memtype.ty == Tvoid)
          {
--- 158,167 ----
                  ed.semanticRun = PASS.initial;
                  return;
              }
!             // Ensure that semantic is run to detect. e.g. invalid forward references
!             sym.dsymbolSemantic(sc);
!             if (ed.errors)
!                 ed.memtype = Type.terror; // avoid infinite recursion in toBaseType
          }
          if (ed.memtype.ty == Tvoid)
          {
*************** void enumSemantic(Scope* sc, EnumDeclara
*** 175,180 ****
--- 176,183 ----
              ed.semanticRun = PASS.semanticdone;
              return;
          }
+         if (global.params.useTypeInfo && Type.dtypeinfo && !ed.inNonRoot())
+             semanticTypeInfo(sc, ed.memtype);
      }
  
      if (!ed.members) // enum ident : memtype;
*************** void enumSemantic(Scope* sc, EnumDeclara
*** 229,350 ****
      addEnumMembersToSymtab(ed, sc, sc.getScopesym());
  
      if (sc.inCfile)
!     {
!         /* C11 6.7.2.2
!          */
!         Type commonType = ed.memtype;
!         if (!commonType)
!             commonType = Type.tint32;
!         ulong nextValue = 0;        // C11 6.7.2.2-3 first member value defaults to 0
! 
!         // C11 6.7.2.2-2 value must be representable as an int.
!         // The sizemask represents all values that int will fit into,
!         // from 0..uint.max.  We want to cover int.min..uint.max.
!         IntRange ir = IntRange.fromType(commonType);
! 
!         void emSemantic(EnumMember em, ref ulong nextValue)
!         {
!             static void errorReturn(EnumMember em)
!             {
!                 em.value = ErrorExp.get();
!                 em.errors = true;
!                 em.semanticRun = PASS.semanticdone;
!             }
! 
!             em.semanticRun = PASS.semantic;
!             em.type = commonType;
!             em._linkage = LINK.c;
!             em.storage_class |= STC.manifest;
!             if (em.value)
!             {
!                 Expression e = em.value;
!                 assert(e.dyncast() == DYNCAST.expression);
! 
!                 /* To merge the type of e with commonType, add 0 of type commonType
!                  */
!                 if (!ed.memtype)
!                     e = new AddExp(em.loc, e, new IntegerExp(em.loc, 0, commonType));
! 
!                 e = e.expressionSemantic(sc);
!                 e = resolveProperties(sc, e);
!                 e = e.integralPromotions(sc);
!                 e = e.ctfeInterpret();
!                 if (e.op == EXP.error)
!                     return errorReturn(em);
!                 auto ie = e.isIntegerExp();
!                 if (!ie)
!                 {
!                     // C11 6.7.2.2-2
!                     .error(em.loc, "%s `%s` enum member must be an integral constant expression, not `%s` of type `%s`", em.kind, em.toPrettyChars, e.toChars(), e.type.toChars());
!                     return errorReturn(em);
!                 }
!                 if (ed.memtype && !ir.contains(getIntRange(ie)))
!                 {
!                     // C11 6.7.2.2-2
!                     .error(em.loc, "%s `%s` enum member value `%s` does not fit in `%s`", em.kind, em.toPrettyChars, e.toChars(), commonType.toChars());
!                     return errorReturn(em);
!                 }
!                 nextValue = ie.toInteger();
!                 if (!ed.memtype)
!                     commonType = e.type;
!                 em.value = new IntegerExp(em.loc, nextValue, commonType);
!             }
!             else
!             {
!                 // C11 6.7.2.2-3 add 1 to value of previous enumeration constant
!                 bool first = (em == (*em.ed.members)[0]);
!                 if (!first)
!                 {
!                     Expression max = getProperty(commonType, null, em.loc, Id.max, 0);
!                     if (nextValue == max.toInteger())
!                     {
!                         .error(em.loc, "%s `%s` initialization with `%s+1` causes overflow for type `%s`", em.kind, em.toPrettyChars, max.toChars(), commonType.toChars());
!                         return errorReturn(em);
!                     }
!                     nextValue += 1;
!                 }
!                 em.value = new IntegerExp(em.loc, nextValue, commonType);
!             }
!             em.type = commonType;
!             em.semanticRun = PASS.semanticdone;
!         }
! 
!         ed.members.foreachDsymbol( (s)
!         {
!             if (EnumMember em = s.isEnumMember())
!                 emSemantic(em, nextValue);
!         });
! 
!         if (!ed.memtype)
!         {
!             // cast all members to commonType
!             ed.members.foreachDsymbol( (s)
!             {
!                 if (EnumMember em = s.isEnumMember())
!                 {
!                     em.type = commonType;
!                     // optimize out the cast so that other parts of the compiler can
!                     // assume that an integral enum's members are `IntegerExp`s.
!                     // https://issues.dlang.org/show_bug.cgi?id=24504
!                     em.value = em.value.castTo(sc, commonType).optimize(WANTvalue);
!                 }
!             });
!         }
! 
!         ed.memtype = commonType;
!         ed.semanticRun = PASS.semanticdone;
!         return;
!     }
  
      ed.members.foreachDsymbol( (s)
      {
          if (EnumMember em = s.isEnumMember())
              em.dsymbolSemantic(em._scope);
      });
      //printf("ed.defaultval = %lld\n", ed.defaultval);
  
      //if (ed.defaultval) printf("ed.defaultval: %s %s\n", ed.defaultval.toChars(), ed.defaultval.type.toChars());
      //printf("members = %s\n", members.toChars());
  }
  
  Expression getDefaultValue(EnumDeclaration ed, Loc loc)
--- 232,257 ----
      addEnumMembersToSymtab(ed, sc, sc.getScopesym());
  
      if (sc.inCfile)
!         return cEnumSemantic(sc, ed);
  
      ed.members.foreachDsymbol( (s)
      {
          if (EnumMember em = s.isEnumMember())
              em.dsymbolSemantic(em._scope);
      });
+ 
+     if (ed.errors)
+         ed.memtype = Type.terror; // avoid infinite recursion in toBaseType
+     else if (global.params.useTypeInfo && Type.dtypeinfo && !ed.inNonRoot())
+         semanticTypeInfo(sc, ed.memtype);
      //printf("ed.defaultval = %lld\n", ed.defaultval);
  
      //if (ed.defaultval) printf("ed.defaultval: %s %s\n", ed.defaultval.toChars(), ed.defaultval.type.toChars());
      //printf("members = %s\n", members.toChars());
+ 
+     // Set semantic2done here to indicate all members have been processed
+     // This prevents using the enum in a final switch while being defined
+     ed.semanticRun = PASS.semantic2done;
  }
  
  Expression getDefaultValue(EnumDeclaration ed, Loc loc)
*************** void enumMemberSemantic(Scope* sc, EnumM
*** 625,630 ****
--- 532,552 ----
          });
  
          assert(emprev);
+ 
+         // New check: if the base type is an enum, auto-increment is not supported,
+         // unless it is a special enum (for example, the C types like cpp_long/longlong).
+         if (auto te = em.ed.memtype ? em.ed.memtype.isTypeEnum() : null)
+         {
+             if (!te.sym.isSpecial())
+             {
+                 error(em.loc,
+                       "cannot automatically assign value to enum member `%s` because base type `%s` is an enum; provide an explicit value",
+                       em.toPrettyChars(), em.ed.memtype.toChars());
+                 return errorReturn();
+             }
+         }
+ 
+ 
          if (emprev.semanticRun < PASS.semanticdone) // if forward reference
              emprev.dsymbolSemantic(emprev._scope); // resolve it
          if (emprev.errors)
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/escape.d gcc-16-20260201/gcc/d/dmd/escape.d
*** gcc-16-20260125/gcc/d/dmd/escape.d	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/escape.d	Sun Feb  1 22:32:07 2026
*************** void escapeExp(Expression e, ref scope E
*** 1557,1563 ****
      void visitThis(ThisExp e)
      {
          // Special case because `__this2` isn't `ref` internally
!         if (deref == -1 && e.var && e.var.toParent2().isFuncDeclaration().hasDualContext())
          {
              escapeByValue(e, er);
              return;
--- 1557,1563 ----
      void visitThis(ThisExp e)
      {
          // Special case because `__this2` isn't `ref` internally
!         if (deref == -1 && e.var && e.var.toParent2().isFuncDeclaration().hasDualContext)
          {
              escapeByValue(e, er);
              return;
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/expression.d gcc-16-20260201/gcc/d/dmd/expression.d
*** gcc-16-20260125/gcc/d/dmd/expression.d	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/expression.d	Sun Feb  1 22:32:07 2026
*************** import dmd.aggregate;
*** 21,26 ****
--- 21,27 ----
  import dmd.arraytypes;
  import dmd.astenums;
  import dmd.ast_node;
+ import dmd.ctfeexpr : isCtfeReferenceValid;
  import dmd.dcast : implicitConvTo;
  import dmd.dclass;
  import dmd.declaration;
*************** import dmd.dsymbol;
*** 31,36 ****
--- 32,38 ----
  import dmd.dtemplate;
  import dmd.errors;
  import dmd.errorsink;
+ import dmd.expressionsem : getDsymbol;
  import dmd.func;
  import dmd.globals;
  import dmd.hdrgen;
*************** import dmd.root.string;
*** 49,55 ****
  import dmd.root.utf;
  import dmd.target;
  import dmd.tokens;
! import dmd.typesem;
  import dmd.visitor;
  
  enum LOGSEMANTIC = false;
--- 51,57 ----
  import dmd.root.utf;
  import dmd.target;
  import dmd.tokens;
! import dmd.typesem : toHeadMutable, size, mutableOf, unSharedOf;
  import dmd.visitor;
  
  enum LOGSEMANTIC = false;
*************** inout(Expression) lastComma(inout Expres
*** 86,92 ****
   *     exps  = array of Expressions
   *     names = optional array of names corresponding to Expressions
   */
! void expandTuples(Expressions* exps, Identifiers* names = null)
  {
      //printf("expandTuples()\n");
      if (exps is null)
--- 88,94 ----
   *     exps  = array of Expressions
   *     names = optional array of names corresponding to Expressions
   */
! void expandTuples(Expressions* exps, ArgumentLabels* names = null)
  {
      //printf("expandTuples()\n");
      if (exps is null)
*************** void expandTuples(Expressions* exps, Ide
*** 116,122 ****
              }
              foreach (i; 1 .. length)
              {
!                 names.insert(index + i, cast(Identifier) null);
              }
          }
      }
--- 118,124 ----
              }
              foreach (i; 1 .. length)
              {
!                 names.insert(index + i, ArgumentLabel(cast(Identifier) null, Loc.init));
              }
          }
      }
*************** extern (C++) abstract class Expression :
*** 306,311 ****
--- 308,314 ----
      {
      bool parens;    // if this is a parenthesized expression
      bool rvalue;    // true if this is considered to be an rvalue, even if it is an lvalue
+     bool gcPassDone; // `checkGC` has been run on this expression
      }
      import dmd.common.bitfields;
      mixin(generateBitFields!(BitFields, ubyte));
*************** extern (C++) abstract class Expression :
*** 527,546 ****
      }
  
      /******************************
-      * Take address of expression.
-      */
-     final Expression addressOf()
-     {
-         //printf("Expression::addressOf()\n");
-         debug
-         {
-             assert(op == EXP.error || isLvalue());
-         }
-         Expression e = new AddrExp(loc, this, type.pointerTo());
-         return e;
-     }
- 
-     /******************************
       * If this is a reference, dereference it.
       */
      final Expression deref()
--- 530,535 ----
*************** extern (C++) final class StringExp : Exp
*** 1405,1410 ****
--- 1394,1401 ----
  
      /// If the string is parsed from a hex string literal
      bool hexString = false;
+     /// If the string is from a collected C macro
+     bool cMacro = false;
  
      enum char NoPostfix = 0;
  
*************** extern (C++) final class StringExp : Exp
*** 1416,1428 ****
          this.sz = 1;                    // work around LDC bug #1286
      }
  
!     extern (D) this(Loc loc, const(void)[] string, size_t len, ubyte sz, char postfix = NoPostfix) scope
      {
          super(loc, EXP.string_);
          this.string = cast(char*)string.ptr; // note that this.string should be const
          this.len = len;
          this.sz = sz;
          this.postfix = postfix;
      }
  
      static StringExp create(Loc loc, const(char)* s)
--- 1407,1420 ----
          this.sz = 1;                    // work around LDC bug #1286
      }
  
!     extern (D) this(Loc loc, const(void)[] string, size_t len, ubyte sz, char postfix = NoPostfix, bool cMacro = false) scope
      {
          super(loc, EXP.string_);
          this.string = cast(char*)string.ptr; // note that this.string should be const
          this.len = len;
          this.sz = sz;
          this.postfix = postfix;
+         this.cMacro = cMacro;
      }
  
      static StringExp create(Loc loc, const(char)* s)
*************** extern (C++) final class ArrayLiteralExp
*** 1902,1907 ****
--- 1894,1905 ----
  
      Expressions* elements;
  
+     Expression lowering;
+ 
+     // aaLiteral is set if this is an array of values of an AA literal
+     // only used during CTFE to show the original AA in error messages instead
+     AssocArrayLiteralExp aaLiteral;
+ 
      extern (D) this(Loc loc, Type type, Expressions* elements) @safe
      {
          super(loc, EXP.arrayLiteral);
*************** extern (C++) final class ArrayLiteralExp
*** 1913,1920 ****
      {
          super(loc, EXP.arrayLiteral);
          this.type = type;
!         elements = new Expressions();
!         elements.push(e);
      }
  
      extern (D) this(Loc loc, Type type, Expression basis, Expressions* elements) @safe
--- 1911,1917 ----
      {
          super(loc, EXP.arrayLiteral);
          this.type = type;
!         elements = new Expressions(e);
      }
  
      extern (D) this(Loc loc, Type type, Expression basis, Expressions* elements) @safe
*************** extern (C++) final class ArrayLiteralExp
*** 2005,2011 ****
                      if (ch.op != EXP.int64)
                          return null;
                      if (sz == 1)
!                         buf.writeByte(cast(uint)ch.toInteger());
                      else if (sz == 2)
                          buf.writeword(cast(uint)ch.toInteger());
                      else
--- 2002,2008 ----
                      if (ch.op != EXP.int64)
                          return null;
                      if (sz == 1)
!                         buf.writeByte(cast(ubyte)ch.toInteger());
                      else if (sz == 2)
                          buf.writeword(cast(uint)ch.toInteger());
                      else
*************** extern (C++) final class AssocArrayLiter
*** 2055,2062 ****
  
      Expressions* keys;
      Expressions* values;
!     /// Lower to core.internal.newaa for static initializaton
!     Expression lowering;
  
      extern (D) this(Loc loc, Expressions* keys, Expressions* values) @safe
      {
--- 2052,2060 ----
  
      Expressions* keys;
      Expressions* values;
! 
!     Expression lowering;     // call to _d_assocarrayliteralTX()
!     Expression loweringCtfe; // result of interpreting lowering for static initializaton
  
      extern (D) this(Loc loc, Expressions* keys, Expressions* values) @safe
      {
*************** extern (C++) final class StructLiteralEx
*** 2213,2268 ****
          return exp;
      }
  
-     /**************************************
-      * Gets expression at offset of type.
-      * Returns NULL if not found.
-      */
-     extern (D) Expression getField(Type type, uint offset)
-     {
-         //printf("StructLiteralExp::getField(this = %s, type = %s, offset = %u)\n",
-         //  /*toChars()*/"", type.toChars(), offset);
-         Expression e = null;
-         int i = getFieldIndex(type, offset);
- 
-         if (i != -1)
-         {
-             //printf("\ti = %d\n", i);
-             if (i >= sd.nonHiddenFields())
-                 return null;
- 
-             assert(i < elements.length);
-             e = (*elements)[i];
-             if (e)
-             {
-                 //printf("e = %s, e.type = %s\n", e.toChars(), e.type.toChars());
- 
-                 /* If type is a static array, and e is an initializer for that array,
-                  * then the field initializer should be an array literal of e.
-                  */
-                 auto tsa = type.isTypeSArray();
-                 if (tsa && e.type.castMod(0) != type.castMod(0))
-                 {
-                     const length = cast(size_t)tsa.dim.toInteger();
-                     auto z = new Expressions(length);
-                     foreach (ref q; *z)
-                         q = e.copy();
-                     e = new ArrayLiteralExp(loc, type, z);
-                 }
-                 else
-                 {
-                     e = e.copy();
-                     e.type = type;
-                 }
-                 if (useStaticInit && e.type.needsNested())
-                     if (auto se = e.isStructLiteralExp())
-                     {
-                         se.useStaticInit = true;
-                     }
-             }
-         }
-         return e;
-     }
- 
      /************************************
       * Get index of field.
       * Returns -1 if not found.
--- 2211,2216 ----
*************** extern (C++) final class NewExp : Expres
*** 2445,2451 ****
      Expression thisexp;         // if !=null, 'this' for class being allocated
      Type newtype;
      Expressions* arguments;     // Array of Expression's
!     Identifiers* names;         // Array of names corresponding to expressions
      Expression placement;       // if !=null, then PlacementExpression
  
      Expression argprefix;       // expression to be evaluated just before arguments[]
--- 2393,2399 ----
      Expression thisexp;         // if !=null, 'this' for class being allocated
      Type newtype;
      Expressions* arguments;     // Array of Expression's
!     ArgumentLabels* names;         // Array of names(name and location of name) corresponding to expressions
      Expression placement;       // if !=null, then PlacementExpression
  
      Expression argprefix;       // expression to be evaluated just before arguments[]
*************** extern (C++) final class NewExp : Expres
*** 2457,2465 ****
  
      /// Puts the `arguments` and `names` into an `ArgumentList` for easily passing them around.
      /// The fields are still separate for backwards compatibility
      extern (D) ArgumentList argumentList() { return ArgumentList(arguments, names); }
  
!     extern (D) this(Loc loc, Expression placement, Expression thisexp, Type newtype, Expressions* arguments, Identifiers* names = null) @safe
      {
          super(loc, EXP.new_);
          this.placement = placement;
--- 2405,2414 ----
  
      /// Puts the `arguments` and `names` into an `ArgumentList` for easily passing them around.
      /// The fields are still separate for backwards compatibility
+ 
      extern (D) ArgumentList argumentList() { return ArgumentList(arguments, names); }
  
!     extern (D) this(Loc loc, Expression placement, Expression thisexp, Type newtype, Expressions* arguments, ArgumentLabels* names = null) @safe
      {
          super(loc, EXP.new_);
          this.placement = placement;
*************** extern (C++) final class DotTypeExp : Un
*** 3271,3311 ****
  struct ArgumentList
  {
      Expressions* arguments; // function arguments
!     Identifiers* names;     // named argument identifiers
  
      size_t length() const @nogc nothrow pure @safe { return arguments ? arguments.length : 0; }
  
      /// Returns: whether this argument list contains any named arguments
!     bool hasNames() const @nogc nothrow pure @safe
      {
          if (names is null)
              return false;
!         foreach (name; *names)
!             if (name !is null)
                  return true;
  
          return false;
      }
  }
  
  /***********************************************************
   */
  extern (C++) final class CallExp : UnaExp
  {
      Expressions* arguments; // function arguments
!     Identifiers* names;     // named argument identifiers
      FuncDeclaration f;      // symbol to call
      bool directcall;        // true if a virtual call is devirtualized
      bool inDebugStatement;  /// true if this was in a debug statement
      bool ignoreAttributes;  /// don't enforce attributes (e.g. call @gc function in @nogc code)
      bool isUfcsRewrite;     /// the first argument was pushed in here by a UFCS rewrite
      VarDeclaration vthis2;  // container for multi-context
  
      /// Puts the `arguments` and `names` into an `ArgumentList` for easily passing them around.
      /// The fields are still separate for backwards compatibility
      extern (D) ArgumentList argumentList() { return ArgumentList(arguments, names); }
  
!     extern (D) this(Loc loc, Expression e, Expressions* exps, Identifiers* names = null) @safe
      {
          super(loc, EXP.call, e);
          this.arguments = exps;
--- 3220,3268 ----
  struct ArgumentList
  {
      Expressions* arguments; // function arguments
!     ArgumentLabels* names;  // named argument labels
  
      size_t length() const @nogc nothrow pure @safe { return arguments ? arguments.length : 0; }
  
      /// Returns: whether this argument list contains any named arguments
!     bool hasArgNames() const @nogc nothrow pure @safe
      {
          if (names is null)
              return false;
!         foreach (argLabel; *names)
!             if (argLabel.name !is null)
                  return true;
  
          return false;
      }
  }
  
+ // Contains both `name` and `location of the name` for an expression.
+ struct ArgumentLabel
+ {
+     Identifier name;    // name of the argument
+     Loc loc;            // location of the name
+  }
+ 
  /***********************************************************
   */
  extern (C++) final class CallExp : UnaExp
  {
      Expressions* arguments; // function arguments
!     ArgumentLabels *names;  // named argument labels
      FuncDeclaration f;      // symbol to call
      bool directcall;        // true if a virtual call is devirtualized
      bool inDebugStatement;  /// true if this was in a debug statement
      bool ignoreAttributes;  /// don't enforce attributes (e.g. call @gc function in @nogc code)
      bool isUfcsRewrite;     /// the first argument was pushed in here by a UFCS rewrite
      VarDeclaration vthis2;  // container for multi-context
+     Expression loweredFrom; // set if this is the result of a lowering
  
      /// Puts the `arguments` and `names` into an `ArgumentList` for easily passing them around.
      /// The fields are still separate for backwards compatibility
      extern (D) ArgumentList argumentList() { return ArgumentList(arguments, names); }
  
!     extern (D) this(Loc loc, Expression e, Expressions* exps, ArgumentLabels *names = null) @safe
      {
          super(loc, EXP.call, e);
          this.arguments = exps;
*************** extern (C++) final class AddrExp : UnaEx
*** 3474,3479 ****
--- 3431,3443 ----
          type = t;
      }
  
+     override Optional!bool toBool()
+     {
+         if (isCtfeReferenceValid(e1))
+             return typeof(return)(true);
+         return UnaExp.toBool();
+     }
+ 
      override void accept(Visitor v)
      {
          v.visit(this);
*************** extern (C++) final class ComExp : UnaExp
*** 3562,3567 ****
--- 3526,3533 ----
   */
  extern (C++) final class NotExp : UnaExp
  {
+     Expression loweredFrom; // for lowering of `aa1 != aa2` to `!_d_aaEqual(aa1, aa2)`
+ 
      extern (D) this(Loc loc, Expression e) @safe
      {
          super(loc, EXP.not, e);
*************** extern (C++) final class CastExp : UnaEx
*** 3606,3611 ****
--- 3572,3578 ----
      Type to;                    // type to cast to
      ubyte mod = cast(ubyte)~0;  // MODxxxxx
      bool trusted; // assume cast is safe
+     Expression lowering;
  
      extern (D) this(Loc loc, Expression e, Type t) @safe
      {
*************** extern (C++) final class ArrayExp : UnaE
*** 3785,3790 ****
--- 3752,3758 ----
  
      size_t currentDimension;    // for opDollar
      VarDeclaration lengthVar;
+     bool modifiable = false;    // is this expected to be an lvalue in an AssignExp? propagate to IndexExp
  
      extern (D) this(Loc loc, Expression e1, Expression index = null)
      {
*************** extern (C++) final class CommaExp : BinE
*** 3851,3856 ****
--- 3819,3827 ----
      /// false will be passed will be from the parser.
      bool allowCommaExp;
  
+     /// The original expression before any rewriting occurs.
+     /// This is used in error messages.
+     Expression originalExp;
  
      extern (D) this(Loc loc, Expression e1, Expression e2, bool generated = true) @safe
      {
*************** extern (C++) final class CommaExp : BinE
*** 3858,3863 ****
--- 3829,3840 ----
          allowCommaExp = isGenerated = generated;
      }
  
+     extern (D) this(Loc loc, Expression e1, Expression e2, Expression oe) @safe
+     {
+         this(loc, e1, e2);
+         originalExp = oe;
+     }
+ 
      override bool isLvalue()
      {
          return !rvalue && e2.isLvalue();
*************** extern (C++) final class DelegateFuncptr
*** 3973,3978 ****
--- 3950,3956 ----
  extern (C++) final class IndexExp : BinExp
  {
      VarDeclaration lengthVar;
+     Expression loweredFrom;     // for associative array lowering to _d_aaGetY or _d_aaGetRvalueX
      bool modifiable = false;    // assume it is an rvalue
      bool indexIsInBounds;       // true if 0 <= e2 && e2 <= e1.length - 1
  
*************** extern (C++) final class IndexExp : BinE
*** 4009,4037 ****
          return true;
      }
  
-     extern (D) Expression markSettingAAElem()
-     {
-         if (e1.type.toBasetype().ty == Taarray)
-         {
-             Type t2b = e2.type.toBasetype();
-             if (t2b.ty == Tarray && t2b.nextOf().isMutable())
-             {
-                 error(loc, "associative arrays can only be assigned values with immutable keys, not `%s`", e2.type.toChars());
-                 return ErrorExp.get();
-             }
-             modifiable = true;
- 
-             if (auto ie = e1.isIndexExp())
-             {
-                 Expression ex = ie.markSettingAAElem();
-                 if (ex.op == EXP.error)
-                     return ex;
-                 assert(ex == e1);
-             }
-         }
-         return this;
-     }
- 
      override void accept(Visitor v)
      {
          v.visit(this);
--- 3987,3992 ----
*************** extern (C++) final class RemoveExp : Bin
*** 4762,4768 ****
      extern (D) this(Loc loc, Expression e1, Expression e2)
      {
          super(loc, EXP.remove, e1, e2);
-         type = Type.tbool;
      }
  
      override void accept(Visitor v)
--- 4717,4722 ----
*************** extern (C++) final class RemoveExp : Bin
*** 4780,4785 ****
--- 4734,4740 ----
   */
  extern (C++) final class EqualExp : BinExp
  {
+     Expression lowering;
      extern (D) this(EXP op, Loc loc, Expression e1, Expression e2) @safe
      {
          super(loc, op, e1, e2);
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/expression.h gcc-16-20260201/gcc/d/dmd/expression.h
*** gcc-16-20260125/gcc/d/dmd/expression.h	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/expression.h	Sun Feb  1 22:32:07 2026
*************** namespace dmd
*** 51,64 ****
  {
      // in expressionsem.d
      Expression *expressionSemantic(Expression *e, Scope *sc);
-     void lowerNonArrayAggregate(StaticForeach *sfe, Scope *sc);
      // in typesem.d
      Expression *defaultInit(Type *mt, Loc loc, const bool isCfile = false);
  
      // Entry point for CTFE.
      // A compile-time result is required. Give an error if not possible
      Expression *ctfeInterpret(Expression *e);
!     void expandTuples(Expressions *exps, Identifiers *names = nullptr);
      Expression *optimize(Expression *exp, int result, bool keepLvalue = false);
  }
  
--- 51,63 ----
  {
      // in expressionsem.d
      Expression *expressionSemantic(Expression *e, Scope *sc);
      // in typesem.d
      Expression *defaultInit(Type *mt, Loc loc, const bool isCfile = false);
  
      // Entry point for CTFE.
      // A compile-time result is required. Give an error if not possible
      Expression *ctfeInterpret(Expression *e);
!     void expandTuples(Expressions *exps, ArgumentLabels *names = nullptr);
      Expression *optimize(Expression *exp, int result, bool keepLvalue = false);
  }
  
*************** public:
*** 354,359 ****
--- 353,359 ----
      unsigned char sz;   // 1: char, 2: wchar, 4: dchar
      d_bool committed;   // if type is committed
      d_bool hexString;   // if string is parsed from a hex string literal
+     d_bool cMacro;      // If the string is from a collected C macro
  
      static StringExp *create(Loc loc, const char *s);
      static StringExp *create(Loc loc, const void *s, d_size_t len);
*************** public:
*** 407,412 ****
--- 407,414 ----
      d_bool onstack;
      Expression *basis;
      Expressions *elements;
+     Expression *lowering;
+     AssocArrayLiteralExp* aaLiteral; // set if this is an array of keys/values of an AA literal
  
      static ArrayLiteralExp *create(Loc loc, Expressions *elements);
      ArrayLiteralExp *syntaxCopy() override;
*************** public:
*** 425,430 ****
--- 427,433 ----
      Expressions *keys;
      Expressions *values;
      Expression* lowering;
+     Expression* loweringCtfe;
  
      bool equals(const RootObject * const o) const override;
      AssocArrayLiteralExp *syntaxCopy() override;
*************** public:
*** 518,524 ****
      Expression *thisexp;        // if !NULL, 'this' for class being allocated
      Type *newtype;
      Expressions *arguments;     // Array of Expression's
!     Identifiers *names;         // Array of names corresponding to expressions
      Expression *placement;      // if !NULL, placement expression
  
      Expression *argprefix;      // expression to be evaluated just before arguments[]
--- 521,527 ----
      Expression *thisexp;        // if !NULL, 'this' for class being allocated
      Type *newtype;
      Expressions *arguments;     // Array of Expression's
!     ArgumentLabels *names;      // Array of argument Labels (name and location of name) corresponding to expressions
      Expression *placement;      // if !NULL, placement expression
  
      Expression *argprefix;      // expression to be evaluated just before arguments[]
*************** public:
*** 795,823 ****
  struct ArgumentList final
  {
      Expressions* arguments;
!     Identifiers* names;
      ArgumentList() :
          arguments(),
          names()
      {
      }
!     ArgumentList(Expressions* arguments, Identifiers* names = nullptr) :
          arguments(arguments),
          names(names)
          {}
  };
  
  class CallExp final : public UnaExp
  {
  public:
      Expressions *arguments;     // function arguments
!     Identifiers *names;
      FuncDeclaration *f;         // symbol to call
      d_bool directcall;            // true if a virtual call is devirtualized
      d_bool inDebugStatement;      // true if this was in a debug statement
      d_bool ignoreAttributes;      // don't enforce attributes (e.g. call @gc function in @nogc code)
      d_bool isUfcsRewrite;       // the first argument was pushed in here by a UFCS rewrite
      VarDeclaration *vthis2;     // container for multi-context
  
      static CallExp *create(Loc loc, Expression *e, Expressions *exps);
      static CallExp *create(Loc loc, Expression *e);
--- 798,842 ----
  struct ArgumentList final
  {
      Expressions* arguments;
!     ArgumentLabels* names;
      ArgumentList() :
          arguments(),
          names()
      {
      }
!     ArgumentList(Expressions* arguments, ArgumentLabels* names = nullptr) :
          arguments(arguments),
          names(names)
          {}
  };
  
+ struct ArgumentLabel final
+ {
+     Identifier* name;
+     Loc loc;
+     ArgumentLabel() :
+         name(),
+         loc()
+     {
+     }
+     ArgumentLabel(Identifier* name, Loc loc = Loc()) :
+         name(name),
+         loc(loc)
+         {}
+ };
+ 
  class CallExp final : public UnaExp
  {
  public:
      Expressions *arguments;     // function arguments
!     ArgumentLabels* names;      // function argument Labels (name + location of name)
      FuncDeclaration *f;         // symbol to call
      d_bool directcall;            // true if a virtual call is devirtualized
      d_bool inDebugStatement;      // true if this was in a debug statement
      d_bool ignoreAttributes;      // don't enforce attributes (e.g. call @gc function in @nogc code)
      d_bool isUfcsRewrite;       // the first argument was pushed in here by a UFCS rewrite
      VarDeclaration *vthis2;     // container for multi-context
+     Expression* loweredFrom;    // set if this is the result of a lowering
  
      static CallExp *create(Loc loc, Expression *e, Expressions *exps);
      static CallExp *create(Loc loc, Expression *e);
*************** public:
*** 833,838 ****
--- 852,858 ----
  class AddrExp final : public UnaExp
  {
  public:
+     Optional<bool> toBool() override;
      void accept(Visitor *v) override { v->visit(this); }
  };
  
*************** public:
*** 865,870 ****
--- 885,891 ----
  class NotExp final : public UnaExp
  {
  public:
+     Expression* loweredFrom;    // for lowering of `aa1 != aa2` to `!_d_aaEqual(aa1, aa2)`
      void accept(Visitor *v) override { v->visit(this); }
  };
  
*************** public:
*** 882,887 ****
--- 903,909 ----
      Type *to;                   // type to cast to
      unsigned char mod;          // MODxxxxx
      d_bool trusted; // assume cast is safe
+     Expression* lowering;
  
      CastExp *syntaxCopy() override;
      bool isLvalue() override;
*************** public:
*** 935,940 ****
--- 957,963 ----
  class ArrayLengthExp final : public UnaExp
  {
  public:
+     Expression lowering;
      void accept(Visitor *v) override { v->visit(this); }
  };
  
*************** public:
*** 970,975 ****
--- 993,999 ----
      Expressions *arguments;             // Array of Expression's
      size_t currentDimension;            // for opDollar
      VarDeclaration *lengthVar;
+     d_bool modifiable;
  
      ArrayExp *syntaxCopy() override;
      bool isLvalue() override;
*************** class CommaExp final : public BinExp
*** 990,995 ****
--- 1014,1020 ----
  public:
      d_bool isGenerated;
      d_bool allowCommaExp;
+     Expression* originalExp;
      bool isLvalue() override;
      Optional<bool> toBool() override;
      void accept(Visitor *v) override { v->visit(this); }
*************** class IndexExp final : public BinExp
*** 999,1004 ****
--- 1024,1030 ----
  {
  public:
      VarDeclaration *lengthVar;
+     Expression* loweredFrom;      // for associative array lowering to _d_aaGetY or _d_aaGetRvalueX
      d_bool modifiable;
      d_bool indexIsInBounds;       // true if 0 <= e2 && e2 <= e1.length - 1
  
*************** public:
*** 1262,1267 ****
--- 1288,1295 ----
  class EqualExp final : public BinExp
  {
  public:
+     Expression* lowering;
+ 
      void accept(Visitor *v) override { v->visit(this); }
  };
  
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/expressionsem.d gcc-16-20260201/gcc/d/dmd/expressionsem.d
*** gcc-16-20260125/gcc/d/dmd/expressionsem.d	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/expressionsem.d	Sun Feb  1 22:32:07 2026
***************
*** 1,4 ****
! /**
   * Semantic analysis of expressions.
   *
   * Specification: ($LINK2 https://dlang.org/spec/expression.html, Expressions)
--- 1,4 ----
! /***
   * Semantic analysis of expressions.
   *
   * Specification: ($LINK2 https://dlang.org/spec/expression.html, Expressions)
*************** import dmd.cond;
*** 29,34 ****
--- 29,35 ----
  import dmd.ctorflow;
  import dmd.dscope;
  import dmd.dsymbol;
+ import dmd.dsymbolsem;
  import dmd.declaration;
  import dmd.dclass;
  import dmd.dcast;
*************** import dmd.dimport;
*** 39,45 ****
  import dmd.dinterpret;
  import dmd.dmodule;
  import dmd.dstruct;
! import dmd.dsymbolsem;
  import dmd.dtemplate;
  import dmd.errors;
  import dmd.errorsink;
--- 40,46 ----
  import dmd.dinterpret;
  import dmd.dmodule;
  import dmd.dstruct;
! import dmd.dsymbolsem : findTempDecl;
  import dmd.dtemplate;
  import dmd.errors;
  import dmd.errorsink;
*************** import dmd.semantic3;
*** 82,88 ****
  import dmd.sideeffect;
  import dmd.safe;
  import dmd.target;
! import dmd.templatesem : matchWithInstance;
  import dmd.tokens;
  import dmd.traits;
  import dmd.typesem;
--- 83,89 ----
  import dmd.sideeffect;
  import dmd.safe;
  import dmd.target;
! import dmd.templatesem : matchWithInstance, deduceType, matchArg, updateTempDecl;
  import dmd.tokens;
  import dmd.traits;
  import dmd.typesem;
*************** bool expressionsToString(ref OutBuffer b
*** 202,207 ****
--- 203,256 ----
      return false;
  }
  
+ /***************************************
+  * Verifies whether the struct declaration has a
+  * constructor that is not a copy constructor.
+  * Optionally, it can check whether the struct
+  * declaration has a regular constructor, that
+  * is not disabled.
+  *
+  * Params:
+  *      sd = struct declaration
+  *      ignoreDisabled = true to ignore disabled constructors
+  * Returns:
+  *      true, if the struct has a regular (optionally,
+  *      not disabled) constructor, false otherwise.
+  */
+ bool hasRegularCtor(StructDeclaration sd, bool ignoreDisabled)
+ {
+     if (!sd.ctor)
+         return false;
+ 
+     bool result;
+     overloadApply(sd.ctor, (Dsymbol s)
+     {
+         if (auto td = s.isTemplateDeclaration())
+         {
+             if (ignoreDisabled && td.onemember)
+             {
+                 if (auto ctorDecl = td.onemember.isCtorDeclaration())
+                 {
+                     if (ctorDecl.storage_class & STC.disable)
+                         return 0;
+                 }
+             }
+             result = true;
+             return 1;
+         }
+         if (auto ctorDecl = s.isCtorDeclaration())
+         {
+             if (!ctorDecl.isCpCtor && !ctorDecl.isMoveCtor && (!ignoreDisabled || !(ctorDecl.storage_class & STC.disable)))
+             {
+                 result = true;
+                 return 1;
+             }
+         }
+         return 0;
+     });
+     return result;
+ }
+ 
  /*****************************************
   * Determine if `this` is available by walking up the enclosing
   * scopes until a function is found.
*************** FuncDeclaration hasThis(Scope* sc)
*** 228,234 ****
          {
              return null;
          }
!         if (!fd.isNested() || fd.isThis() || (fd.hasDualContext() && fd.isMember2()))
              break;
  
          Dsymbol parent = fd.parent;
--- 277,283 ----
          {
              return null;
          }
!         if (!fd.isNested() || fd.isThis() || (fd.hasDualContext && fd.isMember2()))
              break;
  
          Dsymbol parent = fd.parent;
*************** FuncDeclaration hasThis(Scope* sc)
*** 245,251 ****
          fd = parent.isFuncDeclaration();
      }
  
!     if (!fd.isThis() && !(fd.hasDualContext() && fd.isMember2()))
      {
          return null;
      }
--- 294,300 ----
          fd = parent.isFuncDeclaration();
      }
  
!     if (!fd.isThis() && !(fd.hasDualContext && fd.isMember2()))
      {
          return null;
      }
*************** extern (D) Expression incompatibleTypes(
*** 410,463 ****
      return ErrorExp.get();
  }
  
- private Expression reorderSettingAAElem(BinExp exp, Scope* sc)
- {
-     BinExp be = exp;
- 
-     auto ie = be.e1.isIndexExp();
-     if (!ie)
-         return be;
-     if (ie.e1.type.toBasetype().ty != Taarray)
-         return be;
- 
-     /* Fix evaluation order of setting AA element
-      * https://issues.dlang.org/show_bug.cgi?id=3825
-      * Rewrite:
-      *     aa[k1][k2][k3] op= val;
-      * as:
-      *     auto ref __aatmp = aa;
-      *     auto ref __aakey3 = k1, __aakey2 = k2, __aakey1 = k3;
-      *     auto ref __aaval = val;
-      *     __aatmp[__aakey3][__aakey2][__aakey1] op= __aaval;  // assignment
-      */
- 
-     Expression e0;
-     while (1)
-     {
-         Expression de;
-         ie.e2 = extractSideEffect(sc, "__aakey", de, ie.e2);
-         e0 = Expression.combine(de, e0);
- 
-         auto ie1 = ie.e1.isIndexExp();
-         if (!ie1 ||
-             ie1.e1.type.toBasetype().ty != Taarray)
-         {
-             break;
-         }
-         ie = ie1;
-     }
-     assert(ie.e1.type.toBasetype().ty == Taarray);
- 
-     Expression de;
-     ie.e1 = extractSideEffect(sc, "__aatmp", de, ie.e1);
-     e0 = Expression.combine(de, e0);
- 
-     be.e2 = extractSideEffect(sc, "__aaval", e0, be.e2, true);
- 
-     //printf("-e0 = %s, be = %s\n", e0.toChars(), be.toChars());
-     return Expression.combine(e0, be);
- }
- 
  private Expression checkOpAssignTypes(BinExp binExp, Scope* sc)
  {
      auto e1 = binExp.e1;
--- 459,464 ----
*************** private Expression extractOpDollarSideEf
*** 612,631 ****
      // https://issues.dlang.org/show_bug.cgi?id=12585
      // Extract the side effect part if ue.e1 is comma.
  
!     if (sc.ctfe ? hasSideEffect(e1) : !isTrivialExp(e1)) // match logic in extractSideEffect()
!     {
!         /* Even if opDollar is needed, 'e1' should be evaluate only once. So
!          * Rewrite:
!          *      e1.opIndex( ... use of $ ... )
!          *      e1.opSlice( ... use of $ ... )
!          * as:
!          *      (ref __dop = e1, __dop).opIndex( ... __dop.opDollar ...)
!          *      (ref __dop = e1, __dop).opSlice( ... __dop.opDollar ...)
!          */
!         e1 = extractSideEffect(sc, "__dop", e0, e1, false);
!         assert(e1.isVarExp());
!         e1.isVarExp().var.storage_class |= STC.exptemp;     // lifetime limited to expression
!     }
      ue.e1 = e1;
      return e0;
  }
--- 613,627 ----
      // https://issues.dlang.org/show_bug.cgi?id=12585
      // Extract the side effect part if ue.e1 is comma.
  
!     /* Even if opDollar is needed, 'e1' should be evaluate only once. So
!         * Rewrite:
!         *      e1.opIndex( ... use of $ ... )
!         *      e1.opSlice( ... use of $ ... )
!         * as:
!         *      (ref __dop = e1, __dop).opIndex( ... __dop.opDollar ...)
!         *      (ref __dop = e1, __dop).opSlice( ... __dop.opDollar ...)
!         */
!     e1 = extractSideEffect(sc, "__dop", e0, e1, false);
      ue.e1 = e1;
      return e0;
  }
*************** TupleDeclaration isAliasThisTuple(Expres
*** 663,668 ****
--- 659,730 ----
      }
  }
  
+ /******************************
+  * Take address of expression.
+  */
+ Expression addressOf(Expression e)
+ {
+     //printf("Expression::addressOf() %s\n", e.toChars());
+     debug
+     {
+         assert(e.op == EXP.error || e.isLvalue());
+     }
+     return new AddrExp(e.loc, e, e.type.pointerTo());
+ }
+ 
+ /**************************************
+  * Gets expression at offset of type.
+  * Returns NULL if not found.
+  */
+ Expression getField(StructLiteralExp sle, Type type, uint offset)
+ {
+     //printf("StructLiteralExp::getField(this = %s, type = %s, offset = %u)\n",
+     //  /*toChars()*/"", type.toChars(), offset);
+     Expression e2 = null;
+     const int i = sle.getFieldIndex(type, offset);
+ 
+     if (i == -1)
+         return null;
+ 
+     //printf("\ti = %d\n", i);
+     if (i >= sle.sd.nonHiddenFields())
+         return null;
+ 
+     assert(i < sle.elements.length);
+     e2 = (*sle.elements)[i];
+     if (!e2)
+         return null;
+ 
+     //printf("e = %s, e.type = %s\n", e.toChars(), e.type.toChars());
+ 
+     /* If type is a static array, and e is an initializer for that array,
+      * then the field initializer should be an array literal of e.
+      */
+     auto tsa = type.isTypeSArray();
+     if (tsa && e2.type.castMod(0) != type.castMod(0))
+     {
+         const length = cast(size_t)tsa.dim.toInteger();
+         auto z = new Expressions(length);
+         foreach (ref q; *z)
+             q = e2.copy();
+         e2 = new ArrayLiteralExp(sle.loc, type, z);
+     }
+     else
+     {
+         e2 = e2.copy();
+         e2.type = type;
+     }
+     if (sle.useStaticInit && e2.type.needsNested())
+         if (auto se = e2.isStructLiteralExp())
+         {
+             se.useStaticInit = true;
+         }
+ 
+     return e2;
+ }
+ 
+ 
+ 
  /**************************************
   * Runs semantic on ae.arguments. Declares temporary variables
   * if '$' was used.
*************** Expression resolveOpDollar(Scope* sc, Ar
*** 712,725 ****
  
          if (auto ie = e.isIntervalExp())
          {
-             auto tiargs = new Objects();
              Expression edim = new IntegerExp(ae.loc, i, Type.tsize_t);
              edim = edim.expressionSemantic(sc);
!             tiargs.push(edim);
  
!             auto fargs = new Expressions(2);
!             (*fargs)[0] = ie.lwr;
!             (*fargs)[1] = ie.upr;
  
              const xerrors = global.startGagging();
              sc = sc.push();
--- 774,784 ----
  
          if (auto ie = e.isIntervalExp())
          {
              Expression edim = new IntegerExp(ae.loc, i, Type.tsize_t);
              edim = edim.expressionSemantic(sc);
!             auto tiargs = new Objects(edim);
  
!             auto fargs = new Expressions(ie.lwr, ie.upr);
  
              const xerrors = global.startGagging();
              sc = sc.push();
*************** private Expression resolveUFCS(Scope* sc
*** 1246,1252 ****
  
                  semanticTypeInfo(sc, taa.index);
  
!                 return new RemoveExp(loc, eleft, key);
              }
          }
          else
--- 1305,1312 ----
  
                  semanticTypeInfo(sc, taa.index);
  
!                 e = new RemoveExp(loc, eleft, key);
!                 return e.expressionSemantic(sc);
              }
          }
          else
*************** private Expression resolveUFCS(Scope* sc
*** 1334,1341 ****
          ce.arguments = new Expressions();
      ce.arguments.shift(eleft);
      if (!ce.names)
!         ce.names = new Identifiers();
!     ce.names.shift(null);
      ce.isUfcsRewrite = true;
      return null;
  }
--- 1394,1401 ----
          ce.arguments = new Expressions();
      ce.arguments.shift(eleft);
      if (!ce.names)
!         ce.names = new ArgumentLabels();
!     ce.names.shift(ArgumentLabel(cast(Identifier) null, Loc.init));
      ce.isUfcsRewrite = true;
      return null;
  }
*************** L1:
*** 1817,1823 ****
      if (e1.op == EXP.this_)
      {
          FuncDeclaration f = hasThis(sc);
!         if (f && f.hasDualContext())
          {
              if (f.followInstantiationContext(ad))
              {
--- 1877,1883 ----
      if (e1.op == EXP.this_)
      {
          FuncDeclaration f = hasThis(sc);
!         if (f && f.hasDualContext)
          {
              if (f.followInstantiationContext(ad))
              {
*************** void checkOverriddenDtor(FuncDeclaration
*** 2000,2006 ****
              scope bool function(DtorDeclaration) check, const string checkName)
  {
      auto dd = f.isDtorDeclaration();
!     if (!dd || !dd.isGenerated())
          return;
  
      // DtorDeclaration without parents should fail at an earlier stage
--- 2060,2066 ----
              scope bool function(DtorDeclaration) check, const string checkName)
  {
      auto dd = f.isDtorDeclaration();
!     if (!dd || !dd.isGenerated)
          return;
  
      // DtorDeclaration without parents should fail at an earlier stage
*************** void checkOverriddenDtor(FuncDeclaration
*** 2017,2023 ****
      }
  
      dd.loc.errorSupplemental("%s`%s.~this` is %.*s because of the following field's destructors:",
!                         dd.isGenerated() ? "generated " : "".ptr,
                          ad.toChars,
                          cast(int) checkName.length, checkName.ptr);
  
--- 2077,2083 ----
      }
  
      dd.loc.errorSupplemental("%s`%s.~this` is %.*s because of the following field's destructors:",
!                         dd.isGenerated ? "generated " : "".ptr,
                          ad.toChars,
                          cast(int) checkName.length, checkName.ptr);
  
*************** void checkOverriddenDtor(FuncDeclaration
*** 2048,2054 ****
          {
              field.loc.errorSupplemental(" - %s %s", field.type.toChars(), field.toChars());
  
!             if (fieldSd.dtor.isGenerated())
                  fieldSd.dtor.checkOverriddenDtor(sc, loc, check, checkName);
              else
                  fieldSd.dtor.loc.errorSupplemental("   %.*s `%s.~this` is declared here",
--- 2108,2114 ----
          {
              field.loc.errorSupplemental(" - %s %s", field.type.toChars(), field.toChars());
  
!             if (fieldSd.dtor.isGenerated)
                  fieldSd.dtor.checkOverriddenDtor(sc, loc, check, checkName);
              else
                  fieldSd.dtor.loc.errorSupplemental("   %.*s `%s.~this` is declared here",
*************** private bool checkNogc(FuncDeclaration f
*** 2351,2357 ****
      // so don't print anything to avoid double error messages.
      if (!(f.ident == Id._d_HookTraceImpl || f.ident == Id._d_arraysetlengthT
          || f.ident == Id._d_arrayappendT || f.ident == Id._d_arrayappendcTX
!         || f.ident == Id._d_arraycatnTX || f.ident == Id._d_newclassT))
      {
          error(loc, "`@nogc` %s `%s` cannot call non-@nogc %s `%s`",
              sc.func.kind(), sc.func.toPrettyChars(), f.kind(), f.toPrettyChars());
--- 2411,2419 ----
      // so don't print anything to avoid double error messages.
      if (!(f.ident == Id._d_HookTraceImpl || f.ident == Id._d_arraysetlengthT
          || f.ident == Id._d_arrayappendT || f.ident == Id._d_arrayappendcTX
!         || f.ident == Id._d_arraycatnTX || f.ident == Id._d_newclassT
!         || f.ident == Id._d_assocarrayliteralTX || f.ident == Id._d_arrayliteralTX
!         || f.ident == Id._d_aaGetY))
      {
          error(loc, "`@nogc` %s `%s` cannot call non-@nogc %s `%s`",
              sc.func.kind(), sc.func.toPrettyChars(), f.kind(), f.toPrettyChars());
*************** private bool checkNogc(FuncDeclaration f
*** 2373,2379 ****
   *   t = struct type, or static array of struct type to check
   *   loc = error message location
   *   sc = scope in which attributes are checked
!  * Returns: true if there's an error
   */
  private bool checkPostblit(Type t, ref Loc loc, Scope* sc)
  {
--- 2435,2441 ----
   *   t = struct type, or static array of struct type to check
   *   loc = error message location
   *   sc = scope in which attributes are checked
!  * Returns: true if there is an error
   */
  private bool checkPostblit(Type t, ref Loc loc, Scope* sc)
  {
*************** private Expression resolvePropertiesX(Sc
*** 2441,2448 ****
                  return ErrorExp.get();
              e2 = resolveProperties(sc, e2);
  
!             Expressions* a = new Expressions();
!             a.push(e2);
  
              for (size_t i = 0; i < os.a.length; i++)
              {
--- 2503,2509 ----
                  return ErrorExp.get();
              e2 = resolveProperties(sc, e2);
  
!             Expressions* a = new Expressions(e2);
  
              for (size_t i = 0; i < os.a.length; i++)
              {
*************** private Expression resolvePropertiesX(Sc
*** 2561,2568 ****
                  return ErrorExp.get();
              e2 = resolveProperties(sc, e2);
  
!             Expressions* a = new Expressions();
!             a.push(e2);
  
              FuncDeclaration fd = resolveFuncCall(loc, sc, s, tiargs, tthis, ArgumentList(a), FuncResolveFlag.quiet);
              if (fd && fd.type)
--- 2622,2628 ----
                  return ErrorExp.get();
              e2 = resolveProperties(sc, e2);
  
!             Expressions* a = new Expressions(e2);
  
              FuncDeclaration fd = resolveFuncCall(loc, sc, s, tiargs, tthis, ArgumentList(a), FuncResolveFlag.quiet);
              if (fd && fd.type)
*************** private bool functionParameters(Loc loc,
*** 3032,3038 ****
       */
      if (fd && fd.inlining == PINLINE.always)
      {
!         if (sc._module)
              sc._module.hasAlwaysInlines = true;
          if (sc.func)
              sc.func.hasAlwaysInlines = true;
--- 3092,3100 ----
       */
      if (fd && fd.inlining == PINLINE.always)
      {
!         if (sc.minst)
!             sc.minst.hasAlwaysInlines = true;
!         else if (sc._module)
              sc._module.hasAlwaysInlines = true;
          if (sc.func)
              sc.func.hasAlwaysInlines = true;
*************** private bool functionParameters(Loc loc,
*** 3754,3761 ****
              int offset;
              if (!tret.implicitConvTo(tthis) && !(MODimplicitConv(tret.mod, tthis.mod) && tret.isBaseOf(tthis, &offset) && offset == 0))
              {
!                 const(char)* s1 = tret.isNaked() ? " mutable" : tret.modToChars();
!                 const(char)* s2 = tthis.isNaked() ? " mutable" : tthis.modToChars();
                  .error(loc, "`inout` constructor `%s` creates%s object, not%s", fd.toPrettyChars(), s1, s2);
                  err = true;
              }
--- 3816,3823 ----
              int offset;
              if (!tret.implicitConvTo(tthis) && !(MODimplicitConv(tret.mod, tthis.mod) && tret.isBaseOf(tthis, &offset) && offset == 0))
              {
!                 const(char)* s1 = tret.isNaked ? " mutable" : tret.modToChars();
!                 const(char)* s2 = tthis.isNaked ? " mutable" : tthis.modToChars();
                  .error(loc, "`inout` constructor `%s` creates%s object, not%s", fd.toPrettyChars(), s1, s2);
                  err = true;
              }
*************** Package resolveIsPackage(Dsymbol sym)
*** 3807,3812 ****
--- 3869,4194 ----
      return pkg;
  }
  
+ /**
+  * Performs the lowering of a CastExp to a call to `.object._d_cast`,
+  * populating the `lowering` field of the CastExp.
+  * This is only done for casts between classes/interfaces.
+  *
+  * Params:
+  *  cex = the CastExp to lower
+  *  sc = the current scope
+  */
+ private void lowerCastExp(CastExp cex, Scope* sc)
+ {
+     Type t1b = cex.e1.type.toBasetype();
+     Type tob = cex.to.toBasetype();
+ 
+     if (t1b.ty != Tclass || tob.ty != Tclass)
+         return;
+ 
+     ClassDeclaration cdfrom = t1b.isClassHandle();
+     ClassDeclaration cdto   = tob.isClassHandle();
+ 
+     int offset;
+     if ((cdto.isBaseOf(cdfrom, &offset) && offset != ClassDeclaration.OFFSET_RUNTIME)
+         || cdfrom.classKind == ClassKind.cpp || cdto.classKind == ClassKind.cpp)
+         return;
+ 
+     Identifier hook = Id._d_cast;
+     if (!verifyHookExist(cex.loc, *sc, hook, "d_cast", Id.object))
+         return;
+ 
+     // Lower to .object._d_cast!(To)(exp.e1)
+     Expression lowering = new IdentifierExp(cex.loc, Id.empty);
+     lowering = new DotIdExp(cex.loc, lowering, Id.object);
+ 
+     // Unqualify the type being casted to, avoiding multiple instantiations
+     auto unqual_tob = tob.unqualify(MODFlags.wild | MODFlags.const_ |
+         MODFlags.immutable_ | MODFlags.shared_);
+     auto tiargs = new Objects(unqual_tob);
+     lowering = new DotTemplateInstanceExp(cex.loc, lowering, hook, tiargs);
+ 
+     // Unqualify the type being casted from to avoid multiple instantiations
+     auto unqual_t1b = t1b.unqualify(MODFlags.wild | MODFlags.const_ |
+         MODFlags.immutable_ | MODFlags.shared_);
+     Expression e1c = cex.e1.copy();
+     e1c.type = unqual_t1b;
+     auto arguments = new Expressions(e1c);
+ 
+     lowering = new CallExp(cex.loc, lowering, arguments);
+ 
+     cex.lowering = lowering.expressionSemantic(sc);
+ }
+ 
+ /**
+  * Visitor to check if a type is suitable for comparison using `memcmp`.
+  * Currently used when lowering `EqualExp`.
+  */
+ private extern(C++) final class IsMemcmpableVisitor : Visitor
+ {
+     alias visit = Visitor.visit;
+     public:
+     bool result = false;
+ 
+     override void visit(Type t)
+     {
+         result = t.ty == Tvoid || (t.isScalar() && !t.isFloating());
+     }
+ 
+     override void visit(TypeStruct ts)
+     {
+         result = false;
+ 
+         if (ts.sym.hasIdentityEquals)
+             return; // has custom opEquals
+ 
+         if (!ts.sym.members)
+         {
+             result = true;
+             return;
+         }
+ 
+         /* We recursively check all variable declaration within the struct.
+          * The recursiveness is needed to handle cases like this:
+          * struct Test {
+          *     nothrow:
+          *     int[] contents;
+          * }
+          * Here a `StorageClassDeclaration` symbol will be created, which wraps the variable declaration.
+          */
+         static bool visitAllMembers(Dsymbols* members, TypeStruct root, IsMemcmpableVisitor v)
+         {
+             if (members is null)
+                 return true;
+ 
+             foreach (m; *members)
+             {
+                 if (auto vd = m.isVarDeclaration())
+                 {
+                     if (vd.type is null)
+                         continue;
+ 
+                     auto tbvd = vd.type.toBasetype();
+                     if (tbvd !is root)
+                         tbvd.accept(v);
+ 
+                     if (!v.result)
+                         return false;
+                 }
+                 else if (auto ad = m.isAttribDeclaration())
+                 {
+                     if(!visitAllMembers(ad.decl, root, v))
+                         return false;
+                 }
+             }
+             return true;
+         }
+         result = visitAllMembers(ts.sym.members, ts, this);
+     }
+ 
+     override void visit(TypeSArray tsa)
+     {
+         tsa.nextOf().toBasetype().accept(this);
+     }
+ }
+ 
+ /*********************************************
+  * In the current function 'sc.func', we are calling 'fd'.
+  * 1. Check to see if the current function can call 'fd' , issue error if not.
+  * 2. If the current function is not the parent of 'fd' , then add
+  *    the current function to the list of siblings of 'fd' .
+  * 3. If the current function is a literal, and it's accessing an uplevel scope,
+  *    then mark it as a delegate.
+  * Returns true if error occurs.
+  */
+ private bool checkNestedFuncReference(FuncDeclaration fd, Scope* sc, Loc loc)
+ {
+     //printf("FuncDeclaration::checkNestedFuncReference() %s\n", toPrettyChars());
+     if (auto fld = fd.isFuncLiteralDeclaration())
+     {
+         if (fld.tok == TOK.reserved)
+         {
+             fld.tok = TOK.function_;
+             fld.vthis = null;
+         }
+     }
+     if (!fd.parent || fd.parent == sc.parent)
+         return false;
+     if (fd.ident == Id.require || fd.ident == Id.ensure)
+         return false;
+     if (!fd.isThis() && !fd.isNested())
+         return false;
+     // The current function
+     FuncDeclaration fdthis = sc.parent.isFuncDeclaration();
+     if (!fdthis)
+         return false; // out of function scope
+     Dsymbol p = fd.toParentLocal();
+     Dsymbol p2 = fd.toParent2();
+     // Function literals from fdthis to p must be delegates
+     ensureStaticLinkTo(fdthis, p);
+     if (p != p2)
+         ensureStaticLinkTo(fdthis, p2);
+     if (!fd.isNested())
+         return false;
+ 
+     // The function that this function is in
+     bool checkEnclosing(FuncDeclaration fdv)
+     {
+         if (!fdv)
+             return false;
+         if (fdv == fdthis)
+             return false;
+         //printf("this = %s in [%s]\n", this.toChars(), this.loc.toChars());
+         //printf("fdv  = %s in [%s]\n", fdv .toChars(), fdv .loc.toChars());
+         //printf("fdthis = %s in [%s]\n", fdthis.toChars(), fdthis.loc.toChars());
+         // Add this function to the list of those which called us
+         if (fdthis != fd)
+         {
+             bool found = false;
+             for (size_t i = 0; i < fd.siblingCallers.length; ++i)
+             {
+                 if (fd.siblingCallers[i] == fdthis)
+                     found = true;
+             }
+             if (!found)
+             {
+                 //printf("\tadding sibling %s to %s\n", fdthis.toPrettyChars(), toPrettyChars());
+                 if (!sc.intypeof && !sc.traitsCompiles)
+                 {
+                     fd.siblingCallers.push(fdthis);
+                     fd.computedEscapingSiblings = false;
+                 }
+             }
+         }
+         const lv = fdthis.getLevelAndCheck(loc, sc, fdv, fd);
+         if (lv == fd.LevelError)
+             return true; // error
+         if (lv == -1)
+             return false; // downlevel call
+         if (lv == 0)
+             return false; // same level call
+         return false; // Uplevel call
+     }
+     if (checkEnclosing(p.isFuncDeclaration()))
+         return true;
+     if (checkEnclosing(p == p2 ? null : p2.isFuncDeclaration()))
+         return true;
+     return false;
+ }
+ 
+ Expression lowerArrayLiteral(ArrayLiteralExp ale, Scope* sc)
+ {
+     const dim = ale.elements ? ale.elements.length : 0;
+ 
+     Identifier hook = global.params.tracegc ? Id._d_arrayliteralTXTrace : Id._d_arrayliteralTX;
+     if (!verifyHookExist(ale.loc, *sc, hook, "creating array literals"))
+         return null;
+ 
+     Expression lowering = new IdentifierExp(ale.loc, Id.empty);
+     lowering = new DotIdExp(ale.loc, lowering, Id.object);
+     // Remove `inout`, `const`, `immutable` and `shared` to reduce template instances
+     auto t = ale.type.nextOf().unqualify(MODFlags.wild | MODFlags.const_ | MODFlags.immutable_ | MODFlags.shared_);
+     auto tiargs = new Objects(t);
+     lowering = new DotTemplateInstanceExp(ale.loc, lowering, hook, tiargs);
+ 
+     auto arguments = new Expressions(new IntegerExp(dim));
+     lowering = new CallExp(ale.loc, lowering, arguments);
+     ale.lowering = lowering.expressionSemantic(sc);
+ 
+     return ale.lowering;
+ }
+ 
+ /***********************************
+  * If oarg represents a Dsymbol, return that Dsymbol
+  * Params:
+  *      oarg = argument to check
+  * Returns:
+  *      Dsymbol if a symbol, null if not
+  */
+ Dsymbol getDsymbol(RootObject oarg)
+ {
+     //printf("getDsymbol()\n");
+     //printf("e %p s %p t %p v %p\n", isExpression(oarg), isDsymbol(oarg), isType(oarg), isTuple(oarg));
+     if (auto ea = isExpression(oarg))
+     {
+         // Try to convert Expression to symbol
+         if (auto ve = ea.isVarExp())
+             return ve.var;
+         if (auto fe = ea.isFuncExp())
+             return fe.td ? fe.td : fe.fd;
+         if (auto te = ea.isTemplateExp())
+             return te.td;
+         if (auto te = ea.isScopeExp())
+             return te.sds;
+         return null;
+     }
+     // Try to convert Type to symbol
+     if (auto ta = isType(oarg))
+         return ta.toDsymbol(null);
+     return isDsymbol(oarg); // if already a symbol
+ }
+ 
+ /**************************************
+  * IsExpression can evaluate the specified type speculatively, and even if
+  * it instantiates any symbols, they are normally unnecessary for the
+  * final executable.
+  * However, if those symbols leak to the actual code, compiler should remark
+  * them as non-speculative to generate their code and link to the final executable.
+  */
+ private void unSpeculative(Scope* sc, RootObject o)
+ {
+     if (!o)
+         return;
+ 
+     if (Tuple tup = isTuple(o))
+     {
+         foreach (obj; tup.objects)
+         {
+             unSpeculative(sc, obj);
+         }
+         return;
+     }
+ 
+     Dsymbol s = getDsymbol(o);
+     if (!s)
+         return;
+ 
+     if (Declaration d = s.isDeclaration())
+     {
+         if (VarDeclaration vd = d.isVarDeclaration())
+             o = vd.type;
+         else if (AliasDeclaration ad = d.isAliasDeclaration())
+         {
+             o = ad.getType();
+             if (!o)
+                 o = ad.toAlias();
+         }
+         else
+             o = d.toAlias();
+ 
+         s = getDsymbol(o);
+         if (!s)
+             return;
+     }
+ 
+     if (TemplateInstance ti = s.isTemplateInstance())
+     {
+         // If the instance is already non-speculative,
+         // or it is leaked to the speculative scope.
+         if (ti.minst !is null || sc.minst is null)
+             return;
+ 
+         // Remark as non-speculative instance.
+         ti.minst = sc.minst;
+         if (!ti.tinst)
+             ti.tinst = sc.tinst;
+ 
+         unSpeculative(sc, ti.tempdecl);
+     }
+ 
+     if (TemplateInstance ti = s.isInstantiated())
+         unSpeculative(sc, ti);
+ }
  
  private extern (C++) final class ExpressionSemanticVisitor : Visitor
  {
*************** private extern (C++) final class Express
*** 3921,3926 ****
--- 4303,4315 ----
              printf("IdentifierExp::semantic('%s')\n", exp.ident.toChars());
          }
  
+         if (exp.rvalue)
+         {
+             if (sc.setUnsafe(false, exp.loc, "moving variable `%s` with `__rvalue`", exp))
+             {
+                 setError();
+             }
+         }
          scope (exit) result.rvalue = exp.rvalue;
  
          Dsymbol scopesym;
*************** private extern (C++) final class Express
*** 4115,4130 ****
  
          /* Look for what user might have meant
           */
!         if (const n = importHint(exp.ident.toString()))
!             error(exp.loc, "`%s` is not defined, perhaps `import %.*s;` is needed?", exp.ident.toChars(), cast(int)n.length, n.ptr);
!         else if (auto s2 = sc.search_correct(exp.ident))
!             error(exp.loc, "undefined identifier `%s`, did you mean %s `%s`?", exp.ident.toChars(), s2.kind(), s2.toChars());
!         else if (const p = Scope.search_correct_C(exp.ident))
!             error(exp.loc, "undefined identifier `%s`, did you mean `%s`?", exp.ident.toChars(), p);
!         else if (exp.ident == Id.dollar)
!             error(exp.loc, "undefined identifier `$`");
          else
!             error(exp.loc, "undefined identifier `%s`", exp.ident.toChars());
  
          result = ErrorExp.get();
      }
--- 4504,4531 ----
  
          /* Look for what user might have meant
           */
!         if (!(sc && sc.inCfile))
!         {
!             if (const n = importHint(exp.ident.toString()))
!                 error(exp.loc, "`%s` is not defined, perhaps `import %.*s;` is needed?", exp.ident.toChars(), cast(int)n.length, n.ptr);
!             else if (auto s2 = sc.search_correct(exp.ident))
!                 error(exp.loc, "undefined identifier `%s`, did you mean %s `%s`?", exp.ident.toChars(), s2.kind(), s2.toChars());
!             else if (const p = Scope.search_correct_C(exp.ident))
!                 error(exp.loc, "undefined identifier `%s`, did you mean `%s`?", exp.ident.toChars(), p);
!             else if (exp.ident == Id.dollar)
!                 error(exp.loc, "undefined identifier `$`");
!             else
!                 error(exp.loc, "undefined identifier `%s`", exp.ident.toChars());
!         }
          else
!         {
!             if (const n = cIncludeHint(exp.ident.toString()))
!                 error(exp.loc, "`%s` is not defined, perhaps `#include %.*s` is needed?", exp.ident.toChars(), cast(int)n.length, n.ptr);
!             else if (auto s2 = sc.search_correct(exp.ident))
!                 error(exp.loc, "undefined identifier `%s`, did you mean %s `%s`?", exp.ident.toChars(), s2.kind(), s2.toChars());
!             else
!                 error(exp.loc, "undefined identifier `%s`", exp.ident.toChars());
!         }
  
          result = ErrorExp.get();
      }
*************** private extern (C++) final class Express
*** 4306,4313 ****
          Expression makeNonTemplateItem(Identifier which) {
              Expression id = new IdentifierExp(e.loc, Id.empty);
              id = new DotIdExp(e.loc, id, Id.object);
!             auto moduleNameArgs = new Objects();
!             moduleNameArgs.push(new StringExp(e.loc, "core.interpolation"));
              id = new DotTemplateInstanceExp(e.loc, id, Id.imported, moduleNameArgs);
              id = new DotIdExp(e.loc, id, which);
              id = new CallExp(e.loc, id, new Expressions());
--- 4707,4713 ----
          Expression makeNonTemplateItem(Identifier which) {
              Expression id = new IdentifierExp(e.loc, Id.empty);
              id = new DotIdExp(e.loc, id, Id.object);
!             auto moduleNameArgs = new Objects(new StringExp(e.loc, "core.interpolation"));
              id = new DotTemplateInstanceExp(e.loc, id, Id.imported, moduleNameArgs);
              id = new DotIdExp(e.loc, id, which);
              id = new CallExp(e.loc, id, new Expressions());
*************** private extern (C++) final class Express
*** 4317,4337 ****
          Expression makeTemplateItem(Identifier which, string arg) {
              Expression id = new IdentifierExp(e.loc, Id.empty);
              id = new DotIdExp(e.loc, id, Id.object);
!             auto moduleNameArgs = new Objects();
!             moduleNameArgs.push(new StringExp(e.loc, "core.interpolation"));
              id = new DotTemplateInstanceExp(e.loc, id, Id.imported, moduleNameArgs);
!             auto tiargs = new Objects();
              auto templateStringArg = new StringExp(e.loc, arg);
              // banning those instead of forwarding them
              // templateStringArg.postfix = e.postfix; // forward the postfix to these literals
!             tiargs.push(templateStringArg);
              id = new DotTemplateInstanceExp(e.loc, id, which, tiargs);
              id = new CallExp(e.loc, id, new Expressions());
              return id;
          }
  
!         auto arguments = new Expressions();
!         arguments.push(makeNonTemplateItem(Id.InterpolationHeader));
  
          foreach (idx, str; e.interpolatedSet.parts)
          {
--- 4717,4735 ----
          Expression makeTemplateItem(Identifier which, string arg) {
              Expression id = new IdentifierExp(e.loc, Id.empty);
              id = new DotIdExp(e.loc, id, Id.object);
!             auto moduleNameArgs = new Objects(new StringExp(e.loc, "core.interpolation"));
              id = new DotTemplateInstanceExp(e.loc, id, Id.imported, moduleNameArgs);
! 
              auto templateStringArg = new StringExp(e.loc, arg);
              // banning those instead of forwarding them
              // templateStringArg.postfix = e.postfix; // forward the postfix to these literals
!             auto tiargs = new Objects(templateStringArg);
              id = new DotTemplateInstanceExp(e.loc, id, which, tiargs);
              id = new CallExp(e.loc, id, new Expressions());
              return id;
          }
  
!         auto arguments = new Expressions(makeNonTemplateItem(Id.InterpolationHeader));
  
          foreach (idx, str; e.interpolatedSet.parts)
          {
*************** private extern (C++) final class Express
*** 4343,4350 ****
              else
              {
                  arguments.push(makeTemplateItem(Id.InterpolatedExpression, str));
!                 Expressions* mix = new Expressions();
!                 mix.push(new StringExp(e.loc, str));
                  // FIXME: i'd rather not use MixinExp but idk how to do it lol
                  arguments.push(new MixinExp(e.loc, mix));
              }
--- 4741,4747 ----
              else
              {
                  arguments.push(makeTemplateItem(Id.InterpolatedExpression, str));
!                 Expressions* mix = new Expressions(new StringExp(e.loc, str));
                  // FIXME: i'd rather not use MixinExp but idk how to do it lol
                  arguments.push(new MixinExp(e.loc, mix));
              }
*************** private extern (C++) final class Express
*** 4416,4422 ****
              }
              buffer.write4(0);
              e.setData(buffer.extractData(), newlen, 4);
!             if (sc && sc.inCfile)
                  e.type = Type.tuns32.sarrayOf(e.len + 1);
              else
                  e.type = Type.tdchar.immutableOf().arrayOf();
--- 4813,4819 ----
              }
              buffer.write4(0);
              e.setData(buffer.extractData(), newlen, 4);
!             if (!e.cMacro && sc && sc.inCfile)
                  e.type = Type.tuns32.sarrayOf(e.len + 1);
              else
                  e.type = Type.tdchar.immutableOf().arrayOf();
*************** private extern (C++) final class Express
*** 4441,4447 ****
              }
              buffer.writeUTF16(0);
              e.setData(buffer.extractData(), newlen, 2);
!             if (sc && sc.inCfile)
                  e.type = Type.tuns16.sarrayOf(e.len + 1);
              else
                  e.type = Type.twchar.immutableOf().arrayOf();
--- 4838,4844 ----
              }
              buffer.writeUTF16(0);
              e.setData(buffer.extractData(), newlen, 2);
!             if (!e.cMacro && sc && sc.inCfile)
                  e.type = Type.tuns16.sarrayOf(e.len + 1);
              else
                  e.type = Type.twchar.immutableOf().arrayOf();
*************** private extern (C++) final class Express
*** 4453,4459 ****
              goto default;
  
          default:
!             if (sc && sc.inCfile)
                  e.type = Type.tchar.sarrayOf(e.len + 1);
              else
                  e.type = Type.tchar.immutableOf().arrayOf();
--- 4850,4856 ----
              goto default;
  
          default:
!             if (!e.cMacro && sc && sc.inCfile)
                  e.type = Type.tchar.sarrayOf(e.len + 1);
              else
                  e.type = Type.tchar.immutableOf().arrayOf();
*************** private extern (C++) final class Express
*** 4545,4557 ****
          result = e;
      }
  
      override void visit(AssocArrayLiteralExp e)
      {
          static if (LOGSEMANTIC)
          {
              printf("AssocArrayLiteralExp::semantic('%s')\n", e.toChars());
          }
! 
          // Run semantic() on each element
          bool err_keys = arrayExpressionSemantic(e.keys.peekSlice(), sc);
          bool err_vals = arrayExpressionSemantic(e.values.peekSlice(), sc);
--- 4942,4990 ----
          result = e;
      }
  
+     void tryLowerAALiteral(AssocArrayLiteralExp aaExp)
+     {
+         auto hookId = Id._d_assocarrayliteralTX;
+         if (!verifyHookExist(aaExp.loc, *sc, hookId, "initializing associative arrays", Id.object))
+             return;
+ 
+         auto aaType = aaExp.type.toBasetype().isTypeAArray();
+         assert(aaType);
+         Expression hookFunc = new IdentifierExp(aaExp.loc, Id.empty);
+         hookFunc = new DotIdExp(aaExp.loc, hookFunc, Id.object);
+         auto keytype = aaType.index.substWildTo(MODFlags.const_);
+         auto valtype = aaType.nextOf().substWildTo(MODFlags.const_);
+         auto tiargs = new Objects(keytype, valtype);
+         hookFunc = new DotTemplateInstanceExp(aaExp.loc, hookFunc, hookId, tiargs);
+         auto ale1 = new ArrayLiteralExp(aaExp.loc, keytype.arrayOf(), aaExp.keys);
+         auto ale2 = new ArrayLiteralExp(aaExp.loc, valtype.arrayOf(), aaExp.values);
+         lowerArrayLiteral(ale1, sc);
+         lowerArrayLiteral(ale2, sc);
+         auto arguments = new Expressions(ale1, ale2);
+ 
+         Expression loweredExp = new CallExp(aaExp.loc, hookFunc, arguments);
+         loweredExp = loweredExp.expressionSemantic(sc);
+         loweredExp = resolveProperties(sc, loweredExp);
+         aaExp.lowering = loweredExp;
+ 
+         semanticTypeInfo(sc, loweredExp.type);
+     }
+ 
      override void visit(AssocArrayLiteralExp e)
      {
          static if (LOGSEMANTIC)
          {
              printf("AssocArrayLiteralExp::semantic('%s')\n", e.toChars());
          }
!         if (e.type)
!         {
!             // already done, but we might have missed generating type info
!             semanticTypeInfo(sc, e.type);
!             if (!e.lowering)
!                 tryLowerAALiteral(e);
!             result = e;
!             return;
!         }
          // Run semantic() on each element
          bool err_keys = arrayExpressionSemantic(e.keys.peekSlice(), sc);
          bool err_vals = arrayExpressionSemantic(e.values.peekSlice(), sc);
*************** private extern (C++) final class Express
*** 4575,4580 ****
--- 5008,5014 ----
          e.type = new TypeAArray(tvalue, tkey);
          e.type = e.type.typeSemantic(e.loc, sc);
  
+         tryLowerAALiteral(e);
          semanticTypeInfo(sc, e.type);
  
          if (checkAssocArrayLiteralEscape(*sc, e, false))
*************** private extern (C++) final class Express
*** 4848,4861 ****
           */
          Expression id = new IdentifierExp(ne.loc, Id.empty);
          id = new DotIdExp(ne.loc, id, Id.object);
-         auto tiargs = new Objects();
          /*
           * Remove `inout`, `const`, `immutable` and `shared` to reduce the
           * number of generated `_d_newitemT` instances.
           */
          auto t = ne.type.nextOf.unqualify(MODFlags.wild | MODFlags.const_ |
              MODFlags.immutable_ | MODFlags.shared_);
!         tiargs.push(t);
          id = new DotTemplateInstanceExp(ne.loc, id, hook, tiargs);
  
          auto arguments = new Expressions();
--- 5282,5326 ----
           */
          Expression id = new IdentifierExp(ne.loc, Id.empty);
          id = new DotIdExp(ne.loc, id, Id.object);
          /*
           * Remove `inout`, `const`, `immutable` and `shared` to reduce the
           * number of generated `_d_newitemT` instances.
           */
          auto t = ne.type.nextOf.unqualify(MODFlags.wild | MODFlags.const_ |
              MODFlags.immutable_ | MODFlags.shared_);
!         auto tiargs = new Objects(t);
!         id = new DotTemplateInstanceExp(ne.loc, id, hook, tiargs);
! 
!         auto arguments = new Expressions();
!         id = new CallExp(ne.loc, id, arguments);
! 
!         ne.lowering = id.expressionSemantic(sc);
!     }
! 
!     /**
!     * Sets the `lowering` field of a `NewExp` to a call to `_d_newAA` unless
!     * compiling with `-betterC` or within `__traits(compiles)`.
!     *
!     * Params:
!     *  ne = the `NewExp` to lower
!     */
!     private void tryLowerToNewAA(NewExp ne)
!     {
!         if (!global.params.useGC || !sc.needsCodegen())
!             return;
! 
!         Identifier hook = Id._d_aaNew;
!         if (!verifyHookExist(ne.loc, *sc, hook, "new AA"))
!             return;
! 
!         /* Lower the memory allocation and initialization of `new V[K]` to
!         * `_d_newAA!(V[K])()`.
!         */
!         Expression id = new IdentifierExp(ne.loc, Id.empty);
!         id = new DotIdExp(ne.loc, id, Id.object);
!         auto taa = ne.type.isTypeAArray();
!         assert(taa);
!         auto tiargs = new Objects(taa.index, taa.next);
          id = new DotTemplateInstanceExp(ne.loc, id, hook, tiargs);
  
          auto arguments = new Expressions();
*************** private extern (C++) final class Express
*** 4889,4899 ****
              {
                  return setError();
              }
!             if (!exp.placement.type.isNaked())
              {
                  error(p.loc, "PlacementExpression `%s` of type `%s` be unshared and mutable", p.toChars(), toChars(p.type));
                  return setError();
              }
          }
  
          //for error messages if the argument in [] is not convertible to size_t
--- 5354,5365 ----
              {
                  return setError();
              }
!             if (!exp.placement.type.isNaked)
              {
                  error(p.loc, "PlacementExpression `%s` of type `%s` be unshared and mutable", p.toChars(), toChars(p.type));
                  return setError();
              }
+             checkModifiable(exp.placement, sc);
          }
  
          //for error messages if the argument in [] is not convertible to size_t
*************** private extern (C++) final class Express
*** 4958,4965 ****
              else
              {
                  // --> new T[](edim)
!                 exp.arguments = new Expressions();
!                 exp.arguments.push(edim);
                  exp.type = exp.type.arrayOf();
              }
          }
--- 5424,5430 ----
              else
              {
                  // --> new T[](edim)
!                 exp.arguments = new Expressions(edim);
                  exp.type = exp.type.arrayOf();
              }
          }
*************** private extern (C++) final class Express
*** 5207,5214 ****
                  Expression id = new IdentifierExp(exp.loc, Id.empty);
                  id = new DotIdExp(exp.loc, id, Id.object);
  
!                 auto tiargs = new Objects();
!                 tiargs.push(exp.newtype);
  
                  id = new DotTemplateInstanceExp(exp.loc, id, Id._d_newThrowable, tiargs);
  
--- 5672,5678 ----
                  Expression id = new IdentifierExp(exp.loc, Id.empty);
                  id = new DotIdExp(exp.loc, id, Id.object);
  
!                 auto tiargs = new Objects(exp.newtype);
  
                  id = new DotTemplateInstanceExp(exp.loc, id, Id._d_newThrowable, tiargs);
  
*************** private extern (C++) final class Express
*** 5233,5241 ****
                  Expression id = new IdentifierExp(exp.loc, Id.empty);
                  id = new DotIdExp(exp.loc, id, Id.object);
  
-                 auto tiargs = new Objects();
                  auto t = exp.newtype.unqualify(MODFlags.wild);  // remove `inout`
!                 tiargs.push(t);
                  id = new DotTemplateInstanceExp(exp.loc, id, hook, tiargs);
                  auto arguments = new Expressions();
                  id = new CallExp(exp.loc, id, arguments);
--- 5697,5704 ----
                  Expression id = new IdentifierExp(exp.loc, Id.empty);
                  id = new DotIdExp(exp.loc, id, Id.object);
  
                  auto t = exp.newtype.unqualify(MODFlags.wild);  // remove `inout`
!                 auto tiargs = new Objects(t);
                  id = new DotTemplateInstanceExp(exp.loc, id, hook, tiargs);
                  auto arguments = new Expressions();
                  id = new CallExp(exp.loc, id, arguments);
*************** private extern (C++) final class Express
*** 5269,5275 ****
              // If the new expression has arguments, we either should call a
              // regular constructor of a copy constructor if the first argument
              // is the same type as the struct
!             if (nargs && (sd.hasRegularCtor() || (sd.ctor && (*exp.arguments)[0].type.mutableOf() == sd.type.mutableOf())))
              {
                  FuncDeclaration f = resolveFuncCall(exp.loc, sc, sd.ctor, null, tb, exp.argumentList, FuncResolveFlag.standard);
                  if (!f || f.errors)
--- 5732,5738 ----
              // If the new expression has arguments, we either should call a
              // regular constructor of a copy constructor if the first argument
              // is the same type as the struct
!             if (nargs && (sd.hasRegularCtor(false) || (sd.ctor && (*exp.arguments)[0].type.mutableOf() == sd.type.mutableOf())))
              {
                  FuncDeclaration f = resolveFuncCall(exp.loc, sc, sd.ctor, null, tb, exp.argumentList, FuncResolveFlag.standard);
                  if (!f || f.errors)
*************** private extern (C++) final class Express
*** 5294,5303 ****
              {
                  if (exp.names)
                  {
!                     exp.arguments = resolveStructLiteralNamedArgs(sd, exp.type, sc, exp.loc,
!                         exp.names ? (*exp.names)[] : null,
                          (size_t i, Type t) => (*exp.arguments)[i],
!                         i => (*exp.arguments)[i].loc
                      );
                      if (!exp.arguments)
                          return setError();
--- 5757,5767 ----
              {
                  if (exp.names)
                  {
!                     exp.arguments = resolveStructLiteralNamedArgs(sd, exp.type, sc, exp.loc, exp.names.length,
!                         i => (*exp.names)[i].name,
                          (size_t i, Type t) => (*exp.arguments)[i],
!                         i => (*exp.arguments)[i].loc,
!                         i => (*exp.names)[i].loc
                      );
                      if (!exp.arguments)
                          return setError();
*************** private extern (C++) final class Express
*** 5361,5369 ****
                  }
  
                  Expression arg = (*exp.arguments)[i];
!                 if (exp.names && (*exp.names)[i])
                  {
!                     error(exp.loc, "no named argument `%s` allowed for array dimension", (*exp.names)[i].toChars());
                      return setError();
                  }
  
--- 5825,5833 ----
                  }
  
                  Expression arg = (*exp.arguments)[i];
!                 if (exp.names && (*exp.names)[i].name)
                  {
!                     error(exp.loc, "no named argument `%s` allowed for array dimension", (*exp.names)[i].name.toChars());
                      return setError();
                  }
  
*************** private extern (C++) final class Express
*** 5420,5438 ****
                   */
                  Expression lowering = new IdentifierExp(exp.loc, Id.empty);
                  lowering = new DotIdExp(exp.loc, lowering, Id.object);
!                 auto tiargs = new Objects();
                  /* Remove `inout`, `const`, `immutable` and `shared` to reduce
                   * the number of generated `_d_newarrayT` instances.
                   */
                  const isShared = exp.type.nextOf.isShared();
                  auto t = exp.type.nextOf.unqualify(MODFlags.wild | MODFlags.const_ |
                      MODFlags.immutable_ | MODFlags.shared_);
!                 tiargs.push(t);
                  lowering = new DotTemplateInstanceExp(exp.loc, lowering, hook, tiargs);
  
!                 auto arguments = new Expressions();
!                 arguments.push((*exp.arguments)[0]);
!                 arguments.push(new IntegerExp(exp.loc, isShared, Type.tbool));
  
                  lowering = new CallExp(exp.loc, lowering, arguments);
                  exp.lowering = lowering.expressionSemantic(sc);
--- 5884,5900 ----
                   */
                  Expression lowering = new IdentifierExp(exp.loc, Id.empty);
                  lowering = new DotIdExp(exp.loc, lowering, Id.object);
! 
                  /* Remove `inout`, `const`, `immutable` and `shared` to reduce
                   * the number of generated `_d_newarrayT` instances.
                   */
                  const isShared = exp.type.nextOf.isShared();
                  auto t = exp.type.nextOf.unqualify(MODFlags.wild | MODFlags.const_ |
                      MODFlags.immutable_ | MODFlags.shared_);
!                 auto tiargs = new Objects(t);
                  lowering = new DotTemplateInstanceExp(exp.loc, lowering, hook, tiargs);
  
!                 auto arguments = new Expressions((*exp.arguments)[0], new IntegerExp(exp.loc, isShared, Type.tbool));
  
                  lowering = new CallExp(exp.loc, lowering, arguments);
                  exp.lowering = lowering.expressionSemantic(sc);
*************** private extern (C++) final class Express
*** 5456,5470 ****
                  auto unqualTbn = tbn.unqualify(MODFlags.wild | MODFlags.const_ |
                      MODFlags.immutable_ | MODFlags.shared_);
  
!                 auto tiargs = new Objects();
!                 tiargs.push(exp.type);
!                 tiargs.push(unqualTbn);
                  lowering = new DotTemplateInstanceExp(exp.loc, lowering, hook, tiargs);
  
!                 auto arguments = new Expressions();
! 
!                 arguments.push(new ArrayLiteralExp(exp.loc, Type.tsize_t.sarrayOf(nargs), exp.arguments));
!                 arguments.push(new IntegerExp(exp.loc, tbn.isShared(), Type.tbool));
  
                  lowering = new CallExp(exp.loc, lowering, arguments);
                  exp.lowering = lowering.expressionSemantic(sc);
--- 5918,5928 ----
                  auto unqualTbn = tbn.unqualify(MODFlags.wild | MODFlags.const_ |
                      MODFlags.immutable_ | MODFlags.shared_);
  
!                 auto tiargs = new Objects(exp.type, unqualTbn);
                  lowering = new DotTemplateInstanceExp(exp.loc, lowering, hook, tiargs);
  
!                 auto arguments = new Expressions(new ArrayLiteralExp(exp.loc, Type.tsize_t.sarrayOf(nargs), exp.arguments),
!                                                  new IntegerExp(exp.loc, tbn.isShared(), Type.tbool));
  
                  lowering = new CallExp(exp.loc, lowering, arguments);
                  exp.lowering = lowering.expressionSemantic(sc);
*************** private extern (C++) final class Express
*** 5477,5485 ****
              }
              else if (nargs == 1)
              {
!                 if (exp.names && (*exp.names)[0])
                  {
!                     error(exp.loc, "no named argument `%s` allowed for scalar", (*exp.names)[0].toChars());
                      return setError();
                  }
                  Expression e = (*exp.arguments)[0];
--- 5935,5943 ----
              }
              else if (nargs == 1)
              {
!                 if (exp.names && (*exp.names)[0].name)
                  {
!                     error(exp.loc, "no named argument `%s` allowed for scalar", (*exp.names)[0].name.toChars());
                      return setError();
                  }
                  Expression e = (*exp.arguments)[0];
*************** private extern (C++) final class Express
*** 5509,5514 ****
--- 5967,5973 ----
                  error(exp.loc, "`new` cannot take arguments for an associative array");
                  return setError();
              }
+             tryLowerToNewAA(exp);
          }
          else
          {
*************** private extern (C++) final class Express
*** 5682,5688 ****
              symtab = sds.symtab;
          }
          assert(symtab);
!         Identifier id = Identifier.generateIdWithLoc(s, exp.loc, cast(string) toDString(sc.parent.toPrettyChars()));
          exp.fd.ident = id;
          if (exp.td)
              exp.td.ident = id;
--- 6141,6147 ----
              symtab = sds.symtab;
          }
          assert(symtab);
!         Identifier id = Identifier.generateIdWithLoc(s, exp.loc, cast(const void*) sc.parent);
          exp.fd.ident = id;
          if (exp.td)
              exp.td.ident = id;
*************** private extern (C++) final class Express
*** 5896,5906 ****
          {
              if (TypeFunction tf = exp.f ? cast(TypeFunction)exp.f.type : null)
              {
!                 result.rvalue = tf.isRvalue;
!                 if (tf.isRvalue && !tf.isRef)
                  {
!                     error(exp.f.loc, "`__rvalue` only valid on functions that return by `ref`");
!                     setError();
                  }
              }
          }
--- 6355,6382 ----
          {
              if (TypeFunction tf = exp.f ? cast(TypeFunction)exp.f.type : null)
              {
!                 if (tf.isRvalue)
                  {
!                     if(!tf.isRef)
!                     {
!                         error(exp.f.loc, "`__rvalue` only valid on functions that return by `ref`");
!                         setError();
!                     }
!                     else if (sc.setUnsafe(false, exp.loc, "calling `__rvalue`-annotated function `%s`", exp.f))
!                     {
!                         setError();
!                     }
!                     else
!                     {
!                         result.rvalue = true;
!                     }
!                 }
!                 else if (exp.rvalue && tf.isRef)
!                 {
!                     if (sc.setUnsafe(false, exp.loc, "moving result of `ref` function `%s` with `__rvalue`", exp.f))
!                     {
!                         setError();
!                     }
                  }
              }
          }
*************** private extern (C++) final class Express
*** 6193,6199 ****
                  if (sd.ctor)
                  {
                      auto ctor = sd.ctor.isCtorDeclaration();
!                     if (ctor && (ctor.isCpCtor || ctor.isMoveCtor) && ctor.isGenerated())
                          sd.ctor = null;
                  }
  
--- 6669,6675 ----
                  if (sd.ctor)
                  {
                      auto ctor = sd.ctor.isCtorDeclaration();
!                     if (ctor && (ctor.isCpCtor || ctor.isMoveCtor) && ctor.isGenerated)
                          sd.ctor = null;
                  }
  
*************** private extern (C++) final class Express
*** 6207,6213 ****
                         If all constructors are copy constructors, then
                         try default construction.
                       */
!                     if (!sd.hasRegularCtor &&
                          // https://issues.dlang.org/show_bug.cgi?id=22639
                          // we might still have a copy constructor that could be called
                          (*exp.arguments)[0].type.mutableOf != sd.type.mutableOf())
--- 6683,6689 ----
                         If all constructors are copy constructors, then
                         try default construction.
                       */
!                     if (!sd.hasRegularCtor(false) &&
                          // https://issues.dlang.org/show_bug.cgi?id=22639
                          // we might still have a copy constructor that could be called
                          (*exp.arguments)[0].type.mutableOf != sd.type.mutableOf())
*************** private extern (C++) final class Express
*** 6269,6278 ****
                  Expressions* resolvedArgs = exp.arguments;
                  if (exp.names)
                  {
!                     resolvedArgs = resolveStructLiteralNamedArgs(sd, exp.e1.type, sc, exp.loc,
!                         (*exp.names)[],
                          (size_t i, Type t) => (*exp.arguments)[i],
!                         i => (*exp.arguments)[i].loc
                      );
                      if (!resolvedArgs)
                      {
--- 6745,6755 ----
                  Expressions* resolvedArgs = exp.arguments;
                  if (exp.names)
                  {
!                     resolvedArgs = resolveStructLiteralNamedArgs(sd, exp.e1.type, sc, exp.loc, exp.names.length,
!                         i => (*exp.names)[i].name,
                          (size_t i, Type t) => (*exp.arguments)[i],
!                         i => (*exp.arguments)[i].loc,
!                         i => (*exp.names)[i].loc
                      );
                      if (!resolvedArgs)
                      {
*************** private extern (C++) final class Express
*** 6877,6884 ****
          if (!exp.type)
          {
              exp.e1 = e1org; // https://issues.dlang.org/show_bug.cgi?id=10922
!                         // avoid recursive expression printing
!             error(exp.loc, "forward reference to inferred return type of function call `%s`", exp.toErrMsg());
              return setError();
          }
  
--- 7354,7374 ----
          if (!exp.type)
          {
              exp.e1 = e1org; // https://issues.dlang.org/show_bug.cgi?id=10922
!                             // avoid recursive expression printing
!             FuncDeclaration fd = null;
!             if (auto dve = exp.e1.isDotVarExp())
!                 fd = cast(FuncDeclaration)dve.var;
!             else if (auto ve = exp.e1.isVarExp())
!                 fd = cast(FuncDeclaration)ve.var;
! 
!             if (fd && fd.inferRetType && sc && sc.func == fd)
!             {
!                 error(exp.loc, "can't infer return type in function `%s`", fd.toChars());
!             }
!             else
!             {
!                 error(exp.loc, "forward reference to inferred return type of function call `%s`", exp.toErrMsg());
!             }
              return setError();
          }
  
*************** private extern (C++) final class Express
*** 6890,6896 ****
              if (tf.next.isBaseOf(t, &offset) && offset)
              {
                  exp.type = tf.next;
!                 result = Expression.combine(argprefix, exp.castTo(sc, t));
                  return;
              }
          }
--- 7380,7391 ----
              if (tf.next.isBaseOf(t, &offset) && offset)
              {
                  exp.type = tf.next;
!                 auto casted_exp = exp.castTo(sc, t);
!                 if (auto cex = casted_exp.isCastExp())
!                 {
!                     lowerCastExp(cex, sc);
!                 }
!                 result = Expression.combine(argprefix, casted_exp);
                  return;
              }
          }
*************** private extern (C++) final class Express
*** 6939,6945 ****
          }
  
          // declare dual-context container
!         if (exp.f && exp.f.hasDualContext() && !sc.intypeof && sc.func)
          {
              // check access to second `this`
              if (AggregateDeclaration ad2 = exp.f.isMember2())
--- 7434,7440 ----
          }
  
          // declare dual-context container
!         if (exp.f && exp.f.hasDualContext && !sc.intypeof && sc.func)
          {
              // check access to second `this`
              if (AggregateDeclaration ad2 = exp.f.isMember2())
*************** private extern (C++) final class Express
*** 7303,7308 ****
--- 7798,7804 ----
              sc2.tinst = null;
              sc2.minst = null;
              sc2.fullinst = true;
+             sc2.traitsCompiles = true;
              Type t = dmd.typesem.trySemantic(e.targ, e.loc, sc2);
              sc2.pop();
              if (!t) // errors, so condition is false
*************** private extern (C++) final class Express
*** 7678,7684 ****
          }
  
          assert(e.op == EXP.assign || e == exp);
!         result = (cast(BinExp)e).reorderSettingAAElem(sc);
      }
  
      private Expression compileIt(MixinExp exp, Scope* sc)
--- 8174,8180 ----
          }
  
          assert(e.op == EXP.assign || e == exp);
!         result = e;
      }
  
      private Expression compileIt(MixinExp exp, Scope* sc)
*************** private extern (C++) final class Express
*** 7895,7901 ****
                  // Defensively assume that function calls may have side effects even
                  // though it's not detected by hasSideEffect (e.g. `debug puts("Hello")` )
                  // Rewriting CallExp's also avoids some issues with the inliner/debug generation
!                 if (op.hasSideEffect(true))
                  {
                      // Don't create an invalid temporary for void-expressions
                      // Further semantic will issue an appropriate error
--- 8391,8397 ----
                  // Defensively assume that function calls may have side effects even
                  // though it's not detected by hasSideEffect (e.g. `debug puts("Hello")` )
                  // Rewriting CallExp's also avoids some issues with the inliner/debug generation
!                 if (op.hasSideEffect(true) || op.isAssocArrayLiteralExp())
                  {
                      // Don't create an invalid temporary for void-expressions
                      // Further semantic will issue an appropriate error
*************** private extern (C++) final class Express
*** 7981,7987 ****
                  isEqualsCallExpression)
              {
                  es = new Expressions(3);
-                 tiargs = new Objects(1);
  
                  if (isEqualsCallExpression)
                  {
--- 8477,8482 ----
*************** private extern (C++) final class Express
*** 8020,8026 ****
                  Expression comp = new StringExp(loc, isEqualsCallExpression ? "==" : EXPtoString(exp.e1.op));
                  comp = comp.expressionSemantic(sc);
                  (*es)[0] = comp;
!                 (*tiargs)[0] = (*es)[1].type;
              }
  
              // Format exp.e1 before any additional boolean conversion
--- 8515,8521 ----
                  Expression comp = new StringExp(loc, isEqualsCallExpression ? "==" : EXPtoString(exp.e1.op));
                  comp = comp.expressionSemantic(sc);
                  (*es)[0] = comp;
!                 tiargs = new Objects((*es)[1].type);
              }
  
              // Format exp.e1 before any additional boolean conversion
*************** private extern (C++) final class Express
*** 8028,8034 ****
              else if (op != EXP.andAnd && op != EXP.orOr)
              {
                  es = new Expressions(2);
-                 tiargs = new Objects(1);
  
                  if (auto ne = exp.e1.isNotExp())
                  {
--- 8523,8528 ----
*************** private extern (C++) final class Express
*** 8052,8058 ****
                      (*es)[1] = maybePromoteToTmp(exp.e1);
                  }
  
!                 (*tiargs)[0] = (*es)[1].type;
  
                  // Passing __ctfe to auto ref infers ref and aborts compilation:
                  // "cannot modify compiler-generated variable __ctfe"
--- 8546,8552 ----
                      (*es)[1] = maybePromoteToTmp(exp.e1);
                  }
  
!                 tiargs = new Objects((*es)[1].type);
  
                  // Passing __ctfe to auto ref infers ref and aborts compilation:
                  // "cannot modify compiler-generated variable __ctfe"
*************** private extern (C++) final class Express
*** 8163,8168 ****
--- 8657,8669 ----
              printf("DotIdExp::semantic(this = %p, '%s')\n", exp, exp.toChars());
              printAST(exp);
          }
+         scope (exit)
+         {
+             if (result)
+                 result.rvalue = exp.rvalue;
+             else
+                 setError();
+         }
  
          if (sc.inCfile)
          {
*************** private extern (C++) final class Express
*** 8177,8213 ****
              if (exp.arrow) // ImportC only
                  exp.e1 = exp.e1.expressionSemantic(sc).arrayFuncConv(sc);
  
!             if (exp.ident == Id.__xalignof && exp.e1.isTypeExp())
!             {
!                 // C11 6.5.3 says _Alignof only applies to types
!                 Expression e;
!                 Type t;
!                 Dsymbol s;
!                 dmd.typesem.resolve(exp.e1.type, exp.e1.loc, sc, e, t, s, true);
!                 if (e)
!                 {
!                     error(exp.e1.loc, "argument to `_Alignof` must be a type");
!                     return setError();
!                 }
!                 else if (t)
!                 {
!                     // Note similarity to getProperty() implementation of __xalignof
!                     const explicitAlignment = t.alignment();
!                     const naturalAlignment = t.alignsize();
!                     const actualAlignment = (explicitAlignment.isDefault() ? naturalAlignment : explicitAlignment.get());
!                     result = new IntegerExp(exp.loc, actualAlignment, Type.tsize_t);
!                 }
!                 else if (s)
!                 {
!                     error(exp.e1.loc, "argument to `_Alignof` must be a type");
!                     return setError();
!                 }
!                 else
!                     assert(0);
!                 return;
!             }
! 
!             if (exp.ident != Id.__sizeof)
              {
                  result = fieldLookup(exp.e1, sc, exp.ident, exp.arrow);
                  return;
--- 8678,8684 ----
              if (exp.arrow) // ImportC only
                  exp.e1 = exp.e1.expressionSemantic(sc).arrayFuncConv(sc);
  
!             if (exp.ident != Id.__sizeof && exp.ident != Id.__xalignof)
              {
                  result = fieldLookup(exp.e1, sc, exp.ident, exp.arrow);
                  return;
*************** private extern (C++) final class Express
*** 8475,8481 ****
          }
          result = e;
          // declare dual-context container
!         if (f.hasDualContext() && !sc.intypeof && sc.func)
          {
              // check access to second `this`
              if (AggregateDeclaration ad2 = f.isMember2())
--- 8946,8952 ----
          }
          result = e;
          // declare dual-context container
!         if (f.hasDualContext && !sc.intypeof && sc.func)
          {
              // check access to second `this`
              if (AggregateDeclaration ad2 = f.isMember2())
*************** private extern (C++) final class Express
*** 8649,8655 ****
              error(exp.loc, "cannot take address of `%s`", exp.e1.toErrMsg());
              return setError();
          }
!         if (!checkAddressable(exp, sc))
              return setError();
  
          bool hasOverloads;
--- 9120,9126 ----
              error(exp.loc, "cannot take address of `%s`", exp.e1.toErrMsg());
              return setError();
          }
!         if (!checkAddressable(exp, sc, "take address of"))
              return setError();
  
          bool hasOverloads;
*************** private extern (C++) final class Express
*** 9307,9319 ****
                              Expression id = new IdentifierExp(exp.loc, Id.empty);
                              auto dotid = new DotIdExp(exp.loc, id, Id.object);
  
!                             auto tiargs = new Objects();
!                             tiargs.push(tFrom);
!                             tiargs.push(tTo);
                              auto dt = new DotTemplateInstanceExp(exp.loc, dotid, Id.__ArrayCast, tiargs);
  
!                             auto arguments = new Expressions();
!                             arguments.push(exp.e1);
                              Expression ce = new CallExp(exp.loc, dt, arguments);
  
                              result = expressionSemantic(ce, sc);
--- 9778,9787 ----
                              Expression id = new IdentifierExp(exp.loc, Id.empty);
                              auto dotid = new DotIdExp(exp.loc, id, Id.object);
  
!                             auto tiargs = new Objects(tFrom, tTo);
                              auto dt = new DotTemplateInstanceExp(exp.loc, dotid, Id.__ArrayCast, tiargs);
  
!                             auto arguments = new Expressions(exp.e1);
                              Expression ce = new CallExp(exp.loc, dt, arguments);
  
                              result = expressionSemantic(ce, sc);
*************** private extern (C++) final class Express
*** 9336,9341 ****
--- 9804,9815 ----
                  ex.type = exp.to;
              }
          }
+ 
+         if (auto cex = ex.isCastExp())
+         {
+             lowerCastExp(cex, sc);
+         }
+ 
          result = ex;
      }
  
*************** private extern (C++) final class Express
*** 9974,9980 ****
          }
          if (t1b.isStaticOrDynamicArray())
          {
!             if (!checkAddressable(exp, sc))
                  return setError();
          }
  
--- 10448,10454 ----
          }
          if (t1b.isStaticOrDynamicArray())
          {
!             if (!checkAddressable(exp, sc, "index through"))
                  return setError();
          }
  
*************** private extern (C++) final class Express
*** 10061,10069 ****
                  }
  
                  semanticTypeInfo(sc, taa);
!                 checkNewEscape(*sc, exp.e2, false);
  
                  exp.type = taa.next;
                  break;
              }
          case Ttuple:
--- 10535,10550 ----
                  }
  
                  semanticTypeInfo(sc, taa);
!                 bool escape = checkNewEscape(*sc, exp.e2, false);
!                 if (escape)
!                     return setError();
  
                  exp.type = taa.next;
+                 if (!exp.modifiable)
+                 {
+                     result = lowerAAIndexRead(exp, sc);
+                     return;
+                 }
                  break;
              }
          case Ttuple:
*************** private extern (C++) final class Express
*** 10169,10174 ****
--- 10650,10658 ----
              }
          }
  
+         if (auto ae = exp.e1.isArrayExp())
+             markArrayExpModifiable(ae);
+ 
          if (Expression ex = binSemantic(exp, sc))
          {
              result = ex;
*************** private extern (C++) final class Express
*** 10182,10187 ****
--- 10666,10677 ----
          }
          exp.e1 = e1x;
  
+         Type[2] aliasThisStop;
+         if (auto res = rewriteIndexAssign(exp, sc, aliasThisStop))
+         {
+             result = res;
+             return;
+         }
          if (exp.e1.checkReadModifyWrite(exp.op))
              return setError();
  
*************** private extern (C++) final class Express
*** 10251,10256 ****
--- 10741,10749 ----
  
      override void visit(PreExp exp)
      {
+         if (auto ae = exp.e1.isArrayExp())
+             markArrayExpModifiable(ae);
+ 
          // printf("PreExp::semantic('%s')\n", toChars());
          if (Expression e = exp.opOverloadUnary(sc))
          {
*************** private extern (C++) final class Express
*** 10341,10346 ****
--- 10834,10840 ----
          if (auto ae = exp.e1.isArrayExp())
          {
              Expression res;
+             markArrayExpModifiable(ae);
  
              ae.e1 = ae.e1.expressionSemantic(sc);
              ae.e1 = resolveProperties(sc, ae.e1);
*************** private extern (C++) final class Express
*** 10416,10423 ****
                      /* Rewrite (a[i..j] = e2) as:
                       *      a.opSliceAssign(e2, i, j)
                       */
!                     auto a = new Expressions();
!                     a.push(exp.e2);
                      if (ie)
                      {
                          a.push(ie.lwr);
--- 10910,10916 ----
                      /* Rewrite (a[i..j] = e2) as:
                       *      a.opSliceAssign(e2, i, j)
                       */
!                     auto a = new Expressions(exp.e2);
                      if (ie)
                      {
                          a.push(ie.lwr);
*************** private extern (C++) final class Express
*** 10595,10601 ****
              {
                  TupleDeclaration td = isAliasThisTuple(e2x);
                  if (!td)
!                     goto Lnomatch;
  
                  assert(exp.e1.type.ty == Ttuple);
                  TypeTuple tt = cast(TypeTuple)exp.e1.type;
--- 11088,11099 ----
              {
                  TupleDeclaration td = isAliasThisTuple(e2x);
                  if (!td)
!                 {
!                 Lnomatch:
!                     error(exp.loc, "cannot assign `%s` to expression sequence `%s`",
!                         exp.e2.type.toChars(), exp.e1.type.toChars());
!                     return setError();
!                 }
  
                  assert(exp.e1.type.ty == Ttuple);
                  TypeTuple tt = cast(TypeTuple)exp.e1.type;
*************** private extern (C++) final class Express
*** 10603,10610 ****
                  Expression e0;
                  Expression ev = extractSideEffect(sc, "__tup", e0, e2x);
  
!                 auto iexps = new Expressions();
!                 iexps.push(ev);
                  for (size_t u = 0; u < iexps.length; u++)
                  {
                  Lexpand:
--- 11101,11107 ----
                  Expression e0;
                  Expression ev = extractSideEffect(sc, "__tup", e0, e2x);
  
!                 auto iexps = new Expressions(ev);
                  for (size_t u = 0; u < iexps.length; u++)
                  {
                  Lexpand:
*************** private extern (C++) final class Express
*** 10637,10643 ****
                  // Do not need to overwrite this.e2
                  goto Ltupleassign;
              }
-         Lnomatch:
          }
  
          /* Inside constructor, if this is the first assignment of object field,
--- 11134,11139 ----
*************** private extern (C++) final class Express
*** 10679,10696 ****
              auto t = exp.type;
              exp = new ConstructExp(exp.loc, exp.e1, exp.e2);
              exp.type = t;
- 
-             // https://issues.dlang.org/show_bug.cgi?id=13515
-             // set Index::modifiable flag for complex AA element initialization
-             if (auto ie1 = exp.e1.isIndexExp())
-             {
-                 Expression e1x = ie1.markSettingAAElem();
-                 if (e1x.op == EXP.error)
-                 {
-                     result = e1x;
-                     return;
-                 }
-             }
          }
          else if (exp.op == EXP.construct && exp.e1.op == EXP.variable &&
                   (cast(VarExp)exp.e1).var.storage_class & (STC.out_ | STC.ref_))
--- 11175,11180 ----
*************** private extern (C++) final class Express
*** 10706,10711 ****
--- 11190,11201 ----
  
          checkUnsafeAccess(sc, exp.e2, true, true); // Initializer must always be checked
  
+         if (auto res = rewriteIndexAssign(exp, sc, aliasThisStop))
+         {
+             result = res;
+             return;
+         }
+ 
          /* If it is an assignment from a 'foreign' type,
           * check for operator overloading.
           */
*************** private extern (C++) final class Express
*** 10995,11085 ****
              }
              else if (exp.op == EXP.assign)
              {
!                 if (e1x.op == EXP.index && (cast(IndexExp)e1x).e1.type.toBasetype().ty == Taarray)
!                 {
!                     /*
!                      * Rewrite:
!                      *      aa[key] = e2;
!                      * as:
!                      *      ref __aatmp = aa;
!                      *      ref __aakey = key;
!                      *      ref __aaval = e2;
!                      *      (__aakey in __aatmp
!                      *          ? __aatmp[__aakey].opAssign(__aaval)
!                      *          : ConstructExp(__aatmp[__aakey], __aaval));
!                      */
!                     // ensure we keep the expr modifiable
!                     Expression esetting = (cast(IndexExp)e1x).markSettingAAElem();
!                     if (esetting.op == EXP.error)
!                     {
!                         result = esetting;
!                         return;
!                     }
!                     assert(esetting.op == EXP.index);
!                     IndexExp ie = cast(IndexExp) esetting;
!                     Type t2 = e2x.type.toBasetype();
! 
!                     Expression e0 = null;
!                     Expression ea = extractSideEffect(sc, "__aatmp", e0, ie.e1);
!                     Expression ek = extractSideEffect(sc, "__aakey", e0, ie.e2);
!                     Expression ev = extractSideEffect(sc, "__aaval", e0, e2x);
! 
!                     AssignExp ae = cast(AssignExp)exp.copy();
!                     ae.e1 = new IndexExp(exp.loc, ea, ek);
!                     ae.e1 = ae.e1.expressionSemantic(sc);
!                     ae.e1 = ae.e1.optimize(WANTvalue);
!                     ae.e2 = ev;
!                     if (Expression e = ae.opOverloadAssign(sc, aliasThisStop))
!                     {
!                         Expression ey = null;
!                         if (t2.ty == Tstruct && sd == t2.toDsymbol(sc))
!                         {
!                             ey = ev;
!                         }
!                         else if (!ev.implicitConvTo(ie.type) && sd.ctor)
!                         {
!                             // Look for implicit constructor call
!                             // Rewrite as S().ctor(e2)
!                             ey = new StructLiteralExp(exp.loc, sd, null);
!                             ey = new DotIdExp(exp.loc, ey, Id.ctor);
!                             ey = new CallExp(exp.loc, ey, ev);
!                             ey = ey.trySemantic(sc);
!                         }
!                         if (ey)
!                         {
!                             Expression ex;
!                             ex = new IndexExp(exp.loc, ea, ek);
!                             ex = ex.expressionSemantic(sc);
!                             ex = ex.modifiableLvalue(sc); // allocate new slot
!                             ex = ex.optimize(WANTvalue);
! 
!                             ey = new ConstructExp(exp.loc, ex, ey);
!                             ey = ey.expressionSemantic(sc);
!                             if (ey.op == EXP.error)
!                             {
!                                 result = ey;
!                                 return;
!                             }
!                             ex = e;
! 
!                             // https://issues.dlang.org/show_bug.cgi?id=14144
!                             // The whole expression should have the common type
!                             // of opAssign() return and assigned AA entry.
!                             // Even if there's no common type, expression should be typed as void.
!                             if (!typeMerge(sc, EXP.question, ex, ey))
!                             {
!                                 ex = new CastExp(ex.loc, ex, Type.tvoid);
!                                 ey = new CastExp(ey.loc, ey, Type.tvoid);
!                             }
!                             e = new CondExp(exp.loc, new InExp(exp.loc, ek, ea), ex, ey);
!                         }
!                         e = Expression.combine(e0, e);
!                         e = e.expressionSemantic(sc);
!                         result = e;
!                         return;
!                     }
!                 }
!                 else if (Expression e = exp.isAssignExp().opOverloadAssign(sc, aliasThisStop))
                  {
                      result = e;
                      return;
--- 11485,11491 ----
              }
              else if (exp.op == EXP.assign)
              {
!                 if (Expression e = exp.isAssignExp().opOverloadAssign(sc, aliasThisStop))
                  {
                      result = e;
                      return;
*************** private extern (C++) final class Express
*** 11241,11265 ****
           */
          if (auto ale = exp.e1.isArrayLengthExp())
          {
-             // e1 is not an lvalue, but we let code generator handle it
  
!             auto ale1x = ale.e1.modifiableLvalueImpl(sc, exp.e1);
              if (ale1x.op == EXP.error)
                  return setResult(ale1x);
              ale.e1 = ale1x;
  
              Type tn = ale.e1.type.toBasetype().nextOf();
              checkDefCtor(ale.loc, tn);
  
              Identifier hook = global.params.tracegc ? Id._d_arraysetlengthTTrace : Id._d_arraysetlengthT;
!             if (!verifyHookExist(exp.loc, *sc, Id._d_arraysetlengthTImpl, "resizing arrays"))
                  return setError();
  
              exp.e2 = exp.e2.expressionSemantic(sc);
              auto lc = lastComma(exp.e2);
              lc = lc.optimize(WANTvalue);
!             // use slice expression when arr.length = 0 to avoid runtime call
!             if(lc.op == EXP.int64 && lc.toInteger() == 0)
              {
                  Expression se = new SliceExp(ale.loc, ale.e1, lc, lc);
                  Expression as = new AssignExp(ale.loc, ale.e1, se);
--- 11647,11676 ----
           */
          if (auto ale = exp.e1.isArrayLengthExp())
          {
  
!             // Ensure e1 is a modifiable lvalue
!             auto ale1x = ale.e1.modifiableLvalue(sc, exp.e1);
              if (ale1x.op == EXP.error)
                  return setResult(ale1x);
              ale.e1 = ale1x;
  
+             // Ensure the element type has a valid constructor
              Type tn = ale.e1.type.toBasetype().nextOf();
              checkDefCtor(ale.loc, tn);
  
+             // Choose correct GC hook
              Identifier hook = global.params.tracegc ? Id._d_arraysetlengthTTrace : Id._d_arraysetlengthT;
! 
!             // Verify the correct hook exists
!             if (!verifyHookExist(exp.loc, *sc, hook, "resizing arrays"))
                  return setError();
  
              exp.e2 = exp.e2.expressionSemantic(sc);
              auto lc = lastComma(exp.e2);
              lc = lc.optimize(WANTvalue);
! 
!             // Optimize case where arr.length = 0
!             if (lc.op == EXP.int64 && lc.toInteger() == 0)
              {
                  Expression se = new SliceExp(ale.loc, ale.e1, lc, lc);
                  Expression as = new AssignExp(ale.loc, ale.e1, se);
*************** private extern (C++) final class Express
*** 11269,11298 ****
                  return setResult(res);
              }
  
!             if (!sc.needsCodegen())      // if compile time creature only
              {
                  exp.type = Type.tsize_t;
                  return setResult(exp);
              }
  
!             // Lower to object._d_arraysetlengthTImpl!(typeof(e1))._d_arraysetlengthT{,Trace}(e1, e2)
              Expression id = new IdentifierExp(ale.loc, Id.empty);
              id = new DotIdExp(ale.loc, id, Id.object);
-             auto tiargs = new Objects();
-             tiargs.push(ale.e1.type);
-             id = new DotTemplateInstanceExp(ale.loc, id, Id._d_arraysetlengthTImpl, tiargs);
              id = new DotIdExp(ale.loc, id, hook);
              id = id.expressionSemantic(sc);
  
!             auto arguments = new Expressions();
!             arguments.push(ale.e1);
!             arguments.push(exp.e2);
  
              Expression ce = new CallExp(ale.loc, id, arguments).expressionSemantic(sc);
              auto res = new LoweredAssignExp(exp, ce);
-             // if (global.params.verbose)
-             //     message("lowered   %s =>\n          %s", exp.toChars(), res.toChars());
              res.type = Type.tsize_t;
              return setResult(res);
          }
          else if (auto se = exp.e1.isSliceExp())
--- 11680,11705 ----
                  return setResult(res);
              }
  
!             if (!sc.needsCodegen()) // Compile-time only case
              {
                  exp.type = Type.tsize_t;
                  return setResult(exp);
              }
  
!             // Ensure correct reference for _d_arraysetlengthT
              Expression id = new IdentifierExp(ale.loc, Id.empty);
              id = new DotIdExp(ale.loc, id, Id.object);
              id = new DotIdExp(ale.loc, id, hook);
              id = id.expressionSemantic(sc);
  
!             // Generate call: _d_arraysetlengthT(e1, e2)
!             auto arguments = new Expressions(ale.e1,  // array
!                                              exp.e2);  // new length
  
              Expression ce = new CallExp(ale.loc, id, arguments).expressionSemantic(sc);
              auto res = new LoweredAssignExp(exp, ce);
              res.type = Type.tsize_t;
+ 
              return setResult(res);
          }
          else if (auto se = exp.e1.isSliceExp())
*************** private extern (C++) final class Express
*** 11321,11327 ****
                  se = cast(SliceExp)se.e1;
              if (se.e1.op == EXP.question && se.e1.type.toBasetype().ty == Tsarray)
              {
!                 se.e1 = se.e1.modifiableLvalueImpl(sc, exp.e1);
                  if (se.e1.op == EXP.error)
                      return setResult(se.e1);
              }
--- 11728,11734 ----
                  se = cast(SliceExp)se.e1;
              if (se.e1.op == EXP.question && se.e1.type.toBasetype().ty == Tsarray)
              {
!                 se.e1 = se.e1.modifiableLvalue(sc, exp.e1);
                  if (se.e1.op == EXP.error)
                      return setResult(se.e1);
              }
*************** private extern (C++) final class Express
*** 11345,11351 ****
              // Try to do a decent error message with the expression
              // before it gets constant folded
              if (exp.op == EXP.assign)
!                 e1x = e1x.modifiableLvalueImpl(sc, e1old);
  
              e1x = e1x.optimize(WANTvalue, /*keepLvalue*/ true);
  
--- 11752,11758 ----
              // Try to do a decent error message with the expression
              // before it gets constant folded
              if (exp.op == EXP.assign)
!                 e1x = e1x.modifiableLvalue(sc, e1old);
  
              e1x = e1x.optimize(WANTvalue, /*keepLvalue*/ true);
  
*************** private extern (C++) final class Express
*** 11492,11498 ****
              t1.isStaticOrDynamicArray() &&
              t1.nextOf().toBasetype().ty == Tvoid)
          {
!             if (t2.nextOf().implicitConvTo(t1.nextOf()))
              {
                  if (sc.setUnsafe(false, exp.loc, "copying `%s` to `%s`", t2, t1))
                      return setError();
--- 11899,11912 ----
              t1.isStaticOrDynamicArray() &&
              t1.nextOf().toBasetype().ty == Tvoid)
          {
!             auto t2n = t2.nextOf();
!             if (!t2n)
!             {
!                 // filling not allowed
!                 error(exp.loc, "cannot copy `%s` to `%s`",
!                     t2.toChars(), t1.toChars());
!             }
!             else if (t2n.implicitConvTo(t1.nextOf()))
              {
                  if (sc.setUnsafe(false, exp.loc, "copying `%s` to `%s`", t2, t1))
                      return setError();
*************** private extern (C++) final class Express
*** 11570,11585 ****
          exp.type = exp.e1.type;
          assert(exp.type);
          auto assignElem = exp.e2;
!         auto res = exp.op == EXP.assign ? exp.reorderSettingAAElem(sc) : exp;
!         /* https://issues.dlang.org/show_bug.cgi?id=22366
!          *
!          * `reorderSettingAAElem` creates a tree of comma expressions, however,
!          * `checkAssignExp` expects only AssignExps.
!          */
!         if (res == exp) // no `AA[k] = v` rewrite was performed
!             checkAssignEscape(*sc, res, false, false);
!         else
!             checkNewEscape(*sc, assignElem, false); // assigning to AA puts it on heap
  
          if (auto ae = res.isConstructExp())
          {
--- 11984,11991 ----
          exp.type = exp.e1.type;
          assert(exp.type);
          auto assignElem = exp.e2;
!         Expression res = exp;
!         checkAssignEscape(*sc, res, false, false);
  
          if (auto ae = res.isConstructExp())
          {
*************** private extern (C++) final class Express
*** 11641,11648 ****
                  id = new DotIdExp(exp.loc, id, Id.object);
                  id = new DotIdExp(exp.loc, id, func);
  
!                 auto arguments = new Expressions();
!                 arguments.push(new CastExp(ae.loc, ae.e1, t1e.arrayOf).expressionSemantic(sc));
                  if (lowerToArrayCtor)
                  {
                      arguments.push(new CastExp(ae.loc, rhs, t2b.nextOf.arrayOf).expressionSemantic(sc));
--- 12047,12053 ----
                  id = new DotIdExp(exp.loc, id, Id.object);
                  id = new DotIdExp(exp.loc, id, func);
  
!                 auto arguments = new Expressions(new CastExp(ae.loc, ae.e1, t1e.arrayOf).expressionSemantic(sc));
                  if (lowerToArrayCtor)
                  {
                      arguments.push(new CastExp(ae.loc, rhs, t2b.nextOf.arrayOf).expressionSemantic(sc));
*************** private extern (C++) final class Express
*** 11723,11731 ****
          id = new DotIdExp(ae.loc, id, Id.object);
          id = new DotIdExp(ae.loc, id, func);
  
!         auto arguments = new Expressions();
!         arguments.push(new CastExp(ae.loc, ae.e1, ae.e1.type.nextOf.arrayOf)
!             .expressionSemantic(sc));
  
          Expression eValue2, value2 = ae.e2;
          if (isArrayAssign && value2.isLvalue())
--- 12128,12135 ----
          id = new DotIdExp(ae.loc, id, Id.object);
          id = new DotIdExp(ae.loc, id, func);
  
!         auto arguments = new Expressions(new CastExp(ae.loc, ae.e1, ae.e1.type.nextOf.arrayOf)
!                                          .expressionSemantic(sc));
  
          Expression eValue2, value2 = ae.e2;
          if (isArrayAssign && value2.isLvalue())
*************** private extern (C++) final class Express
*** 11754,11760 ****
          Expression ce = new CallExp(ae.loc, id, arguments);
          res = Expression.combine(eValue2, ce).expressionSemantic(sc);
          if (isArrayAssign)
!             res = Expression.combine(res, ae.e1).expressionSemantic(sc);
  
          if (global.params.v.verbose)
              message("lowered   %s =>\n          %s", ae.toChars(), res.toChars());
--- 12158,12164 ----
          Expression ce = new CallExp(ae.loc, id, arguments);
          res = Expression.combine(eValue2, ce).expressionSemantic(sc);
          if (isArrayAssign)
!             res = Expression.combine(res, ae.e1).expressionSemantic(sc).checkGC(sc);
  
          if (global.params.v.verbose)
              message("lowered   %s =>\n          %s", ae.toChars(), res.toChars());
*************** private extern (C++) final class Express
*** 11815,11821 ****
          if ((exp.e1.type.isIntegral() || exp.e1.type.isFloating()) && (exp.e2.type.isIntegral() || exp.e2.type.isFloating()))
          {
              Expression e0 = null;
!             Expression e = exp.reorderSettingAAElem(sc);
              e = Expression.extractLast(e, e0);
              assert(e == exp);
  
--- 12219,12225 ----
          if ((exp.e1.type.isIntegral() || exp.e1.type.isFloating()) && (exp.e2.type.isIntegral() || exp.e2.type.isFloating()))
          {
              Expression e0 = null;
!             Expression e = exp;
              e = Expression.extractLast(e, e0);
              assert(e == exp);
  
*************** private extern (C++) final class Express
*** 11962,11971 ****
  
          exp.type = exp.e1.type;
          auto assignElem = exp.e2;
!         auto res = exp.reorderSettingAAElem(sc);
!         if (res != exp) // `AA[k] = v` rewrite was performed
!             checkNewEscape(*sc, assignElem, false);
!         else if (exp.op == EXP.concatenateElemAssign || exp.op == EXP.concatenateDcharAssign)
              checkAssignEscape(*sc, res, false, false);
  
          result = res;
--- 12366,12373 ----
  
          exp.type = exp.e1.type;
          auto assignElem = exp.e2;
!         auto res = exp;
!         if (exp.op == EXP.concatenateElemAssign || exp.op == EXP.concatenateDcharAssign)
              checkAssignEscape(*sc, res, false, false);
  
          result = res;
*************** private extern (C++) final class Express
*** 12001,12009 ****
                  id = new DotIdExp(exp.loc, id, Id.object);
                  id = new DotIdExp(exp.loc, id, hook);
  
!                 auto arguments = new Expressions();
!                 arguments.push(exp.e1);
!                 arguments.push(exp.e2);
                  Expression ce = new CallExp(exp.loc, id, arguments);
  
                  exp.lowering = ce.expressionSemantic(sc);
--- 12403,12409 ----
                  id = new DotIdExp(exp.loc, id, Id.object);
                  id = new DotIdExp(exp.loc, id, hook);
  
!                 auto arguments = new Expressions(exp.e1, exp.e2);
                  Expression ce = new CallExp(exp.loc, id, arguments);
  
                  exp.lowering = ce.expressionSemantic(sc);
*************** private extern (C++) final class Express
*** 12035,12046 ****
                  id = new DotIdExp(exp.loc, id, Id.object);
                  id = new DotIdExp(exp.loc, id, hook);
  
-                 auto arguments = new Expressions();
                  Expression eValue1;
                  Expression value1 = extractSideEffect(sc, "__appendtmp", eValue1, exp.e1);
  
!                 arguments.push(value1);
!                 arguments.push(new IntegerExp(exp.loc, 1, Type.tsize_t));
  
                  Expression ce = new CallExp(exp.loc, id, arguments);
  
--- 12435,12444 ----
                  id = new DotIdExp(exp.loc, id, Id.object);
                  id = new DotIdExp(exp.loc, id, hook);
  
                  Expression eValue1;
                  Expression value1 = extractSideEffect(sc, "__appendtmp", eValue1, exp.e1);
  
!                 auto arguments = new Expressions(value1, new IntegerExp(exp.loc, 1, Type.tsize_t));
  
                  Expression ce = new CallExp(exp.loc, id, arguments);
  
*************** private extern (C++) final class Express
*** 12052,12065 ****
                       * for expressions like `a ~= a[$-1]`. Here, $ will be modified
                       * by calling `_d_arrayappendcTX`, so we need to save `a[$-1]` in
                       * a temporary variable.
                       */
!                     value2 = extractSideEffect(sc, "__appendtmp", eValue2, value2, true);
! 
!                     // `__appendtmp*` will be destroyed together with the array `exp.e1`.
!                     auto vd = eValue2.isDeclarationExp().declaration.isVarDeclaration();
!                     vd.storage_class |= STC.nodtor;
!                     // Be more explicit that this "declaration" is local to the expression
!                     vd.storage_class |= STC.exptemp;
                  }
  
                  auto ale = new ArrayLengthExp(exp.loc, value1);
--- 12450,12458 ----
                       * for expressions like `a ~= a[$-1]`. Here, $ will be modified
                       * by calling `_d_arrayappendcTX`, so we need to save `a[$-1]` in
                       * a temporary variable.
+                      * `__appendtmp*` will be destroyed together with the array `exp.e1`.
                       */
!                     value2 = extractSideEffect(sc, "__appendtmp", eValue2, value2, true, STC.nodtor | STC.exptemp);
                  }
  
                  auto ale = new ArrayLengthExp(exp.loc, value1);
*************** private extern (C++) final class Express
*** 12393,12403 ****
          Expression id = new IdentifierExp(exp.loc, Id.empty);
          id = new DotIdExp(exp.loc, id, Id.object);
  
!         auto tiargs = new Objects();
!         tiargs.push(exp.type);
          id = new DotTemplateInstanceExp(exp.loc, id, hook, tiargs);
          id = new CallExp(exp.loc, id, arguments);
!         return id.expressionSemantic(sc);
      }
  
      void trySetCatExpLowering(Expression exp)
--- 12786,12795 ----
          Expression id = new IdentifierExp(exp.loc, Id.empty);
          id = new DotIdExp(exp.loc, id, Id.object);
  
!         auto tiargs = new Objects(exp.type);
          id = new DotTemplateInstanceExp(exp.loc, id, hook, tiargs);
          id = new CallExp(exp.loc, id, arguments);
!         return id.expressionSemantic(sc).checkGC(sc);
      }
  
      void trySetCatExpLowering(Expression exp)
*************** private extern (C++) final class Express
*** 12795,12801 ****
              return;
          }
  
!         Module mmath = Module.loadStdMath();
          if (!mmath)
          {
              error(e.loc, "`%s` requires `std.math` for `^^` operators", e.toErrMsg());
--- 13187,13244 ----
              return;
          }
  
!         // Inline the expression, if possible.
!         PowExp pe = cast(PowExp)e;
!         if (pe.e1.type.isScalar() && pe.e2.isIntegerExp())
!         {
!             Expression one;
!             if (pe.e1.type.isIntegral()) {
!                 one = new IntegerExp(e.loc, 1, pe.e1.type);
!             } else {
!                 one = new RealExp(e.loc, CTFloat.one, pe.e1.type);
!             }
! 
!             const expo = cast(sinteger_t)pe.e2.toInteger();
!             // Replace e1 ^^ -1 with 1 / e1
!             if (expo == -1)
!             {
!                 Expression ex = new DivExp(exp.loc, one, pe.e1);
!                 ex = ex.expressionSemantic(sc);
!                 result = ex;
!                 return;
!             }
!             // Replace e1 ^^ 0 with (e1, 1)
!             else if (expo == 0)
!             {
!                 Expression ex = new CommaExp(exp.loc, pe.e1, one, exp);
!                 ex = ex.expressionSemantic(sc);
!                 result = ex;
!                 return;
!             }
!             // Replace e1 ^^ 1 with e1
!             else if (expo == 1)
!             {
!                 Expression ex = pe.e1;
!                 ex.loc = exp.loc;
!                 ex = ex.expressionSemantic(sc);
!                 result = ex;
!                 return;
!             }
!             // Replace e1 ^^ 2 with e1 * e1
!             else if (expo == 2)
!             {
!                 auto v = copyToTemp(STC.const_, "__powtmp", pe.e1);
!                 auto ve = new VarExp(exp.loc, v);
!                 auto de = new DeclarationExp(exp.e1.loc, v);
!                 auto me = new MulExp(exp.e2.loc, ve, ve);
!                 Expression ex = new CommaExp(exp.loc, de, me, exp);
!                 ex = ex.expressionSemantic(sc);
!                 result = ex;
!                 return;
!             }
!         }
! 
!         Module mmath = loadStdMath();
          if (!mmath)
          {
              error(e.loc, "`%s` requires `std.math` for `^^` operators", e.toErrMsg());
*************** private extern (C++) final class Express
*** 13122,13127 ****
--- 13565,13623 ----
          return;
      }
  
+     /**
+     * lowers an `InExp` to a call to `_d_aaIn!(V[K])`.
+     *
+     * Params:
+     *  ie = the `InExp` to lower
+     * Returns:
+     *  the lowered expression or an ErrorExp
+     */
+     private Expression lowerToAAIn(InExp ie)
+     {
+         Identifier hook = Id._d_aaIn;
+         if (!verifyHookExist(ie.loc, *sc, hook, "key in AA"))
+             return ErrorExp.get();
+ 
+         Expression id = new IdentifierExp(ie.loc, Id.empty);
+         id = new DotIdExp(ie.loc, id, Id.object);
+         auto tiargs = new Objects();
+         id = new DotIdExp(ie.loc, id, hook);
+ 
+         Expression e1;
+         Expression ekey = extractSideEffect(sc, "__aakey", e1, ie.e1);
+         auto arguments = new Expressions(ie.e2, ekey);
+         auto ce = new CallExp(ie.loc, id, arguments);
+         ce.loweredFrom = ie;
+         e1 = Expression.combine(e1, ce);
+         return e1.expressionSemantic(sc);
+     }
+ 
+     /**
+     * lowers a `RemoveExp` to a call to `_d_aaDel!(V[K])`.
+     *
+     * Params:
+     *  re = the `RemoveExp` to lower
+     * Returns:
+     *  the lowered expression or an ErrorExp
+     */
+     private Expression lowerToAADel(RemoveExp re)
+     {
+         Identifier hook = Id._d_aaDel;
+         if (!verifyHookExist(re.loc, *sc, hook, "remove key in AA"))
+             return ErrorExp.get();
+ 
+         Expression id = new IdentifierExp(re.loc, Id.empty);
+         id = new DotIdExp(re.loc, id, Id.object);
+         auto tiargs = new Objects();
+         id = new DotIdExp(re.loc, id, hook);
+ 
+         auto arguments = new Expressions(re.e1, re.e2);
+         auto ce = new CallExp(re.loc, id, arguments);
+         ce.loweredFrom = re;
+         return ce.expressionSemantic(sc);
+     }
+ 
      override void visit(InExp exp)
      {
          if (Expression e = exp.opOverloadBinary(sc, aliasThisStop))
*************** private extern (C++) final class Express
*** 13144,13157 ****
                      exp.e1 = exp.e1.implicitCastTo(sc, ta.index);
                  }
  
                  // even though the glue layer only needs the type info of the index,
                  // this might be the first time an AA literal is accessed, so check
                  // the full type info
                  semanticTypeInfo(sc, ta);
! 
!                 // Return type is pointer to value
!                 exp.type = ta.nextOf().pointerTo();
!                 break;
              }
  
          case Terror:
--- 13640,13658 ----
                      exp.e1 = exp.e1.implicitCastTo(sc, ta.index);
                  }
  
+                 // for backward compatibility, type accepted during semantic, but errors in glue layer
+                 if (exp.e2.isTypeExp())
+                 {
+                     exp.type = ta.nextOf().pointerTo();
+                     break;
+                 }
+                 result = lowerToAAIn(exp);
+ 
                  // even though the glue layer only needs the type info of the index,
                  // this might be the first time an AA literal is accessed, so check
                  // the full type info
                  semanticTypeInfo(sc, ta);
!                 return;
              }
  
          case Terror:
*************** private extern (C++) final class Express
*** 13179,13185 ****
              result = ex;
              return;
          }
!         result = e;
      }
  
      override void visit(EqualExp exp)
--- 13680,13718 ----
              result = ex;
              return;
          }
! 
!         result = lowerToAADel(e);
!     }
! 
!     /**
!     * lower a `EqualExp` to a call to `_d_aaEqual!(aa1, aa2)`.
!     *
!     * Params:
!     *  ee = the `EqualExp` to lower
!     * Returns:
!     *  the lowered expression or an ErrorExp
!     */
!     private Expression lowerToAAEqual(EqualExp ee)
!     {
!         Identifier hook = Id._d_aaEqual;
!         if (!verifyHookExist(ee.loc, *sc, hook, "compare AAs"))
!             return ErrorExp.get();
! 
!         Expression id = new IdentifierExp(ee.loc, Id.empty);
!         id = new DotIdExp(ee.loc, id, Id.object);
!         auto tiargs = new Objects();
!         id = new DotIdExp(ee.loc, id, hook);
! 
!         auto arguments = new Expressions(ee.e1, ee.e2);
!         auto ce = new CallExp(ee.loc, id, arguments);
!         if (ee.op == EXP.notEqual)
!         {
!             auto ne = new NotExp(ee.loc, ce);
!             ne.loweredFrom = ee;
!             return ne.expressionSemantic(sc);
!         }
!         ce.loweredFrom = ee;
!         return ce.expressionSemantic(sc);
      }
  
      override void visit(EqualExp exp)
*************** private extern (C++) final class Express
*** 13262,13280 ****
          Type t1 = exp.e1.type.toBasetype();
          Type t2 = exp.e2.type.toBasetype();
  
!         // Indicates whether the comparison of the 2 specified array types
!         // requires an object.__equals() lowering.
!         static bool needsDirectEq(Type t1, Type t2, Scope* sc)
          {
              Type t1n = t1.nextOf().toBasetype();
              Type t2n = t2.nextOf().toBasetype();
              if ((t1n.ty.isSomeChar && t2n.ty.isSomeChar) ||
                  (t1n.ty == Tvoid || t2n.ty == Tvoid))
              {
!                 return false;
              }
              if (t1n.constOf() != t2n.constOf())
                  return true;
  
              Type t = t1n;
              while (t.toBasetype().nextOf())
--- 13795,13847 ----
          Type t1 = exp.e1.type.toBasetype();
          Type t2 = exp.e2.type.toBasetype();
  
!         static bool unifyArrayTypes(Type t1, Type t2, Scope* sc)
          {
              Type t1n = t1.nextOf().toBasetype();
              Type t2n = t2.nextOf().toBasetype();
+ 
              if ((t1n.ty.isSomeChar && t2n.ty.isSomeChar) ||
                  (t1n.ty == Tvoid || t2n.ty == Tvoid))
              {
!                 return true;
              }
              if (t1n.constOf() != t2n.constOf())
+             {
+                 return false;
+             }
+ 
+             Type t = t1n;
+             while (t.toBasetype().nextOf())
+                 t = t.nextOf().toBasetype();
+             if (auto ts = t.isTypeStruct())
+             {
+                 // semanticTypeInfo() makes sure hasIdentityEquals has been computed
+                 if (global.params.useTypeInfo && Type.dtypeinfo)
+                     semanticTypeInfo(sc, ts);
+ 
+                 return !ts.sym.hasIdentityEquals; // has custom opEquals
+             }
+ 
+             return true;
+         }
+ 
+         static bool shouldUseMemcmp(Type t1, Type t2, Scope *sc)
+         {
+             Type t1n = t1.nextOf().toBasetype();
+             Type t2n = t2.nextOf().toBasetype();
+             const t1nsz = t1n.size();
+             const t2nsz = t2n.size();
+ 
+             if ((t1n.ty == Tvoid || (t1n.isScalar() && !t1n.isFloating())) &&
+                 (t2n.ty == Tvoid || (t2n.isScalar() && !t1n.isFloating())) &&
+                 t1nsz == t2nsz && t1n.isUnsigned() == t2n.isUnsigned())
+             {
                  return true;
+             }
+             if (t1n.constOf() != t2n.constOf())
+             {
+                 return false;
+             }
  
              Type t = t1n;
              while (t.toBasetype().nextOf())
*************** private extern (C++) final class Express
*** 13285,13291 ****
                  if (global.params.useTypeInfo && Type.dtypeinfo)
                      semanticTypeInfo(sc, ts);
  
!                 return ts.sym.hasIdentityEquals; // has custom opEquals
              }
  
              return false;
--- 13852,13860 ----
                  if (global.params.useTypeInfo && Type.dtypeinfo)
                      semanticTypeInfo(sc, ts);
  
!                 auto v = new IsMemcmpableVisitor();
!                 ts.accept(v);
!                 return v.result;
              }
  
              return false;
*************** private extern (C++) final class Express
*** 13298,13306 ****
          }
  
          const isArrayComparison = t1.isStaticOrDynamicArray() && t2.isStaticOrDynamicArray();
-         const needsArrayLowering = isArrayComparison && needsDirectEq(t1, t2, sc);
  
!         if (!needsArrayLowering)
          {
              // https://issues.dlang.org/show_bug.cgi?id=23783
              if (exp.e1.checkSharedAccess(sc) || exp.e2.checkSharedAccess(sc))
--- 13867,13874 ----
          }
  
          const isArrayComparison = t1.isStaticOrDynamicArray() && t2.isStaticOrDynamicArray();
  
!         if (!isArrayComparison || unifyArrayTypes(t1, t2, sc))
          {
              // https://issues.dlang.org/show_bug.cgi?id=23783
              if (exp.e1.checkSharedAccess(sc) || exp.e2.checkSharedAccess(sc))
*************** private extern (C++) final class Express
*** 13330,13336 ****
          }
  
          // lower some array comparisons to object.__equals(e1, e2)
!         if (needsArrayLowering || (t1.ty == Tarray && t2.ty == Tarray))
          {
              //printf("Lowering to __equals %s %s\n", exp.e1.toChars(), exp.e2.toChars());
  
--- 13898,13904 ----
          }
  
          // lower some array comparisons to object.__equals(e1, e2)
!         if (isArrayComparison && !shouldUseMemcmp(t1, t2, sc))
          {
              //printf("Lowering to __equals %s %s\n", exp.e1.toChars(), exp.e2.toChars());
  
*************** private extern (C++) final class Express
*** 13345,13357 ****
                  return;
              }
  
!             if (!verifyHookExist(exp.loc, *sc, Id.__equals, "equal checks on arrays"))
                  return setError();
  
!             Expression __equals = new IdentifierExp(exp.loc, Id.empty);
!             Identifier id = Identifier.idPool("__equals");
!             __equals = new DotIdExp(exp.loc, __equals, Id.object);
!             __equals = new DotIdExp(exp.loc, __equals, id);
  
              /* https://issues.dlang.org/show_bug.cgi?id=23674
               *
--- 13913,13925 ----
                  return;
              }
  
!             Identifier hook = Id.__equals;
!             if (!verifyHookExist(exp.loc, *sc, hook, "equal checks on arrays"))
                  return setError();
  
!             Expression lowering = new IdentifierExp(exp.loc, Id.empty);
!             lowering = new DotIdExp(exp.loc, lowering, Id.object);
!             lowering = new DotIdExp(exp.loc, lowering, hook);
  
              /* https://issues.dlang.org/show_bug.cgi?id=23674
               *
*************** private extern (C++) final class Express
*** 13362,13391 ****
              exp.e1 = exp.e1.optimize(WANTvalue);
              exp.e2 = exp.e2.optimize(WANTvalue);
  
              auto arguments = new Expressions(2);
!             (*arguments)[0] = exp.e1;
!             (*arguments)[1] = exp.e2;
  
!             __equals = new CallExp(exp.loc, __equals, arguments);
              if (exp.op == EXP.notEqual)
              {
!                 __equals = new NotExp(exp.loc, __equals);
              }
!             __equals = __equals.trySemantic(sc); // for better error message
!             if (!__equals)
              {
!                 error(exp.loc, "incompatible types for array comparison: `%s` and `%s`",
!                           exp.e1.type.toChars(), exp.e2.type.toChars());
!                 __equals = ErrorExp.get();
              }
! 
!             result = __equals;
              return;
          }
  
          if (exp.e1.type.toBasetype().ty == Taarray)
          {
              semanticTypeInfo(sc, exp.e1.type.toBasetype());
          }
  
          if (!target.isVectorOpSupported(t1, exp.op, t2))
--- 13930,14005 ----
              exp.e1 = exp.e1.optimize(WANTvalue);
              exp.e2 = exp.e2.optimize(WANTvalue);
  
+             auto e1c = exp.e1.copy();
+             auto e2c = exp.e2.copy();
+ 
+             /* Remove qualifiers from the types of the arguments to reduce the number
+              * of generated `__equals` instances.
+              */
+             static void unqualifyExp(Expression e)
+             {
+                 e.type = e.type.unqualify(MODFlags.wild | MODFlags.immutable_ | MODFlags.shared_);
+                 auto eNext = e.type.nextOf();
+                 if (eNext && !eNext.toBasetype().isTypeStruct())
+                     e.type = e.type.unqualify(MODFlags.const_);
+ 
+                 if (!e.isArrayLiteralExp())
+                     return;
+ 
+                 if (auto elems = e.isArrayLiteralExp().elements)
+                     foreach(elem; *elems)
+                         if (elem)
+                             unqualifyExp(elem);
+             }
+             unqualifyExp(e1c);
+             unqualifyExp(e2c);
+ 
              auto arguments = new Expressions(2);
!             (*arguments)[0] = e1c;
!             (*arguments)[1] = e2c;
  
!             lowering = new CallExp(exp.loc, lowering, arguments);
              if (exp.op == EXP.notEqual)
              {
!                 lowering = new NotExp(exp.loc, lowering);
              }
!             lowering = lowering.trySemantic(sc); // for better error message
!             if (!lowering)
              {
!                 if (sc.func)
!                     error(exp.loc, "can't infer return type in function `%s`", sc.func.toChars());
!                 else
!                     error(exp.loc, "incompatible types for array comparison: `%s` and `%s`",
!                   exp.e1.type.toChars(), exp.e2.type.toChars());
!                 lowering = ErrorExp.get();
              }
!             exp.lowering = lowering;
!             result = exp;
              return;
          }
  
+         // When array comparison is not lowered to `__equals`, `memcmp` is used, but
+         // GC checks occur before the expression is lowered to `memcmp` in e2ir.d.
+         // Thus, we will consider the literal arrays as on-stack arrays to avoid issues
+         // during GC checks.
+         if (isArrayComparison)
+         {
+             if (auto ale1 = exp.e1.isArrayLiteralExp())
+             {
+                 ale1.onstack = true;
+             }
+ 
+             if (auto ale2 = exp.e2.isArrayLiteralExp())
+             {
+                 ale2.onstack = true;
+             }
+         }
+ 
          if (exp.e1.type.toBasetype().ty == Taarray)
          {
+             result = lowerToAAEqual(exp);
              semanticTypeInfo(sc, exp.e1.type.toBasetype());
+             return;
          }
  
          if (!target.isVectorOpSupported(t1, exp.op, t2))
*************** private bool expressionSemanticDone(Expr
*** 13874,13879 ****
--- 14488,14495 ----
          || e.isTypeExp() // stores its type in the Expression.type field
          || e.isCompoundLiteralExp() // stores its `(type) {}` in type field, gets rewritten to struct literal
          || e.isVarExp() // type sometimes gets set already before semantic
+         || (e.isAssocArrayLiteralExp() && // semanticTypeInfo not run during initialization
+             (!e.type.vtinfo || !e.isAssocArrayLiteralExp().lowering))
      );
  }
  
*************** Expression dotIdSemanticProp(DotIdExp ex
*** 14359,14378 ****
          Expression e = new IntegerExp(exp.loc, actualAlignment, Type.tsize_t);
          return e;
      }
!     else if ((exp.ident == Id.max || exp.ident == Id.min) &&
!              exp.e1.isVarExp() &&
!              exp.e1.isVarExp().var.isBitFieldDeclaration())
!     {
!         // For `x.max` and `x.min` get the max/min of the bitfield, not the max/min of its type
!         auto bf = exp.e1.isVarExp().var.isBitFieldDeclaration();
!         return new IntegerExp(exp.loc, bf.getMinMax(exp.ident), bf.type);
!     }
!     else if ((exp.ident == Id.max || exp.ident == Id.min) &&
!              exp.e1.isDotVarExp() &&
!              exp.e1.isDotVarExp().var.isBitFieldDeclaration())
      {
          // For `x.max` and `x.min` get the max/min of the bitfield, not the max/min of its type
!         auto bf = exp.e1.isDotVarExp().var.isBitFieldDeclaration();
          return new IntegerExp(exp.loc, bf.getMinMax(exp.ident), bf.type);
      }
      else
--- 14975,14984 ----
          Expression e = new IntegerExp(exp.loc, actualAlignment, Type.tsize_t);
          return e;
      }
!     else if ((exp.ident == Id.max || exp.ident == Id.min) && exp.e1.isBitField())
      {
          // For `x.max` and `x.min` get the max/min of the bitfield, not the max/min of its type
!         auto bf = exp.e1.isBitField();
          return new IntegerExp(exp.loc, bf.getMinMax(exp.ident), bf.type);
      }
      else
*************** Expression resolveLoc(Expression exp, Lo
*** 15295,15300 ****
--- 15901,15909 ----
                  element = element.resolveLoc(loc, sc);
          }
  
+         if (exp.lowering)
+             exp.lowering.resolveLoc(loc, sc);
+ 
          return exp;
      }
  
*************** Expression addDtorHook(Expression e, Sco
*** 15489,15513 ****
  /*******************************
   * Try to convert an expression to be an lvalue.
   *
!  * Give error if we're not an lvalue.
   * Params:
   *     _this = expression to convert
   *     sc = scope
   *     action = for error messages, what the lvalue is needed for (e.g. take address of for `&x`, modify for `x++`)
   * Returns: converted expression, or `ErrorExp` on error
  */
! Expression toLvalue(Expression _this, Scope* sc, const(char)* action)
! {
!     return toLvalueImpl(_this, sc, action, _this);
! }
! 
! // e = original un-lowered expression for error messages, in case of recursive calls
! private Expression toLvalueImpl(Expression _this, Scope* sc, const(char)* action, Expression e)
  {
      if (!action)
          action = "create lvalue of";
  
!     assert(e);
      Expression visit(Expression _this)
      {
          // BinaryAssignExp does not have an EXP associated
--- 16098,16120 ----
  /*******************************
   * Try to convert an expression to be an lvalue.
   *
!  * Give error if we are not an lvalue.
   * Params:
   *     _this = expression to convert
   *     sc = scope
   *     action = for error messages, what the lvalue is needed for (e.g. take address of for `&x`, modify for `x++`)
+  *     eorig = original un-lowered expression for error messages, in case of recursive calls; null means use `_this`
   * Returns: converted expression, or `ErrorExp` on error
  */
! Expression toLvalue(Expression _this, Scope* sc, const(char)* action, Expression eorig = null)
  {
+     //printf("toLvalue() %s\n", _this.toChars());
+     if (!eorig)
+         eorig = _this;
      if (!action)
          action = "create lvalue of";
  
!     assert(eorig);
      Expression visit(Expression _this)
      {
          // BinaryAssignExp does not have an EXP associated
*************** private Expression toLvalueImpl(Expressi
*** 15516,15529 ****
          if (_this.isBinAssignExp())
              return _this;
          if (!_this.loc.isValid())
!             _this.loc = e.loc;
  
!         if (e.op == EXP.type)
!             error(_this.loc, "cannot %s type `%s`", action, e.type.toChars());
!         else if (e.op == EXP.template_)
!             error(_this.loc, "cannot %s template `%s`, perhaps instantiate it first", action, e.toErrMsg());
          else
!             error(_this.loc, "cannot %s expression `%s` because it is not an lvalue", action, e.toErrMsg());
  
          return ErrorExp.get();
      }
--- 16123,16136 ----
          if (_this.isBinAssignExp())
              return _this;
          if (!_this.loc.isValid())
!             _this.loc = eorig.loc;
  
!         if (eorig.op == EXP.type)
!             error(_this.loc, "cannot %s type `%s`", action, eorig.type.toChars());
!         else if (eorig.op == EXP.template_)
!             error(_this.loc, "cannot %s template `%s`, perhaps instantiate it first", action, eorig.toErrMsg());
          else
!             error(_this.loc, "cannot %s expression `%s` because it is not an lvalue", action, eorig.toErrMsg());
  
          return ErrorExp.get();
      }
*************** private Expression toLvalueImpl(Expressi
*** 15531,15538 ****
      Expression visitInteger(IntegerExp _this)
      {
          if (!_this.loc.isValid())
!             _this.loc = e.loc;
!         error(e.loc, "cannot %s constant `%s`", action, e.toErrMsg());
          return ErrorExp.get();
      }
  
--- 16138,16145 ----
      Expression visitInteger(IntegerExp _this)
      {
          if (!_this.loc.isValid())
!             _this.loc = eorig.loc;
!         error(eorig.loc, "cannot %s constant `%s`", action, eorig.toErrMsg());
          return ErrorExp.get();
      }
  
*************** private Expression toLvalueImpl(Expressi
*** 15601,15614 ****
      {
          auto e1 = _this.e1;
          auto var = _this.var;
!         //printf("DotVarExp::toLvalue(%s)\n", toChars());
          if (sc && sc.inCfile)
          {
              /* C11 6.5.2.3-3: A postfix expression followed by the '.' or '->' operator
               * is an lvalue if the first expression is an lvalue.
               */
!             if (!e1.isLvalue())
!                 return visit(_this);
          }
          if (!_this.isLvalue())
              return visit(_this);
--- 16208,16222 ----
      {
          auto e1 = _this.e1;
          auto var = _this.var;
!         //printf("DotVarExp::toLvalue(%s)\n", _this.toChars());
          if (sc && sc.inCfile)
          {
              /* C11 6.5.2.3-3: A postfix expression followed by the '.' or '->' operator
               * is an lvalue if the first expression is an lvalue.
               */
!             e1 = e1.toLvalue(sc, action, eorig);
!             if (e1.isErrorExp())
!                 return e1;
          }
          if (!_this.isLvalue())
              return visit(_this);
*************** private Expression toLvalueImpl(Expressi
*** 15669,15675 ****
  
      Expression visitVectorArray(VectorArrayExp _this)
      {
!         _this.e1 = _this.e1.toLvalueImpl(sc, action, e);
          return _this;
      }
  
--- 16277,16283 ----
  
      Expression visitVectorArray(VectorArrayExp _this)
      {
!         _this.e1 = _this.e1.toLvalue(sc, action, eorig);
          return _this;
      }
  
*************** private Expression toLvalueImpl(Expressi
*** 15694,15706 ****
  
      Expression visitDelegatePointer(DelegatePtrExp _this)
      {
!         _this.e1 = _this.e1.toLvalueImpl(sc, action, e);
          return _this;
      }
  
      Expression visitDelegateFuncptr(DelegateFuncptrExp _this)
      {
!         _this.e1 = _this.e1.toLvalueImpl(sc, action, e);
          return _this;
      }
  
--- 16302,16314 ----
  
      Expression visitDelegatePointer(DelegatePtrExp _this)
      {
!         _this.e1 = _this.e1.toLvalue(sc, action, eorig);
          return _this;
      }
  
      Expression visitDelegateFuncptr(DelegateFuncptrExp _this)
      {
!         _this.e1 = _this.e1.toLvalue(sc, action, eorig);
          return _this;
      }
  
*************** private Expression toLvalueImpl(Expressi
*** 15727,15738 ****
  
      Expression visitCond(CondExp _this)
      {
          // convert (econd ? e1 : e2) to *(econd ? &e1 : &e2)
!         CondExp e = cast(CondExp)(_this.copy());
!         e.e1 = _this.e1.toLvalue(sc, action).addressOf();
!         e.e2 = _this.e2.toLvalue(sc, action).addressOf();
!         e.type = _this.type.pointerTo();
!         return new PtrExp(_this.loc, e, _this.type);
  
      }
  
--- 16335,16353 ----
  
      Expression visitCond(CondExp _this)
      {
+         if (sc && sc.inCfile)
+         {
+             // C11 6.5.15: A conditional expression does not yield an lvalue.
+             return visit(_this);
+         }
          // convert (econd ? e1 : e2) to *(econd ? &e1 : &e2)
!         CondExp ecopy = cast(CondExp)(_this.copy());
!         ecopy.e1 = _this.e1.toLvalue(sc, action).addressOf();
!         checkAddressable(ecopy.e1, sc, "take address of");
!         ecopy.e2 = _this.e2.toLvalue(sc, action).addressOf();
!         checkAddressable(ecopy.e2, sc, "take address of");
!         ecopy.type = _this.type.pointerTo();
!         return new PtrExp(_this.loc, ecopy, _this.type);
  
      }
  
*************** private Expression toLvalueImpl(Expressi
*** 15771,15781 ****
  }
  
  /***************************************
!  * Parameters:
!  *      sc:     scope
!  *      flag:   1: do not issue error message for invalid modification
!                 2: the exp is a DotVarExp and a subfield of the leftmost
!                    variable is modified
   * Returns:
   *      Whether the type is modifiable
   */
--- 16386,16397 ----
  }
  
  /***************************************
!  * Params:
!  *      exp  = expression to check if modifiable
!  *      sc   = scope
!  *      flag = noError - do not issue error message for invalid modification
!                fieldAssign - exp is a DotVarExp and a subfield of the leftmost
!                variable is modified
   * Returns:
   *      Whether the type is modifiable
   */
*************** Modifiable checkModifiable(Expression ex
*** 15923,15939 ****
   * Params:
   *     _this = Expression to convert
   *     sc = scope
   * Returns: `_this` converted to an lvalue, or an `ErrorExp`
   */
! Expression modifiableLvalue(Expression _this, Scope* sc)
  {
!     return modifiableLvalueImpl(_this, sc, _this);
! }
  
- // e = original / un-lowered expression to print in error messages
- private Expression modifiableLvalueImpl(Expression _this, Scope* sc, Expression e)
- {
-     assert(e);
      Expression visit(Expression exp)
      {
          //printf("Expression::modifiableLvalue() %s, type = %s\n", exp.toChars(), exp.type.toChars());
--- 16539,16552 ----
   * Params:
   *     _this = Expression to convert
   *     sc = scope
+  *     eorig = original / un-lowered expression to print in error messages, if null default to `_this`
   * Returns: `_this` converted to an lvalue, or an `ErrorExp`
   */
! Expression modifiableLvalue(Expression _this, Scope* sc, Expression eorig = null)
  {
!     if (!eorig)
!         eorig = _this;
  
      Expression visit(Expression exp)
      {
          //printf("Expression::modifiableLvalue() %s, type = %s\n", exp.toChars(), exp.type.toChars());
*************** private Expression modifiableLvalueImpl(
*** 15972,15978 ****
                  return ErrorExp.get();
              }
          }
!         return exp.toLvalueImpl(sc, "modify", e);
      }
  
      Expression visitString(StringExp exp)
--- 16585,16591 ----
                  return ErrorExp.get();
              }
          }
!         return exp.toLvalue(sc, "modify", eorig);
      }
  
      Expression visitString(StringExp exp)
*************** private Expression modifiableLvalueImpl(
*** 16021,16027 ****
  
      Expression visitComma(CommaExp exp)
      {
!         exp.e2 = exp.e2.modifiableLvalueImpl(sc, e);
          return exp;
      }
  
--- 16634,16640 ----
  
      Expression visitComma(CommaExp exp)
      {
!         exp.e2 = exp.e2.modifiableLvalue(sc, eorig);
          return exp;
      }
  
*************** private Expression modifiableLvalueImpl(
*** 16043,16058 ****
          return visit(exp);
      }
  
-     Expression visitIndex(IndexExp exp)
-     {
-         //printf("IndexExp::modifiableLvalue(%s)\n", exp.toChars());
-         Expression ex = exp.markSettingAAElem();
-         if (ex.op == EXP.error)
-             return ex;
- 
-         return visit(exp);
-     }
- 
      Expression visitCond(CondExp exp)
      {
          if (!exp.e1.isLvalue() && !exp.e2.isLvalue())
--- 16656,16661 ----
*************** private Expression modifiableLvalueImpl(
*** 16075,16081 ****
          case EXP.comma:                   return visitComma(_this.isCommaExp());
          case EXP.delegatePointer:         return visitDelegatePtr(_this.isDelegatePtrExp());
          case EXP.delegateFunctionPointer: return visitDelegateFuncptr(_this.isDelegateFuncptrExp());
-         case EXP.index:                   return visitIndex(_this.isIndexExp());
          case EXP.question:                return visitCond(_this.isCondExp());
      }
  }
--- 16678,16683 ----
*************** private bool checkAddressVar(Scope* sc,
*** 16103,16111 ****
      }
      if (sc.func && !sc.intypeof && !v.isDataseg())
      {
          if (sc.useDIP1000 != FeatureState.enabled &&
              !(v.storage_class & STC.temp) &&
!             sc.setUnsafe(false, exp.loc, "taking the address of stack-allocated local variable `%s`", v))
          {
              return false;
          }
--- 16705,16716 ----
      }
      if (sc.func && !sc.intypeof && !v.isDataseg())
      {
+         auto msg = (v.storage_class & STC.ref_) ?
+             "taking the address of local variable `%s`" :
+             "taking the address of stack-allocated local variable `%s`";
          if (sc.useDIP1000 != FeatureState.enabled &&
              !(v.storage_class & STC.temp) &&
!             sc.setUnsafe(false, exp.loc, msg.ptr, v))
          {
              return false;
          }
*************** private bool checkAddressVar(Scope* sc,
*** 16119,16129 ****
   * Params:
   *      e = expression to check
   *      sc = context
   * Returns:
   *      true if the expression is addressable
   */
! bool checkAddressable(Expression e, Scope* sc)
  {
      Expression ex = e;
      while (true)
      {
--- 16724,16736 ----
   * Params:
   *      e = expression to check
   *      sc = context
+  *      action = for error messages, what the address is needed for (e.g. ref return, indexing an array)
   * Returns:
   *      true if the expression is addressable
   */
! bool checkAddressable(Expression e, Scope* sc, const(char)* action)
  {
+     //printf("checkAddressable() %s\n", e.toChars());
      Expression ex = e;
      while (true)
      {
*************** bool checkAddressable(Expression e, Scop
*** 16131,16141 ****
          {
              case EXP.dotVariable:
                  // https://issues.dlang.org/show_bug.cgi?id=22749
!                 // Error about taking address of any bit-field, regardless of
                  // whether SCOPE.Cfile is set.
                  if (auto bf = ex.isDotVarExp().var.isBitFieldDeclaration())
                  {
!                     error(e.loc, "cannot take address of bit-field `%s`", bf.toChars());
                      return false;
                  }
                  goto case EXP.cast_;
--- 16738,16748 ----
          {
              case EXP.dotVariable:
                  // https://issues.dlang.org/show_bug.cgi?id=22749
!                 // Error about taking address of any bitfield, regardless of
                  // whether SCOPE.Cfile is set.
                  if (auto bf = ex.isDotVarExp().var.isBitFieldDeclaration())
                  {
!                     sc.eSink.error(e.loc, "cannot %s bitfield `%s`", action, ex.toErrMsg());
                      return false;
                  }
                  goto case EXP.cast_;
*************** bool checkAddressable(Expression e, Scop
*** 16151,16157 ****
                  continue;
  
              case EXP.variable:
!                 if (sc.inCfile)
                  {
                      // C11 6.5.3.2: A variable that has its address taken cannot be
                      // stored in a register.
--- 16758,16764 ----
                  continue;
  
              case EXP.variable:
!                 if (sc && sc.inCfile)
                  {
                      // C11 6.5.3.2: A variable that has its address taken cannot be
                      // stored in a register.
*************** bool checkAddressable(Expression e, Scop
*** 16159,16168 ****
                      // or cast to an lvalue pointer cannot be stored in a register.
                      if (ex.isVarExp().var.storage_class & STC.register)
                      {
!                         if (e.isIndexExp())
!                             error(e.loc, "cannot index through register variable `%s`", ex.toErrMsg());
!                         else
!                             error(e.loc, "cannot take address of register variable `%s`", ex.toErrMsg());
                          return false;
                      }
                  }
--- 16766,16772 ----
                      // or cast to an lvalue pointer cannot be stored in a register.
                      if (ex.isVarExp().var.storage_class & STC.register)
                      {
!                         sc.eSink.error(e.loc, "cannot %s register variable `%s`", action, ex.toErrMsg());
                          return false;
                      }
                  }
*************** Expression getThisSkipNestedFuncs(Loc lo
*** 16223,16229 ****
          {
              n++;
              e1 = new VarExp(loc, f.vthis);
!             if (f.hasDualContext())
              {
                  // (*__this)[i]
                  if (n > 1)
--- 16827,16833 ----
          {
              n++;
              e1 = new VarExp(loc, f.vthis);
!             if (f.hasDualContext)
              {
                  // (*__this)[i]
                  if (n > 1)
*************** private bool fit(StructDeclaration sd, L
*** 16330,16336 ****
          return true;
  
      const nfields = sd.nonHiddenFields();
!     size_t offset = 0;
      for (size_t i = 0; i < elements.length; i++)
      {
          Expression e = (*elements)[i];
--- 16934,16940 ----
          return true;
  
      const nfields = sd.nonHiddenFields();
!     ulong bitoffset = 0;
      for (size_t i = 0; i < elements.length; i++)
      {
          Expression e = (*elements)[i];
*************** private bool fit(StructDeclaration sd, L
*** 16349,16355 ****
              return false;
          }
          VarDeclaration v = sd.fields[i];
!         if (v.offset < offset)
          {
              .error(loc, "overlapping initialization for `%s`", v.toChars());
              if (!sd.isUnionDeclaration())
--- 16953,16965 ----
              return false;
          }
          VarDeclaration v = sd.fields[i];
!         // Overlap is checked by comparing bit offsets
!         ulong vbitoffset = v.offset * 8;
!         auto vbf = v.isBitFieldDeclaration();
!         if (vbf)
!             vbitoffset += vbf.bitOffset;
! 
!         if (vbitoffset < bitoffset)
          {
              .error(loc, "overlapping initialization for `%s`", v.toChars());
              if (!sd.isUnionDeclaration())
*************** private bool fit(StructDeclaration sd, L
*** 16364,16370 ****
          const vsize = v.type.size();
          if (vsize == SIZE_INVALID)
              return false;
!         offset = cast(uint)(v.offset + vsize);
  
          Type t = v.type;
          if (stype)
--- 16974,16984 ----
          const vsize = v.type.size();
          if (vsize == SIZE_INVALID)
              return false;
!         // Bitsize of types are overridden by any bitfield widths.
!         if (vbf)
!             bitoffset = vbitoffset + vbf.fieldWidth;
!         else
!             bitoffset = vbitoffset + vsize * 8;
  
          Type t = v.type;
          if (stype)
*************** Expression toBoolean(Expression exp, Sco
*** 16563,16570 ****
--- 17177,17188 ----
              if (!t.isBoolean())
              {
                  if (tb != Type.terror)
+                 {
                      error(exp.loc, "expression `%s` of type `%s` does not have a boolean value",
                                exp.toChars(), t.toChars());
+                     if (auto ts = tb.isTypeStruct())
+                         errorSupplemental(ts.sym.loc, "perhaps add Cast Operator Overloading with `bool opCast(T : bool)() => ...`");
+                 }
                  return ErrorExp.get();
              }
              return e;
*************** enum ModifyFlags
*** 16728,16738 ****
  }
  
  /*************************************
!  * Check to see if declaration can be modified in this context (sc).
   * Issue error if not.
   * Params:
   *  loc  = location for error messages
!  *  e1   = `null` or `this` expression when this declaration is a field
   *  sc   = context
   *  flag = if the first bit is set it means do not issue error message for
   *         invalid modification; if the second bit is set, it means that
--- 17346,17357 ----
  }
  
  /*************************************
!  * Check to see if `d` can be modified in this context `sc`.
   * Issue error if not.
   * Params:
+  *  d    = declaration to check
   *  loc  = location for error messages
!  *  e1   = `null` or `this` expression when `d` is a field
   *  sc   = context
   *  flag = if the first bit is set it means do not issue error message for
   *         invalid modification; if the second bit is set, it means that
*************** enum ModifyFlags
*** 16742,16747 ****
--- 17361,17367 ----
   */
  private Modifiable checkModify(Declaration d, Loc loc, Scope* sc, Expression e1, ModifyFlags flag)
  {
+     //printf("checkModify() d: %s, e1: %s\n", d.toChars(), e1.toChars());
      VarDeclaration v = d.isVarDeclaration();
      if (v && v.canassign)
          return Modifiable.initialization;
*************** private Modifiable checkModify(Declarati
*** 16787,16801 ****
  }
  
  /***********************************************
!  * Mark variable v as modified if it is inside a constructor that var
   * is a field in.
   * Also used to allow immutable globals to be initialized inside a static constructor.
   * Returns:
!  *    true if it's an initialization of v
   */
  private bool modifyFieldVar(Loc loc, Scope* sc, VarDeclaration var, Expression e1)
  {
!     //printf("modifyFieldVar(var = %s)\n", var.toChars());
      Dsymbol s = sc.func;
      while (1)
      {
--- 17407,17425 ----
  }
  
  /***********************************************
!  * Mark variable `var` as modified if it is inside a constructor that `var`
   * is a field in.
   * Also used to allow immutable globals to be initialized inside a static constructor.
+  * Params:
+  *    loc = location for error messages
+  *    sc = scope
+  *    var = field
   * Returns:
!  *    true if it's an initialization of `var`
   */
  private bool modifyFieldVar(Loc loc, Scope* sc, VarDeclaration var, Expression e1)
  {
!     //printf("modifyFieldVar(var: %s, e1: %s)\n", var.toChars(), e1.toChars());
      Dsymbol s = sc.func;
      while (1)
      {
*************** private bool modifyFieldVar(Loc loc, Sco
*** 16811,16817 ****
              bool result = true;
  
              var.ctorinit = true;
!             //printf("setting ctorinit\n");
  
              if (var.isField() && sc.ctorflow.fieldinit.length && !sc.intypeof)
              {
--- 17435,17441 ----
              bool result = true;
  
              var.ctorinit = true;
!             //printf("setting ctorinit for %s\n", var.toChars());
  
              if (var.isField() && sc.ctorflow.fieldinit.length && !sc.intypeof)
              {
*************** bool checkDisabled(Declaration d, Loc lo
*** 17075,17081 ****
               * postblit. Print the first field that has
               * a disabled postblit.
               */
!             if (postblit.isGenerated())
              {
                  auto sd = p.isStructDeclaration();
                  assert(sd);
--- 17699,17705 ----
               * postblit. Print the first field that has
               * a disabled postblit.
               */
!             if (postblit.isGenerated)
              {
                  auto sd = p.isStructDeclaration();
                  assert(sd);
*************** bool checkDisabled(Declaration d, Loc lo
*** 17117,17123 ****
      if (auto ctor = d.isCtorDeclaration())
      {
          //printf("checkDisabled() %s %s\n", ctor.toPrettyChars(), toChars(ctor.type));
!         if (ctor.isCpCtor && ctor.isGenerated())
          {
              .error(loc, "generating an `inout` copy constructor for `struct %s` failed, therefore instances of it are uncopyable", d.parent.toPrettyChars());
              return true;
--- 17741,17747 ----
      if (auto ctor = d.isCtorDeclaration())
      {
          //printf("checkDisabled() %s %s\n", ctor.toPrettyChars(), toChars(ctor.type));
!         if (ctor.isCpCtor && ctor.isGenerated)
          {
              .error(loc, "generating an `inout` copy constructor for `struct %s` failed, therefore instances of it are uncopyable", d.parent.toPrettyChars());
              return true;
*************** bool checkDisabled(Declaration d, Loc lo
*** 17127,17132 ****
--- 17751,17789 ----
      return true;
  }
  
+ 
+ /*******************************************
+  * If variable has a constant expression initializer, get it.
+  * Otherwise, return null.
+  */
+ Expression getConstInitializer(VarDeclaration vd, bool needFullType = true)
+ {
+     assert(vd.type && vd._init);
+ 
+     // Ungag errors when not speculative
+     const oldgag = global.gag;
+     if (global.gag)
+     {
+         Dsymbol sym = vd.isMember();
+         if (sym && !sym.isSpeculative())
+             global.gag = 0;
+     }
+ 
+     if (vd._scope)
+     {
+         vd.inuse++;
+         vd._init = vd._init.initializerSemantic(vd._scope, vd.type, INITinterpret);
+         import dmd.semantic2 : lowerStaticAAs;
+         lowerStaticAAs(vd, vd._scope);
+         vd._scope = null;
+         vd.inuse--;
+     }
+ 
+     Expression e = vd._init.initializerToExpression(needFullType ? vd.type : null);
+     global.gag = oldgag;
+     return e;
+ }
+ 
  /*******************************************
   * Helper function for the expansion of manifest constant.
   */
*************** private Expression expandInitializer(Var
*** 17142,17147 ****
--- 17799,17806 ----
      }
  
      e = e.copy();
+     if (auto aae = e.isAssocArrayLiteralExp())
+         aae.lowering = null; // need to redo lowering as it contains temporary variables that must be renamed
      e.loc = loc;    // for better error message
      return e;
  }
*************** bool fill(StructDeclaration sd, Loc loc,
*** 17457,17463 ****
  *     sfe = The 'static foreach'.
  *     sc = The current scope.
  */
! extern (C++) void lowerNonArrayAggregate(StaticForeach sfe, Scope* sc)
  {
      import dmd.statement;
  
--- 18116,18122 ----
  *     sfe = The 'static foreach'.
  *     sc = The current scope.
  */
! void lowerNonArrayAggregate(StaticForeach sfe, Scope* sc)
  {
      import dmd.statement;
  
*************** extern (C++) void lowerNonArrayAggregate
*** 17468,17477 ****
      Parameters*[3] pparams = [new Parameters(), new Parameters(), new Parameters()];
      foreach (i; 0 .. nvars)
      {
!         foreach (params; pparams)
          {
              auto p = sfe.aggrfe ? (*sfe.aggrfe.parameters)[i] : sfe.rangefe.param;
!             params.push(new Parameter(aloc, p.storageClass, p.type, p.ident, null, null));
          }
      }
      Expression[2] res;
--- 18127,18137 ----
      Parameters*[3] pparams = [new Parameters(), new Parameters(), new Parameters()];
      foreach (i; 0 .. nvars)
      {
!         foreach (j, params; pparams)
          {
              auto p = sfe.aggrfe ? (*sfe.aggrfe.parameters)[i] : sfe.rangefe.param;
!             auto storageClass = j == 2 ? p.storageClass : p.storageClass & ~(STC.manifest | STC.alias_);
!             params.push(new Parameter(aloc, storageClass, p.type, p.ident, null, null));
          }
      }
      Expression[2] res;
*************** extern (C++) void lowerNonArrayAggregate
*** 17516,17527 ****
          sfe.rangefe.upr = sfe.rangefe.upr.optimize(WANTvalue);
          sfe.rangefe.upr = sfe.rangefe.upr.ctfeInterpret();
      }
!     auto s1 = new Statements();
      auto stmts = new Statements();
      if (tplty) stmts.push(new ExpStatement(sfe.loc, tplty.sym));
      stmts.push(new ReturnStatement(aloc, res[0]));
!     s1.push(sfe.createForeach(aloc, pparams[0], new CompoundStatement(aloc, stmts)));
!     s1.push(new ExpStatement(aloc, new AssertExp(aloc, IntegerExp.literal!0)));
      Type ety = new TypeTypeof(aloc, sfe.wrapAndCall(aloc, new CompoundStatement(aloc, s1)));
      auto aty = ety.arrayOf();
      auto idres = Identifier.generateId("__res");
--- 18176,18187 ----
          sfe.rangefe.upr = sfe.rangefe.upr.optimize(WANTvalue);
          sfe.rangefe.upr = sfe.rangefe.upr.ctfeInterpret();
      }
! 
      auto stmts = new Statements();
      if (tplty) stmts.push(new ExpStatement(sfe.loc, tplty.sym));
      stmts.push(new ReturnStatement(aloc, res[0]));
!     auto s1 = new Statements(sfe.createForeach(aloc, pparams[0], new CompoundStatement(aloc, stmts)),
!                              new ExpStatement(aloc, new AssertExp(aloc, IntegerExp.literal!0)));
      Type ety = new TypeTypeof(aloc, sfe.wrapAndCall(aloc, new CompoundStatement(aloc, s1)));
      auto aty = ety.arrayOf();
      auto idres = Identifier.generateId("__res");
*************** extern(D) void lowerArrayAggregate(Stati
*** 17671,17673 ****
--- 18331,18844 ----
      sfe.aggrfe.aggr = sfe.aggrfe.aggr.optimize(WANTvalue);
      sfe.aggrfe.aggr = sfe.aggrfe.aggr.ctfeInterpret();
  }
+ 
+ int include(Condition c, Scope* sc)
+ {
+     scope v = new IncludeVisitor(sc);
+     c.accept(v);
+     return v.result;
+ }
+ 
+ /*******************************************
+  * Look for constructor declaration.
+  */
+ Dsymbol searchCtor(AggregateDeclaration ad)
+ {
+     auto s = ad.search(Loc.initial, Id.ctor);
+     if (s)
+     {
+         if (!(s.isCtorDeclaration() ||
+               s.isTemplateDeclaration() ||
+               s.isOverloadSet()))
+         {
+             error(s.loc, "%s name `__ctor` is not allowed", s.kind);
+             errorSupplemental(s.loc, "identifiers starting with `__` are reserved for internal use");
+             ad.errors = true;
+             s = null;
+         }
+     }
+     if (s && s.toParent() != ad)
+         s = null; // search() looks through ancestor classes
+     if (s)
+     {
+         // Finish all constructors semantics to determine this.noDefaultCtor.
+         static int searchCtor(Dsymbol s, void*)
+         {
+             auto f = s.isCtorDeclaration();
+             if (f && f.semanticRun == PASS.initial)
+                 f.dsymbolSemantic(null);
+             return 0;
+         }
+ 
+         for (size_t i = 0; i < ad.members.length; i++)
+         {
+             auto sm = (*ad.members)[i];
+             sm.apply(&searchCtor, null);
+         }
+     }
+     return s;
+ }
+ 
+ private extern(C++) class IncludeVisitor : Visitor {
+     alias visit = Visitor.visit;
+ 
+     Scope *sc;
+     int result;
+ 
+     this(Scope* sc)
+     {
+         this.sc = sc;
+     }
+ 
+     override void visit(DebugCondition dc)
+     {
+         //printf("DebugCondition::include() level = %d, debuglevel = %d\n", level, global.params.debuglevel);
+         if (dc.inc != Include.notComputed)
+         {
+             result = dc.inc == Include.yes;
+             return;
+         }
+         dc.inc = Include.no;
+         bool definedInModule = false;
+         if (dc.ident)
+         {
+             if (dc.mod.debugids && findCondition(*dc.mod.debugids, dc.ident))
+             {
+                 dc.inc = Include.yes;
+                 definedInModule = true;
+             }
+             else if (findCondition(global.debugids, dc.ident))
+                 dc.inc = Include.yes;
+             else
+             {
+                 if (!dc.mod.debugidsNot)
+                     dc.mod.debugidsNot = new Identifiers();
+                 dc.mod.debugidsNot.push(dc.ident);
+             }
+         }
+         else if (global.params.debugEnabled)
+             dc.inc = Include.yes;
+ 
+         if (!definedInModule)
+             printDepsConditional(sc, dc, "depsDebug ");
+         result = (dc.inc == Include.yes);
+     }
+ 
+     override void visit(VersionCondition vc)
+     {
+         //printf("VersionCondition::include() level = %d, versionlevel = %d\n", level, global.params.versionlevel);
+         //if (ident) printf("\tident = '%s'\n", ident.toChars());
+         if (vc.inc != Include.notComputed)
+         {
+             result = vc.inc == Include.yes;
+             return;
+         }
+ 
+         vc.inc = Include.no;
+         bool definedInModule = false;
+         if (vc.ident)
+         {
+             if (vc.mod.versionids && findCondition(*vc.mod.versionids, vc.ident))
+             {
+                 vc.inc = Include.yes;
+                 definedInModule = true;
+             }
+             else if (findCondition(global.versionids, vc.ident))
+                 vc.inc = Include.yes;
+             else
+             {
+                 if (!vc.mod.versionidsNot)
+                     vc.mod.versionidsNot = new Identifiers();
+                 vc.mod.versionidsNot.push(vc.ident);
+             }
+         }
+         if (!definedInModule &&
+             (!vc.ident || (!vc.isReserved(vc.ident.toString()) && vc.ident != Id._unittest && vc.ident != Id._assert)))
+         {
+             printDepsConditional(sc, vc, "depsVersion ");
+         }
+         result = (vc.inc == Include.yes);
+     }
+ 
+     override void visit(StaticIfCondition sic)
+     {
+         // printf("StaticIfCondition::include(sc = %p) this=%p inc = %d\n", sc, this, inc);
+ 
+         int errorReturn()
+         {
+             if (!global.gag)
+                 sic.inc = Include.no; // so we don't see the error message again
+             return 0;
+         }
+ 
+         if (sic.inc != Include.notComputed)
+         {
+             result = sic.inc == Include.yes;
+             return;
+         }
+ 
+         if (!sc)
+         {
+             error(sic.loc, "`static if` conditional cannot be at global scope");
+             sic.inc = Include.no;
+             result = 0;
+             return;
+         }
+ 
+         import dmd.staticcond;
+         bool errors;
+ 
+         bool local_result = evalStaticCondition(sc, sic.exp, sic.exp, errors);
+ 
+         // Prevent repeated condition evaluation.
+         // See: fail_compilation/fail7815.d
+         if (sic.inc != Include.notComputed)
+         {
+             result = (sic.inc == Include.yes);
+             return;
+         }
+ 
+         if (errors)
+         {
+             result = errorReturn();
+             return;
+         }
+ 
+         if (local_result)
+             sic.inc = Include.yes;
+         else
+             sic.inc = Include.no;
+         result = (sic.inc == Include.yes);
+     }
+ }
+ 
+ /***************************************
+ * mark ArrayExp on the left side of an assignment recursively as modifiable before
+ * semantic analysis to defer potential lowerings into the assignment when
+ * the right side of the expression is analyzed, too, i.e.
+ *
+ *       a[i][j] = 1
+ *
+ * is parsed to
+ *
+ *       AssignExp(ArrayExp(ArrayExp(Id('a'), Id('i')), Id('j')), 1)
+ *
+ * ArrayExp is converted to IndexExp during semantic analysis, but the lowering
+ * for IndexExp on associative arrays is different for reading or writing. For
+ * struct types, it can even depend on the right hand side of an assignment.
+ *
+ * Params:
+ *       ae = the ArrayExp to mark
+ */
+ void markArrayExpModifiable(ArrayExp ae)
+ {
+     ae.modifiable = true;
+     for (auto ae1 = ae.e1.isArrayExp(); ae1; ae1 = ae1.e1.isArrayExp())
+         ae1.modifiable = true;
+ }
+ 
+ /***************************************
+ * convert an IndexExp on an associative array `aa[key]`
+ * to `_d_aaGetRvalueX!(K,V)(aa, key)[0]`
+ *
+ * Params:
+ *       ie = the IndexExp to lower
+ *       sc = context
+ * Returns:
+ *       on success, the lowered expression that is still an IndexExp
+ *         with its `loweredFrom` field set to the original expression
+ *       on failure, null is returned
+ */
+ Expression lowerAAIndexRead(IndexExp ie, Scope* sc)
+ {
+     Expression ce = buildAAIndexRValueX(ie.e1.type, ie.e1, ie.e2, sc);
+     if (!ce)
+         return ie;
+     auto rv = new IndexExp(ie.loc, ce, IntegerExp.literal!0);
+     rv.loweredFrom = ie;
+ 
+     return rv.expressionSemantic(sc);
+ }
+ 
+ // helper for lowerAAIndexRead and revertIndexAssignToRvalues
+ // to rewrite `aa[key]` to `_d_aaGetRvalueX!(K,V)(aa, key)[0]`
+ private Expression buildAAIndexRValueX(Type t, Expression eaa, Expression ekey, Scope* sc)
+ {
+     auto taa = t.toBasetype().isTypeAArray();
+     if (!taa)
+         return null;
+ 
+     auto loc = eaa.loc;
+     Identifier hook = Id._d_aaGetRvalueX;
+     if (!verifyHookExist(loc, *sc, hook, "indexing AA"))
+         return null;
+ 
+     Expression func = new IdentifierExp(loc, Id.empty);
+     func = new DotIdExp(loc, func, Id.object);
+     auto tiargs = new Objects(taa.index, taa.next);
+     func = new DotTemplateInstanceExp(loc, func, hook, tiargs);
+ 
+     Expression e0;
+     auto arguments = new Expressions(eaa, ekey);
+     auto call = new CallExp(loc, func, arguments);
+     e0 = Expression.combine(e0, call);
+ 
+     if (arrayBoundsCheck(sc.func))
+     {
+         // __aaget = _d_aaGetRvalueX(aa, key), __aaget ? __aaget : onRangeError(__FILE__, __LINE__)
+         auto ei = new ExpInitializer(loc, e0);
+         auto vartmp = Identifier.generateId("__aaget");
+         auto vardecl = new VarDeclaration(loc, null, vartmp, ei, STC.exptemp);
+         auto declexp = new DeclarationExp(loc, vardecl);
+ 
+         //Expression idrange = new IdentifierExp(loc, Identifier.idPool("_d_arraybounds"));
+         Expression idrange = new IdentifierExp(loc, Id.empty);
+         idrange = new DotIdExp(loc, idrange, Id.object);
+         idrange = new DotIdExp(loc, idrange, Identifier.idPool("_d_arraybounds"));
+         auto locargs = new Expressions(new FileInitExp(loc, EXP.file), new LineInitExp(loc));
+         auto ex = new CallExp(loc, idrange, locargs);
+ 
+         auto idvar1 = new IdentifierExp(loc, vartmp);
+         auto idvar2 = new IdentifierExp(loc, vartmp);
+         auto cond = new CondExp(loc, idvar1, idvar2, ex);
+         auto comma = new CommaExp(loc, declexp, cond);
+         return comma;
+     }
+     return e0;
+ }
+ 
+ /***************************************
+ * in a multi-dimensional array assignment without the out-most access being to an AA,
+ * convert AA accesses back to rvalues
+ *
+ * Params:
+ *       ie = the IndexExp to lower
+ *       sc = context
+ * Returns:
+ *       the lowered expression if the assignment was actually on an associative array,
+ *       the original expression otherwise,
+ *       an ErorrExp on failure
+ */
+ Expression revertIndexAssignToRvalues(IndexExp ie, Scope* sc)
+ {
+     if (auto ie1 = ie.e1.isIndexExp())
+     {
+         // convert inner access first, otherwise we'd have to crawl into the lowered AST
+         ie.e1 = revertIndexAssignToRvalues(ie1, sc);
+     }
+     if (!ie.e1.type.isTypeAArray())
+         return ie;
+ 
+     assert(ie.modifiable);
+     return lowerAAIndexRead(ie, sc);
+ }
+ 
+ // helper for rewriteAAIndexAssign
+ private Expression implicitConvertToStruct(Expression ev, StructDeclaration sd, Scope* sc)
+ {
+     Type t2 = ev.type.toBasetype();
+     Expression ey = null;
+     if (t2.ty == Tstruct && sd == t2.toDsymbol(sc))
+     {
+         ey = ev;
+     }
+     else if (!ev.implicitConvTo(sd.type) && sd.ctor)
+     {
+         // Look for implicit constructor call
+         // Rewrite as S().ctor(e2)
+         ey = new StructLiteralExp(ev.loc, sd, null);
+         ey = new DotIdExp(ev.loc, ey, Id.ctor);
+         ey = new CallExp(ev.loc, ey, ev);
+         ey = ey.trySemantic(sc);
+     }
+     return ey;
+ }
+ 
+ // helper for rewriteIndexAssign
+ private Expression rewriteAAIndexAssign(BinExp exp, Scope* sc, ref Type[2] aliasThisStop)
+ {
+     auto ie = exp.e1.isIndexExp();
+     assert(ie);
+     auto loc = ie.e1.loc;
+ 
+     Identifier hook = Id._d_aaGetY;
+     if (!verifyHookExist(loc, *sc, hook, "modifying AA"))
+         return ErrorExp.get();
+ 
+     bool escape = checkNewEscape(*sc, exp.e2, false);
+     if (escape)
+         return ErrorExp.get();
+     auto gcexp = exp.checkGC(sc);
+     if (gcexp.op == EXP.error)
+         return gcexp;
+ 
+     // build `bool __aafound, auto __aaget = _d_aaGetY(aa, key, found);`
+     auto idfound = Identifier.generateId("__aafound");
+     auto varfound = new VarDeclaration(loc, Type.tbool, idfound, null, STC.temp | STC.ctfe);
+     auto declfound = new DeclarationExp(loc, varfound);
+ 
+     // handle side effects before the actual AA insert
+     Expression e0 = declfound.expressionSemantic(sc);
+     Expression eaa = ie.e1;
+     // find the AA of multi dimensional access
+     for (auto ieaa = ie.e1.isIndexExp(); ieaa && ieaa.e1.type.isTypeAArray(); ieaa = ieaa.e1.isIndexExp())
+         eaa = ieaa.e1;
+     eaa = extractSideEffect(sc, "__aatmp", e0, eaa);
+     // collect all keys of multi dimensional access
+     Expressions ekeys;
+     ekeys.push(ie.e2);
+     for (auto ieaa = ie.e1.isIndexExp(); ieaa && ieaa.e1.type.isTypeAArray(); ieaa = ieaa.e1.isIndexExp())
+         ekeys.push(ieaa.e2);
+     foreach (ekey; ekeys)
+     {
+         Type tidx = ekey.type.toBasetype();
+         if (tidx.ty == Tarray && tidx.nextOf().isMutable())
+         {
+             error(loc, "associative arrays can only be assigned values with immutable keys, not `%s`", tidx.toChars());
+             return ErrorExp.get();
+         }
+     }
+     // extract side effects in lexical order
+     for (size_t i = ekeys.length; i > 0; --i)
+         ekeys[i-1] = extractSideEffect(sc, "__aakey", e0, ekeys[i-1]);
+     Expression ev = extractSideEffect(sc, "__aaval", e0, exp.e2);
+ 
+     // generate series of calls to _d_aaGetY
+     for (size_t i = ekeys.length; i > 0; --i)
+     {
+         auto taa = eaa.type.isTypeAArray();
+         assert (taa); // type must not have changed during rewrite
+         Expression func = new IdentifierExp(loc, Id.empty);
+         func = new DotIdExp(loc, func, Id.object);
+         auto tiargs = new Objects(taa.index, taa.next);
+         func = new DotTemplateInstanceExp(loc, func, hook, tiargs);
+ 
+         auto arguments = new Expressions(eaa, ekeys[i-1], new IdentifierExp(loc, idfound));
+         eaa = new CallExp(loc, func, arguments);
+         if (i > 1)
+         {
+             // extractSideEffect() cannot be used to ref the IndexExp,
+             // because ConstructExp below will not insert a postblit
+             auto ie1 = new IndexExp(loc, eaa, IntegerExp.literal!0);
+             ie1.modifiable = true;
+             ie1.loweredFrom = eaa;
+             eaa = ie1;
+         }
+         eaa = eaa.expressionSemantic(sc);
+         if (eaa.op == EXP.error)
+             return eaa;
+     }
+     Expression eg = extractSideEffect(sc, "__aaget", e0, eaa);
+     auto ie1 = new IndexExp(loc, eg, IntegerExp.literal!0);
+     ie1.modifiable = true;
+     ie1.loweredFrom = ie;
+     auto ex = ie1.expressionSemantic(sc);
+     ex = ex.optimize(WANTvalue);
+     if (ex.op == EXP.error)
+         return ex;
+     if (!exp.isAssignExp())
+     {
+         // modifying assignments work with zero-initialized inserted value
+         BinExp bex = cast(BinExp)exp.copy();
+         bex.e1 = ex;
+         bex.e2 = ev;
+         ex = Expression.combine(e0, bex);
+         ex.isCommaExp().originalExp = exp;
+         return ex.expressionSemantic(sc);
+     }
+     AssignExp ae = new AssignExp(loc, ex, ev);
+     auto ts = ie.type.isTypeStruct();
+     if (Expression overexp = ts ? ae.opOverloadAssign(sc, aliasThisStop) : null)
+     {
+         if (overexp.op == EXP.error)
+             return overexp;
+         if (auto ey = implicitConvertToStruct(ev, ts.sym, sc))
+         {
+             // __aafound ? __aaget.opAssign(__aaval) : __aaget.ctor(__aaval)
+             ey = new ConstructExp(loc, ex, ey);
+             ey = ey.expressionSemantic(sc);
+             if (ey.op == EXP.error)
+                 return ey;
+             ex = overexp;
+ 
+             // https://issues.dlang.org/show_bug.cgi?id=14144
+             // The whole expression should have the common type
+             // of opAssign() return and assigned AA entry.
+             // Even if there's no common type, expression should be typed as void.
+             if (!typeMerge(sc, EXP.question, ex, ey))
+             {
+                 ex = new CastExp(ex.loc, ex, Type.tvoid);
+                 ey = new CastExp(ey.loc, ey, Type.tvoid);
+             }
+             Expression condfound = new IdentifierExp(loc, idfound);
+             ex = new CondExp(loc, condfound, ex, ey);
+             ex = Expression.combine(e0, ex);
+             ex.isCommaExp().originalExp = exp;
+         }
+         else
+         {
+             // write back to _aaGetRValueX(aa, key)[0].opAssign(__aaval)
+             auto call = buildAAIndexRValueX(ie.e1.type, ie.e1, ie.e2, sc);
+             ie1 = new IndexExp(loc, call, IntegerExp.literal!0);
+             ie1.loweredFrom = ie;
+             ex = ie1.expressionSemantic(sc);
+             ex = ex.optimize(WANTvalue);
+             ae = new AssignExp(loc, ex, ev);
+             ex = ae.opOverloadAssign(sc, aliasThisStop);
+             assert(ex);
+         }
+     }
+     else
+     {
+         ex = Expression.combine(e0, ae);
+         ex.isCommaExp().originalExp = exp;
+     }
+     ex = ex.expressionSemantic(sc);
+     return ex;
+ }
+ 
+ /***************************************
+ * rewrite multi-dimensional array modifying assignments on associative arrays
+ *
+ * Params:
+ *       exp = the assignment expression, AssignExp, ConstructExp, BinAssignExp or PostExp
+ *       sc = context
+ *       aliasThisStop = for recursion check on `alias this`
+ * Returns:
+ *       the lowered expression if the assignment was actually on an associative array,
+ *       null if no modifying index expression was found on the lhs of the assignemnt
+ */
+ Expression rewriteIndexAssign(BinExp exp, Scope* sc, Type[2] aliasThisStop)
+ {
+     if (auto ie1 = exp.e1.isIndexExp())
+     {
+         if (ie1.e1.type.isTypeAArray())
+         {
+             if (exp.op == EXP.construct)
+                 exp.e1 = exp.e1.toLvalue(sc, "initialize");
+             else
+                 exp.e1 = exp.e1.modifiableLvalue(sc);
+             if (exp.e1.op == EXP.error)
+                 return exp.e1;
+             assert(exp.e1 == ie1);
+             assert(ie1.modifiable);
+             return rewriteAAIndexAssign(exp, sc, aliasThisStop);
+         }
+         exp.e1 = revertIndexAssignToRvalues(ie1, sc);
+     }
+     return null;
+ }
+ 
+ /****************************************
+  * Get bitfield from expression.
+  */
+ BitFieldDeclaration isBitField(Expression e)
+ {
+     if (auto ve = e.isVarExp())
+         return ve.var.isBitFieldDeclaration();
+ 
+     if (auto dve = e.isDotVarExp())
+         return dve.var.isBitFieldDeclaration();
+ 
+     return null;
+ }
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/file_manager.d gcc-16-20260201/gcc/d/dmd/file_manager.d
*** gcc-16-20260125/gcc/d/dmd/file_manager.d	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/file_manager.d	Sun Feb  1 22:32:07 2026
*************** nothrow:
*** 175,295 ****
  
          whichPathFoundThis = -1;
  
!         // see if we should check for the module locally.
!         bool checkLocal = pathCache.pathExists(filename);
!         const sdi = FileName.forceExt(filename, hdr_ext);
!         if (checkLocal && FileName.exists(sdi) == 1)
!             return sdi;
!         scope(exit) FileName.free(sdi.ptr);
! 
!         const sd = FileName.forceExt(filename, mars_ext);
!         if (checkLocal && FileName.exists(sd) == 1)
!             return sd;
!         scope(exit) FileName.free(sd.ptr);
! 
!         if (checkLocal)
          {
!             if (pathCache.isExistingPath(filename))
!             {
!                 /* The filename exists but it's a directory.
!                  * Therefore, the result should be: filename/package.d
!                  * iff filename/package.d is a file
!                  */
!                 const ni = FileName.combine(filename, package_di);
!                 if (FileName.exists(ni) == 1)
!                     return ni;
!                 FileName.free(ni.ptr);
! 
!                 const n = FileName.combine(filename, package_d);
!                 if (FileName.exists(n) == 1)
!                     return n;
!                 FileName.free(n.ptr);
!             }
          }
  
!         if (FileName.absolute(filename))
!             return null;
!         if (!pathsInfo.length)
!             return null;
!         foreach (pathIndex, entry; pathsInfo)
          {
!             const p = entry.path.toDString();
! 
!             const(char)[] n = FileName.combine(p, sdi);
! 
!             if (!pathCache.pathExists(n))
              {
!                 FileName.free(n.ptr);
!                 continue; // no need to check for anything else.
              }
-             if (FileName.exists(n) == 1)
-                 return n;
  
!             FileName.free(n.ptr);
  
!             n = FileName.combine(p, sd);
!             if (FileName.exists(n) == 1)
              {
!                 whichPathFoundThis = pathIndex;
!                 return n;
              }
-             FileName.free(n.ptr);
- 
-             n = FileName.combine(p, FileName.sansExt(filename));
-             scope(exit) FileName.free(n.ptr);
  
!             // also cache this if we are looking for package.d[i]
              if (pathCache.isExistingPath(n))
              {
!                 const n2i = FileName.combine(n, package_di);
!                 if (FileName.exists(n2i) == 1)
!                 {
!                     whichPathFoundThis = pathIndex;
!                     return n2i;
!                 }
  
!                 FileName.free(n2i.ptr);
!                 const n2 = FileName.combine(n, package_d);
!                 if (FileName.exists(n2) == 1)
                  {
!                     whichPathFoundThis = pathIndex;
!                     return n2;
                  }
!                 FileName.free(n2.ptr);
              }
          }
  
!         /* ImportC: No D modules found, now search along paths[] for .i file, then .c file.
!          */
!         const si = FileName.forceExt(filename, i_ext);
!         if (FileName.exists(si) == 1)
!             return si;
!         scope(exit) FileName.free(si.ptr);
! 
!         const sc = FileName.forceExt(filename, c_ext);
!         if (FileName.exists(sc) == 1)
!             return sc;
!         scope(exit) FileName.free(sc.ptr);
!         foreach (pathIndex, entry; pathsInfo)
          {
!             const p = entry.path.toDString();
! 
!             const(char)[] n = FileName.combine(p, si);
!             if (FileName.exists(n) == 1)
!             {
!                 whichPathFoundThis = pathIndex;
!                 return n;
!             }
!             FileName.free(n.ptr);
! 
!             n = FileName.combine(p, sc);
!             if (FileName.exists(n) == 1)
              {
!                 whichPathFoundThis = pathIndex;
!                 return n;
              }
-             FileName.free(n.ptr);
          }
          return null;
      }
  
--- 175,279 ----
  
          whichPathFoundThis = -1;
  
!         // List of extensions to match, in order of precedence.
!         const(char)[][2] extensions = [
!             FileName.forceExt(filename, hdr_ext),
!             FileName.forceExt(filename, mars_ext),
!         ];
!         const(char)[][3] importCextensions = [
!             FileName.forceExt(filename, i_ext),
!             FileName.forceExt(filename, h_ext),
!             FileName.forceExt(filename, c_ext),
!         ];
!         scope(exit)
          {
!             foreach (ext; extensions)
!                 FileName.free(ext.ptr);
!             foreach (ext; importCextensions)
!                 FileName.free(ext.ptr);
          }
  
!         /* Search for all combinations of files (mod.di, mod.d, mod/package.d, ...)
!          * within in directory `path`.
!          */
!         const(char)[] lookForSourceFileInPath(const char[] path)
          {
!             // When checking for modules locally, combine won't allocate a new string.
!             bool checkLocal = path is null;
!             void freePath(const(char)[] p)
              {
!                 if (checkLocal)
!                     return;
!                 FileName.free(p.ptr);
              }
  
!             const p = FileName.combine(path, filename);
!             scope(exit) freePath(p);
!             if (!pathCache.pathExists(p))
!                 return null; // no need to check for anything else.
  
!             // Search for any file matching {path}/{file}.{ext}
!             foreach (ext; extensions)
              {
!                 const file = FileName.combine(path, ext);
!                 if (FileName.exists(file) == 1)
!                 {
!                     import dmd.root.rmem : xarraydup;
!                     return checkLocal ? file.xarraydup : file;
!                 }
!                 freePath(file);
              }
  
!             const n = FileName.combine(path, FileName.sansExt(filename));
!             scope(exit) freePath(n);
              if (pathCache.isExistingPath(n))
              {
!                 /* The filename exists but it's a directory.
!                  * Therefore, the result should be: filename/package.d
!                  * iff filename/package.d is a file
!                  */
!                 const ni = FileName.combine(n, package_di);
!                 if (FileName.exists(ni) == 1)
!                     return ni;
!                 FileName.free(ni.ptr);
  
!                 const nd = FileName.combine(n, package_d);
!                 if (FileName.exists(nd) == 1)
!                     return nd;
!                 FileName.free(nd.ptr);
!             }
! 
!             /* Search for any file with importC extensions after all attempts
!                to find a D module/package in the path are exhausted.  */
!             foreach (ext; importCextensions)
!             {
!                 const file = FileName.combine(path, ext);
!                 if (FileName.exists(file) == 1)
                  {
!                     import dmd.root.rmem : xarraydup;
!                     return checkLocal ? file.xarraydup : file;
                  }
!                 freePath(file);
              }
+             return null;
          }
  
!         // First see if module is found in any search paths.
!         if (!FileName.absolute(filename))
          {
!             foreach (pathIndex, entry; pathsInfo)
              {
!                 if (auto s = lookForSourceFileInPath(entry.path.toDString()))
!                 {
!                     whichPathFoundThis = pathIndex;
!                     return s;
!                 }
              }
          }
+         // No modules found, check for the module locally.
+         if (auto s = lookForSourceFileInPath(null))
+             return s;
+ 
          return null;
      }
  
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/func.d gcc-16-20260201/gcc/d/dmd/func.d
*** gcc-16-20260125/gcc/d/dmd/func.d	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/func.d	Sun Feb  1 22:32:07 2026
*************** import dmd.aggregate;
*** 24,30 ****
  import dmd.arraytypes;
  import dmd.astenums;
  import dmd.blockexit;
- import dmd.gluelayer;
  import dmd.dcast;
  import dmd.dclass;
  import dmd.declaration;
--- 24,29 ----
*************** import dmd.dsymbol;
*** 36,42 ****
  import dmd.dtemplate;
  import dmd.escape;
  import dmd.expression;
! import dmd.funcsem : overloadApply;
  import dmd.globals;
  import dmd.hdrgen;
  import dmd.id;
--- 35,41 ----
  import dmd.dtemplate;
  import dmd.escape;
  import dmd.expression;
! import dmd.funcsem : isUnique;
  import dmd.globals;
  import dmd.hdrgen;
  import dmd.id;
*************** extern (C++) class FuncDeclaration : Dec
*** 240,246 ****
      // Things that should really go into Scope
  
      VarDeclaration nrvo_var;            /// variable to replace with shidden
!     Symbol* shidden;                    /// hidden pointer passed to function
  
      ReturnStatements* returns;
  
--- 239,245 ----
      // Things that should really go into Scope
  
      VarDeclaration nrvo_var;            /// variable to replace with shidden
!     void* shidden;                    /// hidden pointer passed to function
  
      ReturnStatements* returns;
  
*************** extern (C++) class FuncDeclaration : Dec
*** 249,255 ****
      version (MARS)
      {
          VarDeclarations* alignSectionVars;  /// local variables with alignment needs larger than stackAlign
!         Symbol* salignSection;              /// pointer to aligned section, if any
      }
  
      /// set if this is a known, builtin function we can evaluate at compile time
--- 248,254 ----
      version (MARS)
      {
          VarDeclarations* alignSectionVars;  /// local variables with alignment needs larger than stackAlign
!         void* salignSection;              /// pointer to aligned section, if any
      }
  
      /// set if this is a known, builtin function we can evaluate at compile time
*************** extern (C++) class FuncDeclaration : Dec
*** 820,866 ****
      bool addPreInvariant()
      {
          auto ad = isThis();
!         ClassDeclaration cd = ad ? ad.isClassDeclaration() : null;
!         return (ad && !(cd && cd.isCPPclass()) && global.params.useInvariants == CHECKENABLE.on && (visibility.kind == Visibility.Kind.protected_ || visibility.kind == Visibility.Kind.public_ || visibility.kind == Visibility.Kind.export_) && !this.isNaked());
      }
  
      bool addPostInvariant()
      {
          auto ad = isThis();
!         ClassDeclaration cd = ad ? ad.isClassDeclaration() : null;
!         return (ad && !(cd && cd.isCPPclass()) && ad.inv && global.params.useInvariants == CHECKENABLE.on && (visibility.kind == Visibility.Kind.protected_ || visibility.kind == Visibility.Kind.public_ || visibility.kind == Visibility.Kind.export_) && !this.isNaked());
      }
  
      override const(char)* kind() const
      {
!         return this.isGenerated() ? "generated function" : "function";
!     }
! 
!     /********************************************
!      * Returns:
!      *  true if there are no overloads of this function
!      */
!     final bool isUnique() const
!     {
!         bool result = false;
!         overloadApply(cast() this, (Dsymbol s)
!         {
!             auto f = s.isFuncDeclaration();
!             auto td = s.isTemplateDeclaration();
!             if (!f && !td)
!                 return 0;
!             if (result)
!             {
!                 result = false;
!                 return 1; // ambiguous, done
!             }
!             else
!             {
!                 result = true;
!                 return 0;
!             }
!         });
!         return result;
      }
  
      /*******************************
--- 819,836 ----
      bool addPreInvariant()
      {
          auto ad = isThis();
!         return (ad && global.params.useInvariants == CHECKENABLE.on && (visibility.kind == Visibility.Kind.protected_ || visibility.kind == Visibility.Kind.public_ || visibility.kind == Visibility.Kind.export_) && !this.isNaked);
      }
  
      bool addPostInvariant()
      {
          auto ad = isThis();
!         return (ad && ad.inv && global.params.useInvariants == CHECKENABLE.on && (visibility.kind == Visibility.Kind.protected_ || visibility.kind == Visibility.Kind.public_ || visibility.kind == Visibility.Kind.export_) && !this.isNaked);
      }
  
      override const(char)* kind() const
      {
!         return this.isGenerated ? "generated function" : "function";
      }
  
      /*******************************
*************** extern (C++) final class CtorDeclaration
*** 1375,1381 ****
  
      override const(char)* kind() const
      {
!         return isCpCtor ? "copy constructor" : "constructor";
      }
  
      override bool isVirtual() const
--- 1345,1352 ----
  
      override const(char)* kind() const
      {
!         return isCpCtor ? "copy constructor" :
!              isMoveCtor ? "move constructor" : "constructor";
      }
  
      override bool isVirtual() const
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/funcsem.d gcc-16-20260201/gcc/d/dmd/funcsem.d
*** gcc-16-20260125/gcc/d/dmd/funcsem.d	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/funcsem.d	Sun Feb  1 22:32:07 2026
*************** import dmd.arraytypes;
*** 20,26 ****
  import dmd.astenums;
  import dmd.attrib;
  import dmd.blockexit;
- import dmd.gluelayer;
  import dmd.dcast;
  import dmd.dclass;
  import dmd.declaration;
--- 20,25 ----
*************** public:
*** 103,109 ****
      override void visit(TryFinallyStatement s)
      {
          DtorExpStatement des;
!         if (fd.isNRVO() && s.finalbody && (des = s.finalbody.isDtorExpStatement()) !is null &&
              fd.nrvo_var == des.var)
          {
              if (!(global.params.useExceptions && ClassDeclaration.throwable))
--- 102,108 ----
      override void visit(TryFinallyStatement s)
      {
          DtorExpStatement des;
!         if (fd.isNRVO && s.finalbody && (des = s.finalbody.isDtorExpStatement()) !is null &&
              fd.nrvo_var == des.var)
          {
              if (!(global.params.useExceptions && ClassDeclaration.throwable))
*************** public:
*** 138,148 ****
                  handler = new CompoundStatement(Loc.initial, handler, ts);
              }
  
-             auto catches = new Catches();
              auto ctch = new Catch(Loc.initial, getThrowable(), id, handler);
              ctch.internalCatch = true;
              ctch.catchSemantic(sc); // Run semantic to resolve identifier '__o'
!             catches.push(ctch);
  
              Statement s2 = new TryCatchStatement(Loc.initial, s._body, catches);
              fd.hasNoEH = false;
--- 137,146 ----
                  handler = new CompoundStatement(Loc.initial, handler, ts);
              }
  
              auto ctch = new Catch(Loc.initial, getThrowable(), id, handler);
              ctch.internalCatch = true;
              ctch.catchSemantic(sc); // Run semantic to resolve identifier '__o'
!             auto catches = new Catches(ctch);
  
              Statement s2 = new TryCatchStatement(Loc.initial, s._body, catches);
              fd.hasNoEH = false;
*************** extern (C++) bool onlyOneMain(FuncDeclar
*** 176,181 ****
--- 174,206 ----
      return true;
  }
  
+ /********************************************
+  * Returns:
+  *  true if there are no overloads of this function
+  */
+ bool isUnique(const FuncDeclaration fd)
+ {
+     bool result = false;
+     overloadApply(cast() fd, (Dsymbol s)
+     {
+         auto f = s.isFuncDeclaration();
+         auto td = s.isTemplateDeclaration();
+         if (!f && !td)
+             return 0;
+         if (result)
+         {
+             result = false;
+             return 1; // ambiguous, done
+         }
+         else
+         {
+             result = true;
+             return 0;
+         }
+     });
+     return result;
+ }
+ 
  /**********************************
   * Main semantic routine for functions.
   */
*************** void funcDeclarationSemantic(Scope* sc,
*** 224,230 ****
      AggregateDeclaration ad = funcdecl.isThis();
      // Don't nest structs b/c of generated methods which should not access the outer scopes.
      // https://issues.dlang.org/show_bug.cgi?id=16627
!     if (ad && !funcdecl.isGenerated())
      {
          funcdecl.storage_class |= ad.storage_class & (STC.TYPECTOR | STC.synchronized_);
          ad.makeNested();
--- 249,255 ----
      AggregateDeclaration ad = funcdecl.isThis();
      // Don't nest structs b/c of generated methods which should not access the outer scopes.
      // https://issues.dlang.org/show_bug.cgi?id=16627
!     if (ad && !funcdecl.isGenerated)
      {
          funcdecl.storage_class |= ad.storage_class & (STC.TYPECTOR | STC.synchronized_);
          ad.makeNested();
*************** void funcDeclarationSemantic(Scope* sc,
*** 235,240 ****
--- 260,276 ----
      if ((funcdecl.storage_class & STC.TYPECTOR) && !(ad || funcdecl.isNested()))
          funcdecl.storage_class &= ~STC.TYPECTOR;
  
+     auto tf = funcdecl.type.isTypeFunction();
+     if ((funcdecl.storage_class & STC.auto_) && tf.isRef && !funcdecl.inferRetType)
+     {
+         if (!(funcdecl.storage_class & STC.autoref))
+         {
+             // @@@DEPRECATED_2.122@@@
+             // Deprecated in 2.112, turn into an error in 2.122
+             deprecation(funcdecl.loc, "`auto ref` return type must have `auto` and `ref` adjacent");
+             funcdecl.storage_class |= STC.autoref;
+         }
+     }
      //printf("function storage_class = x%llx, sc.stc = x%llx, %x\n", storage_class, sc.stc, Declaration.isFinal());
  
      if (sc.traitsCompiles)
*************** void funcDeclarationSemantic(Scope* sc,
*** 272,291 ****
      if (!funcdecl.originalType)
          funcdecl.originalType = funcdecl.type.syntaxCopy();
  
-     static TypeFunction getFunctionType(FuncDeclaration fd)
-     {
-         if (auto tf = fd.type.isTypeFunction())
-             return tf;
- 
-         if (!fd.type.isTypeError())
-         {
-             .error(fd.loc, "%s `%s` `%s` must be a function instead of `%s`", fd.kind, fd.toPrettyChars, fd.toChars(), fd.type.toChars());
-             fd.type = Type.terror;
-         }
-         fd.errors = true;
-         return null;
-     }
- 
      if (sc.inCfile)
      {
          /* C11 allows a function to be declared with a typedef, D does not.
--- 308,313 ----
*************** void funcDeclarationSemantic(Scope* sc,
*** 313,319 ****
          sc = sc.push();
          sc.stc |= funcdecl.storage_class & (STC.disable | STC.deprecated_); // forward to function type
  
-         TypeFunction tf = funcdecl.type.toTypeFunction();
          if (sc.func)
          {
              /* If the nesting parent is pure without inference,
--- 335,340 ----
*************** void funcDeclarationSemantic(Scope* sc,
*** 413,419 ****
  
          sc.linkage = funcdecl._linkage;
  
!         if (!tf.isNaked() && !(funcdecl.isThis() || funcdecl.isNested()))
          {
              import core.bitop : popcnt;
              auto mods = MODtoChars(tf.mod);
--- 434,440 ----
  
          sc.linkage = funcdecl._linkage;
  
!         if (!tf.isNaked && !(funcdecl.isThis() || funcdecl.isNested()))
          {
              import core.bitop : popcnt;
              auto mods = MODtoChars(tf.mod);
*************** void funcDeclarationSemantic(Scope* sc,
*** 563,1149 ****
  
      if (ClassDeclaration cd = parent.isClassDeclaration())
      {
!         parent = cd = objc.getParent(funcdecl, cd);
  
!         if (funcdecl.isCtorDeclaration())
          {
!             goto Ldone;
          }
  
!         if (funcdecl.storage_class & STC.abstract_)
!             cd.isabstract = ThreeState.yes;
  
!         // if static function, do not put in vtbl[]
!         if (!funcdecl.isVirtual())
          {
!             //printf("\tnot virtual\n");
!             goto Ldone;
          }
!         // Suppress further errors if the return type is an error
!         if (funcdecl.type.nextOf() == Type.terror)
!             goto Ldone;
  
!         bool may_override = false;
!         for (size_t i = 0; i < cd.baseclasses.length; i++)
          {
!             BaseClass* b = (*cd.baseclasses)[i];
!             ClassDeclaration cbd = b.type.toBasetype().isClassHandle();
!             if (!cbd)
                  continue;
!             for (size_t j = 0; j < cbd.vtbl.length; j++)
              {
!                 FuncDeclaration f2 = cbd.vtbl[j].isFuncDeclaration();
!                 if (!f2 || f2.ident != funcdecl.ident)
!                     continue;
!                 if (cbd.parent && cbd.parent.isTemplateInstance())
!                 {
!                     if (!functionSemantic(f2))
!                         goto Ldone;
!                 }
!                 may_override = true;
              }
          }
!         if (may_override && funcdecl.type.nextOf() is null)
          {
!             /* If same name function exists in base class but 'this' is auto return,
!              * cannot find index of base class's vtbl[] to override.
!              */
!             .error(funcdecl.loc, "%s `%s` return type inference is not supported if may override base class function", funcdecl.kind, funcdecl.toPrettyChars);
          }
  
!         /* Find index of existing function in base class's vtbl[] to override
!          * (the index will be the same as in cd's current vtbl[])
           */
!         int vi = cd.baseClass ? findVtblIndex(funcdecl, cd.baseClass.vtbl[]) : -1;
! 
!         bool doesoverride = false;
!         switch (vi)
          {
!         case -1:
!         Lintro:
!             /* Didn't find one, so
!              * This is an 'introducing' function which gets a new
!              * slot in the vtbl[].
               */
  
!             // Verify this doesn't override previous final function
!             if (cd.baseClass)
              {
!                 Dsymbol s = cd.baseClass.search(funcdecl.loc, funcdecl.ident);
!                 if (s)
                  {
!                     if (auto f2 = s.isFuncDeclaration())
                      {
!                         f2 = f2.overloadExactMatch(funcdecl.type);
!                         if (f2 && f2.isFinalFunc() && f2.visible().kind != Visibility.Kind.private_)
!                             .error(funcdecl.loc, "%s `%s` cannot override `final` function `%s`", funcdecl.kind, funcdecl.toPrettyChars, f2.toPrettyChars());
                      }
                  }
              }
  
!             /* These quirky conditions mimic what happens when virtual
!                inheritance is implemented by producing a virtual base table
!                with offsets to each of the virtual bases.
!              */
!             if (target.cpp.splitVBasetable && cd.classKind == ClassKind.cpp &&
!                 cd.baseClass && cd.baseClass.vtbl.length)
              {
!                 /* if overriding an interface function, then this is not
!                  * introducing and don't put it in the class vtbl[]
                   */
!                 funcdecl.interfaceVirtual = overrideInterface(funcdecl);
!                 if (funcdecl.interfaceVirtual)
!                 {
!                     //printf("\tinterface function %s\n", toChars());
!                     cd.vtblFinal.push(funcdecl);
!                     goto Linterfaces;
!                 }
              }
  
!             if (funcdecl.isFinalFunc())
              {
!                 // Don't check here, as it may override an interface function
!                 //if (isOverride())
!                 //    error("is marked as override, but does not override any function");
!                 cd.vtblFinal.push(funcdecl);
              }
!             else
              {
!                 //printf("\tintroducing function %s\n", funcdecl.toChars());
!                 funcdecl.isIntroducing = true;
!                 if (cd.classKind == ClassKind.cpp && target.cpp.reverseOverloads)
!                 {
!                     /* Overloaded functions with same name are grouped and in reverse order.
!                      * Search for first function of overload group, and insert
!                      * funcdecl into vtbl[] immediately before it.
!                      */
!                     funcdecl.vtblIndex = cast(int)cd.vtbl.length;
!                     bool found;
!                     foreach (const i, s; cd.vtbl)
!                     {
!                         if (found)
!                             // the rest get shifted forward
!                             ++s.isFuncDeclaration().vtblIndex;
!                         else if (s.ident == funcdecl.ident && s.parent == parent)
!                         {
!                             // found first function of overload group
!                             funcdecl.vtblIndex = cast(int)i;
!                             found = true;
!                             ++s.isFuncDeclaration().vtblIndex;
!                         }
!                     }
!                     cd.vtbl.insert(funcdecl.vtblIndex, funcdecl);
  
!                     debug foreach (const i, s; cd.vtbl)
!                     {
!                         // a C++ dtor gets its vtblIndex later (and might even be added twice to the vtbl),
!                         // e.g. when compiling druntime with a debug compiler, namely with core.stdcpp.exception.
!                         if (auto fd = s.isFuncDeclaration())
!                             assert(fd.vtblIndex == i ||
!                                    (cd.classKind == ClassKind.cpp && fd.isDtorDeclaration) ||
!                                    funcdecl.parent.isInterfaceDeclaration); // interface functions can be in multiple vtbls
!                     }
                  }
                  else
                  {
!                     // Append to end of vtbl[]
!                     vi = cast(int)cd.vtbl.length;
!                     cd.vtbl.push(funcdecl);
!                     funcdecl.vtblIndex = vi;
                  }
              }
!             break;
! 
!         case -2:
!             // can't determine because of forward references
!             funcdecl.errors = true;
!             return;
! 
!         default:
              {
!                 if (vi >= cd.vtbl.length)
                  {
!                     /* the derived class cd doesn't have its vtbl[] allocated yet.
!                      * https://issues.dlang.org/show_bug.cgi?id=21008
                       */
!                     .error(funcdecl.loc, "%s `%s` circular reference to class `%s`", funcdecl.kind, funcdecl.toPrettyChars, cd.toChars());
!                     funcdecl.errors = true;
!                     return;
                  }
!                 FuncDeclaration fdv = cd.baseClass.vtbl[vi].isFuncDeclaration();
!                 FuncDeclaration fdc = cd.vtbl[vi].isFuncDeclaration();
!                 // This function is covariant with fdv
! 
!                 if (fdc == funcdecl)
                  {
!                     doesoverride = true;
                      break;
                  }
! 
!                 auto vtf = getFunctionType(fdv);
!                 if (vtf.trust > TRUST.system && f.trust == TRUST.system)
!                     .error(funcdecl.loc, "%s `%s` cannot override `@safe` method `%s` with a `@system` attribute", funcdecl.kind, funcdecl.toPrettyChars,
!                                    fdv.toPrettyChars);
! 
!                 if (fdc.toParent() == parent)
                  {
!                     //printf("vi = %d,\tthis = %p %s %s @ [%s]\n\tfdc  = %p %s %s @ [%s]\n\tfdv  = %p %s %s @ [%s]\n",
!                     //        vi, this, this.toChars(), this.type.toChars(), this.loc.toChars(),
!                     //            fdc,  fdc .toChars(), fdc .type.toChars(), fdc .loc.toChars(),
!                     //            fdv,  fdv .toChars(), fdv .type.toChars(), fdv .loc.toChars());
! 
!                     // fdc overrides fdv exactly, then this introduces new function.
!                     if (fdc.type.mod == fdv.type.mod && funcdecl.type.mod != fdv.type.mod)
!                         goto Lintro;
                  }
  
!                 if (fdv.isDeprecated && !funcdecl.isDeprecated)
!                     deprecation(funcdecl.loc, "`%s` is overriding the deprecated method `%s`",
!                                 funcdecl.toPrettyChars, fdv.toPrettyChars);
  
!                 // This function overrides fdv
!                 if (fdv.isFinalFunc())
!                     .error(funcdecl.loc, "%s `%s` cannot override `final` function `%s`", funcdecl.kind, funcdecl.toPrettyChars, fdv.toPrettyChars());
  
!                 if (!funcdecl.isOverride())
!                 {
!                     if (fdv.isFuture())
!                     {
!                         deprecation(funcdecl.loc, "method `%s` implicitly overrides `@__future` base class method; rename the former",
!                             funcdecl.toPrettyChars());
!                         deprecationSupplemental(fdv.loc, "base method `%s` defined here",
!                             fdv.toPrettyChars());
!                         // Treat 'this' as an introducing function, giving it a separate hierarchy in the vtbl[]
!                         goto Lintro;
!                     }
!                     else
!                     {
!                         // https://issues.dlang.org/show_bug.cgi?id=17349
!                         error(funcdecl.loc, "cannot implicitly override base class method `%s` with `%s`; add `override` attribute",
!                               fdv.toPrettyChars(), funcdecl.toPrettyChars());
!                     }
!                 }
!                 doesoverride = true;
!                 if (fdc.toParent() == parent)
                  {
!                     // If both are mixins, or both are not, then error.
!                     // If either is not, the one that is not overrides the other.
!                     bool thismixin = funcdecl.parent.isClassDeclaration() !is null;
!                     bool fdcmixin = fdc.parent.isClassDeclaration() !is null;
!                     if (thismixin == fdcmixin)
!                     {
!                         .error(funcdecl.loc, "%s `%s` multiple overrides of same function", funcdecl.kind, funcdecl.toPrettyChars);
!                     }
!                     /*
!                      * https://issues.dlang.org/show_bug.cgi?id=711
!                      *
!                      * If an overriding method is introduced through a mixin,
!                      * we need to update the vtbl so that both methods are
!                      * present.
!                      */
!                     else if (thismixin)
!                     {
!                         /* if the mixin introduced the overriding method, then reintroduce it
!                          * in the vtbl. The initial entry for the mixined method
!                          * will be updated at the end of the enclosing `if` block
!                          * to point to the current (non-mixined) function.
!                          */
!                         auto vitmp = cast(int)cd.vtbl.length;
!                         cd.vtbl.push(fdc);
!                         fdc.vtblIndex = vitmp;
!                     }
!                     else if (fdcmixin)
!                     {
!                         /* if the current overriding function is coming from a
!                          * mixined block, then push the current function in the
!                          * vtbl, but keep the previous (non-mixined) function as
!                          * the overriding one.
!                          */
!                         auto vitmp = cast(int)cd.vtbl.length;
!                         cd.vtbl.push(funcdecl);
!                         funcdecl.vtblIndex = vitmp;
!                         break;
!                     }
!                     else // fdc overrides fdv
!                     {
!                         // this doesn't override any function
!                         break;
!                     }
                  }
!                 cd.vtbl[vi] = funcdecl;
!                 funcdecl.vtblIndex = vi;
! 
!                 /* Remember which functions this overrides
!                  */
!                 funcdecl.foverrides.push(fdv);
! 
!                 /* This works by whenever this function is called,
!                  * it actually returns tintro, which gets dynamically
!                  * cast to type. But we know that tintro is a base
!                  * of type, so we could optimize it by not doing a
!                  * dynamic cast, but just subtracting the isBaseOf()
!                  * offset if the value is != null.
                   */
! 
!                 if (fdv.tintro)
!                     funcdecl.tintro = fdv.tintro;
!                 else if (!funcdecl.type.equals(fdv.type))
                  {
!                     auto tnext = funcdecl.type.nextOf();
!                     if (auto handle = tnext.isClassHandle())
!                     {
!                         if (handle.semanticRun < PASS.semanticdone && !handle.isBaseInfoComplete())
!                             handle.dsymbolSemantic(null);
!                     }
!                     /* Only need to have a tintro if the vptr
!                      * offsets differ
!                      */
!                     int offset;
!                     if (fdv.type.nextOf().isBaseOf(tnext, &offset))
!                     {
!                         funcdecl.tintro = fdv.type;
!                     }
                  }
-                 break;
              }
          }
  
!         /* Go through all the interface bases.
!          * If this function is covariant with any members of those interface
!          * functions, set the tintro.
!          */
!     Linterfaces:
!         bool foundVtblMatch = false;
  
!         for (ClassDeclaration bcd = cd; !foundVtblMatch && bcd; bcd = bcd.baseClass)
          {
!             foreach (b; bcd.interfaces)
              {
!                 vi = findVtblIndex(funcdecl, b.sym.vtbl[]);
!                 switch (vi)
!                 {
!                 case -1:
!                     break;
  
!                 case -2:
!                     // can't determine because of forward references
!                     funcdecl.errors = true;
!                     return;
  
!                 default:
!                     {
!                         auto fdv = cast(FuncDeclaration)b.sym.vtbl[vi];
!                         Type ti = null;
  
!                         foundVtblMatch = true;
  
!                         /* Remember which functions this overrides
!                          */
!                         funcdecl.foverrides.push(fdv);
  
!                         if (fdv.tintro)
!                             ti = fdv.tintro;
!                         else if (!funcdecl.type.equals(fdv.type))
                          {
!                             /* Only need to have a tintro if the vptr
!                              * offsets differ
!                              */
!                             int offset;
!                             if (fdv.type.nextOf().isBaseOf(funcdecl.type.nextOf(), &offset))
!                             {
!                                 ti = fdv.type;
!                             }
                          }
!                         if (ti)
                          {
!                             if (funcdecl.tintro)
!                             {
!                                 if (!funcdecl.tintro.nextOf().equals(ti.nextOf()) && !funcdecl.tintro.nextOf().isBaseOf(ti.nextOf(), null) && !ti.nextOf().isBaseOf(funcdecl.tintro.nextOf(), null))
!                                 {
!                                     .error(funcdecl.loc, "%s `%s` incompatible covariant types `%s` and `%s`", funcdecl.kind, funcdecl.toPrettyChars, funcdecl.tintro.toChars(), ti.toChars());
!                                 }
!                             }
!                             else
                              {
!                                 funcdecl.tintro = ti;
                              }
                          }
                      }
                  }
              }
          }
!         if (foundVtblMatch)
          {
!             goto L2;
          }
  
!         if (!doesoverride && funcdecl.isOverride() && (funcdecl.type.nextOf() || !may_override))
          {
!             BaseClass* bc = null;
!             Dsymbol s = null;
!             for (size_t i = 0; i < cd.baseclasses.length; i++)
!             {
!                 bc = (*cd.baseclasses)[i];
!                 s = bc.sym.search_correct(funcdecl.ident);
!                 if (s)
!                     break;
!             }
  
!             if (s)
              {
!                 HdrGenState hgs;
!                 OutBuffer buf;
  
!                 auto fd = s.isFuncDeclaration();
!                 functionToBufferFull(cast(TypeFunction)(funcdecl.type), buf,
!                     new Identifier(funcdecl.toPrettyChars()), hgs, null);
!                 const(char)* funcdeclToChars = buf.peekChars();
  
!                 if (fd)
                  {
!                     OutBuffer buf1;
! 
!                     if (fd.ident == funcdecl.ident)
!                         hgs.fullQual = true;
  
!                     // https://issues.dlang.org/show_bug.cgi?id=23745
!                     // If the potentially overridden function contains errors,
!                     // inform the user to fix that one first
!                     if (fd.errors)
!                     {
!                         error(funcdecl.loc, "function `%s` does not override any function, did you mean to override `%s`?",
!                             funcdecl.toChars(), fd.toPrettyChars());
!                         errorSupplemental(fd.loc, "Function `%s` contains errors in its declaration, therefore it cannot be correctly overridden",
!                             fd.toPrettyChars());
!                     }
!                     else
                      {
!                         functionToBufferFull(cast(TypeFunction)(fd.type), buf1,
!                             new Identifier(fd.toPrettyChars()), hgs, null);
  
!                         error(funcdecl.loc, "function `%s` does not override any function, did you mean to override `%s`?",
!                             funcdeclToChars, buf1.peekChars());
!                    }
                  }
                  else
                  {
!                     error(funcdecl.loc, "function `%s` does not override any function, did you mean to override %s `%s`?",
!                         funcdeclToChars, s.kind, s.toPrettyChars());
!                     errorSupplemental(funcdecl.loc, "Functions are the only declarations that may be overridden");
!                 }
!             }
!             else
!                 .error(funcdecl.loc, "%s `%s` does not override any function", funcdecl.kind, funcdecl.toPrettyChars);
!         }
! 
!     L2:
!         objc.setSelector(funcdecl, sc);
!         objc.checkLinkage(funcdecl);
!         objc.addToClassMethodList(funcdecl, cd);
!         objc.setAsOptional(funcdecl, sc);
  
!         /* Go through all the interface bases.
!          * Disallow overriding any final functions in the interface(s).
!          */
!         foreach (b; cd.interfaces)
!         {
!             if (b.sym)
!             {
!                 if (auto s = search_function(b.sym, funcdecl.ident))
!                 {
!                     if (auto f2 = s.isFuncDeclaration())
!                     {
!                         f2 = f2.overloadExactMatch(funcdecl.type);
!                         if (f2 && f2.isFinalFunc() && f2.visible().kind != Visibility.Kind.private_)
!                             .error(funcdecl.loc, "%s `%s` cannot override `final` function `%s.%s`", funcdecl.kind, funcdecl.toPrettyChars, b.sym.toChars(), f2.toPrettyChars());
!                     }
!                 }
!             }
!         }
  
!         if (funcdecl.isOverride)
!         {
!             if (funcdecl.storage_class & STC.disable)
!                 deprecation(funcdecl.loc,
!                             "`%s` cannot be annotated with `@disable` because it is overriding a function in the base class",
!                             funcdecl.toPrettyChars);
  
!             if (funcdecl.isDeprecated && !(funcdecl.foverrides.length && funcdecl.foverrides[0].isDeprecated))
!                 deprecation(funcdecl.loc,
!                             "`%s` cannot be marked as `deprecated` because it is overriding a function in the base class",
!                             funcdecl.toPrettyChars);
!         }
  
!     }
!     else if (funcdecl.isOverride() && !parent.isTemplateInstance())
!         .error(funcdecl.loc, "%s `%s` `override` only applies to class member functions", funcdecl.kind, funcdecl.toPrettyChars);
  
!     if (auto ti = parent.isTemplateInstance)
!     {
!         objc.setSelector(funcdecl, sc);
!         objc.setAsOptional(funcdecl, sc);
!     }
  
!     objc.validateSelector(funcdecl);
!     objc.validateOptional(funcdecl);
!     // Reflect this.type to f because it could be changed by findVtblIndex
!     f = funcdecl.type.toTypeFunction();
  
! Ldone:
!     if (!funcdecl.fbody && !funcdecl.allowsContractWithoutBody())
!         .error(funcdecl.loc, "%s `%s` `in` and `out` contracts can only appear without a body when they are virtual interface functions or abstract", funcdecl.kind, funcdecl.toPrettyChars);
  
!     /* Do not allow template instances to add virtual functions
!      * to a class.
!      */
!     if (funcdecl.isVirtual())
!     {
!         if (auto ti = parent.isTemplateInstance())
!         {
!             // Take care of nested templates
!             while (1)
!             {
!                 TemplateInstance ti2 = ti.tempdecl.parent.isTemplateInstance();
!                 if (!ti2)
!                     break;
!                 ti = ti2;
              }
! 
!             // If it's a member template
!             if (ClassDeclaration cd = ti.tempdecl.isClassMember())
              {
!                 .error(funcdecl.loc, "%s `%s` cannot use template to add virtual function to class `%s`", funcdecl.kind, funcdecl.toPrettyChars, cd.toChars());
              }
          }
      }
  
!     funcdecl.checkMain();       // Check main() parameters and return type
! 
!     /* Purity and safety can be inferred for some functions by examining
!      * the function body.
!      */
!     if (funcdecl.canInferAttributes(sc))
!         funcdecl.initInferAttributes();
! 
!     funcdecl.semanticRun = PASS.semanticdone;
  
!     /* Save scope for possible later use (if we need the
!      * function internals)
       */
!     funcdecl._scope = sc.copy();
!     funcdecl._scope.setNoFree();
! 
!     __gshared bool printedMain = false; // semantic might run more than once
!     if (global.params.v.verbose && !printedMain)
      {
!         const(char)* type = funcdecl.isMain() ? "main" : funcdecl.isWinMain() ? "winmain" : funcdecl.isDllMain() ? "dllmain" : cast(const(char)*)null;
!         Module mod = sc._module;
! 
!         if (type && mod)
          {
!             printedMain = true;
!             auto name = mod.srcfile.toChars();
!             auto path = FileName.searchPath(global.importPaths, name, true);
!             message("entry     %-10s\t%s", type, path ? path : name);
          }
      }
  
!     if (funcdecl.fbody && sc._module.isRoot() &&
!         (funcdecl.isMain() || funcdecl.isWinMain() || funcdecl.isDllMain() || funcdecl.isCMain()))
!         global.hasMainFunction = true;
! 
!     if (funcdecl.fbody && funcdecl.isMain() && sc._module.isRoot())
      {
!         // check if `_d_cmain` is defined
!         bool cmainTemplateExists()
!         {
!             Dsymbol pscopesym;
!             auto rootSymbol = sc.search(funcdecl.loc, Id.empty, pscopesym);
!             if (auto moduleSymbol = rootSymbol.search(funcdecl.loc, Id.object))
!                 if (moduleSymbol.search(funcdecl.loc, Id.CMain))
!                     return true;
! 
!             return false;
!         }
  
!         // Only mixin `_d_cmain` if it is defined
!         if (cmainTemplateExists())
!         {
!             // add `mixin _d_cmain!();` to the declaring module
!             auto tqual = new TypeIdentifier(funcdecl.loc, Id.CMain);
!             auto tm = new TemplateMixin(funcdecl.loc, null, tqual, null);
!             sc._module.members.push(tm);
!         }
      }
  
!     assert(funcdecl.type.ty != Terror || funcdecl.errors);
  
!     // semantic for parameters' UDAs
!     foreach (i, param; f.parameterList)
      {
!         if (param && param.userAttribDecl)
!             param.userAttribDecl.dsymbolSemantic(sc);
      }
  }
  
  /*****************************************
--- 584,1280 ----
  
      if (ClassDeclaration cd = parent.isClassDeclaration())
      {
!         switch (classFuncSemantic(cd, funcdecl, parent, sc, f))
!         {
!             case 0: break;
!             case 1: goto Ldone;
!             case 2: return;
!             default: assert(0);
!         }
!     }
!     else if (funcdecl.isOverride() && !parent.isTemplateInstance())
!         .error(funcdecl.loc, "%s `%s` `override` only applies to class member functions", funcdecl.kind, funcdecl.toPrettyChars);
  
!     if (auto ti = parent.isTemplateInstance)
!     {
!         objc.setSelector(funcdecl, sc);
!         objc.setAsOptional(funcdecl, sc);
!     }
! 
!     objc.validateSelector(funcdecl);
!     objc.validateOptional(funcdecl);
!     // Reflect this.type to f because it could be changed by findVtblIndex
!     f = funcdecl.type.toTypeFunction();
! 
! Ldone:
!     if (!funcdecl.fbody && !funcdecl.allowsContractWithoutBody())
!         .error(funcdecl.loc, "%s `%s` `in` and `out` contracts can only appear without a body when they are virtual interface functions or abstract", funcdecl.kind, funcdecl.toPrettyChars);
! 
!     /* Do not allow template instances to add virtual functions
!      * to a class.
!      */
!     if (funcdecl.isVirtual())
!     {
!         if (auto ti = parent.isTemplateInstance())
          {
!             // Take care of nested templates
!             while (1)
!             {
!                 TemplateInstance ti2 = ti.tempdecl.parent.isTemplateInstance();
!                 if (!ti2)
!                     break;
!                 ti = ti2;
!             }
! 
!             // If it's a member template
!             if (ClassDeclaration cd = ti.tempdecl.isClassMember())
!             {
!                 .error(funcdecl.loc, "%s `%s` cannot use template to add virtual function to class `%s`", funcdecl.kind, funcdecl.toPrettyChars, cd.toChars());
!             }
          }
+     }
  
!     funcdecl.checkMain();       // Check main() parameters and return type
  
!     /* Purity and safety can be inferred for some functions by examining
!      * the function body.
!      */
!     if (funcdecl.canInferAttributes(sc))
!         funcdecl.initInferAttributes();
! 
!     funcdecl.semanticRun = PASS.semanticdone;
! 
!     /* Save scope for possible later use (if we need the
!      * function internals)
!      */
!     funcdecl._scope = sc.copy();
!     funcdecl._scope.setNoFree();
! 
!     __gshared bool printedMain = false; // semantic might run more than once
!     if (global.params.v.verbose && !printedMain)
!     {
!         const(char)* type = funcdecl.isMain() ? "main" : funcdecl.isWinMain() ? "winmain" : funcdecl.isDllMain() ? "dllmain" : cast(const(char)*)null;
!         Module mod = sc._module;
! 
!         if (type && mod)
          {
!             printedMain = true;
!             auto name = mod.srcfile.toChars();
!             auto path = FileName.searchPath(global.importPaths, name, true);
!             message("entry     %-10s\t%s", type, path ? path : name);
          }
!     }
  
!     if (funcdecl.fbody && sc._module.isRoot() &&
!         (funcdecl.isMain() || funcdecl.isWinMain() || funcdecl.isDllMain() || funcdecl.isCMain()))
!         global.hasMainFunction = true;
! 
!     if (funcdecl.fbody && funcdecl.isMain() && sc._module.isRoot())
!     {
!         // check if `_d_cmain` is defined
!         bool cmainTemplateExists()
          {
!             Dsymbol pscopesym;
!             auto rootSymbol = sc.search(funcdecl.loc, Id.empty, pscopesym);
!             if (auto moduleSymbol = rootSymbol.search(funcdecl.loc, Id.object))
!                 if (moduleSymbol.search(funcdecl.loc, Id.CMain))
!                     return true;
! 
!             return false;
!         }
! 
!         // Only mixin `_d_cmain` if it is defined
!         if (cmainTemplateExists())
!         {
!             // add `mixin _d_cmain!();` to the declaring module
!             auto tqual = new TypeIdentifier(funcdecl.loc, Id.CMain);
!             auto tm = new TemplateMixin(funcdecl.loc, null, tqual, null);
!             sc._module.members.push(tm);
!         }
!     }
! 
!     assert(funcdecl.type.ty != Terror || funcdecl.errors);
! 
!     // semantic for parameters' UDAs
!     foreach (i, param; f.parameterList)
!     {
!         if (param && param.userAttribDecl)
!             param.userAttribDecl.dsymbolSemantic(sc);
!     }
! }
! 
! /**
!  Returns:
!     0 if semantic analysis in `funcDeclarationSemantic` should continue as normal
!     1 if it should skip over some analysis and `goto Ldone;`
!     2 if `funcDeclarationSemantic` should return early because of forward refernce error or
!         the derived class cd doesn't have its vtbl[] allocated yet
!  */
! private int classFuncSemantic(ClassDeclaration cd, FuncDeclaration funcdecl,
!                               ref Dsymbol parent, Scope* sc, TypeFunction f)
! {
!     parent = cd = objc.getParent(funcdecl, cd);
! 
!     if (funcdecl.isCtorDeclaration())
!     {
!         return 1;
!     }
! 
!     if (funcdecl.storage_class & STC.abstract_)
!         cd.isabstract = ThreeState.yes;
! 
!     // if static function, do not put in vtbl[]
!     if (!funcdecl.isVirtual())
!     {
!         //printf("\tnot virtual\n");
!         return 1;
!     }
!     // Suppress further errors if the return type is an error
!     if (funcdecl.type.nextOf() == Type.terror)
!         return 1;
! 
!     bool may_override = false;
!     for (size_t i = 0; i < cd.baseclasses.length; i++)
!     {
!         BaseClass* b = (*cd.baseclasses)[i];
!         ClassDeclaration cbd = b.type.toBasetype().isClassHandle();
!         if (!cbd)
!             continue;
!         for (size_t j = 0; j < cbd.vtbl.length; j++)
!         {
!             FuncDeclaration f2 = cbd.vtbl[j].isFuncDeclaration();
!             if (!f2 || f2.ident != funcdecl.ident)
                  continue;
!             if (cbd.parent && cbd.parent.isTemplateInstance())
              {
!                 if (!functionSemantic(f2))
!                     return 1;
              }
+             may_override = true;
          }
!     }
!     if (may_override && funcdecl.type.nextOf() is null)
!     {
!         /* If same name function exists in base class but 'this' is auto return,
!          * cannot find index of base class's vtbl[] to override.
!          */
!         .error(funcdecl.loc, "%s `%s` return type inference is not supported if may override base class function", funcdecl.kind, funcdecl.toPrettyChars);
!     }
! 
!     /* Find index of existing function in base class's vtbl[] to override
!      * (the index will be the same as in cd's current vtbl[])
!      */
!     int vi = cd.baseClass ? findVtblIndex(funcdecl, cd.baseClass.vtbl[]) : -1;
! 
!     bool doesoverride = false;
!     switch (vi)
!     {
!     case -1:
!     Lintro:
!         /* Didn't find one, so
!          * This is an 'introducing' function which gets a new
!          * slot in the vtbl[].
!          */
! 
!         // Verify this doesn't override previous final function
!         if (cd.baseClass)
          {
!             Dsymbol s = cd.baseClass.search(funcdecl.loc, funcdecl.ident);
!             if (s)
!             {
!                 if (auto f2 = s.isFuncDeclaration())
!                 {
!                     f2 = f2.overloadExactMatch(funcdecl.type);
!                     if (f2 && f2.isFinalFunc() && f2.visible().kind != Visibility.Kind.private_)
!                         .error(funcdecl.loc, "%s `%s` cannot override `final` function `%s`", funcdecl.kind, funcdecl.toPrettyChars, f2.toPrettyChars());
!                 }
!             }
          }
  
!         /* These quirky conditions mimic what happens when virtual
!            inheritance is implemented by producing a virtual base table
!            with offsets to each of the virtual bases.
           */
!         if (target.cpp.splitVBasetable && cd.classKind == ClassKind.cpp &&
!             cd.baseClass && cd.baseClass.vtbl.length)
          {
!             /* if overriding an interface function, then this is not
!              * introducing and don't put it in the class vtbl[]
               */
+             funcdecl.interfaceVirtual = overrideInterface(funcdecl);
+             if (funcdecl.interfaceVirtual)
+             {
+                 //printf("\tinterface function %s\n", toChars());
+                 cd.vtblFinal.push(funcdecl);
+                 goto Linterfaces;
+             }
+         }
  
!         if (funcdecl.isFinalFunc())
!         {
!             // Don't check here, as it may override an interface function
!             //if (isOverride())
!             //    error("is marked as override, but does not override any function");
!             cd.vtblFinal.push(funcdecl);
!         }
!         else
!         {
!             //printf("\tintroducing function %s\n", funcdecl.toChars());
!             funcdecl.isIntroducing = true;
!             if (cd.classKind == ClassKind.cpp && target.cpp.reverseOverloads)
              {
!                 /* Overloaded functions with same name are grouped and in reverse order.
!                  * Search for first function of overload group, and insert
!                  * funcdecl into vtbl[] immediately before it.
!                  */
!                 funcdecl.vtblIndex = cast(int)cd.vtbl.length;
!                 bool found;
!                 foreach (const i, s; cd.vtbl)
                  {
!                     if (found)
!                         // the rest get shifted forward
!                         ++s.isFuncDeclaration().vtblIndex;
!                     else if (s.ident == funcdecl.ident && s.parent == parent)
                      {
!                         // found first function of overload group
!                         funcdecl.vtblIndex = cast(int)i;
!                         found = true;
!                         ++s.isFuncDeclaration().vtblIndex;
                      }
                  }
+                 cd.vtbl.insert(funcdecl.vtblIndex, funcdecl);
+ 
+                 debug foreach (const i, s; cd.vtbl)
+                 {
+                     // a C++ dtor gets its vtblIndex later (and might even be added twice to the vtbl),
+                     // e.g. when compiling druntime with a debug compiler, namely with core.stdcpp.exception.
+                     if (auto fd = s.isFuncDeclaration())
+                         assert(fd.vtblIndex == i ||
+                                (cd.classKind == ClassKind.cpp && fd.isDtorDeclaration) ||
+                                funcdecl.parent.isInterfaceDeclaration); // interface functions can be in multiple vtbls
+                 }
+             }
+             else
+             {
+                 // Append to end of vtbl[]
+                 vi = cast(int)cd.vtbl.length;
+                 cd.vtbl.push(funcdecl);
+                 funcdecl.vtblIndex = vi;
              }
+         }
+         break;
  
!     case -2:
!         // can't determine because of forward references
!         funcdecl.errors = true;
!         return 2;
! 
!     default:
!         {
!             if (vi >= cd.vtbl.length)
              {
!                 /* the derived class cd doesn't have its vtbl[] allocated yet.
!                  * https://issues.dlang.org/show_bug.cgi?id=21008
                   */
!                 .error(funcdecl.loc, "%s `%s` circular reference to class `%s`", funcdecl.kind, funcdecl.toPrettyChars, cd.toChars());
!                 funcdecl.errors = true;
!                 return 2;
              }
+             FuncDeclaration fdv = cd.baseClass.vtbl[vi].isFuncDeclaration();
+             FuncDeclaration fdc = cd.vtbl[vi].isFuncDeclaration();
+             // This function is covariant with fdv
  
!             if (fdc == funcdecl)
              {
!                 doesoverride = true;
!                 break;
              }
! 
!             auto vtf = getFunctionType(fdv);
!             if (vtf.trust > TRUST.system && f.trust == TRUST.system)
!                 .error(funcdecl.loc, "%s `%s` cannot override `@safe` method `%s` with a `@system` attribute", funcdecl.kind, funcdecl.toPrettyChars,
!                                fdv.toPrettyChars);
! 
!             if (fdc.toParent() == parent)
              {
!                 //printf("vi = %d,\tthis = %p %s %s @ [%s]\n\tfdc  = %p %s %s @ [%s]\n\tfdv  = %p %s %s @ [%s]\n",
!                 //        vi, this, this.toChars(), this.type.toChars(), this.loc.toChars(),
!                 //            fdc,  fdc .toChars(), fdc .type.toChars(), fdc .loc.toChars(),
!                 //            fdv,  fdv .toChars(), fdv .type.toChars(), fdv .loc.toChars());
  
!                 // fdc overrides fdv exactly, then this introduces new function.
!                 if (fdc.type.mod == fdv.type.mod && funcdecl.type.mod != fdv.type.mod)
!                     goto Lintro;
!             }
! 
!             if (fdv.isDeprecated && !funcdecl.isDeprecated)
!                 deprecation(funcdecl.loc, "`%s` is overriding the deprecated method `%s`",
!                             funcdecl.toPrettyChars, fdv.toPrettyChars);
! 
!             // This function overrides fdv
!             if (fdv.isFinalFunc())
!                 .error(funcdecl.loc, "%s `%s` cannot override `final` function `%s`", funcdecl.kind, funcdecl.toPrettyChars, fdv.toPrettyChars());
! 
!             if (!funcdecl.isOverride())
!             {
!                 if (fdv.isFuture())
!                 {
!                     deprecation(funcdecl.loc, "method `%s` implicitly overrides `@__future` base class method; rename the former",
!                         funcdecl.toPrettyChars());
!                     deprecationSupplemental(fdv.loc, "base method `%s` defined here",
!                         fdv.toPrettyChars());
!                     // Treat 'this' as an introducing function, giving it a separate hierarchy in the vtbl[]
!                     goto Lintro;
                  }
                  else
                  {
!                     // https://issues.dlang.org/show_bug.cgi?id=17349
!                     error(funcdecl.loc, "cannot implicitly override base class method `%s` with `%s`; add `override` attribute",
!                           fdv.toPrettyChars(), funcdecl.toPrettyChars());
                  }
              }
!             doesoverride = true;
!             if (fdc.toParent() == parent)
              {
!                 // If both are mixins, or both are not, then error.
!                 // If either is not, the one that is not overrides the other.
!                 bool thismixin = funcdecl.parent.isClassDeclaration() !is null;
!                 bool fdcmixin = fdc.parent.isClassDeclaration() !is null;
!                 if (thismixin == fdcmixin)
                  {
!                     .error(funcdecl.loc, "%s `%s` multiple overrides of same function", funcdecl.kind, funcdecl.toPrettyChars);
!                 }
!                 /*
!                  * https://issues.dlang.org/show_bug.cgi?id=711
!                  *
!                  * If an overriding method is introduced through a mixin,
!                  * we need to update the vtbl so that both methods are
!                  * present.
!                  */
!                 else if (thismixin)
!                 {
!                     /* if the mixin introduced the overriding method, then reintroduce it
!                      * in the vtbl. The initial entry for the mixined method
!                      * will be updated at the end of the enclosing `if` block
!                      * to point to the current (non-mixined) function.
                       */
!                     auto vitmp = cast(int)cd.vtbl.length;
!                     cd.vtbl.push(fdc);
!                     fdc.vtblIndex = vitmp;
                  }
!                 else if (fdcmixin)
                  {
!                     /* if the current overriding function is coming from a
!                      * mixined block, then push the current function in the
!                      * vtbl, but keep the previous (non-mixined) function as
!                      * the overriding one.
!                      */
!                     auto vitmp = cast(int)cd.vtbl.length;
!                     cd.vtbl.push(funcdecl);
!                     funcdecl.vtblIndex = vitmp;
                      break;
                  }
!                 else // fdc overrides fdv
                  {
!                     // this doesn't override any function
!                     break;
                  }
+             }
+             cd.vtbl[vi] = funcdecl;
+             funcdecl.vtblIndex = vi;
  
!             /* Remember which functions this overrides
!              */
!             funcdecl.foverrides.push(fdv);
  
!             /* This works by whenever this function is called,
!              * it actually returns tintro, which gets dynamically
!              * cast to type. But we know that tintro is a base
!              * of type, so we could optimize it by not doing a
!              * dynamic cast, but just subtracting the isBaseOf()
!              * offset if the value is != null.
!              */
  
!             if (fdv.tintro)
!                 funcdecl.tintro = fdv.tintro;
!             else if (!funcdecl.type.equals(fdv.type))
!             {
!                 auto tnext = funcdecl.type.nextOf();
!                 if (auto handle = tnext.isClassHandle())
                  {
!                     if (handle.semanticRun < PASS.semanticdone && !handle.isBaseInfoComplete())
!                         handle.dsymbolSemantic(null);
                  }
!                 /* Only need to have a tintro if the vptr
!                  * offsets differ
                   */
!                 int offset;
!                 if (fdv.type.nextOf().isBaseOf(tnext, &offset))
                  {
!                     funcdecl.tintro = fdv.type;
                  }
              }
+             break;
          }
+     }
  
!     /* Go through all the interface bases.
!      * If this function is covariant with any members of those interface
!      * functions, set the tintro.
!      */
! Linterfaces:
!     bool foundVtblMatch = false;
  
!     for (ClassDeclaration bcd = cd; !foundVtblMatch && bcd; bcd = bcd.baseClass)
!     {
!         foreach (b; bcd.interfaces)
          {
!             vi = findVtblIndex(funcdecl, b.sym.vtbl[]);
!             switch (vi)
              {
!             case -1:
!                 break;
  
!             case -2:
!                 // can't determine because of forward references
!                 funcdecl.errors = true;
!                 return 2;
  
!             default:
!                 {
!                     auto fdv = cast(FuncDeclaration)b.sym.vtbl[vi];
!                     Type ti = null;
  
!                     foundVtblMatch = true;
  
!                     /* Remember which functions this overrides
!                      */
!                     funcdecl.foverrides.push(fdv);
  
!                     if (fdv.tintro)
!                         ti = fdv.tintro;
!                     else if (!funcdecl.type.equals(fdv.type))
!                     {
!                         /* Only need to have a tintro if the vptr
!                          * offsets differ
!                          */
!                         int offset;
!                         if (fdv.type.nextOf().isBaseOf(funcdecl.type.nextOf(), &offset))
                          {
!                             ti = fdv.type;
                          }
!                     }
!                     if (ti)
!                     {
!                         if (funcdecl.tintro)
                          {
!                             if (!funcdecl.tintro.nextOf().equals(ti.nextOf()) && !funcdecl.tintro.nextOf().isBaseOf(ti.nextOf(), null) && !ti.nextOf().isBaseOf(funcdecl.tintro.nextOf(), null))
                              {
!                                 .error(funcdecl.loc, "%s `%s` incompatible covariant types `%s` and `%s`", funcdecl.kind, funcdecl.toPrettyChars, funcdecl.tintro.toChars(), ti.toChars());
                              }
                          }
+                         else
+                         {
+                             funcdecl.tintro = ti;
+                         }
                      }
                  }
              }
          }
!     }
!     if (foundVtblMatch)
!     {
!         goto L2;
!     }
! 
!     if (!doesoverride && funcdecl.isOverride() && (funcdecl.type.nextOf() || !may_override))
!     {
!         BaseClass* bc = null;
!         Dsymbol s = null;
!         for (size_t i = 0; i < cd.baseclasses.length; i++)
          {
!             bc = (*cd.baseclasses)[i];
!             s = bc.sym.search_correct(funcdecl.ident);
!             if (s)
!                 break;
          }
  
!         if (s)
          {
!             HdrGenState hgs;
!             OutBuffer buf;
  
!             auto fd = s.isFuncDeclaration();
!             functionToBufferFull(cast(TypeFunction)(funcdecl.type), buf,
!                 new Identifier(funcdecl.toPrettyChars()), hgs, null);
!             const(char)* funcdeclToChars = buf.peekChars();
! 
!             if (fd)
              {
!                 OutBuffer buf1;
  
!                 if (fd.ident == funcdecl.ident)
!                     hgs.fullQual = true;
  
!                 // https://issues.dlang.org/show_bug.cgi?id=23745
!                 // If the potentially overridden function contains errors,
!                 // inform the user to fix that one first
!                 if (fd.errors)
                  {
!                     error(funcdecl.loc, "function `%s` does not override any function, did you mean to override `%s`?",
!                         funcdecl.toChars(), fd.toPrettyChars());
!                     errorSupplemental(fd.loc, "Function `%s` contains errors in its declaration, therefore it cannot be correctly overridden",
!                         fd.toPrettyChars());
!                 }
!                 else if (fd.isFinalFunc())
!                 {
!                     // When trying to override a final method, don't suggest it as a candidate(Issue #19613)
!                     .error(funcdecl.loc, "%s `%s` does not override any function", funcdecl.kind, funcdecl.toPrettyChars);
  
!                     // Look for a non-final method with the same name to suggest as an alternative
!                     auto cdparent = fd.parent ? fd.parent.isClassDeclaration() : null;
!                     if (cdparent)
                      {
!                         Dsymbol nonFinalAlt = null;
  
!                         auto overloadableSyms = cdparent.symtab.lookup(fd.ident);
!                         if (overloadableSyms)
!                         {
!                             // Check each overload to find one that's not final
!                             overloadApply(overloadableSyms, (Dsymbol s)
!                             {
!                                 if (auto funcAlt = s.isFuncDeclaration())
!                                 {
!                                     if (funcAlt != fd && !funcAlt.isFinalFunc())
!                                     {
!                                         nonFinalAlt = funcAlt;
!                                         return 1;
!                                     }
!                                 }
!                                 return 0;
!                             });
! 
!                             // Provide a helpful suggestion if we found a viable alternative
!                             if (nonFinalAlt)
!                             {
!                                 auto funcAlt = nonFinalAlt.isFuncDeclaration();
!                                 OutBuffer buf2;
!                                 functionToBufferFull(cast(TypeFunction)(funcAlt.type), buf2,
!                                     new Identifier(funcAlt.toPrettyChars()), hgs, null);
!                                 errorSupplemental(funcdecl.loc, "Did you mean to override `%s`?", buf2.peekChars());
!                             }
!                         }
!                     }
                  }
                  else
                  {
!                     functionToBufferFull(cast(TypeFunction)(fd.type), buf1,
!                         new Identifier(fd.toPrettyChars()), hgs, null);
  
!                     error(funcdecl.loc, "function `%s` does not override any function, did you mean to override `%s`?",
!                         funcdeclToChars, buf1.peekChars());
  
!                     // Supplemental error for parameter scope differences
!                     auto tf1 = cast(TypeFunction)funcdecl.type;
!                     auto tf2 = cast(TypeFunction)fd.type;
  
!                     if (tf1 && tf2)
!                     {
!                         auto params1 = tf1.parameterList;
!                         auto params2 = tf2.parameterList;
  
!                         if (params1.length == params2.length)
!                         {
!                             bool hasScopeDifference = false;
  
!                             for (size_t i = 0; i < params1.length; i++)
!                             {
!                                 auto p1 = params1[i];
!                                 auto p2 = params2[i];
  
!                                 if ((p1.storageClass & STC.scope_) == (p2.storageClass & STC.scope_))
!                                     continue;
  
!                                 if (!(p2.storageClass & STC.scope_))
!                                     continue;
  
!                                 if (!hasScopeDifference)
!                                 {
!                                     // Intended signature
!                                     errorSupplemental(funcdecl.loc, "Did you intend to override:");
!                                     errorSupplemental(funcdecl.loc, "`%s`", buf1.peekChars());
!                                     hasScopeDifference = true;
!                                 }
!                                 errorSupplemental(funcdecl.loc, "Parameter %d is missing `scope`",
!                                 cast(int)(i + 1));
!                             }
!                         }
!                     }
!                }
              }
!             else
              {
!                 error(funcdecl.loc, "function `%s` does not override any function, did you mean to override %s `%s`?",
!                     funcdeclToChars, s.kind, s.toPrettyChars());
!                 errorSupplemental(funcdecl.loc, "Functions are the only declarations that may be overridden");
              }
          }
+         else
+             .error(funcdecl.loc, "%s `%s` does not override any function", funcdecl.kind, funcdecl.toPrettyChars);
      }
  
! L2:
!     objc.setSelector(funcdecl, sc);
!     objc.checkLinkage(funcdecl);
!     objc.addToClassMethodList(funcdecl, cd);
!     objc.setAsOptional(funcdecl, sc);
  
!     /* Go through all the interface bases.
!      * Disallow overriding any final functions in the interface(s).
       */
!     foreach (b; cd.interfaces)
      {
!         if (b.sym)
          {
!             if (auto s = search_function(b.sym, funcdecl.ident))
!             {
!                 if (auto f2 = s.isFuncDeclaration())
!                 {
!                     f2 = f2.overloadExactMatch(funcdecl.type);
!                     if (f2 && f2.isFinalFunc() && f2.visible().kind != Visibility.Kind.private_)
!                         .error(funcdecl.loc, "%s `%s` cannot override `final` function `%s.%s`", funcdecl.kind, funcdecl.toPrettyChars, b.sym.toChars(), f2.toPrettyChars());
!                 }
!             }
          }
      }
  
!     if (funcdecl.isOverride)
      {
!         if (funcdecl.storage_class & STC.disable)
!             deprecation(funcdecl.loc,
!                         "`%s` cannot be annotated with `@disable` because it is overriding a function in the base class",
!                         funcdecl.toPrettyChars);
  
!         if (funcdecl.isDeprecated && !(funcdecl.foverrides.length && funcdecl.foverrides[0].isDeprecated))
!             deprecation(funcdecl.loc,
!                         "`%s` cannot be marked as `deprecated` because it is overriding a function in the base class",
!                         funcdecl.toPrettyChars);
      }
+     return 0;
+ }
  
! private TypeFunction getFunctionType(FuncDeclaration fd)
! {
!     if (auto tf = fd.type.isTypeFunction())
!         return tf;
  
!     if (!fd.type.isTypeError())
      {
!         .error(fd.loc, "%s `%s` `%s` must be a function instead of `%s`", fd.kind, fd.toPrettyChars, fd.toChars(), fd.type.toChars());
!         fd.type = Type.terror;
      }
+     fd.errors = true;
+     return null;
  }
  
  /*****************************************
*************** bool functionSemantic3(FuncDeclaration f
*** 1260,1266 ****
              return false;
      }
  
!     return !fd.errors && !fd.hasSemantic3Errors();
  }
  
  // called from semantic3
--- 1391,1397 ----
              return false;
      }
  
!     return !fd.errors && !fd.hasSemantic3Errors;
  }
  
  // called from semantic3
*************** int findVtblIndex(FuncDeclaration fd, Ds
*** 1451,1457 ****
                               fdv.toPrettyChars(), fdv.type.toTypeFunction().parameterList.parametersTypeToChars(),
                                fd.toPrettyChars(),  fd.type.toTypeFunction().parameterList.parametersTypeToChars(), fd.type.modToChars());
  
!                 const char* where = fd.type.isNaked() ? "parameters" : "type";
                  deprecationSupplemental(fd.loc, "Either remove `override`, or adjust the `const` qualifiers of the "
                                          ~ "overriding function %s", where);
              }
--- 1582,1588 ----
                               fdv.toPrettyChars(), fdv.type.toTypeFunction().parameterList.parametersTypeToChars(),
                                fd.toPrettyChars(),  fd.type.toTypeFunction().parameterList.parametersTypeToChars(), fd.type.modToChars());
  
!                 const char* where = fd.type.isNaked ? "parameters" : "type";
                  deprecationSupplemental(fd.loc, "Either remove `override`, or adjust the `const` qualifiers of the "
                                          ~ "overriding function %s", where);
              }
*************** FuncDeclaration resolveFuncCall(Loc loc,
*** 1657,1669 ****
              if (!od && !td.overnext)
              {
                  .error(loc, "%s `%s` is not callable using argument types `!(%s)%s`",
!                    td.kind(), td.ident.toChars(), tiargsBuf.peekChars(), fargsBuf.peekChars());
              }
              else
              {
                  .error(loc, "none of the overloads of %s `%s.%s` are callable using argument types `!(%s)%s`",
!                    td.kind(), td.parent.toPrettyChars(), td.ident.toChars(),
!                    tiargsBuf.peekChars(), fargsBuf.peekChars());
              }
  
  
--- 1788,1804 ----
              if (!od && !td.overnext)
              {
                  .error(loc, "%s `%s` is not callable using argument types `!(%s)%s`",
!                     td.kind(), td.ident.toChars(), tiargsBuf.peekChars(), fargsBuf.peekChars());
! 
!                 checkNamedArgErrorAndReport(td, argumentList, loc);
              }
              else
              {
                  .error(loc, "none of the overloads of %s `%s.%s` are callable using argument types `!(%s)%s`",
!                     td.kind(), td.parent.toPrettyChars(), td.ident.toChars(),
!                     tiargsBuf.peekChars(), fargsBuf.peekChars());
! 
!                 checkNamedArgErrorAndReport(td, argumentList, loc);
              }
  
  
*************** FuncDeclaration resolveFuncCall(Loc loc,
*** 1683,1689 ****
      if (od)
      {
          .error(loc, "none of the overloads of `%s` are callable using argument types `!(%s)%s`",
!                od.ident.toChars(), tiargsBuf.peekChars(), fargsBuf.peekChars());
          if (!global.gag || global.params.v.showGaggedErrors)
              printCandidates(loc, od, sc.isDeprecated());
          return null;
--- 1818,1826 ----
      if (od)
      {
          .error(loc, "none of the overloads of `%s` are callable using argument types `!(%s)%s`",
!             od.ident.toChars(), tiargsBuf.peekChars(), fargsBuf.peekChars());
! 
!         checkNamedArgErrorAndReportOverload(od, argumentList, loc);
          if (!global.gag || global.params.v.showGaggedErrors)
              printCandidates(loc, od, sc.isDeprecated());
          return null;
*************** FuncDeclaration resolveFuncCall(Loc loc,
*** 1713,1720 ****
              OutBuffer buf;
              buf.argExpTypesToCBuffer(fargs);
              if (fd.isCtorDeclaration())
!                 .error(loc, "none of the overloads of `%s` can construct a %sobject with argument types `(%s)`",
!                     fd.toChars(), thisBuf.peekChars(), buf.peekChars());
              else
                  .error(loc, "none of the overloads of `%s` are callable using a %sobject with argument types `(%s)`",
                      fd.toChars(), thisBuf.peekChars(), buf.peekChars());
--- 1850,1863 ----
              OutBuffer buf;
              buf.argExpTypesToCBuffer(fargs);
              if (fd.isCtorDeclaration())
!             {
!                 if (tthis.mod & MODFlags.immutable_)
!                     .error(loc, "none of the overloads of `%s` can construct an immutable object with argument types `(%s)`. Expected `immutable(%s)`",
!                         fd.toChars(), buf.peekChars(), buf.peekChars());
!                 else
!                     .error(loc, "none of the overloads of `%s` can construct a %sobject with argument types `(%s)`",
!                         fd.toChars(), thisBuf.peekChars(), buf.peekChars());
!             }
              else
                  .error(loc, "none of the overloads of `%s` are callable using a %sobject with argument types `(%s)`",
                      fd.toChars(), thisBuf.peekChars(), buf.peekChars());
*************** FuncDeclaration resolveFuncCall(Loc loc,
*** 1782,1791 ****
                      functionResolve(mErr, baseFunction, loc, sc, tiargs, baseClass.type, argumentList);
                      if (mErr.last > MATCH.nomatch && mErr.lastf)
                      {
!                         errorSupplemental(loc, "%s `%s` hides base class function `%s`",
!                                 fd.kind, fd.toPrettyChars(), mErr.lastf.toPrettyChars());
!                         errorSupplemental(loc, "add `alias %s = %s` to `%s`'s body to merge the overload sets",
!                                 fd.toChars(), mErr.lastf.toPrettyChars(), tthis.toChars());
                          return null;
                      }
                  }
--- 1925,1939 ----
                      functionResolve(mErr, baseFunction, loc, sc, tiargs, baseClass.type, argumentList);
                      if (mErr.last > MATCH.nomatch && mErr.lastf)
                      {
!                         errorSupplemental(loc, "Note: %s `%s` hides base class %s `%s`",
!                             fd.kind, fd.toPrettyChars(),
!                             mErr.lastf.kind, mErr.lastf.toPrettyChars());
! 
!                         if (!fd.isCtorDeclaration)
!                         {
!                             errorSupplemental(loc, "Add `alias %s = %s;` to `%s`'s body to merge the overload sets",
!                                     fd.toChars(), mErr.lastf.toPrettyChars(), tthis.toChars());
!                         }
                          return null;
                      }
                  }
*************** FuncDeclaration resolveFuncCall(Loc loc,
*** 1803,1808 ****
--- 1951,2012 ----
      return null;
  }
  
+ /********************************************************
+  * Check for named argument errors in template declarations and report them.
+  * Params:
+  *      td = template declaration to check
+  *      argumentList = arguments to check
+  *      loc = location for error reporting
+  */
+ private void checkNamedArgErrorAndReport(TemplateDeclaration td, ArgumentList argumentList, Loc loc)
+ {
+     if (!argumentList.hasArgNames())
+         return;
+ 
+     auto tf = td.onemember ? td.onemember.isFuncDeclaration() : null;
+     if (tf && tf.type && tf.type.ty == Tfunction)
+     {
+         OutBuffer buf;
+         auto resolvedArgs = tf.type.isTypeFunction().resolveNamedArgs(argumentList, &buf);
+         if (!resolvedArgs && buf.length)
+             .errorSupplemental(loc, "%s", buf.peekChars());
+     }
+ }
+ 
+ /******************************************
+  * Check for named argument errors in overload sets and report them.
+  * Params:
+  *      od = overload declaration to check
+  *      argumentList = arguments to check
+  *      loc = location for error report
+  */
+ private void checkNamedArgErrorAndReportOverload(Dsymbol od, ArgumentList argumentList, Loc loc)
+ {
+     if (!argumentList.hasArgNames())
+         return;
+ 
+     FuncDeclaration tf = null;
+     overloadApply(od, (Dsymbol s) {
+         if (!tf)
+         {
+             if (auto fd = s.isFuncDeclaration())
+                 tf = fd;
+             else if (auto td = s.isTemplateDeclaration())
+                 if (td.onemember)
+                     tf = td.onemember.isFuncDeclaration();
+         }
+         return 0;
+     });
+ 
+     if (tf && tf.type && tf.type.ty == Tfunction)
+     {
+         OutBuffer buf;
+         auto resolvedArgs = tf.type.isTypeFunction().resolveNamedArgs(argumentList, &buf);
+         if (!resolvedArgs && buf.length)
+             .errorSupplemental(loc, "%s", buf.peekChars());
+     }
+ }
+ 
  /*******************************************
   * Prints template and function overload candidates as supplemental errors.
   * Params:
*************** int overrides(FuncDeclaration fd1, FuncD
*** 2050,2065 ****
   * Params:
   *  f = first function
   *  g = second function
!  *  names = names of parameters
   * Returns:
   *      match   'this' is at least as specialized as g
   *      0       g is more specialized than 'this'
   */
! MATCH leastAsSpecialized(FuncDeclaration f, FuncDeclaration g, Identifiers* names)
  {
      enum LOG_LEASTAS = 0;
      static if (LOG_LEASTAS)
      {
          import core.stdc.stdio : printf;
          printf("leastAsSpecialized(%s, %s, %s)\n", f.toChars(), g.toChars(), names ? names.toChars() : "null");
          printf("%s, %s\n", f.type.toChars(), g.type.toChars());
--- 2254,2270 ----
   * Params:
   *  f = first function
   *  g = second function
!  *  names = argument Labels of parameters(name and location of the name)
   * Returns:
   *      match   'this' is at least as specialized as g
   *      0       g is more specialized than 'this'
   */
! MATCH leastAsSpecialized(FuncDeclaration f, FuncDeclaration g, ArgumentLabels* names)
  {
      enum LOG_LEASTAS = 0;
      static if (LOG_LEASTAS)
      {
+         Identifiers *names = extractNames(names);
          import core.stdc.stdio : printf;
          printf("leastAsSpecialized(%s, %s, %s)\n", f.toChars(), g.toChars(), names ? names.toChars() : "null");
          printf("%s, %s\n", f.type.toChars(), g.type.toChars());
*************** int getLevelAndCheck(FuncDeclaration fd,
*** 2276,2282 ****
   * Returns:
   *  true if can
   */
! bool canInferAttributes(FuncDeclaration fd, Scope* sc)
  {
      if (!fd.fbody)
          return false;
--- 2481,2487 ----
   * Returns:
   *  true if can
   */
! private bool canInferAttributes(FuncDeclaration fd, Scope* sc)
  {
      if (!fd.fbody)
          return false;
*************** bool canInferAttributes(FuncDeclaration
*** 2307,2396 ****
      return false;
  }
  
- /*********************************************
-  * In the current function 'sc.func', we are calling 'fd'.
-  * 1. Check to see if the current function can call 'fd' , issue error if not.
-  * 2. If the current function is not the parent of 'fd' , then add
-  *    the current function to the list of siblings of 'fd' .
-  * 3. If the current function is a literal, and it's accessing an uplevel scope,
-  *    then mark it as a delegate.
-  * Returns true if error occurs.
-  */
- bool checkNestedFuncReference(FuncDeclaration fd, Scope* sc, Loc loc)
- {
-     //printf("FuncDeclaration::checkNestedFuncReference() %s\n", toPrettyChars());
-     if (auto fld = fd.isFuncLiteralDeclaration())
-     {
-         if (fld.tok == TOK.reserved)
-         {
-             fld.tok = TOK.function_;
-             fld.vthis = null;
-         }
-     }
-     if (!fd.parent || fd.parent == sc.parent)
-         return false;
-     if (fd.ident == Id.require || fd.ident == Id.ensure)
-         return false;
-     if (!fd.isThis() && !fd.isNested())
-         return false;
-     // The current function
-     FuncDeclaration fdthis = sc.parent.isFuncDeclaration();
-     if (!fdthis)
-         return false; // out of function scope
-     Dsymbol p = fd.toParentLocal();
-     Dsymbol p2 = fd.toParent2();
-     // Function literals from fdthis to p must be delegates
-     ensureStaticLinkTo(fdthis, p);
-     if (p != p2)
-         ensureStaticLinkTo(fdthis, p2);
-     if (!fd.isNested())
-         return false;
- 
-     // The function that this function is in
-     bool checkEnclosing(FuncDeclaration fdv)
-     {
-         if (!fdv)
-             return false;
-         if (fdv == fdthis)
-             return false;
-         //printf("this = %s in [%s]\n", this.toChars(), this.loc.toChars());
-         //printf("fdv  = %s in [%s]\n", fdv .toChars(), fdv .loc.toChars());
-         //printf("fdthis = %s in [%s]\n", fdthis.toChars(), fdthis.loc.toChars());
-         // Add this function to the list of those which called us
-         if (fdthis != fd)
-         {
-             bool found = false;
-             for (size_t i = 0; i < fd.siblingCallers.length; ++i)
-             {
-                 if (fd.siblingCallers[i] == fdthis)
-                     found = true;
-             }
-             if (!found)
-             {
-                 //printf("\tadding sibling %s to %s\n", fdthis.toPrettyChars(), toPrettyChars());
-                 if (!sc.intypeof && !sc.traitsCompiles)
-                 {
-                     fd.siblingCallers.push(fdthis);
-                     fd.computedEscapingSiblings = false;
-                 }
-             }
-         }
-         const lv = fdthis.getLevelAndCheck(loc, sc, fdv, fd);
-         if (lv == fd.LevelError)
-             return true; // error
-         if (lv == -1)
-             return false; // downlevel call
-         if (lv == 0)
-             return false; // same level call
-         return false; // Uplevel call
-     }
-     if (checkEnclosing(p.isFuncDeclaration()))
-         return true;
-     if (checkEnclosing(p == p2 ? null : p2.isFuncDeclaration()))
-         return true;
-     return false;
- }
- 
  /****************************************************
   * Check whether result variable can be built.
   * Returns:
--- 2512,2517 ----
*************** Statement mergeFrequire(FuncDeclaration
*** 2484,2491 ****
          Statement s2 = new ExpStatement(fd.loc, e);
          auto c = new Catch(fd.loc, getThrowable(), null, sf);
          c.internalCatch = true;
!         auto catches = new Catches();
!         catches.push(c);
          sf = new TryCatchStatement(fd.loc, s2, catches);
      }
      return sf;
--- 2605,2611 ----
          Statement s2 = new ExpStatement(fd.loc, e);
          auto c = new Catch(fd.loc, getThrowable(), null, sf);
          c.internalCatch = true;
!         auto catches = new Catches(c);
          sf = new TryCatchStatement(fd.loc, s2, catches);
      }
      return sf;
*************** Statement mergeFrequireInclusivePreview(
*** 2548,2555 ****
          Statement s3 = new CompoundStatement(loc, s2, fail);
          auto c = new Catch(loc, getThrowable(), id, s3);
          c.internalCatch = true;
!         auto catches = new Catches();
!         catches.push(c);
          sf = new TryCatchStatement(loc, sf, catches);
      }
      return sf;
--- 2668,2674 ----
          Statement s3 = new CompoundStatement(loc, s2, fail);
          auto c = new Catch(loc, getThrowable(), id, s3);
          c.internalCatch = true;
!         auto catches = new Catches(c);
          sf = new TryCatchStatement(loc, sf, catches);
      }
      return sf;
*************** extern (D) void checkMain(FuncDeclaratio
*** 2984,2990 ****
  extern (D) bool checkNRVO(FuncDeclaration fd)
  {
      //printf("checkNRVO*() %s\n", fd.ident.toChars());
!     if (!fd.isNRVO() || fd.returns is null)
          return false;
  
      auto tf = fd.type.toTypeFunction();
--- 3103,3109 ----
  extern (D) bool checkNRVO(FuncDeclaration fd)
  {
      //printf("checkNRVO*() %s\n", fd.ident.toChars());
!     if (!fd.isNRVO || fd.returns is null)
          return false;
  
      auto tf = fd.type.toTypeFunction();
*************** extern (D) PURE isPureBypassingInference
*** 3130,3136 ****
   * Returns:
   *      true if reference to `tb` is isolated from reference to `ta`
   */
! bool traverseIndirections(Type ta, Type tb)
  {
      //printf("traverseIndirections(%s, %s)\n", ta.toChars(), tb.toChars());
  
--- 3249,3255 ----
   * Returns:
   *      true if reference to `tb` is isolated from reference to `ta`
   */
! private bool traverseIndirections(Type ta, Type tb)
  {
      //printf("traverseIndirections(%s, %s)\n", ta.toChars(), tb.toChars());
  
*************** bool traverseIndirections(Type ta, Type
*** 3221,3227 ****
   *    which could have come from the function's parameters, mutable
   *    globals, or uplevel functions.
   */
! bool isTypeIsolatedIndirect(FuncDeclaration fd, Type t)
  {
      //printf("isTypeIsolatedIndirect(t: %s)\n", t.toChars());
      assert(t);
--- 3340,3346 ----
   *    which could have come from the function's parameters, mutable
   *    globals, or uplevel functions.
   */
! private bool isTypeIsolatedIndirect(FuncDeclaration fd, Type t)
  {
      //printf("isTypeIsolatedIndirect(t: %s)\n", t.toChars());
      assert(t);
*************** extern (D) int overloadApply(Dsymbol fst
*** 3566,3568 ****
--- 3685,3814 ----
      }
      return overloadApplyRecurse(fstart, dg, sc);
  }
+ 
+ Dsymbol isUnique(OverDeclaration od)
+ {
+     Dsymbol result = null;
+     overloadApply(od.aliassym, (Dsymbol s)
+     {
+         if (result)
+         {
+             result = null;
+             return 1; // ambiguous, done
+         }
+         else
+         {
+             result = s;
+             return 0;
+         }
+     });
+     return result;
+ }
+ 
+ /************************************
+ * Check to see if this variable is actually in an enclosing function
+ * rather than the current one.
+ * Update nestedrefs[], closureVars[] and outerVars[].
+ * Returns: true if error occurs.
+ */
+ extern (D) bool checkNestedReference(VarDeclaration vd, Scope* sc, Loc loc)
+ {
+     //printf("VarDeclaration::checkNestedReference() %s\n", toChars());
+     if (sc.intypeof == 1 || sc.ctfe)
+         return false;
+     if (!vd.parent || vd.parent == sc.parent)
+         return false;
+     if (vd.isDataseg() || (vd.storage_class & STC.manifest))
+         return false;
+ 
+     // The current function
+     FuncDeclaration fdthis = sc.parent.isFuncDeclaration();
+     if (!fdthis)
+         return false; // out of function scope
+ 
+     Dsymbol p = vd.toParent2();
+ 
+     // Function literals from fdthis to p must be delegates
+     ensureStaticLinkTo(fdthis, p);
+ 
+     // The function that this variable is in
+     FuncDeclaration fdv = p.isFuncDeclaration();
+     if (!fdv || fdv == fdthis)
+         return false;
+ 
+     // Add fdthis to nestedrefs[] if not already there
+     if (!vd.nestedrefs.contains(fdthis))
+         vd.nestedrefs.push(fdthis);
+ 
+     //printf("\tfdv = %s\n", fdv.toChars());
+     //printf("\tfdthis = %s\n", fdthis.toChars());
+     if (loc.isValid())
+     {
+         if (fdthis.getLevelAndCheck(loc, sc, fdv, vd) == fdthis.LevelError)
+             return true;
+     }
+ 
+     // Add this VarDeclaration to fdv.closureVars[] if not already there
+     if (!sc.intypeof && !sc.traitsCompiles &&
+         // https://issues.dlang.org/show_bug.cgi?id=17605
+         (fdv.skipCodegen || !fdthis.skipCodegen))
+     {
+         if (!fdv.closureVars.contains(vd))
+             fdv.closureVars.push(vd);
+     }
+ 
+     if (!fdthis.outerVars.contains(vd))
+         fdthis.outerVars.push(vd);
+ 
+     //printf("fdthis is %s\n", fdthis.toChars());
+     //printf("var %s in function %s is nested ref\n", toChars(), fdv.toChars());
+     // __dollar creates problems because it isn't a real variable
+     // https://issues.dlang.org/show_bug.cgi?id=3326
+     if (vd.ident == Id.dollar)
+     {
+         .error(loc, "cannnot use `$` inside a function literal");
+         return true;
+     }
+     if (vd.ident == Id.withSym) // https://issues.dlang.org/show_bug.cgi?id=1759
+     {
+         ExpInitializer ez = vd._init.isExpInitializer();
+         assert(ez);
+         Expression e = ez.exp;
+         if (e.op == EXP.construct || e.op == EXP.blit)
+             e = (cast(AssignExp)e).e2;
+         return lambdaCheckForNestedRef(e, sc);
+     }
+ 
+     return false;
+ }
+ 
+ /**********************
+  * Check to see if array bounds checking code has to be generated
+  *
+  * Params:
+  *  fd = function for which code is to be generated
+  * Returns:
+  *  true if do array bounds checking for the given function
+  */
+ bool arrayBoundsCheck(FuncDeclaration fd)
+ {
+     final switch (global.params.useArrayBounds)
+     {
+     case CHECKENABLE.off:
+         return false;
+     case CHECKENABLE.on:
+         return true;
+     case CHECKENABLE.safeonly:
+         {
+             if (fd)
+             {
+                 Type t = fd.type;
+                 if (t.ty == Tfunction && (cast(TypeFunction)t).trust == TRUST.safe)
+                     return true;
+             }
+             return false;
+         }
+     case CHECKENABLE._default:
+         assert(0);
+     }
+ }
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/globals.d gcc-16-20260201/gcc/d/dmd/globals.d
*** gcc-16-20260125/gcc/d/dmd/globals.d	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/globals.d	Sun Feb  1 22:32:07 2026
*************** extern(C++) struct Verbose
*** 154,159 ****
--- 154,160 ----
  
  extern (C++) struct ImportPathInfo {
      const(char)* path; // char*'s of where to look for import modules
+     bool isOutOfBinary; // Will any module found from this path be out of binary?
  }
  
  /// Put command line switches in here
*************** extern (C++) struct Param
*** 189,194 ****
--- 190,200 ----
      Help help;
      Verbose v;
  
+     // Editions
+     Edition edition;             // edition year
+     Edition[const(char)*] editionFiles; // Edition corresponding to a filespec
+ 
+ 
      // Options for `-preview=/-revert=`
      FeatureState useDIP25 = FeatureState.enabled; // implement https://wiki.dlang.org/DIP25
      FeatureState useDIP1000;     // implement https://dlang.org/spec/memory-safe-d.html#scope-return-params
*************** enum hdr_ext  = "di";       // for D 'he
*** 284,289 ****
--- 290,296 ----
  enum json_ext = "json";     // for JSON files
  enum map_ext  = "map";      // for .map files
  enum c_ext    = "c";        // for C source files
+ enum h_ext    = "h";        // for C header source files
  enum i_ext    = "i";        // for preprocessed C source file
  
  /**
*************** extern (C++) struct Global
*** 386,398 ****
          errorSinkNull = new ErrorSinkNull;
  
          this.fileManager = new FileManager();
          version (MARS)
          {
              compileEnv.vendor = "Digital Mars D";
- 
-             // -color=auto is the default value
-             import dmd.console : detectTerminal, detectColorPreference;
-             params.v.color = detectTerminal() && detectColorPreference();
          }
          else version (IN_GCC)
          {
--- 393,402 ----
          errorSinkNull = new ErrorSinkNull;
  
          this.fileManager = new FileManager();
+ 
          version (MARS)
          {
              compileEnv.vendor = "Digital Mars D";
          }
          else version (IN_GCC)
          {
*************** extern (C++) struct Global
*** 401,412 ****
          else version (IN_LLVM)
          {
              compileEnv.vendor = "LDC";
- 
-             import dmd.console : detectTerminal;
-             params.v.color = detectTerminal();
          }
  
-         params.v.errorPrintMode = ErrorPrintMode.printErrorContext; // Enable error context globally by default
          compileEnv.versionNumber = parseVersionNumber(versionString());
  
          /* Initialize date, time, and timestamp
--- 405,414 ----
          else version (IN_LLVM)
          {
              compileEnv.vendor = "LDC";
          }
+         else
+             static assert(0, "unknown vendor");
  
          compileEnv.versionNumber = parseVersionNumber(versionString());
  
          /* Initialize date, time, and timestamp
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/globals.h gcc-16-20260201/gcc/d/dmd/globals.h
*** gcc-16-20260125/gcc/d/dmd/globals.h	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/globals.h	Sun Feb  1 22:32:07 2026
***************
*** 1,4 ****
- 
  /* Compiler implementation of the D programming language
   * Copyright (C) 1999-2025 by The D Language Foundation, All Rights Reserved
   * written by Walter Bright
--- 1,3 ----
*************** struct Verbose
*** 159,167 ****
  struct ImportPathInfo
  {
      const char* path;
  
!     ImportPathInfo() : path(NULL) { }
!     ImportPathInfo(const char* p) : path(p) { }
  };
  
  // Put command line switches in here
--- 158,174 ----
  struct ImportPathInfo
  {
      const char* path;
+     d_bool isOutOfBinary;
  
!     ImportPathInfo() :
!         path(),
!         isOutOfBinary()
!     {
!     }
!     ImportPathInfo(const char* path, d_bool isOutOfBinary = false) :
!         path(path),
!         isOutOfBinary(isOutOfBinary)
!         {}
  };
  
  // Put command line switches in here
*************** struct Param
*** 196,201 ****
--- 203,211 ----
      Help help;
      Verbose v;
  
+     unsigned short edition;      // edition year
+     void* editionFiles;          // Edition corresponding to a filespec
+ 
      // Options for `-preview=/-revert=`
      FeatureState useDIP25;       // implement https://wiki.dlang.org/DIP25
      FeatureState useDIP1000;     // implement https://dlang.org/spec/memory-safe-d.html#scope-return-params
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/gluelayer.d gcc-16-20260201/gcc/d/dmd/gluelayer.d
*** gcc-16-20260125/gcc/d/dmd/gluelayer.d	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/gluelayer.d	Thu Jan  1 00:00:00 1970
***************
*** 1,59 ****
- /**
-  * Declarations for back-end functions that the front-end invokes.
-  *
-  * This 'glues' either the DMC or GCC back-end to the front-end.
-  *
-  * Copyright:   Copyright (C) 1999-2025 by The D Language Foundation, All Rights Reserved
-  * Authors:     $(LINK2 https://www.digitalmars.com, Walter Bright)
-  * License:     $(LINK2 https://www.boost.org/LICENSE_1_0.txt, Boost License 1.0)
-  * Source:      $(LINK2 https://github.com/dlang/dmd/blob/master/compiler/src/dmd/gluelayer.d, _gluelayer.d)
-  * Documentation:  https://dlang.org/phobos/dmd_gluelayer.html
-  * Coverage:    https://codecov.io/gh/dlang/dmd/src/master/compiler/src/dmd/gluelayer.d
-  */
- 
- module dmd.gluelayer;
- 
- import dmd.dmodule;
- import dmd.dscope;
- import dmd.dsymbol;
- import dmd.mtype;
- import dmd.statement;
- import dmd.root.file;
- 
- version (NoBackend)
- {
-     struct Symbol;
-     struct code;
-     struct block;
-     struct BlockState;
-     struct elem;
-     struct TYPE;
-     alias type = TYPE;
- 
-     extern(C++) abstract class ObjcGlue
-     {
-         static void initialize() {}
-     }
- }
- else version (IN_GCC)
- {
-     extern (C++) union tree_node;
- 
-     alias Symbol = tree_node;
-     alias code = tree_node;
-     alias type = tree_node;
- 
-     // stubs
-     extern(C++) abstract class ObjcGlue
-     {
-         static void initialize() {}
-     }
- }
- else
- {
-     public import dmd.backend.cc : block, BlockState, Symbol;
-     public import dmd.backend.type : type;
-     public import dmd.backend.el : elem;
-     public import dmd.backend.x86.code_x86 : code;
-     public import dmd.objc_glue : ObjcGlue;
- }
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/hdrgen.d gcc-16-20260201/gcc/d/dmd/hdrgen.d
*** gcc-16-20260125/gcc/d/dmd/hdrgen.d	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/hdrgen.d	Sun Feb  1 22:32:07 2026
*************** private void truncateForError(ref OutBuf
*** 175,181 ****
      if (buf.length > maxLength)
      {
          buf.setsize(maxLength - 3);
!         buf.writestring("...");
      }
  }
  
--- 175,181 ----
      if (buf.length > maxLength)
      {
          buf.setsize(maxLength - 3);
!         buf.put("...");
      }
  }
  
*************** public const(char)* toChars(const Statem
*** 192,198 ****
      HdrGenState hgs;
      OutBuffer buf;
      toCBuffer(s, buf, hgs);
!     buf.writeByte(0);
      return buf.extractSlice().ptr;
  }
  
--- 192,198 ----
      HdrGenState hgs;
      OutBuffer buf;
      toCBuffer(s, buf, hgs);
!     buf.put(cast(ubyte)0);
      return buf.extractSlice().ptr;
  }
  
*************** public const(char)* toChars(const Dsymbo
*** 250,258 ****
      if (auto tid = d.isTypeInfoDeclaration())
      {
          OutBuffer buf;
!         buf.writestring("typeid(");
!         buf.writestring(tid.tinfo.toChars());
!         buf.writeByte(')');
          return buf.extractChars();
      }
  
--- 250,258 ----
      if (auto tid = d.isTypeInfoDeclaration())
      {
          OutBuffer buf;
!         buf.put("typeid(");
!         buf.put(tid.tinfo.toChars());
!         buf.put(')');
          return buf.extractChars();
      }
  
*************** void moduleToBuffer2(Module m, ref OutBu
*** 288,312 ****
      {
          if (m.userAttribDecl)
          {
!             buf.writestring("@(");
              argsToBuffer(m.userAttribDecl.atts, buf, hgs);
!             buf.writeByte(')');
              buf.writenl();
          }
          if (m.md.isdeprecated)
          {
              if (m.md.msg)
              {
!                 buf.writestring("deprecated(");
                  m.md.msg.expressionToBuffer(buf, hgs);
!                 buf.writestring(") ");
              }
              else
!                 buf.writestring("deprecated ");
          }
!         buf.writestring("module ");
!         buf.writestring(m.md.toChars());
!         buf.writeByte(';');
          buf.writenl();
      }
  
--- 288,312 ----
      {
          if (m.userAttribDecl)
          {
!             buf.put("@(");
              argsToBuffer(m.userAttribDecl.atts, buf, hgs);
!             buf.put(')');
              buf.writenl();
          }
          if (m.md.isdeprecated)
          {
              if (m.md.msg)
              {
!                 buf.put("deprecated(");
                  m.md.msg.expressionToBuffer(buf, hgs);
!                 buf.put(") ");
              }
              else
!                 buf.put("deprecated ");
          }
!         buf.put("module ");
!         buf.put(m.md.toChars());
!         buf.put(';');
          buf.writenl();
      }
  
*************** private void statementToBuffer(Statement
*** 326,332 ****
  
      void visitError(ErrorStatement s)
      {
!         buf.writestring("__error__");
          buf.writenl();
      }
  
--- 326,332 ----
  
      void visitError(ErrorStatement s)
      {
!         buf.put("__error__");
          buf.writenl();
      }
  
*************** private void statementToBuffer(Statement
*** 341,347 ****
          }
          if (s.exp)
              s.exp.expressionToBuffer(buf, hgs);
!         buf.writeByte(';');
          if (!hgs.forStmtInit)
              buf.writenl();
      }
--- 341,347 ----
          }
          if (s.exp)
              s.exp.expressionToBuffer(buf, hgs);
!         buf.put(';');
          if (!hgs.forStmtInit)
              buf.writenl();
      }
*************** private void statementToBuffer(Statement
*** 353,361 ****
  
      void visitMixin(MixinStatement s)
      {
!         buf.writestring("mixin(");
          argsToBuffer(s.exps, buf, hgs, null);
!         buf.writestring(");");
          if (!hgs.forStmtInit)
              buf.writenl();
      }
--- 353,361 ----
  
      void visitMixin(MixinStatement s)
      {
!         buf.put("mixin(");
          argsToBuffer(s.exps, buf, hgs, null);
!         buf.put(");");
          if (!hgs.forStmtInit)
              buf.writenl();
      }
*************** private void statementToBuffer(Statement
*** 392,405 ****
                  anywritten = true;
              }
          }
!         buf.writeByte(';');
          if (!hgs.forStmtInit)
              buf.writenl();
      }
  
      void visitUnrolledLoop(UnrolledLoopStatement s)
      {
!         buf.writestring("/*unrolled*/ {");
          buf.writenl();
          buf.level++;
          foreach (sx; *s.statements)
--- 392,405 ----
                  anywritten = true;
              }
          }
!         buf.put(';');
          if (!hgs.forStmtInit)
              buf.writenl();
      }
  
      void visitUnrolledLoop(UnrolledLoopStatement s)
      {
!         buf.put("/*unrolled*/ {");
          buf.writenl();
          buf.level++;
          foreach (sx; *s.statements)
*************** private void statementToBuffer(Statement
*** 408,426 ****
                  sx.statementToBuffer(buf, hgs);
          }
          buf.level--;
!         buf.writeByte('}');
          buf.writenl();
      }
  
      void visitScope(ScopeStatement s)
      {
!         buf.writeByte('{');
          buf.writenl();
          buf.level++;
          if (s.statement)
              s.statement.statementToBuffer(buf, hgs);
          buf.level--;
!         buf.writeByte('}');
          buf.writenl();
      }
  
--- 408,426 ----
                  sx.statementToBuffer(buf, hgs);
          }
          buf.level--;
!         buf.put('}');
          buf.writenl();
      }
  
      void visitScope(ScopeStatement s)
      {
!         buf.put('{');
          buf.writenl();
          buf.level++;
          if (s.statement)
              s.statement.statementToBuffer(buf, hgs);
          buf.level--;
!         buf.put('}');
          buf.writenl();
      }
  
*************** private void statementToBuffer(Statement
*** 433,453 ****
              if (!p.type && !stc)
                  stc = STC.auto_;
              if (stcToBuffer(buf, stc))
!                 buf.writeByte(' ');
              if (p.type)
                  typeToBuffer(p.type, p.ident, buf, hgs);
              else
!                 buf.writestring(p.ident.toString());
!             buf.writestring(" = ");
          }
          condition.expressionToBuffer(buf, hgs);
      }
  
      void visitWhile(WhileStatement s)
      {
!         buf.writestring("while (");
          printConditionAssignment(s.param, s.condition);
!         buf.writeByte(')');
          buf.writenl();
          if (s._body)
              s._body.statementToBuffer(buf, hgs);
--- 433,453 ----
              if (!p.type && !stc)
                  stc = STC.auto_;
              if (stcToBuffer(buf, stc))
!                 buf.put(' ');
              if (p.type)
                  typeToBuffer(p.type, p.ident, buf, hgs);
              else
!                 buf.put(p.ident.toString());
!             buf.put(" = ");
          }
          condition.expressionToBuffer(buf, hgs);
      }
  
      void visitWhile(WhileStatement s)
      {
!         buf.put("while (");
          printConditionAssignment(s.param, s.condition);
!         buf.put(')');
          buf.writenl();
          if (s._body)
              s._body.statementToBuffer(buf, hgs);
*************** private void statementToBuffer(Statement
*** 455,473 ****
  
      void visitDo(DoStatement s)
      {
!         buf.writestring("do");
          buf.writenl();
          if (s._body)
              s._body.statementToBuffer(buf, hgs);
!         buf.writestring("while (");
          s.condition.expressionToBuffer(buf, hgs);
!         buf.writestring(");");
          buf.writenl();
      }
  
      void visitFor(ForStatement s)
      {
!         buf.writestring("for (");
          if (s._init)
          {
              hgs.forStmtInit++;
--- 455,473 ----
  
      void visitDo(DoStatement s)
      {
!         buf.put("do");
          buf.writenl();
          if (s._body)
              s._body.statementToBuffer(buf, hgs);
!         buf.put("while (");
          s.condition.expressionToBuffer(buf, hgs);
!         buf.put(");");
          buf.writenl();
      }
  
      void visitFor(ForStatement s)
      {
!         buf.put("for (");
          if (s._init)
          {
              hgs.forStmtInit++;
*************** private void statementToBuffer(Statement
*** 475,570 ****
              hgs.forStmtInit--;
          }
          else
!             buf.writeByte(';');
          if (s.condition)
          {
!             buf.writeByte(' ');
              s.condition.expressionToBuffer(buf, hgs);
          }
!         buf.writeByte(';');
          if (s.increment)
          {
!             buf.writeByte(' ');
              s.increment.expressionToBuffer(buf, hgs);
          }
!         buf.writeByte(')');
          buf.writenl();
!         buf.writeByte('{');
          buf.writenl();
          buf.level++;
          if (s._body)
              s._body.statementToBuffer(buf, hgs);
          buf.level--;
!         buf.writeByte('}');
          buf.writenl();
      }
  
      void foreachWithoutBody(ForeachStatement s)
      {
!         buf.writestring(Token.toString(s.op));
!         buf.writestring(" (");
          foreach (i, p; *s.parameters)
          {
              if (i)
!                 buf.writestring(", ");
              if (stcToBuffer(buf, p.storageClass))
!                 buf.writeByte(' ');
              if (p.type)
                  typeToBuffer(p.type, p.ident, buf, hgs);
              else
!                 buf.writestring(p.ident.toString());
          }
!         buf.writestring("; ");
          s.aggr.expressionToBuffer(buf, hgs);
!         buf.writeByte(')');
          buf.writenl();
      }
  
      void visitForeach(ForeachStatement s)
      {
          foreachWithoutBody(s);
!         buf.writeByte('{');
          buf.writenl();
          buf.level++;
          if (s._body)
              s._body.statementToBuffer(buf, hgs);
          buf.level--;
!         buf.writeByte('}');
          buf.writenl();
      }
  
      void foreachRangeWithoutBody(ForeachRangeStatement s)
      {
!         buf.writestring(Token.toString(s.op));
!         buf.writestring(" (");
          if (s.param.type)
              typeToBuffer(s.param.type, s.param.ident, buf, hgs);
          else
!             buf.writestring(s.param.ident.toString());
!         buf.writestring("; ");
          s.lwr.expressionToBuffer(buf, hgs);
!         buf.writestring(" .. ");
          s.upr.expressionToBuffer(buf, hgs);
!         buf.writeByte(')');
          buf.writenl();
      }
  
      void visitForeachRange(ForeachRangeStatement s)
      {
          foreachRangeWithoutBody(s);
!         buf.writeByte('{');
          buf.writenl();
          buf.level++;
          if (s._body)
              s._body.statementToBuffer(buf, hgs);
          buf.level--;
!         buf.writeByte('}');
          buf.writenl();
      }
  
      void visitStaticForeach(StaticForeachStatement s)
      {
!         buf.writestring("static ");
          if (s.sfe.aggrfe)
          {
              visitForeach(s.sfe.aggrfe);
--- 475,570 ----
              hgs.forStmtInit--;
          }
          else
!             buf.put(';');
          if (s.condition)
          {
!             buf.put(' ');
              s.condition.expressionToBuffer(buf, hgs);
          }
!         buf.put(';');
          if (s.increment)
          {
!             buf.put(' ');
              s.increment.expressionToBuffer(buf, hgs);
          }
!         buf.put(')');
          buf.writenl();
!         buf.put('{');
          buf.writenl();
          buf.level++;
          if (s._body)
              s._body.statementToBuffer(buf, hgs);
          buf.level--;
!         buf.put('}');
          buf.writenl();
      }
  
      void foreachWithoutBody(ForeachStatement s)
      {
!         buf.put(Token.toString(s.op));
!         buf.put(" (");
          foreach (i, p; *s.parameters)
          {
              if (i)
!                 buf.put(", ");
              if (stcToBuffer(buf, p.storageClass))
!                 buf.put(' ');
              if (p.type)
                  typeToBuffer(p.type, p.ident, buf, hgs);
              else
!                 buf.put(p.ident.toString());
          }
!         buf.put("; ");
          s.aggr.expressionToBuffer(buf, hgs);
!         buf.put(')');
          buf.writenl();
      }
  
      void visitForeach(ForeachStatement s)
      {
          foreachWithoutBody(s);
!         buf.put('{');
          buf.writenl();
          buf.level++;
          if (s._body)
              s._body.statementToBuffer(buf, hgs);
          buf.level--;
!         buf.put('}');
          buf.writenl();
      }
  
      void foreachRangeWithoutBody(ForeachRangeStatement s)
      {
!         buf.put(Token.toString(s.op));
!         buf.put(" (");
          if (s.param.type)
              typeToBuffer(s.param.type, s.param.ident, buf, hgs);
          else
!             buf.put(s.param.ident.toString());
!         buf.put("; ");
          s.lwr.expressionToBuffer(buf, hgs);
!         buf.put(" .. ");
          s.upr.expressionToBuffer(buf, hgs);
!         buf.put(')');
          buf.writenl();
      }
  
      void visitForeachRange(ForeachRangeStatement s)
      {
          foreachRangeWithoutBody(s);
!         buf.put('{');
          buf.writenl();
          buf.level++;
          if (s._body)
              s._body.statementToBuffer(buf, hgs);
          buf.level--;
!         buf.put('}');
          buf.writenl();
      }
  
      void visitStaticForeach(StaticForeachStatement s)
      {
!         buf.put("static ");
          if (s.sfe.aggrfe)
          {
              visitForeach(s.sfe.aggrfe);
*************** private void statementToBuffer(Statement
*** 583,591 ****
  
      void visitIf(IfStatement s)
      {
!         buf.writestring("if (");
          printConditionAssignment(s.param, s.condition);
!         buf.writeByte(')');
          buf.writenl();
          if (s.ifbody.isScopeStatement())
          {
--- 583,591 ----
  
      void visitIf(IfStatement s)
      {
!         buf.put("if (");
          printConditionAssignment(s.param, s.condition);
!         buf.put(')');
          buf.writenl();
          if (s.ifbody.isScopeStatement())
          {
*************** private void statementToBuffer(Statement
*** 599,612 ****
          }
          if (s.elsebody)
          {
!             buf.writestring("else");
              if (!s.elsebody.isIfStatement())
              {
                  buf.writenl();
              }
              else
              {
!                 buf.writeByte(' ');
              }
              if (s.elsebody.isScopeStatement() || s.elsebody.isIfStatement())
              {
--- 599,612 ----
          }
          if (s.elsebody)
          {
!             buf.put("else");
              if (!s.elsebody.isIfStatement())
              {
                  buf.writenl();
              }
              else
              {
!                 buf.put(' ');
              }
              if (s.elsebody.isScopeStatement() || s.elsebody.isIfStatement())
              {
*************** private void statementToBuffer(Statement
*** 625,676 ****
      {
          s.condition.conditionToBuffer(buf, hgs);
          buf.writenl();
!         buf.writeByte('{');
          buf.writenl();
          buf.level++;
          if (s.ifbody)
              s.ifbody.statementToBuffer(buf, hgs);
          buf.level--;
!         buf.writeByte('}');
          buf.writenl();
          if (s.elsebody)
          {
!             buf.writestring("else");
              buf.writenl();
!             buf.writeByte('{');
              buf.level++;
              buf.writenl();
              s.elsebody.statementToBuffer(buf, hgs);
              buf.level--;
!             buf.writeByte('}');
          }
          buf.writenl();
      }
  
      void visitPragma(PragmaStatement s)
      {
!         buf.writestring("pragma (");
!         buf.writestring(s.ident.toString());
          if (s.args && s.args.length)
          {
!             buf.writestring(", ");
              argsToBuffer(s.args, buf, hgs);
          }
!         buf.writeByte(')');
          if (s._body)
          {
              buf.writenl();
!             buf.writeByte('{');
              buf.writenl();
              buf.level++;
              s._body.statementToBuffer(buf, hgs);
              buf.level--;
!             buf.writeByte('}');
              buf.writenl();
          }
          else
          {
!             buf.writeByte(';');
              buf.writenl();
          }
      }
--- 625,676 ----
      {
          s.condition.conditionToBuffer(buf, hgs);
          buf.writenl();
!         buf.put('{');
          buf.writenl();
          buf.level++;
          if (s.ifbody)
              s.ifbody.statementToBuffer(buf, hgs);
          buf.level--;
!         buf.put('}');
          buf.writenl();
          if (s.elsebody)
          {
!             buf.put("else");
              buf.writenl();
!             buf.put('{');
              buf.level++;
              buf.writenl();
              s.elsebody.statementToBuffer(buf, hgs);
              buf.level--;
!             buf.put('}');
          }
          buf.writenl();
      }
  
      void visitPragma(PragmaStatement s)
      {
!         buf.put("pragma (");
!         buf.put(s.ident.toString());
          if (s.args && s.args.length)
          {
!             buf.put(", ");
              argsToBuffer(s.args, buf, hgs);
          }
!         buf.put(')');
          if (s._body)
          {
              buf.writenl();
!             buf.put('{');
              buf.writenl();
              buf.level++;
              s._body.statementToBuffer(buf, hgs);
              buf.level--;
!             buf.put('}');
              buf.writenl();
          }
          else
          {
!             buf.put(';');
              buf.writenl();
          }
      }
*************** private void statementToBuffer(Statement
*** 682,701 ****
  
      void visitSwitch(SwitchStatement s)
      {
!         buf.writestring(s.isFinal ? "final switch (" : "switch (");
          printConditionAssignment(s.param, s.condition);
!         buf.writeByte(')');
          buf.writenl();
          if (s._body)
          {
              if (!s._body.isScopeStatement())
              {
!                 buf.writeByte('{');
                  buf.writenl();
                  buf.level++;
                  s._body.statementToBuffer(buf, hgs);
                  buf.level--;
!                 buf.writeByte('}');
                  buf.writenl();
              }
              else
--- 682,701 ----
  
      void visitSwitch(SwitchStatement s)
      {
!         buf.put(s.isFinal ? "final switch (" : "switch (");
          printConditionAssignment(s.param, s.condition);
!         buf.put(')');
          buf.writenl();
          if (s._body)
          {
              if (!s._body.isScopeStatement())
              {
!                 buf.put('{');
                  buf.writenl();
                  buf.level++;
                  s._body.statementToBuffer(buf, hgs);
                  buf.level--;
!                 buf.put('}');
                  buf.writenl();
              }
              else
*************** private void statementToBuffer(Statement
*** 707,815 ****
  
      void visitCase(CaseStatement s)
      {
!         buf.writestring("case ");
          s.exp.expressionToBuffer(buf, hgs);
!         buf.writeByte(':');
          buf.writenl();
          s.statement.statementToBuffer(buf, hgs);
      }
  
      void visitCaseRange(CaseRangeStatement s)
      {
!         buf.writestring("case ");
          s.first.expressionToBuffer(buf, hgs);
!         buf.writestring(": .. case ");
          s.last.expressionToBuffer(buf, hgs);
!         buf.writeByte(':');
          buf.writenl();
          s.statement.statementToBuffer(buf, hgs);
      }
  
      void visitDefault(DefaultStatement s)
      {
!         buf.writestring("default:");
          buf.writenl();
          s.statement.statementToBuffer(buf, hgs);
      }
  
      void visitGotoDefault(GotoDefaultStatement s)
      {
!         buf.writestring("goto default;");
          buf.writenl();
      }
  
      void visitGotoCase(GotoCaseStatement s)
      {
!         buf.writestring("goto case");
          if (s.exp)
          {
!             buf.writeByte(' ');
              s.exp.expressionToBuffer(buf, hgs);
          }
!         buf.writeByte(';');
          buf.writenl();
      }
  
      void visitSwitchError(SwitchErrorStatement s)
      {
!         buf.writestring("SwitchErrorStatement::toCBuffer()");
          buf.writenl();
      }
  
      void visitReturn(ReturnStatement s)
      {
!         buf.writestring("return ");
          if (s.exp)
              s.exp.expressionToBuffer(buf, hgs);
!         buf.writeByte(';');
          buf.writenl();
      }
  
      void visitBreak(BreakStatement s)
      {
!         buf.writestring("break");
          if (s.ident)
          {
!             buf.writeByte(' ');
!             buf.writestring(s.ident.toString());
          }
!         buf.writeByte(';');
          buf.writenl();
      }
  
      void visitContinue(ContinueStatement s)
      {
!         buf.writestring("continue");
          if (s.ident)
          {
!             buf.writeByte(' ');
!             buf.writestring(s.ident.toString());
          }
!         buf.writeByte(';');
          buf.writenl();
      }
  
      void visitSynchronized(SynchronizedStatement s)
      {
!         buf.writestring("synchronized");
          if (s.exp)
          {
!             buf.writeByte('(');
              s.exp.expressionToBuffer(buf, hgs);
!             buf.writeByte(')');
          }
          if (s._body)
          {
!             buf.writeByte(' ');
              s._body.statementToBuffer(buf, hgs);
          }
      }
  
      void visitWith(WithStatement s)
      {
!         buf.writestring("with (");
          s.exp.expressionToBuffer(buf, hgs);
!         buf.writestring(")");
          buf.writenl();
          if (s._body)
              s._body.statementToBuffer(buf, hgs);
--- 707,815 ----
  
      void visitCase(CaseStatement s)
      {
!         buf.put("case ");
          s.exp.expressionToBuffer(buf, hgs);
!         buf.put(':');
          buf.writenl();
          s.statement.statementToBuffer(buf, hgs);
      }
  
      void visitCaseRange(CaseRangeStatement s)
      {
!         buf.put("case ");
          s.first.expressionToBuffer(buf, hgs);
!         buf.put(": .. case ");
          s.last.expressionToBuffer(buf, hgs);
!         buf.put(':');
          buf.writenl();
          s.statement.statementToBuffer(buf, hgs);
      }
  
      void visitDefault(DefaultStatement s)
      {
!         buf.put("default:");
          buf.writenl();
          s.statement.statementToBuffer(buf, hgs);
      }
  
      void visitGotoDefault(GotoDefaultStatement s)
      {
!         buf.put("goto default;");
          buf.writenl();
      }
  
      void visitGotoCase(GotoCaseStatement s)
      {
!         buf.put("goto case");
          if (s.exp)
          {
!             buf.put(' ');
              s.exp.expressionToBuffer(buf, hgs);
          }
!         buf.put(';');
          buf.writenl();
      }
  
      void visitSwitchError(SwitchErrorStatement s)
      {
!         buf.put("SwitchErrorStatement::toCBuffer()");
          buf.writenl();
      }
  
      void visitReturn(ReturnStatement s)
      {
!         buf.put("return ");
          if (s.exp)
              s.exp.expressionToBuffer(buf, hgs);
!         buf.put(';');
          buf.writenl();
      }
  
      void visitBreak(BreakStatement s)
      {
!         buf.put("break");
          if (s.ident)
          {
!             buf.put(' ');
!             buf.put(s.ident.toString());
          }
!         buf.put(';');
          buf.writenl();
      }
  
      void visitContinue(ContinueStatement s)
      {
!         buf.put("continue");
          if (s.ident)
          {
!             buf.put(' ');
!             buf.put(s.ident.toString());
          }
!         buf.put(';');
          buf.writenl();
      }
  
      void visitSynchronized(SynchronizedStatement s)
      {
!         buf.put("synchronized");
          if (s.exp)
          {
!             buf.put('(');
              s.exp.expressionToBuffer(buf, hgs);
!             buf.put(')');
          }
          if (s._body)
          {
!             buf.put(' ');
              s._body.statementToBuffer(buf, hgs);
          }
      }
  
      void visitWith(WithStatement s)
      {
!         buf.put("with (");
          s.exp.expressionToBuffer(buf, hgs);
!         buf.put(")");
          buf.writenl();
          if (s._body)
              s._body.statementToBuffer(buf, hgs);
*************** private void statementToBuffer(Statement
*** 817,823 ****
  
      void visitTryCatch(TryCatchStatement s)
      {
!         buf.writestring("try");
          buf.writenl();
          if (s._body)
          {
--- 817,823 ----
  
      void visitTryCatch(TryCatchStatement s)
      {
!         buf.put("try");
          buf.writenl();
          if (s._body)
          {
*************** private void statementToBuffer(Statement
*** 834,870 ****
          }
          foreach (c; *s.catches)
          {
!             buf.writestring("catch");
              if (c.type)
              {
!                 buf.writeByte('(');
                  typeToBuffer(c.type, c.ident, buf, hgs);
!                 buf.writeByte(')');
              }
              buf.writenl();
!             buf.writeByte('{');
              buf.writenl();
              buf.level++;
              if (c.handler)
                  c.handler.statementToBuffer(buf, hgs);
              buf.level--;
!             buf.writeByte('}');
              buf.writenl();
          }
      }
  
      void visitTryFinally(TryFinallyStatement s)
      {
!         buf.writestring("try");
          buf.writenl();
!         buf.writeByte('{');
          buf.writenl();
          buf.level++;
          s._body.statementToBuffer(buf, hgs);
          buf.level--;
!         buf.writeByte('}');
          buf.writenl();
!         buf.writestring("finally");
          buf.writenl();
          if (s.finalbody.isScopeStatement())
          {
--- 834,870 ----
          }
          foreach (c; *s.catches)
          {
!             buf.put("catch");
              if (c.type)
              {
!                 buf.put('(');
                  typeToBuffer(c.type, c.ident, buf, hgs);
!                 buf.put(')');
              }
              buf.writenl();
!             buf.put('{');
              buf.writenl();
              buf.level++;
              if (c.handler)
                  c.handler.statementToBuffer(buf, hgs);
              buf.level--;
!             buf.put('}');
              buf.writenl();
          }
      }
  
      void visitTryFinally(TryFinallyStatement s)
      {
!         buf.put("try");
          buf.writenl();
!         buf.put('{');
          buf.writenl();
          buf.level++;
          s._body.statementToBuffer(buf, hgs);
          buf.level--;
!         buf.put('}');
          buf.writenl();
!         buf.put("finally");
          buf.writenl();
          if (s.finalbody.isScopeStatement())
          {
*************** private void statementToBuffer(Statement
*** 880,896 ****
  
      void visitScopeGuard(ScopeGuardStatement s)
      {
!         buf.writestring(Token.toString(s.tok));
!         buf.writeByte(' ');
          if (s.statement)
              s.statement.statementToBuffer(buf, hgs);
      }
  
      void visitThrow(ThrowStatement s)
      {
!         buf.writestring("throw ");
          s.exp.expressionToBuffer(buf, hgs);
!         buf.writeByte(';');
          buf.writenl();
      }
  
--- 880,896 ----
  
      void visitScopeGuard(ScopeGuardStatement s)
      {
!         buf.put(Token.toString(s.tok));
!         buf.put(' ');
          if (s.statement)
              s.statement.statementToBuffer(buf, hgs);
      }
  
      void visitThrow(ThrowStatement s)
      {
!         buf.put("throw ");
          s.exp.expressionToBuffer(buf, hgs);
!         buf.put(';');
          buf.writenl();
      }
  
*************** private void statementToBuffer(Statement
*** 904,919 ****
  
      void visitGoto(GotoStatement s)
      {
!         buf.writestring("goto ");
!         buf.writestring(s.ident.toString());
!         buf.writeByte(';');
          buf.writenl();
      }
  
      void visitLabel(LabelStatement s)
      {
!         buf.writestring(s.ident.toString());
!         buf.writeByte(':');
          buf.writenl();
          if (s.statement)
              s.statement.statementToBuffer(buf, hgs);
--- 904,919 ----
  
      void visitGoto(GotoStatement s)
      {
!         buf.put("goto ");
!         buf.put(s.ident.toString());
!         buf.put(';');
          buf.writenl();
      }
  
      void visitLabel(LabelStatement s)
      {
!         buf.put(s.ident.toString());
!         buf.put(':');
          buf.writenl();
          if (s.statement)
              s.statement.statementToBuffer(buf, hgs);
*************** private void statementToBuffer(Statement
*** 921,932 ****
  
      void visitAsm(AsmStatement s)
      {
!         buf.writestring("asm { ");
          Token* t = s.tokens;
          buf.level++;
          while (t)
          {
!             buf.writestring(t.toString());
              if (t.next &&
                  t.value != TOK.min      &&
                  t.value != TOK.comma    && t.next.value != TOK.comma    &&
--- 921,932 ----
  
      void visitAsm(AsmStatement s)
      {
!         buf.put("asm { ");
          Token* t = s.tokens;
          buf.level++;
          while (t)
          {
!             buf.put(t.toString());
              if (t.next &&
                  t.value != TOK.min      &&
                  t.value != TOK.comma    && t.next.value != TOK.comma    &&
*************** private void statementToBuffer(Statement
*** 936,947 ****
                                            t.next.value != TOK.rightParenthesis   &&
                  t.value != TOK.dot      && t.next.value != TOK.dot)
              {
!                 buf.writeByte(' ');
              }
              t = t.next;
          }
          buf.level--;
!         buf.writestring("; }");
          buf.writenl();
      }
  
--- 936,947 ----
                                            t.next.value != TOK.rightParenthesis   &&
                  t.value != TOK.dot      && t.next.value != TOK.dot)
              {
!                 buf.put(' ');
              }
              t = t.next;
          }
          buf.level--;
!         buf.put("; }");
          buf.writenl();
      }
  
*************** void toCBuffer(Dsymbol s, ref OutBuffer
*** 976,1014 ****
  {
      void visitDsymbol(Dsymbol s)
      {
!         buf.writestring(s.toChars());
      }
  
      void visitStaticAssert(StaticAssert s)
      {
!         buf.writestring(s.kind());
!         buf.writeByte('(');
          s.exp.expressionToBuffer(buf, hgs);
          if (s.msgs)
          {
              foreach (m; (*s.msgs)[])
              {
!                 buf.writestring(", ");
                  m.expressionToBuffer(buf, hgs);
              }
          }
!         buf.writestring(");");
          buf.writenl();
      }
  
      void visitDebugSymbol(DebugSymbol s)
      {
!         buf.writestring("debug = ");
!         buf.writestring(s.ident.toString());
!         buf.writeByte(';');
          buf.writenl();
      }
  
      void visitVersionSymbol(VersionSymbol s)
      {
!         buf.writestring("version = ");
!         buf.writestring(s.ident.toString());
!         buf.writeByte(';');
          buf.writenl();
      }
  
--- 976,1014 ----
  {
      void visitDsymbol(Dsymbol s)
      {
!         buf.put(s.toChars());
      }
  
      void visitStaticAssert(StaticAssert s)
      {
!         buf.put(s.kind());
!         buf.put('(');
          s.exp.expressionToBuffer(buf, hgs);
          if (s.msgs)
          {
              foreach (m; (*s.msgs)[])
              {
!                 buf.put(", ");
                  m.expressionToBuffer(buf, hgs);
              }
          }
!         buf.put(");");
          buf.writenl();
      }
  
      void visitDebugSymbol(DebugSymbol s)
      {
!         buf.put("debug = ");
!         buf.put(s.ident.toString());
!         buf.put(';');
          buf.writenl();
      }
  
      void visitVersionSymbol(VersionSymbol s)
      {
!         buf.put("version = ");
!         buf.put(s.ident.toString());
!         buf.put(';');
          buf.writenl();
      }
  
*************** void toCBuffer(Dsymbol s, ref OutBuffer
*** 1017,1026 ****
          if (em.type)
              typeToBuffer(em.type, em.ident, buf, hgs);
          else
!             buf.writestring(em.ident.toString());
          if (em.value)
          {
!             buf.writestring(" = ");
              em.value.expressionToBuffer(buf, hgs);
          }
      }
--- 1017,1026 ----
          if (em.type)
              typeToBuffer(em.type, em.ident, buf, hgs);
          else
!             buf.put(em.ident.toString());
          if (em.value)
          {
!             buf.put(" = ");
              em.value.expressionToBuffer(buf, hgs);
          }
      }
*************** void toCBuffer(Dsymbol s, ref OutBuffer
*** 1030,1037 ****
          if (hgs.hdrgen && imp.id == Id.object)
              return; // object is imported by default
          if (imp.isstatic)
!             buf.writestring("static ");
!         buf.writestring("import ");
          if (imp.aliasId)
          {
              buf.printf("%s = ", imp.aliasId.toChars());
--- 1030,1037 ----
          if (hgs.hdrgen && imp.id == Id.object)
              return; // object is imported by default
          if (imp.isstatic)
!             buf.put("static ");
!         buf.put("import ");
          if (imp.aliasId)
          {
              buf.printf("%s = ", imp.aliasId.toChars());
*************** void toCBuffer(Dsymbol s, ref OutBuffer
*** 1039,1070 ****
          foreach (const pid; imp.packages)
          {
              buf.write(pid.toString());
!             buf.writeByte('.');
          }
!         buf.writestring(imp.id.toString());
          if (imp.names.length)
          {
!             buf.writestring(" : ");
              foreach (const i, const name; imp.names)
              {
                  if (i)
!                     buf.writestring(", ");
                  const _alias = imp.aliases[i];
                  if (_alias)
                      buf.printf("%s = %s", _alias.toChars(), name.toChars());
                  else
!                     buf.writestring(name.toChars());
              }
          }
!         buf.writeByte(';');
          buf.writenl();
      }
  
      void visitAliasThis(AliasThis d)
      {
!         buf.writestring("alias ");
!         buf.writestring(d.ident.toString());
!         buf.writestring(" this;\n");
      }
  
      void visitAttribDeclaration(AttribDeclaration d)
--- 1039,1070 ----
          foreach (const pid; imp.packages)
          {
              buf.write(pid.toString());
!             buf.put('.');
          }
!         buf.put(imp.id.toString());
          if (imp.names.length)
          {
!             buf.put(" : ");
              foreach (const i, const name; imp.names)
              {
                  if (i)
!                     buf.put(", ");
                  const _alias = imp.aliases[i];
                  if (_alias)
                      buf.printf("%s = %s", _alias.toChars(), name.toChars());
                  else
!                     buf.put(name.toChars());
              }
          }
!         buf.put(';');
          buf.writenl();
      }
  
      void visitAliasThis(AliasThis d)
      {
!         buf.put("alias ");
!         buf.put(d.ident.toString());
!         buf.put(" this;\n");
      }
  
      void visitAttribDeclaration(AttribDeclaration d)
*************** void toCBuffer(Dsymbol s, ref OutBuffer
*** 1077,1108 ****
  
          if (!d.decl)
          {
!             buf.writeByte(';');
              buf.writenl();
              return;
          }
          if (d.decl.length == 0 || (hgs.hdrgen && d.decl.length == 1 && (*d.decl)[0].isUnitTestDeclaration()))
          {
              // hack for https://issues.dlang.org/show_bug.cgi?id=8081
!             if (hasSTC) buf.writeByte(' ');
!             buf.writestring("{}");
          }
          else if (d.decl.length == 1)
          {
!             if (hasSTC) buf.writeByte(' ');
              toCBuffer((*d.decl)[0], buf, hgs);
              return;
          }
          else
          {
              buf.writenl();
!             buf.writeByte('{');
              buf.writenl();
              buf.level++;
              foreach (de; *d.decl)
                  toCBuffer(de, buf, hgs);
              buf.level--;
!             buf.writeByte('}');
          }
          buf.writenl();
      }
--- 1077,1108 ----
  
          if (!d.decl)
          {
!             buf.put(';');
              buf.writenl();
              return;
          }
          if (d.decl.length == 0 || (hgs.hdrgen && d.decl.length == 1 && (*d.decl)[0].isUnitTestDeclaration()))
          {
              // hack for https://issues.dlang.org/show_bug.cgi?id=8081
!             if (hasSTC) buf.put(' ');
!             buf.put("{}");
          }
          else if (d.decl.length == 1)
          {
!             if (hasSTC) buf.put(' ');
              toCBuffer((*d.decl)[0], buf, hgs);
              return;
          }
          else
          {
              buf.writenl();
!             buf.put('{');
              buf.writenl();
              buf.level++;
              foreach (de; *d.decl)
                  toCBuffer(de, buf, hgs);
              buf.level--;
!             buf.put('}');
          }
          buf.writenl();
      }
*************** void toCBuffer(Dsymbol s, ref OutBuffer
*** 1114,1130 ****
  
      void visitDeprecatedDeclaration(DeprecatedDeclaration d)
      {
!         buf.writestring("deprecated(");
          d.msg.expressionToBuffer(buf, hgs);
!         buf.writestring(") ");
          visitAttribDeclaration(d);
      }
  
      void visitLinkDeclaration(LinkDeclaration d)
      {
!         buf.writestring("extern (");
!         buf.writestring(linkageToString(d.linkage));
!         buf.writestring(") ");
          visitAttribDeclaration(d);
      }
  
--- 1114,1130 ----
  
      void visitDeprecatedDeclaration(DeprecatedDeclaration d)
      {
!         buf.put("deprecated(");
          d.msg.expressionToBuffer(buf, hgs);
!         buf.put(") ");
          visitAttribDeclaration(d);
      }
  
      void visitLinkDeclaration(LinkDeclaration d)
      {
!         buf.put("extern (");
!         buf.put(linkageToString(d.linkage));
!         buf.put(") ");
          visitAttribDeclaration(d);
      }
  
*************** void toCBuffer(Dsymbol s, ref OutBuffer
*** 1142,1150 ****
          case CPPMANGLE.def:
              break;
          }
!         buf.writestring("extern (C++, ");
!         buf.writestring(s);
!         buf.writestring(") ");
          visitAttribDeclaration(d);
      }
  
--- 1142,1150 ----
          case CPPMANGLE.def:
              break;
          }
!         buf.put("extern (C++, ");
!         buf.put(s);
!         buf.put(") ");
          visitAttribDeclaration(d);
      }
  
*************** void toCBuffer(Dsymbol s, ref OutBuffer
*** 1153,1159 ****
          visibilityToBuffer(buf, d.visibility);
          AttribDeclaration ad = cast(AttribDeclaration)d;
          if (ad.decl.length <= 1)
!             buf.writeByte(' ');
          if (ad.decl.length == 1 && (*ad.decl)[0].isVisibilityDeclaration)
              visitAttribDeclaration((*ad.decl)[0].isVisibilityDeclaration);
          else
--- 1153,1159 ----
          visibilityToBuffer(buf, d.visibility);
          AttribDeclaration ad = cast(AttribDeclaration)d;
          if (ad.decl.length <= 1)
!             buf.put(' ');
          if (ad.decl.length == 1 && (*ad.decl)[0].isVisibilityDeclaration)
              visitAttribDeclaration((*ad.decl)[0].isVisibilityDeclaration);
          else
*************** void toCBuffer(Dsymbol s, ref OutBuffer
*** 1167,1191 ****
              foreach (i, exp; (*d.exps)[])
              {
                  if (i)
!                     buf.writeByte(' ');
!                 buf.writestring("align (");
                  toCBuffer(exp, buf, hgs);
!                 buf.writeByte(')');
              }
              if (d.decl && d.decl.length < 2)
!                 buf.writeByte(' ');
          }
          else
!             buf.writestring("align ");
  
          visitAttribDeclaration(d.isAttribDeclaration());
      }
  
      void visitAnonDeclaration(AnonDeclaration d)
      {
!         buf.writestring(d.isunion ? "union" : "struct");
          buf.writenl();
!         buf.writestring("{");
          buf.writenl();
          buf.level++;
          if (d.decl)
--- 1167,1191 ----
              foreach (i, exp; (*d.exps)[])
              {
                  if (i)
!                     buf.put(' ');
!                 buf.put("align (");
                  toCBuffer(exp, buf, hgs);
!                 buf.put(')');
              }
              if (d.decl && d.decl.length < 2)
!                 buf.put(' ');
          }
          else
!             buf.put("align ");
  
          visitAttribDeclaration(d.isAttribDeclaration());
      }
  
      void visitAnonDeclaration(AnonDeclaration d)
      {
!         buf.put(d.isunion ? "union" : "struct");
          buf.writenl();
!         buf.put("{");
          buf.writenl();
          buf.level++;
          if (d.decl)
*************** void toCBuffer(Dsymbol s, ref OutBuffer
*** 1194,1214 ****
                  toCBuffer(de, buf, hgs);
          }
          buf.level--;
!         buf.writestring("}");
          buf.writenl();
      }
  
      void visitPragmaDeclaration(PragmaDeclaration d)
      {
!         buf.writestring("pragma (");
!         buf.writestring(d.ident.toString());
          if (d.args && d.args.length)
          {
!             buf.writestring(", ");
              argsToBuffer(d.args, buf, hgs);
          }
  
!         buf.writeByte(')');
  
          // https://issues.dlang.org/show_bug.cgi?id=14690
          // Unconditionally perform a full output dump
--- 1194,1214 ----
                  toCBuffer(de, buf, hgs);
          }
          buf.level--;
!         buf.put("}");
          buf.writenl();
      }
  
      void visitPragmaDeclaration(PragmaDeclaration d)
      {
!         buf.put("pragma (");
!         buf.put(d.ident.toString());
          if (d.args && d.args.length)
          {
!             buf.put(", ");
              argsToBuffer(d.args, buf, hgs);
          }
  
!         buf.put(')');
  
          // https://issues.dlang.org/show_bug.cgi?id=14690
          // Unconditionally perform a full output dump
*************** void toCBuffer(Dsymbol s, ref OutBuffer
*** 1227,1233 ****
          if (d.decl || d.elsedecl)
          {
              buf.writenl();
!             buf.writeByte('{');
              buf.writenl();
              buf.level++;
              if (d.decl)
--- 1227,1233 ----
          if (d.decl || d.elsedecl)
          {
              buf.writenl();
!             buf.put('{');
              buf.writenl();
              buf.level++;
              if (d.decl)
*************** void toCBuffer(Dsymbol s, ref OutBuffer
*** 1236,1258 ****
                      toCBuffer(de, buf, hgs);
              }
              buf.level--;
!             buf.writeByte('}');
              if (d.elsedecl)
              {
                  buf.writenl();
!                 buf.writestring("else");
                  buf.writenl();
!                 buf.writeByte('{');
                  buf.writenl();
                  buf.level++;
                  foreach (de; *d.elsedecl)
                      toCBuffer(de, buf, hgs);
                  buf.level--;
!                 buf.writeByte('}');
              }
          }
          else
!             buf.writeByte(':');
          buf.writenl();
      }
  
--- 1236,1258 ----
                      toCBuffer(de, buf, hgs);
              }
              buf.level--;
!             buf.put('}');
              if (d.elsedecl)
              {
                  buf.writenl();
!                 buf.put("else");
                  buf.writenl();
!                 buf.put('{');
                  buf.writenl();
                  buf.level++;
                  foreach (de; *d.elsedecl)
                      toCBuffer(de, buf, hgs);
                  buf.level--;
!                 buf.put('}');
              }
          }
          else
!             buf.put(':');
          buf.writenl();
      }
  
*************** void toCBuffer(Dsymbol s, ref OutBuffer
*** 1260,1281 ****
      {
          void foreachWithoutBody(ForeachStatement s)
          {
!             buf.writestring(Token.toString(s.op));
!             buf.writestring(" (");
              foreach (i, p; *s.parameters)
              {
                  if (i)
!                     buf.writestring(", ");
                  if (stcToBuffer(buf, p.storageClass))
!                     buf.writeByte(' ');
                  if (p.type)
                      typeToBuffer(p.type, p.ident, buf, hgs);
                  else
!                     buf.writestring(p.ident.toString());
              }
!             buf.writestring("; ");
              s.aggr.expressionToBuffer(buf, hgs);
!             buf.writeByte(')');
              buf.writenl();
          }
  
--- 1260,1281 ----
      {
          void foreachWithoutBody(ForeachStatement s)
          {
!             buf.put(Token.toString(s.op));
!             buf.put(" (");
              foreach (i, p; *s.parameters)
              {
                  if (i)
!                     buf.put(", ");
                  if (stcToBuffer(buf, p.storageClass))
!                     buf.put(' ');
                  if (p.type)
                      typeToBuffer(p.type, p.ident, buf, hgs);
                  else
!                     buf.put(p.ident.toString());
              }
!             buf.put("; ");
              s.aggr.expressionToBuffer(buf, hgs);
!             buf.put(')');
              buf.writenl();
          }
  
*************** void toCBuffer(Dsymbol s, ref OutBuffer
*** 1283,1303 ****
          {
              /* s.op ( param ; lwr .. upr )
               */
!             buf.writestring(Token.toString(s.op));
!             buf.writestring(" (");
              if (s.param.type)
                  typeToBuffer(s.param.type, s.param.ident, buf, hgs);
              else
!                 buf.writestring(s.param.ident.toString());
!             buf.writestring("; ");
              s.lwr.expressionToBuffer(buf, hgs);
!             buf.writestring(" .. ");
              s.upr.expressionToBuffer(buf, hgs);
!             buf.writeByte(')');
              buf.writenl();
          }
  
!         buf.writestring("static ");
          if (s.sfe.aggrfe)
          {
              foreachWithoutBody(s.sfe.aggrfe);
--- 1283,1303 ----
          {
              /* s.op ( param ; lwr .. upr )
               */
!             buf.put(Token.toString(s.op));
!             buf.put(" (");
              if (s.param.type)
                  typeToBuffer(s.param.type, s.param.ident, buf, hgs);
              else
!                 buf.put(s.param.ident.toString());
!             buf.put("; ");
              s.lwr.expressionToBuffer(buf, hgs);
!             buf.put(" .. ");
              s.upr.expressionToBuffer(buf, hgs);
!             buf.put(')');
              buf.writenl();
          }
  
!         buf.put("static ");
          if (s.sfe.aggrfe)
          {
              foreachWithoutBody(s.sfe.aggrfe);
*************** void toCBuffer(Dsymbol s, ref OutBuffer
*** 1307,1335 ****
              assert(s.sfe.rangefe);
              foreachRangeWithoutBody(s.sfe.rangefe);
          }
!         buf.writeByte('{');
          buf.writenl();
          buf.level++;
          visitAttribDeclaration(s);
          buf.level--;
!         buf.writeByte('}');
          buf.writenl();
  
      }
  
      void visitMixinDeclaration(MixinDeclaration d)
      {
!         buf.writestring("mixin(");
          argsToBuffer(d.exps, buf, hgs, null);
!         buf.writestring(");");
          buf.writenl();
      }
  
      void visitUserAttributeDeclaration(UserAttributeDeclaration d)
      {
!         buf.writestring("@(");
          argsToBuffer(d.atts, buf, hgs);
!         buf.writeByte(')');
          visitAttribDeclaration(d);
      }
  
--- 1307,1335 ----
              assert(s.sfe.rangefe);
              foreachRangeWithoutBody(s.sfe.rangefe);
          }
!         buf.put('{');
          buf.writenl();
          buf.level++;
          visitAttribDeclaration(s);
          buf.level--;
!         buf.put('}');
          buf.writenl();
  
      }
  
      void visitMixinDeclaration(MixinDeclaration d)
      {
!         buf.put("mixin(");
          argsToBuffer(d.exps, buf, hgs, null);
!         buf.put(");");
          buf.writenl();
      }
  
      void visitUserAttributeDeclaration(UserAttributeDeclaration d)
      {
!         buf.put("@(");
          argsToBuffer(d.atts, buf, hgs);
!         buf.put(')');
          visitAttribDeclaration(d);
      }
  
*************** void toCBuffer(Dsymbol s, ref OutBuffer
*** 1337,1345 ****
      {
          if (!constraint)
              return;
!         buf.writestring(" if (");
          constraint.expressionToBuffer(buf, hgs);
!         buf.writeByte(')');
      }
  
      /// Returns: whether `do` is needed to write the function body
--- 1337,1345 ----
      {
          if (!constraint)
              return;
!         buf.put(" if (");
          constraint.expressionToBuffer(buf, hgs);
!         buf.put(')');
      }
  
      /// Returns: whether `do` is needed to write the function body
*************** void toCBuffer(Dsymbol s, ref OutBuffer
*** 1351,1363 ****
          {
              foreach (frequire; *f.frequires)
              {
!                 buf.writestring("in");
                  if (auto es = frequire.isExpStatement())
                  {
                      assert(es.exp && es.exp.op == EXP.assert_);
!                     buf.writestring(" (");
                      (cast(AssertExp)es.exp).e1.expressionToBuffer(buf, hgs);
!                     buf.writeByte(')');
                      buf.writenl();
                      requireDo = false;
                  }
--- 1351,1363 ----
          {
              foreach (frequire; *f.frequires)
              {
!                 buf.put("in");
                  if (auto es = frequire.isExpStatement())
                  {
                      assert(es.exp && es.exp.op == EXP.assert_);
!                     buf.put(" (");
                      (cast(AssertExp)es.exp).e1.expressionToBuffer(buf, hgs);
!                     buf.put(')');
                      buf.writenl();
                      requireDo = false;
                  }
*************** void toCBuffer(Dsymbol s, ref OutBuffer
*** 1374,1391 ****
          {
              foreach (fensure; *f.fensures)
              {
!                 buf.writestring("out");
                  if (auto es = fensure.ensure.isExpStatement())
                  {
                      assert(es.exp && es.exp.op == EXP.assert_);
!                     buf.writestring(" (");
                      if (fensure.id)
                      {
!                         buf.writestring(fensure.id.toString());
                      }
!                     buf.writestring("; ");
                      (cast(AssertExp)es.exp).e1.expressionToBuffer(buf, hgs);
!                     buf.writeByte(')');
                      buf.writenl();
                      requireDo = false;
                  }
--- 1374,1391 ----
          {
              foreach (fensure; *f.fensures)
              {
!                 buf.put("out");
                  if (auto es = fensure.ensure.isExpStatement())
                  {
                      assert(es.exp && es.exp.op == EXP.assert_);
!                     buf.put(" (");
                      if (fensure.id)
                      {
!                         buf.put(fensure.id.toString());
                      }
!                     buf.put("; ");
                      (cast(AssertExp)es.exp).e1.expressionToBuffer(buf, hgs);
!                     buf.put(')');
                      buf.writenl();
                      requireDo = false;
                  }
*************** void toCBuffer(Dsymbol s, ref OutBuffer
*** 1393,1401 ****
                  {
                      if (fensure.id)
                      {
!                         buf.writeByte('(');
!                         buf.writestring(fensure.id.toString());
!                         buf.writeByte(')');
                      }
                      buf.writenl();
                      fensure.ensure.statementToBuffer(buf, hgs);
--- 1393,1401 ----
                  {
                      if (fensure.id)
                      {
!                         buf.put('(');
!                         buf.put(fensure.id.toString());
!                         buf.put(')');
                      }
                      buf.writenl();
                      fensure.ensure.statementToBuffer(buf, hgs);
*************** void toCBuffer(Dsymbol s, ref OutBuffer
*** 1415,1421 ****
                  buf.writenl();
                  contractsToBuffer(f);
              }
!             buf.writeByte(';');
              buf.writenl();
              return;
          }
--- 1415,1421 ----
                  buf.writenl();
                  contractsToBuffer(f);
              }
!             buf.put(';');
              buf.writenl();
              return;
          }
*************** void toCBuffer(Dsymbol s, ref OutBuffer
*** 1440,1454 ****
  
          if (requireDo)
          {
!             buf.writestring("do");
              buf.writenl();
          }
!         buf.writeByte('{');
          buf.writenl();
          buf.level++;
          f.fbody.statementToBuffer(buf, hgs);
          buf.level--;
!         buf.writeByte('}');
          buf.writenl();
          hgs.tpltMember = savetlpt;
          hgs.autoMember = saveauto;
--- 1440,1454 ----
  
          if (requireDo)
          {
!             buf.put("do");
              buf.writenl();
          }
!         buf.put('{');
          buf.writenl();
          buf.level++;
          f.fbody.statementToBuffer(buf, hgs);
          buf.level--;
!         buf.put('}');
          buf.writenl();
          hgs.tpltMember = savetlpt;
          hgs.autoMember = saveauto;
*************** void toCBuffer(Dsymbol s, ref OutBuffer
*** 1459,1469 ****
          if (!d || !d.baseclasses.length)
              return;
          if (!d.isAnonymous())
!             buf.writestring(" : ");
          foreach (i, b; *d.baseclasses)
          {
              if (i)
!                 buf.writestring(", ");
              typeToBuffer(b.type, null, buf, hgs);
          }
      }
--- 1459,1469 ----
          if (!d || !d.baseclasses.length)
              return;
          if (!d.isAnonymous())
!             buf.put(" : ");
          foreach (i, b; *d.baseclasses)
          {
              if (i)
!                 buf.put(", ");
              typeToBuffer(b.type, null, buf, hgs);
          }
      }
*************** void toCBuffer(Dsymbol s, ref OutBuffer
*** 1479,1485 ****
          {
              assert(fd.type);
              if (stcToBuffer(buf, fd.storage_class))
!                 buf.writeByte(' ');
              functionToBufferFull(cast(TypeFunction)fd.type, buf, d.ident, hgs, d);
              visitTemplateConstraint(d.constraint);
              hgs.tpltMember++;
--- 1479,1485 ----
          {
              assert(fd.type);
              if (stcToBuffer(buf, fd.storage_class))
!                 buf.put(' ');
              functionToBufferFull(cast(TypeFunction)fd.type, buf, d.ident, hgs, d);
              visitTemplateConstraint(d.constraint);
              hgs.tpltMember++;
*************** void toCBuffer(Dsymbol s, ref OutBuffer
*** 1489,1516 ****
          }
          if (AggregateDeclaration ad = onemember.isAggregateDeclaration())
          {
!             buf.writestring(ad.kind());
!             buf.writeByte(' ');
!             buf.writestring(ad.ident.toString());
!             buf.writeByte('(');
              visitTemplateParameters(hgs.ddoc ? d.origParameters : d.parameters, buf, hgs);
!             buf.writeByte(')');
              visitTemplateConstraint(d.constraint);
              visitBaseClasses(ad.isClassDeclaration());
              hgs.tpltMember++;
              if (ad.members)
              {
                  buf.writenl();
!                 buf.writeByte('{');
                  buf.writenl();
                  buf.level++;
                  foreach (s; *ad.members)
                      toCBuffer(s, buf, hgs);
                  buf.level--;
!                 buf.writeByte('}');
              }
              else
!                 buf.writeByte(';');
              buf.writenl();
              hgs.tpltMember--;
              return true;
--- 1489,1516 ----
          }
          if (AggregateDeclaration ad = onemember.isAggregateDeclaration())
          {
!             buf.put(ad.kind());
!             buf.put(' ');
!             buf.put(ad.ident.toString());
!             buf.put('(');
              visitTemplateParameters(hgs.ddoc ? d.origParameters : d.parameters, buf, hgs);
!             buf.put(')');
              visitTemplateConstraint(d.constraint);
              visitBaseClasses(ad.isClassDeclaration());
              hgs.tpltMember++;
              if (ad.members)
              {
                  buf.writenl();
!                 buf.put('{');
                  buf.writenl();
                  buf.level++;
                  foreach (s; *ad.members)
                      toCBuffer(s, buf, hgs);
                  buf.level--;
!                 buf.put('}');
              }
              else
!                 buf.put(';');
              buf.writenl();
              hgs.tpltMember--;
              return true;
*************** void toCBuffer(Dsymbol s, ref OutBuffer
*** 1520,1543 ****
              if (d.constraint)
                  return false;
              if (stcToBuffer(buf, vd.storage_class))
!                 buf.writeByte(' ');
              if (vd.type)
                  typeToBuffer(vd.type, vd.ident, buf, hgs);
              else
!                 buf.writestring(vd.ident.toString());
!             buf.writeByte('(');
              visitTemplateParameters(hgs.ddoc ? d.origParameters : d.parameters, buf, hgs);
!             buf.writeByte(')');
              if (vd._init)
              {
!                 buf.writestring(" = ");
                  ExpInitializer ie = vd._init.isExpInitializer();
                  if (ie && (ie.exp.op == EXP.construct || ie.exp.op == EXP.blit))
                      (cast(AssignExp)ie.exp).e2.expressionToBuffer(buf, hgs);
                  else
                      vd._init.initializerToBuffer(buf, hgs);
              }
!             buf.writeByte(';');
              buf.writenl();
              return true;
          }
--- 1520,1543 ----
              if (d.constraint)
                  return false;
              if (stcToBuffer(buf, vd.storage_class))
!                 buf.put(' ');
              if (vd.type)
                  typeToBuffer(vd.type, vd.ident, buf, hgs);
              else
!                 buf.put(vd.ident.toString());
!             buf.put('(');
              visitTemplateParameters(hgs.ddoc ? d.origParameters : d.parameters, buf, hgs);
!             buf.put(')');
              if (vd._init)
              {
!                 buf.put(" = ");
                  ExpInitializer ie = vd._init.isExpInitializer();
                  if (ie && (ie.exp.op == EXP.construct || ie.exp.op == EXP.blit))
                      (cast(AssignExp)ie.exp).e2.expressionToBuffer(buf, hgs);
                  else
                      vd._init.initializerToBuffer(buf, hgs);
              }
!             buf.put(';');
              buf.writenl();
              return true;
          }
*************** void toCBuffer(Dsymbol s, ref OutBuffer
*** 1550,1580 ****
          {
              // Should handle template functions for doc generation
              if (onemember && onemember.isFuncDeclaration())
!                 buf.writestring("foo ");
          }
          if ((hgs.hdrgen || hgs.fullDump) && visitEponymousMember(d))
              return;
          if (hgs.ddoc)
!             buf.writestring(d.kind());
          else
!             buf.writestring("template");
!         buf.writeByte(' ');
!         buf.writestring(d.ident.toString());
!         buf.writeByte('(');
          visitTemplateParameters(hgs.ddoc ? d.origParameters : d.parameters, buf, hgs);
!         buf.writeByte(')');
          visitTemplateConstraint(d.constraint);
          if (hgs.hdrgen || hgs.fullDump)
          {
              hgs.tpltMember++;
              buf.writenl();
!             buf.writeByte('{');
              buf.writenl();
              buf.level++;
              foreach (s; *d.members)
                  toCBuffer(s, buf, hgs);
              buf.level--;
!             buf.writeByte('}');
              buf.writenl();
              hgs.tpltMember--;
          }
--- 1550,1580 ----
          {
              // Should handle template functions for doc generation
              if (onemember && onemember.isFuncDeclaration())
!                 buf.put("foo ");
          }
          if ((hgs.hdrgen || hgs.fullDump) && visitEponymousMember(d))
              return;
          if (hgs.ddoc)
!             buf.put(d.kind());
          else
!             buf.put("template");
!         buf.put(' ');
!         buf.put(d.ident.toString());
!         buf.put('(');
          visitTemplateParameters(hgs.ddoc ? d.origParameters : d.parameters, buf, hgs);
!         buf.put(')');
          visitTemplateConstraint(d.constraint);
          if (hgs.hdrgen || hgs.fullDump)
          {
              hgs.tpltMember++;
              buf.writenl();
!             buf.put('{');
              buf.writenl();
              buf.level++;
              foreach (s; *d.members)
                  toCBuffer(s, buf, hgs);
              buf.level--;
!             buf.put('}');
              buf.writenl();
              hgs.tpltMember--;
          }
*************** void toCBuffer(Dsymbol s, ref OutBuffer
*** 1582,1588 ****
  
      void visitTemplateInstance(TemplateInstance ti)
      {
!         buf.writestring(ti.name.toChars());
          tiargsToBuffer(ti, buf, hgs);
  
          if (hgs.fullDump)
--- 1582,1588 ----
  
      void visitTemplateInstance(TemplateInstance ti)
      {
!         buf.put(ti.name.toChars());
          tiargsToBuffer(ti, buf, hgs);
  
          if (hgs.fullDump)
*************** void toCBuffer(Dsymbol s, ref OutBuffer
*** 1594,1608 ****
  
      void visitTemplateMixin(TemplateMixin tm)
      {
!         buf.writestring("mixin ");
          typeToBuffer(tm.tqual, null, buf, hgs);
          tiargsToBuffer(tm, buf, hgs);
          if (tm.ident && memcmp(tm.ident.toString().ptr, cast(const(char)*) "__mixin", 7) != 0)
          {
!             buf.writeByte(' ');
!             buf.writestring(tm.ident.toString());
          }
!         buf.writeByte(';');
          buf.writenl();
          if (hgs.fullDump)
              dumpTemplateInstance(tm, buf, hgs);
--- 1594,1608 ----
  
      void visitTemplateMixin(TemplateMixin tm)
      {
!         buf.put("mixin ");
          typeToBuffer(tm.tqual, null, buf, hgs);
          tiargsToBuffer(tm, buf, hgs);
          if (tm.ident && memcmp(tm.ident.toString().ptr, cast(const(char)*) "__mixin", 7) != 0)
          {
!             buf.put(' ');
!             buf.put(tm.ident.toString());
          }
!         buf.put(';');
          buf.writenl();
          if (hgs.fullDump)
              dumpTemplateInstance(tm, buf, hgs);
*************** void toCBuffer(Dsymbol s, ref OutBuffer
*** 1613,1636 ****
          auto oldInEnumDecl = hgs.inEnumDecl;
          scope(exit) hgs.inEnumDecl = oldInEnumDecl;
          hgs.inEnumDecl = d;
!         buf.writestring("enum ");
          if (d.ident)
          {
!             buf.writestring(d.ident.toString());
          }
          if (d.memtype)
          {
!             buf.writestring(" : ");
              typeToBuffer(d.memtype, null, buf, hgs);
          }
          if (!d.members)
          {
!             buf.writeByte(';');
              buf.writenl();
              return;
          }
          buf.writenl();
!         buf.writeByte('{');
          buf.writenl();
          buf.level++;
          foreach (em; *d.members)
--- 1613,1636 ----
          auto oldInEnumDecl = hgs.inEnumDecl;
          scope(exit) hgs.inEnumDecl = oldInEnumDecl;
          hgs.inEnumDecl = d;
!         buf.put("enum ");
          if (d.ident)
          {
!             buf.put(d.ident.toString());
          }
          if (d.memtype)
          {
!             buf.put(" : ");
              typeToBuffer(d.memtype, null, buf, hgs);
          }
          if (!d.members)
          {
!             buf.put(';');
              buf.writenl();
              return;
          }
          buf.writenl();
!         buf.put('{');
          buf.writenl();
          buf.level++;
          foreach (em; *d.members)
*************** void toCBuffer(Dsymbol s, ref OutBuffer
*** 1638,1648 ****
              if (!em)
                  continue;
              toCBuffer(em, buf, hgs);
!             buf.writeByte(',');
              buf.writenl();
          }
          buf.level--;
!         buf.writeByte('}');
          buf.writenl();
  
          if (!hgs.importcHdr || !d.ident)
--- 1638,1648 ----
              if (!em)
                  continue;
              toCBuffer(em, buf, hgs);
!             buf.put(',');
              buf.writenl();
          }
          buf.level--;
!         buf.put('}');
          buf.writenl();
  
          if (!hgs.importcHdr || !d.ident)
*************** void toCBuffer(Dsymbol s, ref OutBuffer
*** 1657,1704 ****
          {
              if (!em)
                  continue;
!             buf.writestring("alias ");
!             buf.writestring(em.ident.toString);
!             buf.writestring(" = ");
!             buf.writestring(d.ident.toString);
!             buf.writeByte('.');
!             buf.writestring(em.ident.toString);
!             buf.writeByte(';');
              buf.writenl();
          }
      }
  
      void visitNspace(Nspace d)
      {
!         buf.writestring("extern (C++, ");
!         buf.writestring(d.ident.toString());
!         buf.writeByte(')');
          buf.writenl();
!         buf.writeByte('{');
          buf.writenl();
          buf.level++;
          foreach (s; *d.members)
              toCBuffer(s, buf, hgs);
          buf.level--;
!         buf.writeByte('}');
          buf.writenl();
      }
  
      void visitStructDeclaration(StructDeclaration d)
      {
          //printf("visitStructDeclaration() %s\n", d.ident.toChars());
!         buf.writestring(d.kind());
!         buf.writeByte(' ');
          if (!d.isAnonymous())
!             buf.writestring(d.toChars());
          if (!d.members)
          {
!             buf.writeByte(';');
              buf.writenl();
              return;
          }
          buf.writenl();
!         buf.writeByte('{');
          buf.writenl();
          buf.level++;
          hgs.insideAggregate++;
--- 1657,1704 ----
          {
              if (!em)
                  continue;
!             buf.put("alias ");
!             buf.put(em.ident.toString);
!             buf.put(" = ");
!             buf.put(d.ident.toString);
!             buf.put('.');
!             buf.put(em.ident.toString);
!             buf.put(';');
              buf.writenl();
          }
      }
  
      void visitNspace(Nspace d)
      {
!         buf.put("extern (C++, ");
!         buf.put(d.ident.toString());
!         buf.put(')');
          buf.writenl();
!         buf.put('{');
          buf.writenl();
          buf.level++;
          foreach (s; *d.members)
              toCBuffer(s, buf, hgs);
          buf.level--;
!         buf.put('}');
          buf.writenl();
      }
  
      void visitStructDeclaration(StructDeclaration d)
      {
          //printf("visitStructDeclaration() %s\n", d.ident.toChars());
!         buf.put(d.kind());
!         buf.put(' ');
          if (!d.isAnonymous())
!             buf.put(d.toChars());
          if (!d.members)
          {
!             buf.put(';');
              buf.writenl();
              return;
          }
          buf.writenl();
!         buf.put('{');
          buf.writenl();
          buf.level++;
          hgs.insideAggregate++;
*************** void toCBuffer(Dsymbol s, ref OutBuffer
*** 1706,1712 ****
              toCBuffer(s, buf, hgs);
          hgs.insideAggregate--;
          buf.level--;
!         buf.writeByte('}');
          buf.writenl();
      }
  
--- 1706,1712 ----
              toCBuffer(s, buf, hgs);
          hgs.insideAggregate--;
          buf.level--;
!         buf.put('}');
          buf.writenl();
      }
  
*************** void toCBuffer(Dsymbol s, ref OutBuffer
*** 1714,1728 ****
      {
          if (!d.isAnonymous())
          {
!             buf.writestring(d.kind());
!             buf.writeByte(' ');
!             buf.writestring(d.ident.toString());
          }
          visitBaseClasses(d);
          if (d.members)
          {
              buf.writenl();
!             buf.writeByte('{');
              buf.writenl();
              buf.level++;
              hgs.insideAggregate++;
--- 1714,1728 ----
      {
          if (!d.isAnonymous())
          {
!             buf.put(d.kind());
!             buf.put(' ');
!             buf.put(d.ident.toString());
          }
          visitBaseClasses(d);
          if (d.members)
          {
              buf.writenl();
!             buf.put('{');
              buf.writenl();
              buf.level++;
              hgs.insideAggregate++;
*************** void toCBuffer(Dsymbol s, ref OutBuffer
*** 1730,1739 ****
                  toCBuffer(s, buf, hgs);
              hgs.insideAggregate--;
              buf.level--;
!             buf.writeByte('}');
          }
          else
!             buf.writeByte(';');
          buf.writenl();
      }
  
--- 1730,1739 ----
                  toCBuffer(s, buf, hgs);
              hgs.insideAggregate--;
              buf.level--;
!             buf.put('}');
          }
          else
!             buf.put(';');
          buf.writenl();
      }
  
*************** void toCBuffer(Dsymbol s, ref OutBuffer
*** 1743,1755 ****
              return;
          if (d.hidden)
              return;
!         buf.writestring("alias ");
          if (d.aliassym)
          {
!             buf.writestring(d.ident.toString());
!             buf.writestring(" = ");
              if (stcToBuffer(buf, d.storage_class))
!                 buf.writeByte(' ');
              /*
                  https://issues.dlang.org/show_bug.cgi?id=23223
                  https://issues.dlang.org/show_bug.cgi?id=23222
--- 1743,1755 ----
              return;
          if (d.hidden)
              return;
!         buf.put("alias ");
          if (d.aliassym)
          {
!             buf.put(d.ident.toString());
!             buf.put(" = ");
              if (stcToBuffer(buf, d.storage_class))
!                 buf.put(' ');
              /*
                  https://issues.dlang.org/show_bug.cgi?id=23223
                  https://issues.dlang.org/show_bug.cgi?id=23222
*************** void toCBuffer(Dsymbol s, ref OutBuffer
*** 1758,1764 ****
              */
              if (d.aliassym.isModule())
              {
!                 buf.writestring(d.aliassym.ident.toString());
              }
              else
              {
--- 1758,1764 ----
              */
              if (d.aliassym.isModule())
              {
!                 buf.put(d.aliassym.ident.toString());
              }
              else
              {
*************** void toCBuffer(Dsymbol s, ref OutBuffer
*** 1768,1801 ****
          else if (d.type.ty == Tfunction)
          {
              if (stcToBuffer(buf, d.storage_class))
!                 buf.writeByte(' ');
              typeToBuffer(d.type, d.ident, buf, hgs);
          }
          else if (d.ident)
          {
              hgs.declstring = (d.ident == Id.string || d.ident == Id.wstring || d.ident == Id.dstring);
!             buf.writestring(d.ident.toString());
!             buf.writestring(" = ");
              if (stcToBuffer(buf, d.storage_class))
!                 buf.writeByte(' ');
              hgs.inCAlias = hgs.importcHdr;
              typeToBuffer(d.type, null, buf, hgs);
              hgs.inCAlias = false;
              hgs.declstring = false;
          }
!         buf.writeByte(';');
          buf.writenl();
      }
  
      void visitAliasAssign(AliasAssign d)
      {
!         buf.writestring(d.ident.toString());
!         buf.writestring(" = ");
          if (d.aliassym)
              toCBuffer(d.aliassym, buf, hgs);
          else // d.type
              typeToBuffer(d.type, null, buf, hgs);
!         buf.writeByte(';');
          buf.writenl();
      }
  
--- 1768,1801 ----
          else if (d.type.ty == Tfunction)
          {
              if (stcToBuffer(buf, d.storage_class))
!                 buf.put(' ');
              typeToBuffer(d.type, d.ident, buf, hgs);
          }
          else if (d.ident)
          {
              hgs.declstring = (d.ident == Id.string || d.ident == Id.wstring || d.ident == Id.dstring);
!             buf.put(d.ident.toString());
!             buf.put(" = ");
              if (stcToBuffer(buf, d.storage_class))
!                 buf.put(' ');
              hgs.inCAlias = hgs.importcHdr;
              typeToBuffer(d.type, null, buf, hgs);
              hgs.inCAlias = false;
              hgs.declstring = false;
          }
!         buf.put(';');
          buf.writenl();
      }
  
      void visitAliasAssign(AliasAssign d)
      {
!         buf.put(d.ident.toString());
!         buf.put(" = ");
          if (d.aliassym)
              toCBuffer(d.aliassym, buf, hgs);
          else // d.type
              typeToBuffer(d.type, null, buf, hgs);
!         buf.put(';');
          buf.writenl();
      }
  
*************** void toCBuffer(Dsymbol s, ref OutBuffer
*** 1804,1810 ****
          if (d.storage_class & STC.local)
              return;
          visitVarDecl(d, false, buf, hgs);
!         buf.writeByte(';');
          buf.writenl();
      }
  
--- 1804,1810 ----
          if (d.storage_class & STC.local)
              return;
          visitVarDecl(d, false, buf, hgs);
!         buf.put(';');
          buf.writenl();
      }
  
*************** void toCBuffer(Dsymbol s, ref OutBuffer
*** 1814,1821 ****
  
          // https://issues.dlang.org/show_bug.cgi?id=24891
          // return/scope storage classes are printed as part of function type
!         if (stcToBuffer(buf, f.storage_class & ~(STC.scope_ | STC.return_ | STC.returnScope)))
!             buf.writeByte(' ');
          typeToBuffer(f.type, f.ident, buf, hgs);
          auto tf = f.type.isTypeFunction();
  
--- 1814,1821 ----
  
          // https://issues.dlang.org/show_bug.cgi?id=24891
          // return/scope storage classes are printed as part of function type
!         if (stcToBuffer(buf, f.storage_class & ~(STC.scope_ | STC.return_ | STC.returnScope | STC.returnRef)))
!             buf.put(' ');
          typeToBuffer(f.type, f.ident, buf, hgs);
          auto tf = f.type.isTypeFunction();
  
*************** void toCBuffer(Dsymbol s, ref OutBuffer
*** 1840,1846 ****
                          buf.writenl();
                      contractsToBuffer(f);
                  }
!                 buf.writeByte(';');
                  buf.writenl();
              }
              else
--- 1840,1846 ----
                          buf.writenl();
                      contractsToBuffer(f);
                  }
!                 buf.put(';');
                  buf.writenl();
              }
              else
*************** void toCBuffer(Dsymbol s, ref OutBuffer
*** 1854,1866 ****
      {
          if (f.type.ty == Terror)
          {
!             buf.writestring("__error");
              return;
          }
          if (f.tok != TOK.reserved && !hgs.errorMsg)
          {
!             buf.writestring(f.kind());
!             buf.writeByte(' ');
          }
          TypeFunction tf = cast(TypeFunction)f.type;
  
--- 1854,1866 ----
      {
          if (f.type.ty == Terror)
          {
!             buf.put("__error");
              return;
          }
          if (f.tok != TOK.reserved && !hgs.errorMsg)
          {
!             buf.put(f.kind());
!             buf.put(' ');
          }
          TypeFunction tf = cast(TypeFunction)f.type;
  
*************** void toCBuffer(Dsymbol s, ref OutBuffer
*** 1871,1878 ****
          // https://issues.dlang.org/show_bug.cgi?id=20074
          void printAttribute(string str)
          {
!             buf.writeByte(' ');
!             buf.writestring(str);
          }
  
          if (!hgs.errorMsg)
--- 1871,1878 ----
          // https://issues.dlang.org/show_bug.cgi?id=20074
          void printAttribute(string str)
          {
!             buf.put(' ');
!             buf.put(str);
          }
  
          if (!hgs.errorMsg)
*************** void toCBuffer(Dsymbol s, ref OutBuffer
*** 1889,1895 ****
          ReturnStatement rs = s1 ? s1.endsWithReturnStatement() : null;
          if (rs && rs.exp)
          {
!             buf.writestring(" => ");
              rs.exp.expressionToBuffer(buf, hgs);
          }
          else
--- 1889,1895 ----
          ReturnStatement rs = s1 ? s1.endsWithReturnStatement() : null;
          if (rs && rs.exp)
          {
!             buf.put(" => ");
              rs.exp.expressionToBuffer(buf, hgs);
          }
          else
*************** void toCBuffer(Dsymbol s, ref OutBuffer
*** 1903,1931 ****
      void visitPostBlitDeclaration(PostBlitDeclaration d)
      {
          if (stcToBuffer(buf, d.storage_class))
!             buf.writeByte(' ');
!         buf.writestring("this(this)");
          bodyToBuffer(d);
      }
  
      void visitDtorDeclaration(DtorDeclaration d)
      {
          if (stcToBuffer(buf, d.storage_class))
!             buf.writeByte(' ');
!         buf.writestring("~this()");
          bodyToBuffer(d);
      }
  
      void visitStaticCtorDeclaration(StaticCtorDeclaration d)
      {
          if (stcToBuffer(buf, d.storage_class & ~STC.static_))
!             buf.writeByte(' ');
          if (d.isSharedStaticCtorDeclaration())
!             buf.writestring("shared ");
!         buf.writestring("static this()");
          if (hgs.hdrgen && !hgs.tpltMember)
          {
!             buf.writeByte(';');
              buf.writenl();
          }
          else
--- 1903,1931 ----
      void visitPostBlitDeclaration(PostBlitDeclaration d)
      {
          if (stcToBuffer(buf, d.storage_class))
!             buf.put(' ');
!         buf.put("this(this)");
          bodyToBuffer(d);
      }
  
      void visitDtorDeclaration(DtorDeclaration d)
      {
          if (stcToBuffer(buf, d.storage_class))
!             buf.put(' ');
!         buf.put("~this()");
          bodyToBuffer(d);
      }
  
      void visitStaticCtorDeclaration(StaticCtorDeclaration d)
      {
          if (stcToBuffer(buf, d.storage_class & ~STC.static_))
!             buf.put(' ');
          if (d.isSharedStaticCtorDeclaration())
!             buf.put("shared ");
!         buf.put("static this()");
          if (hgs.hdrgen && !hgs.tpltMember)
          {
!             buf.put(';');
              buf.writenl();
          }
          else
*************** void toCBuffer(Dsymbol s, ref OutBuffer
*** 1935,1947 ****
      void visitStaticDtorDeclaration(StaticDtorDeclaration d)
      {
          if (stcToBuffer(buf, d.storage_class & ~STC.static_))
!             buf.writeByte(' ');
          if (d.isSharedStaticDtorDeclaration())
!             buf.writestring("shared ");
!         buf.writestring("static ~this()");
          if (hgs.hdrgen && !hgs.tpltMember)
          {
!             buf.writeByte(';');
              buf.writenl();
          }
          else
--- 1935,1947 ----
      void visitStaticDtorDeclaration(StaticDtorDeclaration d)
      {
          if (stcToBuffer(buf, d.storage_class & ~STC.static_))
!             buf.put(' ');
          if (d.isSharedStaticDtorDeclaration())
!             buf.put("shared ");
!         buf.put("static ~this()");
          if (hgs.hdrgen && !hgs.tpltMember)
          {
!             buf.put(';');
              buf.writenl();
          }
          else
*************** void toCBuffer(Dsymbol s, ref OutBuffer
*** 1953,1966 ****
          if (hgs.hdrgen)
              return;
          if (stcToBuffer(buf, d.storage_class))
!             buf.writeByte(' ');
!         buf.writestring("invariant");
          auto es = d.fbody.isExpStatement();
          if (es && es.exp && es.exp.op == EXP.assert_)
          {
!             buf.writestring(" (");
              (cast(AssertExp)es.exp).e1.expressionToBuffer(buf, hgs);
!             buf.writestring(");");
              buf.writenl();
          }
          else
--- 1953,1966 ----
          if (hgs.hdrgen)
              return;
          if (stcToBuffer(buf, d.storage_class))
!             buf.put(' ');
!         buf.put("invariant");
          auto es = d.fbody.isExpStatement();
          if (es && es.exp && es.exp.op == EXP.assert_)
          {
!             buf.put(" (");
              (cast(AssertExp)es.exp).e1.expressionToBuffer(buf, hgs);
!             buf.put(");");
              buf.writenl();
          }
          else
*************** void toCBuffer(Dsymbol s, ref OutBuffer
*** 1974,2001 ****
          if (hgs.hdrgen)
              return;
          if (stcToBuffer(buf, d.storage_class))
!             buf.writeByte(' ');
!         buf.writestring("unittest");
          bodyToBuffer(d);
      }
  
      void visitBitFieldDeclaration(BitFieldDeclaration d)
      {
          if (stcToBuffer(buf, d.storage_class))
!             buf.writeByte(' ');
          Identifier id = d.isAnonymous() ? null : d.ident;
          typeToBuffer(d.type, id, buf, hgs);
!         buf.writestring(" : ");
          d.width.expressionToBuffer(buf, hgs);
!         buf.writeByte(';');
          buf.writenl();
      }
  
      void visitNewDeclaration(NewDeclaration d)
      {
          if (stcToBuffer(buf, d.storage_class & ~STC.static_))
!             buf.writeByte(' ');
!         buf.writestring("new();");
      }
  
      void visitModule(Module m)
--- 1974,2001 ----
          if (hgs.hdrgen)
              return;
          if (stcToBuffer(buf, d.storage_class))
!             buf.put(' ');
!         buf.put("unittest");
          bodyToBuffer(d);
      }
  
      void visitBitFieldDeclaration(BitFieldDeclaration d)
      {
          if (stcToBuffer(buf, d.storage_class))
!             buf.put(' ');
          Identifier id = d.isAnonymous() ? null : d.ident;
          typeToBuffer(d.type, id, buf, hgs);
!         buf.put(" : ");
          d.width.expressionToBuffer(buf, hgs);
!         buf.put(';');
          buf.writenl();
      }
  
      void visitNewDeclaration(NewDeclaration d)
      {
          if (stcToBuffer(buf, d.storage_class & ~STC.static_))
!             buf.put(' ');
!         buf.put("new();");
      }
  
      void visitModule(Module m)
*************** void toCBuffer(Dsymbol s, ref OutBuffer
*** 2062,2076 ****
  public
  void toCharsMaybeConstraints(const TemplateDeclaration td, ref OutBuffer buf, ref HdrGenState hgs)
  {
!     buf.writestring(td.ident == Id.ctor ? "this" : td.ident.toString());
!     buf.writeByte('(');
      foreach (i, const tp; *td.parameters)
      {
          if (i)
!             buf.writestring(", ");
          toCBuffer(tp, buf, hgs);
      }
!     buf.writeByte(')');
  
      if (hgs.showOneMember && td.onemember)
      {
--- 2062,2076 ----
  public
  void toCharsMaybeConstraints(const TemplateDeclaration td, ref OutBuffer buf, ref HdrGenState hgs)
  {
!     buf.put(td.ident == Id.ctor ? "this" : td.ident.toString());
!     buf.put('(');
      foreach (i, const tp; *td.parameters)
      {
          if (i)
!             buf.put(", ");
          toCBuffer(tp, buf, hgs);
      }
!     buf.put(')');
  
      if (hgs.showOneMember && td.onemember)
      {
*************** void toCharsMaybeConstraints(const Templ
*** 2079,2088 ****
              if (TypeFunction tf = cast(TypeFunction)fd.type.isTypeFunction())
              {
                  // !! Casted away const
!                 buf.writestring(parametersTypeToChars(tf.parameterList));
                  if (tf.mod)
                  {
!                     buf.writeByte(' ');
                      buf.MODtoBuffer(tf.mod);
                  }
              }
--- 2079,2088 ----
              if (TypeFunction tf = cast(TypeFunction)fd.type.isTypeFunction())
              {
                  // !! Casted away const
!                 buf.put(parametersTypeToChars(tf.parameterList));
                  if (tf.mod)
                  {
!                     buf.put(' ');
                      buf.MODtoBuffer(tf.mod);
                  }
              }
*************** void toCharsMaybeConstraints(const Templ
*** 2092,2100 ****
      if (!hgs.skipConstraints &&
          td.constraint)
      {
!         buf.writestring(" if (");
          toCBuffer(td.constraint, buf, hgs);
!         buf.writeByte(')');
      }
  }
  
--- 2092,2100 ----
      if (!hgs.skipConstraints &&
          td.constraint)
      {
!         buf.put(" if (");
          toCBuffer(td.constraint, buf, hgs);
!         buf.put(')');
      }
  }
  
*************** private void visitTemplateParameters(Tem
*** 2109,2115 ****
      foreach (i, p; *parameters)
      {
          if (i)
!             buf.writestring(", ");
          toCBuffer(p, buf, hgs);
      }
  }
--- 2109,2115 ----
      foreach (i, p; *parameters)
      {
          if (i)
!             buf.put(", ");
          toCBuffer(p, buf, hgs);
      }
  }
*************** private void visitVarDecl(VarDeclaration
*** 2137,2148 ****
  
      const commentIt = hgs.importcHdr && isSpecialCName(v.ident);
      if (commentIt)
!         buf.writestring("/+");
  
      if (anywritten)
      {
!         buf.writestring(", ");
!         buf.writestring(v.ident.toString());
      }
      else
      {
--- 2137,2148 ----
  
      const commentIt = hgs.importcHdr && isSpecialCName(v.ident);
      if (commentIt)
!         buf.put("/+");
  
      if (anywritten)
      {
!         buf.put(", ");
!         buf.put(v.ident.toString());
      }
      else
      {
*************** private void visitVarDecl(VarDeclaration
*** 2153,2178 ****
          if (useTypeof)
              stc &= ~STC.auto_;
          if (stcToBuffer(buf, stc))
!             buf.writeByte(' ');
          if (v.type)
              typeToBuffer(v.type, v.ident, buf, hgs);
          else if (useTypeof)
          {
!             buf.writestring("typeof(");
              vinit(v);
!             buf.writestring(") ");
!             buf.writestring(v.ident.toString());
          }
          else
!             buf.writestring(v.ident.toString());
      }
      if (v._init && !isextern)
      {
!         buf.writestring(" = ");
          vinit(v);
      }
      if (commentIt)
!         buf.writestring("+/");
  }
  
  /*************************************
--- 2153,2178 ----
          if (useTypeof)
              stc &= ~STC.auto_;
          if (stcToBuffer(buf, stc))
!             buf.put(' ');
          if (v.type)
              typeToBuffer(v.type, v.ident, buf, hgs);
          else if (useTypeof)
          {
!             buf.put("typeof(");
              vinit(v);
!             buf.put(") ");
!             buf.put(v.ident.toString());
          }
          else
!             buf.put(v.ident.toString());
      }
      if (v._init && !isextern)
      {
!         buf.put(" = ");
          vinit(v);
      }
      if (commentIt)
!         buf.put("+/");
  }
  
  /*************************************
*************** private void expressionPrettyPrint(Expre
*** 2204,2210 ****
  {
      void visit(Expression e)
      {
!         buf.writestring(EXPtoString(e.op));
      }
  
      void visitInteger(IntegerExp e)
--- 2204,2210 ----
  {
      void visit(Expression e)
      {
!         buf.put(EXPtoString(e.op));
      }
  
      void visitInteger(IntegerExp e)
*************** private void expressionPrettyPrint(Expre
*** 2248,2267 ****
                      break;
                  }
              case Tint8:
!                 buf.writestring("cast(byte)");
                  goto L2;
              case Tint16:
!                 buf.writestring("cast(short)");
                  goto L2;
              case Tint32:
              L2:
                  buf.printf("%d", cast(int)v);
                  break;
              case Tuns8:
!                 buf.writestring("cast(ubyte)");
                  goto case Tuns32;
              case Tuns16:
!                 buf.writestring("cast(ushort)");
                  goto case Tuns32;
              case Tuns32:
                  buf.printf("%uu", cast(uint)v);
--- 2248,2267 ----
                      break;
                  }
              case Tint8:
!                 buf.put("cast(byte)");
                  goto L2;
              case Tint16:
!                 buf.put("cast(short)");
                  goto L2;
              case Tint32:
              L2:
                  buf.printf("%d", cast(int)v);
                  break;
              case Tuns8:
!                 buf.put("cast(ubyte)");
                  goto case Tuns32;
              case Tuns16:
!                 buf.put("cast(ushort)");
                  goto case Tuns32;
              case Tuns32:
                  buf.printf("%uu", cast(uint)v);
*************** private void expressionPrettyPrint(Expre
*** 2272,2278 ****
                      // https://issues.dlang.org/show_bug.cgi?id=23173
                      // This is a special case because - is not part of the
                      // integer literal and 9223372036854775808L overflows a long
!                     buf.writestring("cast(long)-9223372036854775808");
                  }
                  else
                  {
--- 2272,2278 ----
                      // https://issues.dlang.org/show_bug.cgi?id=23173
                      // This is a special case because - is not part of the
                      // integer literal and 9223372036854775808L overflows a long
!                     buf.put("cast(long)-9223372036854775808");
                  }
                  else
                  {
*************** private void expressionPrettyPrint(Expre
*** 2283,2302 ****
                  buf.printf("%lluLU", v);
                  break;
              case Tbool:
!                 buf.writestring(v ? "true" : "false");
                  break;
              case Tpointer:
!                 buf.writestring("cast(");
  
                  HdrGenState hgs2;               // should re-examine need for new hgs
                  hgs2.fullQual = (t.ty == Tclass && !t.mod);
                  toCBuffer(t, buf, null, hgs2);
  
!                 buf.writestring(")cast(size_t)");
                  goto case Tuns64;
  
              case Tvoid:
!                 buf.writestring("cast(void)0");
                  break;
  
              default:
--- 2283,2302 ----
                  buf.printf("%lluLU", v);
                  break;
              case Tbool:
!                 buf.put(v ? "true" : "false");
                  break;
              case Tpointer:
!                 buf.put("cast(");
  
                  HdrGenState hgs2;               // should re-examine need for new hgs
                  hgs2.fullQual = (t.ty == Tclass && !t.mod);
                  toCBuffer(t, buf, null, hgs2);
  
!                 buf.put(")cast(size_t)");
                  goto case Tuns64;
  
              case Tvoid:
!                 buf.put("cast(void)0");
                  break;
  
              default:
*************** private void expressionPrettyPrint(Expre
*** 2315,2326 ****
  
      void visitError(ErrorExp e)
      {
!         buf.writestring("__error");
      }
  
      void visitVoidInit(VoidInitExp e)
      {
!         buf.writestring("void");
      }
  
      void floatToBuffer(Type type, real_t value)
--- 2315,2326 ----
  
      void visitError(ErrorExp e)
      {
!         buf.put("__error");
      }
  
      void visitVoidInit(VoidInitExp e)
      {
!         buf.put("void");
      }
  
      void floatToBuffer(Type type, real_t value)
*************** private void expressionPrettyPrint(Expre
*** 2338,2356 ****
          /* Print as:
           *  (re+imi)
           */
!         buf.writeByte('(');
          floatToBuffer(e.type, creall(e.value));
!         buf.writeByte('+');
          floatToBuffer(e.type, cimagl(e.value));
!         buf.writestring("i)");
      }
  
      void visitIdentifier(IdentifierExp e)
      {
          if (hgs.hdrgen || hgs.ddoc)
!             buf.writestring(e.ident.toHChars2());
          else
!             buf.writestring(e.ident.toString());
      }
  
      void visitDsymbol(Dsymbol s)
--- 2338,2356 ----
          /* Print as:
           *  (re+imi)
           */
!         buf.put('(');
          floatToBuffer(e.type, creall(e.value));
!         buf.put('+');
          floatToBuffer(e.type, cimagl(e.value));
!         buf.put("i)");
      }
  
      void visitIdentifier(IdentifierExp e)
      {
          if (hgs.hdrgen || hgs.ddoc)
!             buf.put(e.ident.toHChars2());
          else
!             buf.put(e.ident.toString());
      }
  
      void visitDsymbol(Dsymbol s)
*************** private void expressionPrettyPrint(Expre
*** 2359,2367 ****
          // This condition is a bit kludge, and can be cleaned up if the
          // mutual dependency `AST.toChars <> hdrgen.d` gets refactored
          if (hgs.vcg_ast && s.ident && !s.isTemplateInstance() && !s.isTemplateDeclaration())
!             buf.writestring(s.ident.toChars());
          else
!             buf.writestring(s.toChars());
      }
  
      void visitDsymbolExp(DsymbolExp e)
--- 2359,2367 ----
          // This condition is a bit kludge, and can be cleaned up if the
          // mutual dependency `AST.toChars <> hdrgen.d` gets refactored
          if (hgs.vcg_ast && s.ident && !s.isTemplateInstance() && !s.isTemplateDeclaration())
!             buf.put(s.ident.toChars());
          else
!             buf.put(s.toChars());
      }
  
      void visitDsymbolExp(DsymbolExp e)
*************** private void expressionPrettyPrint(Expre
*** 2371,2403 ****
  
      void visitThis(ThisExp e)
      {
!         buf.writestring("this");
      }
  
      void visitSuper(SuperExp e)
      {
!         buf.writestring("super");
      }
  
      void visitNull(NullExp e)
      {
!         buf.writestring("null");
      }
  
      void visitString(StringExp e)
      {
          if (e.hexString || e.sz == 8)
          {
!             buf.writeByte('x');
!             buf.writeByte('"');
              foreach (i; 0 .. e.len)
                  buf.printf("%0*llX", e.sz, e.getIndex(i));
!             buf.writeByte('"');
              if (e.postfix)
!                 buf.writeByte(e.postfix);
              return;
          }
!         buf.writeByte('"');
          const o = buf.length;
          foreach (i; 0 .. e.len)
          {
--- 2371,2403 ----
  
      void visitThis(ThisExp e)
      {
!         buf.put("this");
      }
  
      void visitSuper(SuperExp e)
      {
!         buf.put("super");
      }
  
      void visitNull(NullExp e)
      {
!         buf.put("null");
      }
  
      void visitString(StringExp e)
      {
          if (e.hexString || e.sz == 8)
          {
!             buf.put('x');
!             buf.put('"');
              foreach (i; 0 .. e.len)
                  buf.printf("%0*llX", e.sz, e.getIndex(i));
!             buf.put('"');
              if (e.postfix)
!                 buf.put(e.postfix);
              return;
          }
!         buf.put('"');
          const o = buf.length;
          foreach (i; 0 .. e.len)
          {
*************** private void expressionPrettyPrint(Expre
*** 2405,2419 ****
          }
          if (hgs.ddoc)
              escapeDdocString(buf, o);
!         buf.writeByte('"');
          if (e.postfix)
!             buf.writeByte(e.postfix);
      }
  
      void visitInterpolation(InterpExp e)
      {
!         buf.writeByte('i');
!         buf.writeByte('"');
          const o = buf.length;
  
          foreach (idx, str; e.interpolatedSet.parts)
--- 2405,2419 ----
          }
          if (hgs.ddoc)
              escapeDdocString(buf, o);
!         buf.put('"');
          if (e.postfix)
!             buf.put(e.postfix);
      }
  
      void visitInterpolation(InterpExp e)
      {
!         buf.put('i');
!         buf.put('"');
          const o = buf.length;
  
          foreach (idx, str; e.interpolatedSet.parts)
*************** private void expressionPrettyPrint(Expre
*** 2425,2478 ****
              }
              else
              {
!                 buf.writeByte('$');
!                 buf.writeByte('(');
                  foreach(ch; str)
!                     buf.writeByte(ch);
!                 buf.writeByte(')');
              }
          }
  
          if (hgs.ddoc)
              escapeDdocString(buf, o);
!         buf.writeByte('"');
          if (e.postfix)
!             buf.writeByte(e.postfix);
  
      }
  
      void visitArrayLiteral(ArrayLiteralExp e)
      {
!         buf.writeByte('[');
          argsToBuffer(e.elements, buf, hgs, e.basis);
!         buf.writeByte(']');
      }
  
      void visitAssocArrayLiteral(AssocArrayLiteralExp e)
      {
!         buf.writeByte('[');
          foreach (i, key; *e.keys)
          {
              if (i)
!                 buf.writestring(", ");
              expToBuffer(key, PREC.assign, buf, hgs);
!             buf.writeByte(':');
              auto value = (*e.values)[i];
              expToBuffer(value, PREC.assign, buf, hgs);
          }
!         buf.writeByte(']');
      }
  
      void visitStructLiteral(StructLiteralExp e)
      {
!         buf.writestring(e.sd.toChars());
!         buf.writeByte('(');
          // CTFE can generate struct literals that contain an AddrExp pointing
          // to themselves, need to avoid infinite recursion:
          // struct S { this(int){ this.s = &this; } S* s; }
          // const foo = new S(0);
          if (e.stageflags & StructLiteralExp.StageFlags.toCBuffer)
!             buf.writestring("<recursion>");
          else
          {
              const old = e.stageflags;
--- 2425,2483 ----
              }
              else
              {
!                 buf.put('$');
!                 buf.put('(');
                  foreach(ch; str)
!                     buf.put(ch);
!                 buf.put(')');
              }
          }
  
          if (hgs.ddoc)
              escapeDdocString(buf, o);
!         buf.put('"');
          if (e.postfix)
!             buf.put(e.postfix);
  
      }
  
      void visitArrayLiteral(ArrayLiteralExp e)
      {
!         buf.put('[');
          argsToBuffer(e.elements, buf, hgs, e.basis);
!         buf.put(']');
      }
  
      void visitAssocArrayLiteral(AssocArrayLiteralExp e)
      {
!         if (hgs.vcg_ast && e.lowering)
!         {
!             expToBuffer(e.lowering, PREC.assign, buf, hgs);
!             return;
!         }
!         buf.put('[');
          foreach (i, key; *e.keys)
          {
              if (i)
!                 buf.put(", ");
              expToBuffer(key, PREC.assign, buf, hgs);
!             buf.put(':');
              auto value = (*e.values)[i];
              expToBuffer(value, PREC.assign, buf, hgs);
          }
!         buf.put(']');
      }
  
      void visitStructLiteral(StructLiteralExp e)
      {
!         buf.put(e.sd.toChars());
!         buf.put('(');
          // CTFE can generate struct literals that contain an AddrExp pointing
          // to themselves, need to avoid infinite recursion:
          // struct S { this(int){ this.s = &this; } S* s; }
          // const foo = new S(0);
          if (e.stageflags & StructLiteralExp.StageFlags.toCBuffer)
!             buf.put("<recursion>");
          else
          {
              const old = e.stageflags;
*************** private void expressionPrettyPrint(Expre
*** 2480,2493 ****
              argsToBuffer(e.elements, buf, hgs);
              e.stageflags = old;
          }
!         buf.writeByte(')');
      }
  
      void visitCompoundLiteral(CompoundLiteralExp e)
      {
!         buf.writeByte('(');
          typeToBuffer(e.type, null, buf, hgs);
!         buf.writeByte(')');
          e.initializer.initializerToBuffer(buf, hgs);
      }
  
--- 2485,2498 ----
              argsToBuffer(e.elements, buf, hgs);
              e.stageflags = old;
          }
!         buf.put(')');
      }
  
      void visitCompoundLiteral(CompoundLiteralExp e)
      {
!         buf.put('(');
          typeToBuffer(e.type, null, buf, hgs);
!         buf.put(')');
          e.initializer.initializerToBuffer(buf, hgs);
      }
  
*************** private void expressionPrettyPrint(Expre
*** 2506,2549 ****
          {
              // fixes bug 6491
              if (auto m = e.sds.isModule())
!                 buf.writestring(m.md.toChars());
              else
!                 buf.writestring(e.sds.toChars());
          }
          else
          {
!             buf.writestring(e.sds.kind());
!             buf.writeByte(' ');
!             buf.writestring(e.sds.toChars());
          }
      }
  
      void visitTemplate(TemplateExp e)
      {
!         buf.writestring(e.td.toChars());
      }
  
      void visitNew(NewExp e)
      {
          if (e.thisexp)
          {
              expToBuffer(e.thisexp, PREC.primary, buf, hgs);
!             buf.writeByte('.');
          }
!         buf.writestring("new ");
          if (e.placement)
          {
!             buf.writeByte('(');
              expToBuffer(e.placement, PREC.assign, buf, hgs);
!             buf.writeByte(')');
!             buf.writeByte(' ');
          }
          typeToBuffer(e.newtype, null, buf, hgs);
          if (e.arguments && e.arguments.length)
          {
!             buf.writeByte('(');
              argsToBuffer(e.arguments, buf, hgs, null, e.names);
!             buf.writeByte(')');
          }
      }
  
--- 2511,2559 ----
          {
              // fixes bug 6491
              if (auto m = e.sds.isModule())
!                 buf.put(m.md.toChars());
              else
!                 buf.put(e.sds.toChars());
          }
          else
          {
!             buf.put(e.sds.kind());
!             buf.put(' ');
!             buf.put(e.sds.toChars());
          }
      }
  
      void visitTemplate(TemplateExp e)
      {
!         buf.put(e.td.toChars());
      }
  
      void visitNew(NewExp e)
      {
+         if (hgs.vcg_ast && e.lowering)
+         {
+             expToBuffer(e.lowering, PREC.primary, buf, hgs);
+             return;
+         }
          if (e.thisexp)
          {
              expToBuffer(e.thisexp, PREC.primary, buf, hgs);
!             buf.put('.');
          }
!         buf.put("new ");
          if (e.placement)
          {
!             buf.put('(');
              expToBuffer(e.placement, PREC.assign, buf, hgs);
!             buf.put(')');
!             buf.put(' ');
          }
          typeToBuffer(e.newtype, null, buf, hgs);
          if (e.arguments && e.arguments.length)
          {
!             buf.put('(');
              argsToBuffer(e.arguments, buf, hgs, null, e.names);
!             buf.put(')');
          }
      }
  
*************** private void expressionPrettyPrint(Expre
*** 2552,2573 ****
          if (e.thisexp)
          {
              expToBuffer(e.thisexp, PREC.primary, buf, hgs);
!             buf.writeByte('.');
          }
!         buf.writestring("new");
          if (e.placement)
          {
!             buf.writeByte(' ');
!             buf.writeByte('(');
              expToBuffer(e.placement, PREC.assign, buf, hgs);
!             buf.writeByte(')');
          }
!         buf.writestring(" class ");
          if (e.arguments && e.arguments.length)
          {
!             buf.writeByte('(');
              argsToBuffer(e.arguments, buf, hgs);
!             buf.writeByte(')');
          }
          if (e.cd)
              e.cd.dsymbolToBuffer(buf, hgs);
--- 2562,2583 ----
          if (e.thisexp)
          {
              expToBuffer(e.thisexp, PREC.primary, buf, hgs);
!             buf.put('.');
          }
!         buf.put("new");
          if (e.placement)
          {
!             buf.put(' ');
!             buf.put('(');
              expToBuffer(e.placement, PREC.assign, buf, hgs);
!             buf.put(')');
          }
!         buf.put(" class ");
          if (e.arguments && e.arguments.length)
          {
!             buf.put('(');
              argsToBuffer(e.arguments, buf, hgs);
!             buf.put(')');
          }
          if (e.cd)
              e.cd.dsymbolToBuffer(buf, hgs);
*************** private void expressionPrettyPrint(Expre
*** 2578,2584 ****
          if (e.offset)
              buf.printf("(& %s + %llu)", e.var.toChars(), e.offset);
          else if (e.var.isTypeInfoDeclaration())
!             buf.writestring(e.var.toChars());
          else
              buf.printf("& %s", e.var.toChars());
      }
--- 2588,2594 ----
          if (e.offset)
              buf.printf("(& %s + %llu)", e.var.toChars(), e.offset);
          else if (e.var.isTypeInfoDeclaration())
!             buf.put(e.var.toChars());
          else
              buf.printf("& %s", e.var.toChars());
      }
*************** private void expressionPrettyPrint(Expre
*** 2590,2620 ****
  
      void visitOver(OverExp e)
      {
!         buf.writestring(e.vars.ident.toString());
      }
  
      void visitTuple(TupleExp e)
      {
          if (e.e0)
          {
!             buf.writeByte('(');
              e.e0.expressionPrettyPrint(buf, hgs);
!             buf.writestring(", AliasSeq!(");
              argsToBuffer(e.exps, buf, hgs);
!             buf.writestring("))");
          }
          else
          {
!             buf.writestring("AliasSeq!(");
              argsToBuffer(e.exps, buf, hgs);
!             buf.writeByte(')');
          }
      }
  
      void visitFunc(FuncExp e)
      {
          e.fd.dsymbolToBuffer(buf, hgs);
!         //buf.writestring(e.fd.toChars());
      }
  
      void visitDeclaration(DeclarationExp e)
--- 2600,2630 ----
  
      void visitOver(OverExp e)
      {
!         buf.put(e.vars.ident.toString());
      }
  
      void visitTuple(TupleExp e)
      {
          if (e.e0)
          {
!             buf.put('(');
              e.e0.expressionPrettyPrint(buf, hgs);
!             buf.put(", AliasSeq!(");
              argsToBuffer(e.exps, buf, hgs);
!             buf.put("))");
          }
          else
          {
!             buf.put("AliasSeq!(");
              argsToBuffer(e.exps, buf, hgs);
!             buf.put(')');
          }
      }
  
      void visitFunc(FuncExp e)
      {
          e.fd.dsymbolToBuffer(buf, hgs);
!         //buf.put(e.fd.toChars());
      }
  
      void visitDeclaration(DeclarationExp e)
*************** private void expressionPrettyPrint(Expre
*** 2631,2642 ****
              // - Avoid printing newline.
              // - Intentionally use the format (Type var;)
              //   which isn't correct as regular D code.
!                 buf.writeByte('(');
  
                  visitVarDecl(var, false, buf, hgs);
  
!                 buf.writeByte(';');
!                 buf.writeByte(')');
              }
              else e.declaration.dsymbolToBuffer(buf, hgs);
          }
--- 2641,2652 ----
              // - Avoid printing newline.
              // - Intentionally use the format (Type var;)
              //   which isn't correct as regular D code.
!                 buf.put('(');
  
                  visitVarDecl(var, false, buf, hgs);
  
!                 buf.put(';');
!                 buf.put(')');
              }
              else e.declaration.dsymbolToBuffer(buf, hgs);
          }
*************** private void expressionPrettyPrint(Expre
*** 2644,2705 ****
  
      void visitTypeid(TypeidExp e)
      {
!         buf.writestring("typeid(");
          objectToBuffer(e.obj, buf, hgs);
!         buf.writeByte(')');
      }
  
      void visitTraits(TraitsExp e)
      {
!         buf.writestring("__traits(");
          if (e.ident)
!             buf.writestring(e.ident.toString());
          if (e.args)
          {
              foreach (arg; *e.args)
              {
!                 buf.writestring(", ");
                  objectToBuffer(arg, buf, hgs);
              }
          }
!         buf.writeByte(')');
      }
  
      void visitHalt(HaltExp e)
      {
!         buf.writestring("halt");
      }
  
      void visitIs(IsExp e)
      {
!         buf.writestring("is(");
          typeToBuffer(e.targ, e.id, buf, hgs);
          if (e.tok2 != TOK.reserved)
          {
!             buf.writeByte(' ');
!             buf.writestring(Token.toString(e.tok));
!             buf.writeByte(' ');
!             buf.writestring(Token.toString(e.tok2));
          }
          else if (e.tspec)
          {
              if (e.tok == TOK.colon)
!                 buf.writestring(" : ");
              else
!                 buf.writestring(" == ");
              typeToBuffer(e.tspec, null, buf, hgs);
          }
          if (e.parameters && e.parameters.length)
          {
!             buf.writestring(", ");
              visitTemplateParameters(e.parameters, buf, hgs);
          }
!         buf.writeByte(')');
      }
  
      void visitUna(UnaExp e)
      {
!         buf.writestring(EXPtoString(e.op));
          expToBuffer(e.e1, precedence[e.op], buf, hgs);
      }
  
--- 2654,2715 ----
  
      void visitTypeid(TypeidExp e)
      {
!         buf.put("typeid(");
          objectToBuffer(e.obj, buf, hgs);
!         buf.put(')');
      }
  
      void visitTraits(TraitsExp e)
      {
!         buf.put("__traits(");
          if (e.ident)
!             buf.put(e.ident.toString());
          if (e.args)
          {
              foreach (arg; *e.args)
              {
!                 buf.put(", ");
                  objectToBuffer(arg, buf, hgs);
              }
          }
!         buf.put(')');
      }
  
      void visitHalt(HaltExp e)
      {
!         buf.put("halt");
      }
  
      void visitIs(IsExp e)
      {
!         buf.put("is(");
          typeToBuffer(e.targ, e.id, buf, hgs);
          if (e.tok2 != TOK.reserved)
          {
!             buf.put(' ');
!             buf.put(Token.toString(e.tok));
!             buf.put(' ');
!             buf.put(Token.toString(e.tok2));
          }
          else if (e.tspec)
          {
              if (e.tok == TOK.colon)
!                 buf.put(" : ");
              else
!                 buf.put(" == ");
              typeToBuffer(e.tspec, null, buf, hgs);
          }
          if (e.parameters && e.parameters.length)
          {
!             buf.put(", ");
              visitTemplateParameters(e.parameters, buf, hgs);
          }
!         buf.put(')');
      }
  
      void visitUna(UnaExp e)
      {
!         buf.put(EXPtoString(e.op));
          expToBuffer(e.e1, precedence[e.op], buf, hgs);
      }
  
*************** private void expressionPrettyPrint(Expre
*** 2716,2729 ****
      void visitBin(BinExp e)
      {
          expToBuffer(e.e1, precedence[e.op], buf, hgs);
!         buf.writeByte(' ');
!         buf.writestring(EXPtoString(e.op));
!         buf.writeByte(' ');
          expToBuffer(e.e2, cast(PREC)(precedence[e.op] + 1), buf, hgs);
      }
  
      void visitComma(CommaExp e)
      {
          // CommaExp is generated by the compiler so it shouldn't
          // appear in error messages or header files.
          // For now, this treats the case where the compiler
--- 2726,2745 ----
      void visitBin(BinExp e)
      {
          expToBuffer(e.e1, precedence[e.op], buf, hgs);
!         buf.put(' ');
!         buf.put(EXPtoString(e.op));
!         buf.put(' ');
          expToBuffer(e.e2, cast(PREC)(precedence[e.op] + 1), buf, hgs);
      }
  
      void visitComma(CommaExp e)
      {
+         if (e.originalExp !is null)
+         {
+             e.originalExp.expressionPrettyPrint(buf, hgs);
+             return;
+         }
+ 
          // CommaExp is generated by the compiler so it shouldn't
          // appear in error messages or header files.
          // For now, this treats the case where the compiler
*************** private void expressionPrettyPrint(Expre
*** 2759,2765 ****
  
              if (commaExtract)
              {
!                 expToBuffer(commaExtract, precedence[exp.op], buf, hgs);
                  return;
              }
          }
--- 2775,2781 ----
  
              if (commaExtract)
              {
!                 expToBuffer(commaExtract, expPrecedence(hgs, exp), buf, hgs);
                  return;
              }
          }
*************** private void expressionPrettyPrint(Expre
*** 2771,2850 ****
  
      void visitMixin(MixinExp e)
      {
!         buf.writestring("mixin(");
          argsToBuffer(e.exps, buf, hgs, null);
!         buf.writeByte(')');
      }
  
      void visitImport(ImportExp e)
      {
!         buf.writestring("import(");
          expToBuffer(e.e1, PREC.assign, buf, hgs);
!         buf.writeByte(')');
      }
  
      void visitAssert(AssertExp e)
      {
!         buf.writestring("assert(");
          expToBuffer(e.e1, PREC.assign, buf, hgs);
          if (e.msg)
          {
!             buf.writestring(", ");
              expToBuffer(e.msg, PREC.assign, buf, hgs);
          }
!         buf.writeByte(')');
      }
  
      void visitThrow(ThrowExp e)
      {
!         buf.writestring("throw ");
          expToBuffer(e.e1, PREC.unary, buf, hgs);
      }
  
      void visitDotId(DotIdExp e)
      {
          expToBuffer(e.e1, PREC.primary, buf, hgs);
!         buf.writeByte('.');
!         buf.writestring(e.ident.toString());
      }
  
      void visitDotTemplate(DotTemplateExp e)
      {
          expToBuffer(e.e1, PREC.primary, buf, hgs);
!         buf.writeByte('.');
!         buf.writestring(e.td.toChars());
      }
  
      void visitDotVar(DotVarExp e)
      {
          expToBuffer(e.e1, PREC.primary, buf, hgs);
!         buf.writeByte('.');
          visitDsymbol(e.var);
      }
  
      void visitDotTemplateInstance(DotTemplateInstanceExp e)
      {
          expToBuffer(e.e1, PREC.primary, buf, hgs);
!         buf.writeByte('.');
          e.ti.dsymbolToBuffer(buf, hgs);
      }
  
      void visitDelegate(DelegateExp e)
      {
!         buf.writeByte('&');
          if (!e.func.isNested() || e.func.needThis())
          {
              expToBuffer(e.e1, PREC.primary, buf, hgs);
!             buf.writeByte('.');
          }
!         buf.writestring(e.func.toChars());
      }
  
      void visitDotType(DotTypeExp e)
      {
          expToBuffer(e.e1, PREC.primary, buf, hgs);
!         buf.writeByte('.');
!         buf.writestring(e.sym.toChars());
      }
  
      void visitCall(CallExp e)
--- 2787,2866 ----
  
      void visitMixin(MixinExp e)
      {
!         buf.put("mixin(");
          argsToBuffer(e.exps, buf, hgs, null);
!         buf.put(')');
      }
  
      void visitImport(ImportExp e)
      {
!         buf.put("import(");
          expToBuffer(e.e1, PREC.assign, buf, hgs);
!         buf.put(')');
      }
  
      void visitAssert(AssertExp e)
      {
!         buf.put("assert(");
          expToBuffer(e.e1, PREC.assign, buf, hgs);
          if (e.msg)
          {
!             buf.put(", ");
              expToBuffer(e.msg, PREC.assign, buf, hgs);
          }
!         buf.put(')');
      }
  
      void visitThrow(ThrowExp e)
      {
!         buf.put("throw ");
          expToBuffer(e.e1, PREC.unary, buf, hgs);
      }
  
      void visitDotId(DotIdExp e)
      {
          expToBuffer(e.e1, PREC.primary, buf, hgs);
!         buf.put('.');
!         buf.put(e.ident.toString());
      }
  
      void visitDotTemplate(DotTemplateExp e)
      {
          expToBuffer(e.e1, PREC.primary, buf, hgs);
!         buf.put('.');
!         buf.put(e.td.toChars());
      }
  
      void visitDotVar(DotVarExp e)
      {
          expToBuffer(e.e1, PREC.primary, buf, hgs);
!         buf.put('.');
          visitDsymbol(e.var);
      }
  
      void visitDotTemplateInstance(DotTemplateInstanceExp e)
      {
          expToBuffer(e.e1, PREC.primary, buf, hgs);
!         buf.put('.');
          e.ti.dsymbolToBuffer(buf, hgs);
      }
  
      void visitDelegate(DelegateExp e)
      {
!         buf.put('&');
          if (!e.func.isNested() || e.func.needThis())
          {
              expToBuffer(e.e1, PREC.primary, buf, hgs);
!             buf.put('.');
          }
!         buf.put(e.func.toChars());
      }
  
      void visitDotType(DotTypeExp e)
      {
          expToBuffer(e.e1, PREC.primary, buf, hgs);
!         buf.put('.');
!         buf.put(e.sym.toChars());
      }
  
      void visitCall(CallExp e)
*************** private void expressionPrettyPrint(Expre
*** 2859,3021 ****
              e.e1.expressionPrettyPrint(buf, hgs);
          }
          else
              expToBuffer(e.e1, precedence[e.op], buf, hgs);
!         buf.writeByte('(');
          argsToBuffer(e.arguments, buf, hgs, null, e.names);
!         buf.writeByte(')');
      }
  
      void visitPtr(PtrExp e)
      {
!         buf.writeByte('*');
          expToBuffer(e.e1, precedence[e.op], buf, hgs);
      }
  
      void visitDelete(DeleteExp e)
      {
!         buf.writestring("delete ");
          expToBuffer(e.e1, precedence[e.op], buf, hgs);
      }
  
      void visitCast(CastExp e)
      {
!         buf.writestring("cast(");
          if (e.to)
              typeToBuffer(e.to, null, buf, hgs);
          else
          {
              MODtoBuffer(buf, e.mod);
          }
!         buf.writeByte(')');
          expToBuffer(e.e1, precedence[e.op], buf, hgs);
      }
  
      void visitVector(VectorExp e)
      {
!         buf.writestring("cast(");
          typeToBuffer(e.to, null, buf, hgs);
!         buf.writeByte(')');
          expToBuffer(e.e1, precedence[e.op], buf, hgs);
      }
  
      void visitVectorArray(VectorArrayExp e)
      {
          expToBuffer(e.e1, PREC.primary, buf, hgs);
!         buf.writestring(".array");
      }
  
      void visitSlice(SliceExp e)
      {
          expToBuffer(e.e1, precedence[e.op], buf, hgs);
!         buf.writeByte('[');
          if (e.upr || e.lwr)
          {
              if (e.lwr)
                  sizeToBuffer(e.lwr, buf, hgs);
              else
!                 buf.writeByte('0');
!             buf.writestring("..");
              if (e.upr)
                  sizeToBuffer(e.upr, buf, hgs);
              else
!                 buf.writeByte('$');
          }
!         buf.writeByte(']');
      }
  
      void visitArrayLength(ArrayLengthExp e)
      {
          expToBuffer(e.e1, PREC.primary, buf, hgs);
!         buf.writestring(".length");
      }
  
      void visitInterval(IntervalExp e)
      {
          expToBuffer(e.lwr, PREC.assign, buf, hgs);
!         buf.writestring("..");
          expToBuffer(e.upr, PREC.assign, buf, hgs);
      }
  
      void visitDelegatePtr(DelegatePtrExp e)
      {
          expToBuffer(e.e1, PREC.primary, buf, hgs);
!         buf.writestring(".ptr");
      }
  
      void visitDelegateFuncptr(DelegateFuncptrExp e)
      {
          expToBuffer(e.e1, PREC.primary, buf, hgs);
!         buf.writestring(".funcptr");
      }
  
      void visitArray(ArrayExp e)
      {
          expToBuffer(e.e1, PREC.primary, buf, hgs);
!         buf.writeByte('[');
          argsToBuffer(e.arguments, buf, hgs);
!         buf.writeByte(']');
      }
  
      void visitDot(DotExp e)
      {
          expToBuffer(e.e1, PREC.primary, buf, hgs);
!         buf.writeByte('.');
          expToBuffer(e.e2, PREC.primary, buf, hgs);
      }
  
      void visitIndex(IndexExp e)
      {
          expToBuffer(e.e1, PREC.primary, buf, hgs);
!         buf.writeByte('[');
          sizeToBuffer(e.e2, buf, hgs);
!         buf.writeByte(']');
      }
  
      void visitPost(PostExp e)
      {
          expToBuffer(e.e1, precedence[e.op], buf, hgs);
!         buf.writestring(EXPtoString(e.op));
      }
  
      void visitPre(PreExp e)
      {
!         buf.writestring(EXPtoString(e.op));
          expToBuffer(e.e1, precedence[e.op], buf, hgs);
      }
  
      void visitRemove(RemoveExp e)
      {
          expToBuffer(e.e1, PREC.primary, buf, hgs);
!         buf.writestring(".remove(");
          expToBuffer(e.e2, PREC.assign, buf, hgs);
!         buf.writeByte(')');
      }
  
      void visitCond(CondExp e)
      {
          expToBuffer(e.econd, PREC.oror, buf, hgs);
!         buf.writestring(" ? ");
          expToBuffer(e.e1, PREC.expr, buf, hgs);
!         buf.writestring(" : ");
          expToBuffer(e.e2, PREC.cond, buf, hgs);
      }
  
      void visitDefaultInit(DefaultInitExp e)
      {
!         buf.writestring(EXPtoString(e.op));
      }
  
      void visitClassReference(ClassReferenceExp e)
      {
!         buf.writestring(e.value.toChars());
      }
  
      if (e.rvalue)
!         buf.writestring("__rvalue(");
  
      scope (exit)
          if (e.rvalue)
!             buf.writeByte(')');
  
      switch (e.op)
      {
--- 2875,3073 ----
              e.e1.expressionPrettyPrint(buf, hgs);
          }
          else
+         {
+             if (!hgs.vcg_ast && e.loweredFrom)
+             {
+                 // restore original syntax for expressions lowered to calls
+                 expressionToBuffer(e.loweredFrom, buf, hgs);
+                 return;
+             }
              expToBuffer(e.e1, precedence[e.op], buf, hgs);
!         }
!         buf.put('(');
          argsToBuffer(e.arguments, buf, hgs, null, e.names);
!         buf.put(')');
!     }
! 
!     void visitNot(NotExp e)
!     {
!         if (!hgs.vcg_ast && e.loweredFrom)
!             return expressionToBuffer(e.loweredFrom, buf, hgs);
!         return visitUna(e);
      }
  
      void visitPtr(PtrExp e)
      {
!         buf.put('*');
          expToBuffer(e.e1, precedence[e.op], buf, hgs);
      }
  
      void visitDelete(DeleteExp e)
      {
!         buf.put("delete ");
          expToBuffer(e.e1, precedence[e.op], buf, hgs);
      }
  
      void visitCast(CastExp e)
      {
!         buf.put("cast(");
          if (e.to)
              typeToBuffer(e.to, null, buf, hgs);
          else
          {
              MODtoBuffer(buf, e.mod);
          }
!         buf.put(')');
          expToBuffer(e.e1, precedence[e.op], buf, hgs);
      }
  
      void visitVector(VectorExp e)
      {
!         buf.put("cast(");
          typeToBuffer(e.to, null, buf, hgs);
!         buf.put(')');
          expToBuffer(e.e1, precedence[e.op], buf, hgs);
      }
  
      void visitVectorArray(VectorArrayExp e)
      {
          expToBuffer(e.e1, PREC.primary, buf, hgs);
!         buf.put(".array");
      }
  
      void visitSlice(SliceExp e)
      {
          expToBuffer(e.e1, precedence[e.op], buf, hgs);
!         buf.put('[');
          if (e.upr || e.lwr)
          {
              if (e.lwr)
                  sizeToBuffer(e.lwr, buf, hgs);
              else
!                 buf.put('0');
!             buf.put("..");
              if (e.upr)
                  sizeToBuffer(e.upr, buf, hgs);
              else
!                 buf.put('$');
          }
!         buf.put(']');
      }
  
      void visitArrayLength(ArrayLengthExp e)
      {
          expToBuffer(e.e1, PREC.primary, buf, hgs);
!         buf.put(".length");
      }
  
      void visitInterval(IntervalExp e)
      {
          expToBuffer(e.lwr, PREC.assign, buf, hgs);
!         buf.put("..");
          expToBuffer(e.upr, PREC.assign, buf, hgs);
      }
  
      void visitDelegatePtr(DelegatePtrExp e)
      {
          expToBuffer(e.e1, PREC.primary, buf, hgs);
!         buf.put(".ptr");
      }
  
      void visitDelegateFuncptr(DelegateFuncptrExp e)
      {
          expToBuffer(e.e1, PREC.primary, buf, hgs);
!         buf.put(".funcptr");
      }
  
      void visitArray(ArrayExp e)
      {
          expToBuffer(e.e1, PREC.primary, buf, hgs);
!         buf.put('[');
          argsToBuffer(e.arguments, buf, hgs);
!         buf.put(']');
      }
  
      void visitDot(DotExp e)
      {
          expToBuffer(e.e1, PREC.primary, buf, hgs);
!         buf.put('.');
          expToBuffer(e.e2, PREC.primary, buf, hgs);
      }
  
+     void visitCat(CatExp e)
+     {
+         if (hgs.vcg_ast && e.lowering)
+             expressionToBuffer(e.lowering, buf, hgs);
+         else
+             visitBin(e);
+     }
+ 
+     void visitCatAssign(CatAssignExp e)
+     {
+         if (hgs.vcg_ast && e.lowering)
+             expressionToBuffer(e.lowering, buf, hgs);
+         else
+             visitBin(e);
+     }
+ 
      void visitIndex(IndexExp e)
      {
+         if (!hgs.vcg_ast && e.loweredFrom)
+         {
+             expressionToBuffer(e.loweredFrom, buf, hgs);
+             return;
+         }
          expToBuffer(e.e1, PREC.primary, buf, hgs);
!         buf.put('[');
          sizeToBuffer(e.e2, buf, hgs);
!         buf.put(']');
      }
  
      void visitPost(PostExp e)
      {
          expToBuffer(e.e1, precedence[e.op], buf, hgs);
!         buf.put(EXPtoString(e.op));
      }
  
      void visitPre(PreExp e)
      {
!         buf.put(EXPtoString(e.op));
          expToBuffer(e.e1, precedence[e.op], buf, hgs);
      }
  
      void visitRemove(RemoveExp e)
      {
          expToBuffer(e.e1, PREC.primary, buf, hgs);
!         buf.put(".remove(");
          expToBuffer(e.e2, PREC.assign, buf, hgs);
!         buf.put(')');
      }
  
      void visitCond(CondExp e)
      {
          expToBuffer(e.econd, PREC.oror, buf, hgs);
!         buf.put(" ? ");
          expToBuffer(e.e1, PREC.expr, buf, hgs);
!         buf.put(" : ");
          expToBuffer(e.e2, PREC.cond, buf, hgs);
      }
  
      void visitDefaultInit(DefaultInitExp e)
      {
!         buf.put(EXPtoString(e.op));
      }
  
      void visitClassReference(ClassReferenceExp e)
      {
!         buf.put(e.value.toChars());
      }
  
      if (e.rvalue)
!         buf.put("__rvalue(");
  
      scope (exit)
          if (e.rvalue)
!             buf.put(')');
  
      switch (e.op)
      {
*************** private void expressionPrettyPrint(Expre
*** 3071,3076 ****
--- 3123,3129 ----
          case EXP.delegate_:     return visitDelegate(e.isDelegateExp());
          case EXP.dotType:       return visitDotType(e.isDotTypeExp());
          case EXP.call:          return visitCall(e.isCallExp());
+         case EXP.not:           return visitNot(e.isNotExp());
          case EXP.star:          return visitPtr(e.isPtrExp());
          case EXP.delete_:       return visitDelete(e.isDeleteExp());
          case EXP.cast_:         return visitCast(e.isCastExp());
*************** private void expressionPrettyPrint(Expre
*** 3084,3089 ****
--- 3137,3146 ----
          case EXP.array:         return visitArray(e.isArrayExp());
          case EXP.dot:           return visitDot(e.isDotExp());
          case EXP.index:         return visitIndex(e.isIndexExp());
+         case EXP.concatenate:   return visitCat(e.isCatExp());
+         case EXP.concatenateAssign:     return visitCatAssign(e.isCatAssignExp());
+         case EXP.concatenateElemAssign: return visitCatAssign(e.isCatElemAssignExp());
+         case EXP.concatenateDcharAssign:        return visitCatAssign(e.isCatDcharAssignExp());
          case EXP.minusMinus:
          case EXP.plusPlus:      return visitPost(e.isPostExp());
          case EXP.preMinusMinus:
*************** void floatToBuffer(Type type, const real
*** 3123,3129 ****
          if (r != value) // if exact duplication
              CTFloat.sprint(buffer.ptr, BUFFER_LEN, 'a', value);
      }
!     buf.writestring(buffer.ptr);
      if (buffer.ptr[strlen(buffer.ptr) - 1] == '.')
          buf.remove(buf.length() - 1, 1);
  
--- 3180,3186 ----
          if (r != value) // if exact duplication
              CTFloat.sprint(buffer.ptr, BUFFER_LEN, 'a', value);
      }
!     buf.put(buffer.ptr);
      if (buffer.ptr[strlen(buffer.ptr) - 1] == '.')
          buf.remove(buf.length() - 1, 1);
  
*************** void floatToBuffer(Type type, const real
*** 3135,3152 ****
          case Tfloat32:
          case Timaginary32:
          case Tcomplex32:
!             buf.writeByte('F');
              break;
          case Tfloat80:
          case Timaginary80:
          case Tcomplex80:
!             buf.writeByte('L');
              break;
          default:
              break;
          }
          if (t.isImaginary())
!             buf.writeByte('i');
      }
  }
  
--- 3192,3209 ----
          case Tfloat32:
          case Timaginary32:
          case Tcomplex32:
!             buf.put('F');
              break;
          case Tfloat80:
          case Timaginary80:
          case Tcomplex80:
!             buf.put('L');
              break;
          default:
              break;
          }
          if (t.isImaginary())
!             buf.put('i');
      }
  }
  
*************** public:
*** 3171,3210 ****
  
      override void visit(TemplateTypeParameter tp)
      {
!         buf.writestring(tp.ident.toString());
          if (tp.specType)
          {
!             buf.writestring(" : ");
              typeToBuffer(tp.specType, null, *buf, *hgs);
          }
          if (tp.defaultType)
          {
!             buf.writestring(" = ");
              typeToBuffer(tp.defaultType, null, *buf, *hgs);
          }
      }
  
      override void visit(TemplateThisParameter tp)
      {
!         buf.writestring("this ");
          visit(cast(TemplateTypeParameter)tp);
      }
  
      override void visit(TemplateAliasParameter tp)
      {
!         buf.writestring("alias ");
          if (tp.specType)
              typeToBuffer(tp.specType, tp.ident, *buf, *hgs);
          else
!             buf.writestring(tp.ident.toString());
          if (tp.specAlias)
          {
!             buf.writestring(" : ");
              objectToBuffer(tp.specAlias, *buf, *hgs);
          }
          if (tp.defaultAlias)
          {
!             buf.writestring(" = ");
              objectToBuffer(tp.defaultAlias, *buf, *hgs);
          }
      }
--- 3228,3267 ----
  
      override void visit(TemplateTypeParameter tp)
      {
!         buf.put(tp.ident.toString());
          if (tp.specType)
          {
!             buf.put(" : ");
              typeToBuffer(tp.specType, null, *buf, *hgs);
          }
          if (tp.defaultType)
          {
!             buf.put(" = ");
              typeToBuffer(tp.defaultType, null, *buf, *hgs);
          }
      }
  
      override void visit(TemplateThisParameter tp)
      {
!         buf.put("this ");
          visit(cast(TemplateTypeParameter)tp);
      }
  
      override void visit(TemplateAliasParameter tp)
      {
!         buf.put("alias ");
          if (tp.specType)
              typeToBuffer(tp.specType, tp.ident, *buf, *hgs);
          else
!             buf.put(tp.ident.toString());
          if (tp.specAlias)
          {
!             buf.put(" : ");
              objectToBuffer(tp.specAlias, *buf, *hgs);
          }
          if (tp.defaultAlias)
          {
!             buf.put(" = ");
              objectToBuffer(tp.defaultAlias, *buf, *hgs);
          }
      }
*************** public:
*** 3214,3233 ****
          typeToBuffer(tp.valType, tp.ident, *buf, *hgs);
          if (tp.specValue)
          {
!             buf.writestring(" : ");
              tp.specValue.expressionToBuffer(*buf, *hgs);
          }
          if (tp.defaultValue)
          {
!             buf.writestring(" = ");
              tp.defaultValue.expressionToBuffer(*buf, *hgs);
          }
      }
  
      override void visit(TemplateTupleParameter tp)
      {
!         buf.writestring(tp.ident.toString());
!         buf.writestring("...");
      }
  }
  
--- 3271,3290 ----
          typeToBuffer(tp.valType, tp.ident, *buf, *hgs);
          if (tp.specValue)
          {
!             buf.put(" : ");
              tp.specValue.expressionToBuffer(*buf, *hgs);
          }
          if (tp.defaultValue)
          {
!             buf.put(" = ");
              tp.defaultValue.expressionToBuffer(*buf, *hgs);
          }
      }
  
      override void visit(TemplateTupleParameter tp)
      {
!         buf.put(tp.ident.toString());
!         buf.put("...");
      }
  }
  
*************** public:
*** 3252,3274 ****
  
      override void visit(DebugCondition c)
      {
!         buf.writestring("debug (");
!         buf.writestring(c.ident.toString());
!         buf.writeByte(')');
      }
  
      override void visit(VersionCondition c)
      {
!         buf.writestring("version (");
!         buf.writestring(c.ident.toString());
!         buf.writeByte(')');
      }
  
      override void visit(StaticIfCondition c)
      {
!         buf.writestring("static if (");
          c.exp.expressionToBuffer(*buf, *hgs);
!         buf.writeByte(')');
      }
  }
  
--- 3309,3335 ----
  
      override void visit(DebugCondition c)
      {
!         buf.put("debug");
!         if (c.ident)
!         {
!             buf.put(" (");
!             buf.put(c.ident.toString());
!             buf.put(')');
!         }
      }
  
      override void visit(VersionCondition c)
      {
!         buf.put("version (");
!         buf.put(c.ident.toString());
!         buf.put(')');
      }
  
      override void visit(StaticIfCondition c)
      {
!         buf.put("static if (");
          c.exp.expressionToBuffer(*buf, *hgs);
!         buf.put(')');
      }
  }
  
*************** void toCBufferInstance(const TemplateIns
*** 3288,3294 ****
      HdrGenState hgs;
      hgs.fullQual = qualifyTypes;
  
!     buf.writestring(ti.name.toChars());
      tiargsToBuffer(cast() ti, buf, hgs);
  }
  
--- 3349,3355 ----
      HdrGenState hgs;
      hgs.fullQual = qualifyTypes;
  
!     buf.put(ti.name.toChars());
      tiargsToBuffer(cast() ti, buf, hgs);
  }
  
*************** bool stcToBuffer(ref OutBuffer buf, STC
*** 3304,3322 ****
  
      if (stc & STC.scopeinferred)
      {
!         //buf.writestring("scope-inferred ");
          stc &= ~(STC.scope_ | STC.scopeinferred);
      }
      if (stc & STC.returninferred)
      {
!         //buf.writestring((stc & STC.returnScope) ? "return-scope-inferred " : "return-ref-inferred ");
          stc &= ~(STC.return_ | STC.returninferred);
      }
  
      // ensure `auto ref` keywords are (almost) adjacent
      if (stc & STC.auto_)
      {
!         buf.writestring("auto ");
          stc &= ~STC.auto_;
      }
      /* Put scope ref return into a standard order
--- 3365,3383 ----
  
      if (stc & STC.scopeinferred)
      {
!         //buf.put("scope-inferred ");
          stc &= ~(STC.scope_ | STC.scopeinferred);
      }
      if (stc & STC.returninferred)
      {
!         //buf.put((stc & STC.returnScope) ? "return-scope-inferred " : "return-ref-inferred ");
          stc &= ~(STC.return_ | STC.returninferred);
      }
  
      // ensure `auto ref` keywords are (almost) adjacent
      if (stc & STC.auto_)
      {
!         buf.put("auto ");
          stc &= ~STC.auto_;
      }
      /* Put scope ref return into a standard order
*************** bool stcToBuffer(ref OutBuffer buf, STC
*** 3338,3344 ****
          case ScopeRef.ReturnRef_Scope:  rrs = isout ? "return out scope" : "return ref scope"; goto L1;
          case ScopeRef.Ref_ReturnScope:  rrs = isout ? "out return scope" : "ref return scope"; goto L1;
          L1:
!             buf.writestring(rrs);
              result = true;
              stc &= ~(STC.out_ | STC.scope_ | STC.ref_ | STC.return_);
              break;
--- 3399,3405 ----
          case ScopeRef.ReturnRef_Scope:  rrs = isout ? "return out scope" : "return ref scope"; goto L1;
          case ScopeRef.Ref_ReturnScope:  rrs = isout ? "out return scope" : "ref return scope"; goto L1;
          L1:
!             buf.put(rrs);
              result = true;
              stc &= ~(STC.out_ | STC.scope_ | STC.ref_ | STC.return_);
              break;
*************** bool stcToBuffer(ref OutBuffer buf, STC
*** 3350,3358 ****
          if (!s.length)
              break;
          if (result)
!             buf.writeByte(' ');
          result = true;
!         buf.writestring(s);
      }
  
      return result;
--- 3411,3419 ----
          if (!s.length)
              break;
          if (result)
!             buf.put(' ');
          result = true;
!         buf.put(s);
      }
  
      return result;
*************** private void linkageToBuffer(ref OutBuff
*** 3427,3435 ****
      const s = linkageToString(linkage);
      if (s.length)
      {
!         buf.writestring("extern (");
!         buf.writestring(s);
!         buf.writeByte(')');
      }
  }
  
--- 3488,3496 ----
      const s = linkageToString(linkage);
      if (s.length)
      {
!         buf.put("extern (");
!         buf.put(s);
!         buf.put(')');
      }
  }
  
*************** string linkageToString(LINK linkage) pur
*** 3457,3468 ****
  
  void visibilityToBuffer(ref OutBuffer buf, Visibility vis)
  {
!     buf.writestring(visibilityToString(vis.kind));
      if (vis.kind == Visibility.Kind.package_ && vis.pkg)
      {
!         buf.writeByte('(');
!         buf.writestring(vis.pkg.toPrettyChars(true));
!         buf.writeByte(')');
      }
  }
  
--- 3518,3529 ----
  
  void visibilityToBuffer(ref OutBuffer buf, Visibility vis)
  {
!     buf.put(visibilityToString(vis.kind));
      if (vis.kind == Visibility.Kind.package_ && vis.pkg)
      {
!         buf.put('(');
!         buf.put(vis.pkg.toPrettyChars(true));
!         buf.put(')');
      }
  }
  
*************** void argExpTypesToCBuffer(ref OutBuffer
*** 3522,3528 ****
      foreach (i, arg; *arguments)
      {
          if (i)
!             buf.writestring(", ");
          typeToBuffer(arg.type, null, buf, hgs);
      }
  }
--- 3583,3589 ----
      foreach (i, arg; *arguments)
      {
          if (i)
!             buf.put(", ");
          typeToBuffer(arg.type, null, buf, hgs);
      }
  }
*************** void arrayObjectsToBuffer(ref OutBuffer
*** 3535,3541 ****
      foreach (i, o; *objects)
      {
          if (i)
!             buf.writestring(", ");
          objectToBuffer(o, buf, hgs);
      }
  }
--- 3596,3602 ----
      foreach (i, o; *objects)
      {
          if (i)
!             buf.put(", ");
          objectToBuffer(o, buf, hgs);
      }
  }
*************** const(char)* parameterToChars(Parameter
*** 3572,3578 ****
  
      if (tf.parameterList.varargs == VarArg.typesafe && parameter == tf.parameterList[tf.parameterList.parameters.length - 1])
      {
!         buf.writestring("...");
      }
      return buf.extractChars();
  }
--- 3633,3639 ----
  
      if (tf.parameterList.varargs == VarArg.typesafe && parameter == tf.parameterList[tf.parameterList.parameters.length - 1])
      {
!         buf.put("...");
      }
      return buf.extractChars();
  }
*************** const(char)* parameterToChars(Parameter
*** 3588,3598 ****
  
  private void parametersToBuffer(ParameterList pl, ref OutBuffer buf, ref HdrGenState hgs)
  {
!     buf.writeByte('(');
      foreach (i; 0 .. pl.length)
      {
          if (i)
!             buf.writestring(", ");
          pl[i].parameterToBuffer(buf, hgs);
      }
      final switch (pl.varargs)
--- 3649,3659 ----
  
  private void parametersToBuffer(ParameterList pl, ref OutBuffer buf, ref HdrGenState hgs)
  {
!     buf.put('(');
      foreach (i; 0 .. pl.length)
      {
          if (i)
!             buf.put(", ");
          pl[i].parameterToBuffer(buf, hgs);
      }
      final switch (pl.varargs)
*************** private void parametersToBuffer(Paramete
*** 3603,3619 ****
  
          case VarArg.variadic:
              if (pl.length)
!                 buf.writestring(", ");
  
              if (stcToBuffer(buf, pl.stc))
!                 buf.writeByte(' ');
              goto case VarArg.typesafe;
  
          case VarArg.typesafe:
!             buf.writestring("...");
              break;
      }
!     buf.writeByte(')');
  }
  
  
--- 3664,3680 ----
  
          case VarArg.variadic:
              if (pl.length)
!                 buf.put(", ");
  
              if (stcToBuffer(buf, pl.stc))
!                 buf.put(' ');
              goto case VarArg.typesafe;
  
          case VarArg.typesafe:
!             buf.put("...");
              break;
      }
!     buf.put(')');
  }
  
  
*************** private void parameterToBuffer(Parameter
*** 3628,3679 ****
  {
      if (p.userAttribDecl)
      {
!         buf.writeByte('@');
  
          bool isAnonymous = p.userAttribDecl.atts.length > 0 && !(*p.userAttribDecl.atts)[0].isCallExp();
          if (isAnonymous)
!             buf.writeByte('(');
  
          argsToBuffer(p.userAttribDecl.atts, buf, hgs);
  
          if (isAnonymous)
!             buf.writeByte(')');
!         buf.writeByte(' ');
      }
      if (p.storageClass & STC.auto_)
!         buf.writestring("auto ");
  
      STC stc = p.storageClass;
      if (p.storageClass & STC.in_)
      {
!         buf.writestring("in ");
          if ((p.storageClass & (STC.constscoperef | STC.ref_)) == (STC.constscoperef | STC.ref_))
              stc &= ~STC.ref_;
      }
      else if (p.storageClass & STC.lazy_)
!         buf.writestring("lazy ");
      else if (p.storageClass & STC.alias_)
!         buf.writestring("alias ");
  
      if (p.type && p.type.mod & MODFlags.shared_)
          stc &= ~STC.shared_;
  
      if (stcToBuffer(buf, stc & (STC.const_ | STC.immutable_ | STC.wild | STC.shared_ |
          STC.return_ | STC.returninferred | STC.scope_ | STC.scopeinferred | STC.out_ | STC.ref_ | STC.returnScope)))
!         buf.writeByte(' ');
  
      const(char)[] s;
      if (p.storageClass & STC.alias_)
      {
          if (p.ident)
!             buf.writestring(p.ident.toString());
      }
      else if (p.type.isTypeIdentifier() &&
               (s = p.type.isTypeIdentifier().ident.toString()).length > 3 &&
               s[0..3] == "__T")
      {
          // print parameter name, instead of undetermined type parameter
!         buf.writestring(p.ident.toString());
      }
      else
      {
--- 3689,3740 ----
  {
      if (p.userAttribDecl)
      {
!         buf.put('@');
  
          bool isAnonymous = p.userAttribDecl.atts.length > 0 && !(*p.userAttribDecl.atts)[0].isCallExp();
          if (isAnonymous)
!             buf.put('(');
  
          argsToBuffer(p.userAttribDecl.atts, buf, hgs);
  
          if (isAnonymous)
!             buf.put(')');
!         buf.put(' ');
      }
      if (p.storageClass & STC.auto_)
!         buf.put("auto ");
  
      STC stc = p.storageClass;
      if (p.storageClass & STC.in_)
      {
!         buf.put("in ");
          if ((p.storageClass & (STC.constscoperef | STC.ref_)) == (STC.constscoperef | STC.ref_))
              stc &= ~STC.ref_;
      }
      else if (p.storageClass & STC.lazy_)
!         buf.put("lazy ");
      else if (p.storageClass & STC.alias_)
!         buf.put("alias ");
  
      if (p.type && p.type.mod & MODFlags.shared_)
          stc &= ~STC.shared_;
  
      if (stcToBuffer(buf, stc & (STC.const_ | STC.immutable_ | STC.wild | STC.shared_ |
          STC.return_ | STC.returninferred | STC.scope_ | STC.scopeinferred | STC.out_ | STC.ref_ | STC.returnScope)))
!         buf.put(' ');
  
      const(char)[] s;
      if (p.storageClass & STC.alias_)
      {
          if (p.ident)
!             buf.put(p.ident.toString());
      }
      else if (p.type.isTypeIdentifier() &&
               (s = p.type.isTypeIdentifier().ident.toString()).length > 3 &&
               s[0..3] == "__T")
      {
          // print parameter name, instead of undetermined type parameter
!         buf.put(p.ident.toString());
      }
      else
      {
*************** private void parameterToBuffer(Parameter
*** 3682,3688 ****
  
      if (p.defaultArg)
      {
!         buf.writestring(" = ");
          p.defaultArg.expToBuffer(PREC.assign, buf, hgs);
      }
  }
--- 3743,3749 ----
  
      if (p.defaultArg)
      {
!         buf.put(" = ");
          p.defaultArg.expToBuffer(PREC.assign, buf, hgs);
      }
  }
*************** private void parameterToBuffer(Parameter
*** 3695,3703 ****
   *     buf = buffer to write to
   *     hgs = context
   *     basis = replace `null`s in argument list with this expression (for sparse array literals)
!  *     names = if non-null, use these as the names for the arguments
   */
! private void argsToBuffer(Expressions* expressions, ref OutBuffer buf, ref HdrGenState hgs, Expression basis = null, Identifiers* names = null)
  {
      if (!expressions || !expressions.length)
          return;
--- 3756,3764 ----
   *     buf = buffer to write to
   *     hgs = context
   *     basis = replace `null`s in argument list with this expression (for sparse array literals)
!  *     names = if non-null, use these as the argument Labels for the arguments
   */
! private void argsToBuffer(Expressions* expressions, ref OutBuffer buf, ref HdrGenState hgs, Expression basis = null, ArgumentLabels* names = null)
  {
      if (!expressions || !expressions.length)
          return;
*************** private void argsToBuffer(Expressions* e
*** 3706,3717 ****
          foreach (i, el; *expressions)
          {
              if (i)
!                 buf.writestring(", ");
  
!             if (names && i < names.length && (*names)[i])
              {
!                 buf.writestring((*names)[i].toString());
!                 buf.writestring(": ");
              }
              if (!el)
                  el = basis;
--- 3767,3778 ----
          foreach (i, el; *expressions)
          {
              if (i)
!                 buf.put(", ");
  
!             if (names && i < names.length && (*names)[i].name)
              {
!                 buf.put((*names)[i].name.toString());
!                 buf.put(": ");
              }
              if (!el)
                  el = basis;
*************** private void argsToBuffer(Expressions* e
*** 3725,3733 ****
          //      [0..length: basis, 1: e1, 5: e5]
          if (basis)
          {
!             buf.writestring("0..");
              buf.print(expressions.length);
!             buf.writestring(": ");
              expToBuffer(basis, PREC.assign, buf, hgs);
          }
          foreach (i, el; *expressions)
--- 3786,3794 ----
          //      [0..length: basis, 1: e1, 5: e5]
          if (basis)
          {
!             buf.put("0..");
              buf.print(expressions.length);
!             buf.put(": ");
              expToBuffer(basis, PREC.assign, buf, hgs);
          }
          foreach (i, el; *expressions)
*************** private void argsToBuffer(Expressions* e
*** 3736,3747 ****
              {
                  if (basis)
                  {
!                     buf.writestring(", ");
                      buf.print(i);
!                     buf.writestring(": ");
                  }
                  else if (i)
!                     buf.writestring(", ");
                  expToBuffer(el, PREC.assign, buf, hgs);
              }
          }
--- 3797,3808 ----
              {
                  if (basis)
                  {
!                     buf.put(", ");
                      buf.print(i);
!                     buf.put(": ");
                  }
                  else if (i)
!                     buf.put(", ");
                  expToBuffer(el, PREC.assign, buf, hgs);
              }
          }
*************** private void sizeToBuffer(Expression e,
*** 3764,3770 ****
              }
              if (uval <= 0x7FFF_FFFF_FFFF_FFFFUL)
              {
!                 buf.writestring("cast(size_t)");
                  buf.print(uval);
                  return;
              }
--- 3825,3831 ----
              }
              if (uval <= 0x7FFF_FFFF_FFFF_FFFFUL)
              {
!                 buf.put("cast(size_t)");
                  buf.print(uval);
                  return;
              }
*************** private void expressionToBuffer(Expressi
*** 3778,3810 ****
      expressionPrettyPrint(e, buf, hgs);
  }
  
  /**************************************************
   * Write expression out to buf, but wrap it
   * in ( ) if its precedence is less than pr.
   */
  private void expToBuffer(Expression e, PREC pr, ref OutBuffer buf, ref HdrGenState hgs)
  {
      debug
      {
!         if (precedence[e.op] == PREC.zero)
              printf("precedence not defined for token '%s'\n", EXPtoString(e.op).ptr);
      }
      if (e.op == 0xFF)
      {
!         buf.writestring("<FF>");
          return;
      }
!     assert(precedence[e.op] != PREC.zero);
      assert(pr != PREC.zero);
      /* Despite precedence, we don't allow a<b<c expressions.
       * They must be parenthesized.
       */
!     if (precedence[e.op] < pr || (pr == PREC.rel && precedence[e.op] == pr)
!         || (pr >= PREC.or && pr <= PREC.and && precedence[e.op] == PREC.rel))
      {
!         buf.writeByte('(');
          e.expressionToBuffer(buf, hgs);
!         buf.writeByte(')');
      }
      else
      {
--- 3839,3889 ----
      expressionPrettyPrint(e, buf, hgs);
  }
  
+ // to be called if e could be loweredFrom another expression instead of acessing precedence[e.op] directly
+ private PREC expPrecedence(ref HdrGenState hgs, Expression e)
+ {
+     if (!hgs.vcg_ast)
+     {
+         if (auto ce = e.isCallExp())
+         {
+             if (ce.loweredFrom)
+                 e = ce.loweredFrom;
+         }
+         else if (auto ne = e.isNotExp())
+             if (ne.loweredFrom)
+                 e = ne.loweredFrom;
+     }
+     return precedence[e.op];
+ }
+ 
  /**************************************************
   * Write expression out to buf, but wrap it
   * in ( ) if its precedence is less than pr.
   */
  private void expToBuffer(Expression e, PREC pr, ref OutBuffer buf, ref HdrGenState hgs)
  {
+     auto prec = expPrecedence(hgs, e);
      debug
      {
!         if (prec == PREC.zero)
              printf("precedence not defined for token '%s'\n", EXPtoString(e.op).ptr);
      }
      if (e.op == 0xFF)
      {
!         buf.put("<FF>");
          return;
      }
!     assert(prec != PREC.zero);
      assert(pr != PREC.zero);
      /* Despite precedence, we don't allow a<b<c expressions.
       * They must be parenthesized.
       */
!     if (prec < pr || (pr == PREC.rel && prec == pr)
!         || (pr >= PREC.or && pr <= PREC.and && prec == PREC.rel))
      {
!         buf.put('(');
          e.expressionToBuffer(buf, hgs);
!         buf.put(')');
      }
      else
      {
*************** private void typeToBuffer(Type t, const
*** 3827,3834 ****
      visitWithMask(t, modMask, buf, hgs);
      if (ident)
      {
!         buf.writeByte(' ');
!         buf.writestring(ident.toString());
      }
  }
  
--- 3906,3913 ----
      visitWithMask(t, modMask, buf, hgs);
      if (ident)
      {
!         buf.put(' ');
!         buf.put(ident.toString());
      }
  }
  
*************** private void visitWithMask(Type t, ubyte
*** 3845,3876 ****
          if (m & MODFlags.shared_)
          {
              MODtoBuffer(buf, MODFlags.shared_);
!             buf.writeByte('(');
          }
          if (m & MODFlags.wild)
          {
              MODtoBuffer(buf, MODFlags.wild);
!             buf.writeByte('(');
          }
          if (m & (MODFlags.const_ | MODFlags.immutable_))
          {
              MODtoBuffer(buf, m & (MODFlags.const_ | MODFlags.immutable_));
!             buf.writeByte('(');
          }
          typeToBufferx(t, buf, hgs);
          if (m & (MODFlags.const_ | MODFlags.immutable_))
!             buf.writeByte(')');
          if (m & MODFlags.wild)
!             buf.writeByte(')');
          if (m & MODFlags.shared_)
!             buf.writeByte(')');
      }
  }
  
  
  private void dumpTemplateInstance(TemplateInstance ti, ref OutBuffer buf, ref HdrGenState hgs)
  {
!     buf.writeByte('{');
      buf.writenl();
      buf.level++;
  
--- 3924,3955 ----
          if (m & MODFlags.shared_)
          {
              MODtoBuffer(buf, MODFlags.shared_);
!             buf.put('(');
          }
          if (m & MODFlags.wild)
          {
              MODtoBuffer(buf, MODFlags.wild);
!             buf.put('(');
          }
          if (m & (MODFlags.const_ | MODFlags.immutable_))
          {
              MODtoBuffer(buf, m & (MODFlags.const_ | MODFlags.immutable_));
!             buf.put('(');
          }
          typeToBufferx(t, buf, hgs);
          if (m & (MODFlags.const_ | MODFlags.immutable_))
!             buf.put(')');
          if (m & MODFlags.wild)
!             buf.put(')');
          if (m & MODFlags.shared_)
!             buf.put(')');
      }
  }
  
  
  private void dumpTemplateInstance(TemplateInstance ti, ref OutBuffer buf, ref HdrGenState hgs)
  {
!     buf.put('{');
      buf.writenl();
      buf.level++;
  
*************** private void dumpTemplateInstance(Templa
*** 3886,3907 ****
      }
  
      buf.level--;
!     buf.writeByte('}');
      buf.writenl();
  
  }
  
  private void tiargsToBuffer(TemplateInstance ti, ref OutBuffer buf, ref HdrGenState hgs)
  {
!     buf.writeByte('!');
      if (ti.nest)
      {
!         buf.writestring("(...)");
          return;
      }
      if (!ti.tiargs)
      {
!         buf.writestring("()");
          return;
      }
      if (ti.tiargs.length == 1)
--- 3965,3986 ----
      }
  
      buf.level--;
!     buf.put('}');
      buf.writenl();
  
  }
  
  private void tiargsToBuffer(TemplateInstance ti, ref OutBuffer buf, ref HdrGenState hgs)
  {
!     buf.put('!');
      if (ti.nest)
      {
!         buf.put("(...)");
          return;
      }
      if (!ti.tiargs)
      {
!         buf.put("()");
          return;
      }
      if (ti.tiargs.length == 1)
*************** private void tiargsToBuffer(TemplateInst
*** 3927,3942 ****
              }
          }
      }
!     buf.writeByte('(');
      ti.nestUp();
      foreach (i, arg; *ti.tiargs)
      {
          if (i)
!             buf.writestring(", ");
          objectToBuffer(arg, buf, hgs);
      }
      ti.nestDown();
!     buf.writeByte(')');
  }
  
  /****************************************
--- 4006,4021 ----
              }
          }
      }
!     buf.put('(');
      ti.nestUp();
      foreach (i, arg; *ti.tiargs)
      {
          if (i)
!             buf.put(", ");
          objectToBuffer(arg, buf, hgs);
      }
      ti.nestDown();
!     buf.put(')');
  }
  
  /****************************************
*************** private void objectToBuffer(RootObject o
*** 3965,3973 ****
      else if (Dsymbol s = isDsymbol(oarg))
      {
          if (s.ident)
!             buf.writestring(s.ident.toString());
          else
!             buf.writestring(s.toChars());
      }
      else if (auto v = isTuple(oarg))
      {
--- 4044,4052 ----
      else if (Dsymbol s = isDsymbol(oarg))
      {
          if (s.ident)
!             buf.put(s.ident.toString());
          else
!             buf.put(s.toChars());
      }
      else if (auto v = isTuple(oarg))
      {
*************** private void objectToBuffer(RootObject o
*** 3975,3981 ****
          foreach (i, arg; *args)
          {
              if (i)
!                 buf.writestring(", ");
              objectToBuffer(arg, buf, hgs);
          }
      }
--- 4054,4060 ----
          foreach (i, arg; *args)
          {
              if (i)
!                 buf.put(", ");
              objectToBuffer(arg, buf, hgs);
          }
      }
*************** private void objectToBuffer(RootObject o
*** 3985,3991 ****
      }
      else if (!oarg)
      {
!         buf.writestring("NULL");
      }
      else
      {
--- 4064,4070 ----
      }
      else if (!oarg)
      {
!         buf.put("NULL");
      }
      else
      {
*************** private void visitFuncIdentWithPostfix(T
*** 4009,4015 ****
      if (t.linkage > LINK.d && hgs.ddoc != 1 && !hgs.hdrgen)
      {
          linkageToBuffer(buf, t.linkage);
!         buf.writeByte(' ');
      }
      if (t.linkage == LINK.objc && isStatic)
          buf.write("static ");
--- 4088,4094 ----
      if (t.linkage > LINK.d && hgs.ddoc != 1 && !hgs.hdrgen)
      {
          linkageToBuffer(buf, t.linkage);
!         buf.put(' ');
      }
      if (t.linkage == LINK.objc && isStatic)
          buf.write("static ");
*************** private void visitFuncIdentWithPostfix(T
*** 4017,4041 ****
      {
          typeToBuffer(t.next, null, buf, hgs);
          if (ident)
!             buf.writeByte(' ');
      }
      else if (hgs.ddoc)
!         buf.writestring("auto ");
      if (ident)
!         buf.writestring(ident);
      parametersToBuffer(t.parameterList, buf, hgs);
      /* Use postfix style for attributes
       */
      if (t.mod)
      {
!         buf.writeByte(' ');
          MODtoBuffer(buf, t.mod);
      }
  
      void dg(string str)
      {
!         buf.writeByte(' ');
!         buf.writestring(str);
      }
      t.attributesApply(&dg);
  
--- 4096,4120 ----
      {
          typeToBuffer(t.next, null, buf, hgs);
          if (ident)
!             buf.put(' ');
      }
      else if (hgs.ddoc)
!         buf.put("auto ");
      if (ident)
!         buf.put(ident);
      parametersToBuffer(t.parameterList, buf, hgs);
      /* Use postfix style for attributes
       */
      if (t.mod)
      {
!         buf.put(' ');
          MODtoBuffer(buf, t.mod);
      }
  
      void dg(string str)
      {
!         buf.put(' ');
!         buf.put(str);
      }
      t.attributesApply(&dg);
  
*************** private void visitFuncIdentWithPrefix(Ty
*** 4057,4063 ****
      if (t.mod && !(hgs.ddoc || hgs.hdrgen))
      {
          MODtoBuffer(buf, t.mod);
!         buf.writeByte(' ');
      }
  
      void dg(string str)
--- 4136,4142 ----
      if (t.mod && !(hgs.ddoc || hgs.hdrgen))
      {
          MODtoBuffer(buf, t.mod);
!         buf.put(' ');
      }
  
      void dg(string str)
*************** private void visitFuncIdentWithPrefix(Ty
*** 4067,4074 ****
              // don't write 'ref' for ctors
              if ((ident == Id.ctor) && str == "ref")
                  return;
!             buf.writestring(str);
!             buf.writeByte(' ');
          }
      }
      t.attributesApply(&dg);
--- 4146,4153 ----
              // don't write 'ref' for ctors
              if ((ident == Id.ctor) && str == "ref")
                  return;
!             buf.put(str);
!             buf.put(' ');
          }
      }
      t.attributesApply(&dg);
*************** private void visitFuncIdentWithPrefix(Ty
*** 4076,4082 ****
      if (t.linkage > LINK.d && hgs.ddoc != 1 && !hgs.hdrgen)
      {
          linkageToBuffer(buf, t.linkage);
!         buf.writeByte(' ');
      }
      if (ident && ident.toHChars2() != ident.toChars())
      {
--- 4155,4161 ----
      if (t.linkage > LINK.d && hgs.ddoc != 1 && !hgs.hdrgen)
      {
          linkageToBuffer(buf, t.linkage);
!         buf.put(' ');
      }
      if (ident && ident.toHChars2() != ident.toChars())
      {
*************** private void visitFuncIdentWithPrefix(Ty
*** 4086,4126 ****
      {
          typeToBuffer(t.next, null, buf, hgs);
          if (ident)
!             buf.writeByte(' ');
      }
      else if (hgs.ddoc)
!         buf.writestring("auto ");
      if (ident)
!         buf.writestring(ident.toHChars2());
      if (td)
      {
!         buf.writeByte('(');
          foreach (i, p; *td.origParameters)
          {
              if (i)
!                 buf.writestring(", ");
              toCBuffer(p, buf, hgs);
          }
!         buf.writeByte(')');
      }
      parametersToBuffer(t.parameterList, buf, hgs);
      // postfix this attributes are more readable
      if (t.mod && (hgs.ddoc || hgs.hdrgen))
      {
!         buf.writeByte(' ');
          MODtoBuffer(buf, t.mod);
      }
      if (t.isReturnScope && !t.isReturnInferred)
      {
!         buf.writestring(" return scope");
      }
      else if (t.isScopeQual && !t.isScopeInferred)
      {
!         buf.writestring(" scope");
      }
      if (t.isReturn && !t.isReturnScope && !t.isReturnInferred)
      {
!         buf.writestring(" return");
      }
      t.inuse--;
  }
--- 4165,4205 ----
      {
          typeToBuffer(t.next, null, buf, hgs);
          if (ident)
!             buf.put(' ');
      }
      else if (hgs.ddoc)
!         buf.put("auto ");
      if (ident)
!         buf.put(ident.toHChars2());
      if (td)
      {
!         buf.put('(');
          foreach (i, p; *td.origParameters)
          {
              if (i)
!                 buf.put(", ");
              toCBuffer(p, buf, hgs);
          }
!         buf.put(')');
      }
      parametersToBuffer(t.parameterList, buf, hgs);
      // postfix this attributes are more readable
      if (t.mod && (hgs.ddoc || hgs.hdrgen))
      {
!         buf.put(' ');
          MODtoBuffer(buf, t.mod);
      }
      if (t.isReturnScope && !t.isReturnInferred)
      {
!         buf.put(" return scope");
      }
      else if (t.isScopeQual && !t.isScopeInferred)
      {
!         buf.put(" scope");
      }
      if (t.isReturn && !t.isReturnScope && !t.isReturnInferred)
      {
!         buf.put(" return");
      }
      t.inuse--;
  }
*************** private void initializerToBuffer(Initial
*** 4130,4183 ****
  {
      void visitError(ErrorInitializer iz)
      {
!         buf.writestring("__error__");
      }
  
      void visitVoid(VoidInitializer iz)
      {
!         buf.writestring("void");
      }
  
      void visitDefault(DefaultInitializer iz)
      {
!         buf.writestring("{ }");
      }
  
      void visitStruct(StructInitializer si)
      {
          //printf("StructInitializer::toCBuffer()\n");
!         buf.writeByte('{');
          foreach (i, const id; si.field)
          {
              if (i)
!                 buf.writestring(", ");
              if (id)
              {
!                 buf.writestring(id.toString());
!                 buf.writeByte(':');
              }
              if (auto iz = si.value[i])
                  initializerToBuffer(iz, buf, hgs);
          }
!         buf.writeByte('}');
      }
  
      void visitArray(ArrayInitializer ai)
      {
!         buf.writeByte('[');
          foreach (i, ex; ai.index)
          {
              if (i)
!                 buf.writestring(", ");
              if (ex)
              {
                  ex.expressionToBuffer(buf, hgs);
!                 buf.writeByte(':');
              }
              if (auto iz = ai.value[i])
                  initializerToBuffer(iz, buf, hgs);
          }
!         buf.writeByte(']');
      }
  
      void visitExp(ExpInitializer ei)
--- 4209,4262 ----
  {
      void visitError(ErrorInitializer iz)
      {
!         buf.put("__error__");
      }
  
      void visitVoid(VoidInitializer iz)
      {
!         buf.put("void");
      }
  
      void visitDefault(DefaultInitializer iz)
      {
!         buf.put("{ }");
      }
  
      void visitStruct(StructInitializer si)
      {
          //printf("StructInitializer::toCBuffer()\n");
!         buf.put('{');
          foreach (i, const id; si.field)
          {
              if (i)
!                 buf.put(", ");
              if (id)
              {
!                 buf.put(id.toString());
!                 buf.put(':');
              }
              if (auto iz = si.value[i])
                  initializerToBuffer(iz, buf, hgs);
          }
!         buf.put('}');
      }
  
      void visitArray(ArrayInitializer ai)
      {
!         buf.put('[');
          foreach (i, ex; ai.index)
          {
              if (i)
!                 buf.put(", ");
              if (ex)
              {
                  ex.expressionToBuffer(buf, hgs);
!                 buf.put(':');
              }
              if (auto iz = ai.value[i])
                  initializerToBuffer(iz, buf, hgs);
          }
!         buf.put(']');
      }
  
      void visitExp(ExpInitializer ei)
*************** private void initializerToBuffer(Initial
*** 4187,4218 ****
  
      void visitC(CInitializer ci)
      {
!         buf.writeByte('{');
          foreach (i, ref DesigInit di; ci.initializerList)
          {
              if (i)
!                 buf.writestring(", ");
              if (di.designatorList)
              {
                  foreach (ref Designator d; (*di.designatorList)[])
                  {
                      if (d.exp)
                      {
!                         buf.writeByte('[');
                          toCBuffer(d.exp, buf, hgs);
!                         buf.writeByte(']');
                      }
                      else
                      {
!                         buf.writeByte('.');
!                         buf.writestring(d.ident.toString());
                      }
                  }
!                 buf.writeByte('=');
              }
              initializerToBuffer(di.initializer, buf, hgs);
          }
!         buf.writeByte('}');
      }
  
      mixin VisitInitializer!void visit;
--- 4266,4297 ----
  
      void visitC(CInitializer ci)
      {
!         buf.put('{');
          foreach (i, ref DesigInit di; ci.initializerList)
          {
              if (i)
!                 buf.put(", ");
              if (di.designatorList)
              {
                  foreach (ref Designator d; (*di.designatorList)[])
                  {
                      if (d.exp)
                      {
!                         buf.put('[');
                          toCBuffer(d.exp, buf, hgs);
!                         buf.put(']');
                      }
                      else
                      {
!                         buf.put('.');
!                         buf.put(d.ident.toString());
                      }
                  }
!                 buf.put('=');
              }
              initializerToBuffer(di.initializer, buf, hgs);
          }
!         buf.put('}');
      }
  
      mixin VisitInitializer!void visit;
*************** private void typeToBufferx(Type t, ref O
*** 4230,4242 ****
  
      void visitError(TypeError t)
      {
!         buf.writestring("_error_");
      }
  
      void visitBasic(TypeBasic t)
      {
          //printf("TypeBasic::toCBuffer2(t.mod = %d)\n", t.mod);
!         buf.writestring(t.dstring);
      }
  
      void visitTraits(TypeTraits t)
--- 4309,4321 ----
  
      void visitError(TypeError t)
      {
!         buf.put("_error_");
      }
  
      void visitBasic(TypeBasic t)
      {
          //printf("TypeBasic::toCBuffer2(t.mod = %d)\n", t.mod);
!         buf.put(t.dstring);
      }
  
      void visitTraits(TypeTraits t)
*************** private void typeToBufferx(Type t, ref O
*** 4248,4264 ****
      void visitVector(TypeVector t)
      {
          //printf("TypeVector::toCBuffer2(t.mod = %d)\n", t.mod);
!         buf.writestring("__vector(");
          visitWithMask(t.basetype, t.mod, buf, hgs);
!         buf.writestring(")");
      }
  
      void visitSArray(TypeSArray t)
      {
          visitWithMask(t.next, t.mod, buf, hgs);
!         buf.writeByte('[');
          sizeToBuffer(t.dim, buf, hgs);
!         buf.writeByte(']');
      }
  
      void visitDArray(TypeDArray t)
--- 4327,4343 ----
      void visitVector(TypeVector t)
      {
          //printf("TypeVector::toCBuffer2(t.mod = %d)\n", t.mod);
!         buf.put("__vector(");
          visitWithMask(t.basetype, t.mod, buf, hgs);
!         buf.put(")");
      }
  
      void visitSArray(TypeSArray t)
      {
          visitWithMask(t.next, t.mod, buf, hgs);
!         buf.put('[');
          sizeToBuffer(t.dim, buf, hgs);
!         buf.put(']');
      }
  
      void visitDArray(TypeDArray t)
*************** private void typeToBufferx(Type t, ref O
*** 4267,4291 ****
          if (hgs.declstring)
              goto L1;
          if (ut.equals(Type.tstring))
!             buf.writestring("string");
          else if (ut.equals(Type.twstring))
!             buf.writestring("wstring");
          else if (ut.equals(Type.tdstring))
!             buf.writestring("dstring");
          else
          {
          L1:
              visitWithMask(t.next, t.mod, buf, hgs);
!             buf.writestring("[]");
          }
      }
  
      void visitAArray(TypeAArray t)
      {
          visitWithMask(t.next, t.mod, buf, hgs);
!         buf.writeByte('[');
          visitWithMask(t.index, 0, buf, hgs);
!         buf.writeByte(']');
      }
  
      void visitPointer(TypePointer t)
--- 4346,4370 ----
          if (hgs.declstring)
              goto L1;
          if (ut.equals(Type.tstring))
!             buf.put("string");
          else if (ut.equals(Type.twstring))
!             buf.put("wstring");
          else if (ut.equals(Type.tdstring))
!             buf.put("dstring");
          else
          {
          L1:
              visitWithMask(t.next, t.mod, buf, hgs);
!             buf.put("[]");
          }
      }
  
      void visitAArray(TypeAArray t)
      {
          visitWithMask(t.next, t.mod, buf, hgs);
!         buf.put('[');
          visitWithMask(t.index, 0, buf, hgs);
!         buf.put(']');
      }
  
      void visitPointer(TypePointer t)
*************** private void typeToBufferx(Type t, ref O
*** 4296,4309 ****
          else
          {
              visitWithMask(t.next, t.mod, buf, hgs);
!             buf.writeByte('*');
          }
      }
  
      void visitReference(TypeReference t)
      {
          visitWithMask(t.next, t.mod, buf, hgs);
!         buf.writeByte('&');
      }
  
      void visitFunction(TypeFunction t)
--- 4375,4388 ----
          else
          {
              visitWithMask(t.next, t.mod, buf, hgs);
!             buf.put('*');
          }
      }
  
      void visitReference(TypeReference t)
      {
          visitWithMask(t.next, t.mod, buf, hgs);
!         buf.put('&');
      }
  
      void visitFunction(TypeFunction t)
*************** private void typeToBufferx(Type t, ref O
*** 4324,4346 ****
              switch (id.dyncast()) with (DYNCAST)
              {
              case dsymbol:
!                 buf.writeByte('.');
                  TemplateInstance ti = cast(TemplateInstance)id;
                  ti.dsymbolToBuffer(buf, hgs);
                  break;
              case expression:
!                 buf.writeByte('[');
                  (cast(Expression)id).expressionToBuffer(buf, hgs);
!                 buf.writeByte(']');
                  break;
              case type:
!                 buf.writeByte('[');
                  typeToBufferx(cast(Type)id, buf, hgs);
!                 buf.writeByte(']');
                  break;
              default:
!                 buf.writeByte('.');
!                 buf.writestring(id.toString());
              }
          }
      }
--- 4403,4425 ----
              switch (id.dyncast()) with (DYNCAST)
              {
              case dsymbol:
!                 buf.put('.');
                  TemplateInstance ti = cast(TemplateInstance)id;
                  ti.dsymbolToBuffer(buf, hgs);
                  break;
              case expression:
!                 buf.put('[');
                  (cast(Expression)id).expressionToBuffer(buf, hgs);
!                 buf.put(']');
                  break;
              case type:
!                 buf.put('[');
                  typeToBufferx(cast(Type)id, buf, hgs);
!                 buf.put(']');
                  break;
              default:
!                 buf.put('.');
!                 buf.put(id.toString());
              }
          }
      }
*************** private void typeToBufferx(Type t, ref O
*** 4348,4354 ****
      void visitIdentifier(TypeIdentifier t)
      {
          //printf("visitTypeIdentifier() %s\n", t.ident.toChars());
!         buf.writestring(t.ident.toString());
          visitTypeQualifiedHelper(t);
      }
  
--- 4427,4433 ----
      void visitIdentifier(TypeIdentifier t)
      {
          //printf("visitTypeIdentifier() %s\n", t.ident.toChars());
!         buf.put(t.ident.toString());
          visitTypeQualifiedHelper(t);
      }
  
*************** private void typeToBufferx(Type t, ref O
*** 4360,4381 ****
  
      void visitTypeof(TypeTypeof t)
      {
!         buf.writestring("typeof(");
          t.exp.expressionToBuffer(buf, hgs);
!         buf.writeByte(')');
          visitTypeQualifiedHelper(t);
      }
  
      void visitReturn(TypeReturn t)
      {
!         buf.writestring("typeof(return)");
          visitTypeQualifiedHelper(t);
      }
  
      void visitEnum(TypeEnum t)
      {
          //printf("visitEnum: %s\n", t.sym.toChars());
!         buf.writestring(hgs.fullQual ? t.sym.toPrettyChars() : t.sym.toChars());
      }
  
      void visitStruct(TypeStruct t)
--- 4439,4460 ----
  
      void visitTypeof(TypeTypeof t)
      {
!         buf.put("typeof(");
          t.exp.expressionToBuffer(buf, hgs);
!         buf.put(')');
          visitTypeQualifiedHelper(t);
      }
  
      void visitReturn(TypeReturn t)
      {
!         buf.put("typeof(return)");
          visitTypeQualifiedHelper(t);
      }
  
      void visitEnum(TypeEnum t)
      {
          //printf("visitEnum: %s\n", t.sym.toChars());
!         buf.put(hgs.fullQual ? t.sym.toPrettyChars() : t.sym.toChars());
      }
  
      void visitStruct(TypeStruct t)
*************** private void typeToBufferx(Type t, ref O
*** 4387,4395 ****
          // while printing messages.
          TemplateInstance ti = t.sym.parent ? t.sym.parent.isTemplateInstance() : null;
          if (ti && ti.aliasdecl == t.sym)
!             buf.writestring(hgs.fullQual ? ti.toPrettyChars() : ti.toChars());
          else
!             buf.writestring(hgs.fullQual ? t.sym.toPrettyChars() : t.sym.toChars());
      }
  
      void visitClass(TypeClass t)
--- 4466,4474 ----
          // while printing messages.
          TemplateInstance ti = t.sym.parent ? t.sym.parent.isTemplateInstance() : null;
          if (ti && ti.aliasdecl == t.sym)
!             buf.put(hgs.fullQual ? ti.toPrettyChars() : ti.toChars());
          else
!             buf.put(hgs.fullQual ? t.sym.toPrettyChars() : t.sym.toChars());
      }
  
      void visitClass(TypeClass t)
*************** private void typeToBufferx(Type t, ref O
*** 4399,4407 ****
          // while printing messages.
          TemplateInstance ti = t.sym.parent ? t.sym.parent.isTemplateInstance() : null;
          if (ti && ti.aliasdecl == t.sym)
!             buf.writestring(hgs.fullQual ? ti.toPrettyChars() : ti.toChars());
          else
!             buf.writestring(hgs.fullQual ? t.sym.toPrettyChars() : t.sym.toChars());
      }
  
      void visitTag(TypeTag t)
--- 4478,4486 ----
          // while printing messages.
          TemplateInstance ti = t.sym.parent ? t.sym.parent.isTemplateInstance() : null;
          if (ti && ti.aliasdecl == t.sym)
!             buf.put(hgs.fullQual ? ti.toPrettyChars() : ti.toChars());
          else
!             buf.put(hgs.fullQual ? t.sym.toPrettyChars() : t.sym.toChars());
      }
  
      void visitTag(TypeTag t)
*************** private void typeToBufferx(Type t, ref O
*** 4411,4435 ****
              // https://issues.dlang.org/show_bug.cgi?id=24670
              // `const` must be parenthesized because it can be a return type
              if (t.mod & MODFlags.const_)
!                 buf.writestring("const(");
  
              // For C to D translation, `struct S` or `enum S` simply becomes `S`
!             buf.writestring(t.id.toString());
  
              if (t.mod & MODFlags.const_)
!                 buf.writestring(")");
              return;
          }
          // The following produces something like "const enum E : short"
          if (t.mod & MODFlags.const_)
!             buf.writestring("const ");
!         buf.writestring(Token.toString(t.tok));
!         buf.writeByte(' ');
          if (t.id)
!             buf.writestring(t.id.toString());
          if (t.tok == TOK.enum_ && t.base && t.base.ty != TY.Tint32)
          {
!             buf.writestring(" : ");
              visitWithMask(t.base, t.mod, buf, hgs);
          }
      }
--- 4490,4514 ----
              // https://issues.dlang.org/show_bug.cgi?id=24670
              // `const` must be parenthesized because it can be a return type
              if (t.mod & MODFlags.const_)
!                 buf.put("const(");
  
              // For C to D translation, `struct S` or `enum S` simply becomes `S`
!             buf.put(t.id.toString());
  
              if (t.mod & MODFlags.const_)
!                 buf.put(")");
              return;
          }
          // The following produces something like "const enum E : short"
          if (t.mod & MODFlags.const_)
!             buf.put("const ");
!         buf.put(Token.toString(t.tok));
!         buf.put(' ');
          if (t.id)
!             buf.put(t.id.toString());
          if (t.tok == TOK.enum_ && t.base && t.base.ty != TY.Tint32)
          {
!             buf.put(" : ");
              visitWithMask(t.base, t.mod, buf, hgs);
          }
      }
*************** private void typeToBufferx(Type t, ref O
*** 4442,4474 ****
      void visitSlice(TypeSlice t)
      {
          visitWithMask(t.next, t.mod, buf, hgs);
!         buf.writeByte('[');
          sizeToBuffer(t.lwr, buf, hgs);
!         buf.writestring(" .. ");
          sizeToBuffer(t.upr, buf, hgs);
!         buf.writeByte(']');
      }
  
      void visitNull(TypeNull t)
      {
!         buf.writestring("typeof(null)");
      }
  
      void visitMixin(TypeMixin t)
      {
!         buf.writestring("mixin(");
          argsToBuffer(t.exps, buf, hgs, null);
!         buf.writeByte(')');
      }
  
      void visitNoreturn(TypeNoreturn t)
      {
!         buf.writestring("noreturn");
      }
  
      if (hgs.importcHdr && !hgs.inCAlias && t.mcache && t.mcache.typedefIdent)
      {
!         buf.writestring(t.mcache.typedefIdent.toString());
          return;
      }
  
--- 4521,4553 ----
      void visitSlice(TypeSlice t)
      {
          visitWithMask(t.next, t.mod, buf, hgs);
!         buf.put('[');
          sizeToBuffer(t.lwr, buf, hgs);
!         buf.put(" .. ");
          sizeToBuffer(t.upr, buf, hgs);
!         buf.put(']');
      }
  
      void visitNull(TypeNull t)
      {
!         buf.put("typeof(null)");
      }
  
      void visitMixin(TypeMixin t)
      {
!         buf.put("mixin(");
          argsToBuffer(t.exps, buf, hgs, null);
!         buf.put(')');
      }
  
      void visitNoreturn(TypeNoreturn t)
      {
!         buf.put("noreturn");
      }
  
      if (hgs.importcHdr && !hgs.inCAlias && t.mcache && t.mcache.typedefIdent)
      {
!         buf.put(t.mcache.typedefIdent.toString());
          return;
      }
  
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/iasm/gcc.d gcc-16-20260201/gcc/d/dmd/iasm/gcc.d
*** gcc-16-20260125/gcc/d/dmd/iasm/gcc.d	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/d/dmd/iasm/gcc.d	Sun Feb  1 22:32:07 2026
***************
*** 0 ****
--- 1,780 ----
+ /**
+  * Inline assembler for the GCC D compiler.
+  *
+  *              Copyright (C) 2018-2025 by The D Language Foundation, All Rights Reserved
+  * Authors:     Iain Buclaw
+  * License:     $(LINK2 https://www.boost.org/LICENSE_1_0.txt, Boost License 1.0)
+  * Source:      $(LINK2 https://github.com/dlang/dmd/blob/master/compiler/src/dmd/iasmgcc.d, _iasmgcc.d)
+  * Documentation:  https://dlang.org/phobos/dmd_iasmgcc.html
+  * Coverage:    https://codecov.io/gh/dlang/dmd/src/master/compiler/src/dmd/iasmgcc.d
+  */
+ 
+ module dmd.iasm.gcc;
+ 
+ import core.stdc.string;
+ 
+ import dmd.arraytypes;
+ import dmd.astcodegen;
+ import dmd.dscope;
+ import dmd.dsymbol;
+ import dmd.errors;
+ import dmd.errorsink;
+ import dmd.expression;
+ import dmd.expressionsem;
+ import dmd.identifier;
+ import dmd.globals;
+ import dmd.location;
+ import dmd.cparse;
+ import dmd.parse;
+ import dmd.target;
+ import dmd.tokens;
+ import dmd.statement;
+ import dmd.statementsem;
+ 
+ /***********************************
+  * Parse and run semantic analysis on a GccAsmStatement.
+  * Params:
+  *      s  = gcc asm statement being parsed
+  *      sc = the scope where the asm statement is located
+  * Returns:
+  *      the completed gcc asm statement, or null if errors occurred
+  */
+ public Statement gccAsmSemantic(GccAsmStatement s, Scope* sc)
+ {
+     //printf("GccAsmStatement.semantic()\n");
+     const bool doUnittests = global.params.parsingUnittestsRequired();
+     scope p = (sc && sc.inCfile)
+         ? new CParser!ASTCodegen(sc._module, "", false, global.errorSink, target.c, null, &global.compileEnv)
+         : new Parser!ASTCodegen(sc._module, "", false, global.errorSink, &global.compileEnv, doUnittests);
+ 
+     // Make a safe copy of the token list before parsing.
+     Token* toklist = null;
+     Token **ptoklist = &toklist;
+ 
+     for (Token* token = s.tokens; token; token = token.next)
+     {
+         *ptoklist = p.allocateToken();
+         memcpy(*ptoklist, token, Token.sizeof);
+         ptoklist = &(*ptoklist).next;
+         *ptoklist = null;
+     }
+     // Append closing `;` location.
+     *ptoklist = p.allocateToken();
+     (*ptoklist).value = TOK.semicolon;
+     (*ptoklist).loc = s.loc;
+     ptoklist = &(*ptoklist).next;
+     *ptoklist = null;
+ 
+     // Adjust starting line number of the parser.
+     p.token = *toklist;
+     p.baseLoc.startLine = s.loc.linnum;
+     p.linnum = s.loc.linnum;
+ 
+     // Parse the gcc asm statement.
+     const errors = global.errors;
+     s = p.parseGccAsm(s);
+     if (errors != global.errors)
+         return null;
+     s.stc = sc.stc;
+ 
+     // Fold the instruction template string.
+     s.insn = semanticAsmString(sc, s.insn, "asm instruction template");
+ 
+     if (s.labels && s.outputargs)
+         p.eSink.error(s.loc, "extended asm statements with labels cannot have output constraints");
+ 
+     // Analyse all input and output operands.
+     if (s.args)
+     {
+         foreach (i; 0 .. s.args.length)
+         {
+             Expression ec = (*s.constraints)[i];
+             (*s.constraints)[i] = semanticAsmString(sc, ec, "asm operand");
+ 
+             Expression earg = (*s.args)[i];
+             earg = earg.expressionSemantic(sc);
+             // Check argument is a valid lvalue/rvalue.
+             if (i < s.outputargs)
+                 earg = earg.modifiableLvalue(sc);
+             else if (earg.checkValue())
+                 earg = ErrorExp.get();
+             (*s.args)[i] = earg;
+         }
+     }
+ 
+     // Analyse all clobbers.
+     if (s.clobbers)
+     {
+         foreach (i; 0 .. s.clobbers.length)
+         {
+             Expression ec = (*s.clobbers)[i];
+             (*s.clobbers)[i] = semanticAsmString(sc, ec, "asm clobber");
+         }
+     }
+ 
+     // Analyse all goto labels.
+     if (s.labels)
+     {
+         foreach (i; 0 .. s.labels.length)
+         {
+             Identifier ident = (*s.labels)[i];
+             GotoStatement gs = new GotoStatement(s.loc, ident);
+             if (!s.gotos)
+                 s.gotos = new GotoStatements();
+             s.gotos.push(gs);
+             gs.statementSemantic(sc);
+         }
+     }
+ 
+     return s;
+ }
+ 
+ /***********************************
+  * Run semantic analysis on an CAsmDeclaration.
+  * Params:
+  *      ad  = asm declaration
+  *      sc = the scope where the asm declaration is located
+  */
+ public void gccAsmSemantic(CAsmDeclaration ad, Scope* sc)
+ {
+     import dmd.typesem : pointerTo;
+     ad.code = semanticString(sc, ad.code, "asm definition");
+     ad.code.type = ad.code.type.nextOf().pointerTo();
+ 
+     // Asm definition always needs emitting into the root module.
+     import dmd.dmodule : Module;
+     if (sc._module && sc._module.isRoot())
+         return;
+     if (Module m = Module.rootModule)
+         m.members.push(ad);
+ }
+ 
+ private:
+ 
+ 
+ /***********************************
+  * Issue error if the current token is not `value`.
+  * Otherwise, advance to next token.
+  * Params:
+  *      p = parser state
+  *      value = token value to compare with
+  * Returns:
+  *      true    advanced to next token
+  *      false   error was issued
+  */
+ bool requireToken(Parser)(Parser p, TOK value)
+ {
+     if (p.token.value == value)
+     {
+         p.nextToken();
+         return true;
+     }
+ 
+     p.eSink.error(p.token.loc, "found `%s` when expecting `%s`",
+                   p.token.toChars(), Token.toChars(value));
+     return false;
+ }
+ 
+ /***********************************
+  * Run semantic analysis on `exp`, resolving it as a compile-time string.
+  * Params:
+  *      sc = scope
+  *      exp = Expression which expected as a string
+  *      s = What the string is expected for, used in error diagnostic
+  * Returns:
+  *      StringExp or ErrorExp
+  */
+ Expression semanticAsmString(Scope* sc, Expression exp, const char *s)
+ {
+     import dmd.dcast : implicitCastTo;
+     import dmd.dsymbolsem : resolveAliasThis;
+     import dmd.mtype : isAggregate, Type;
+ 
+     exp = expressionSemantic(exp, sc);
+ 
+     // Resolve `alias this` if we were given a struct literal.
+     if (auto ad = isAggregate(exp.type))
+     {
+         if (ad.aliasthis && ad.type && !ad.type.isTypeError())
+             exp = resolveAliasThis(sc, exp);
+     }
+ 
+     // Evaluate the expression as a string now or error trying.
+     if (auto se = semanticString(sc, exp, s))
+         exp = implicitCastTo(se, sc, Type.tstring);
+ 
+     return exp;
+ }
+ 
+ /***********************************
+  * Parse a D or ImportC assignment expression
+  */
+ Expression parseAssignment(Parser)(Parser p)
+ {
+     if (p.Ccompile)
+         return (cast(CParser!ASTCodegen)p).cparseAssignExp();
+ 
+     return p.parseAssignExp();
+ }
+ 
+ /***********************************
+  * Parse a D or ImportC conditional expression
+  */
+ Expression parseConditional(Parser)(Parser p)
+ {
+     if (p.Ccompile)
+         return (cast(CParser!ASTCodegen)p).cparseCondExp();
+ 
+     return p.parseCondExp();
+ }
+ 
+ /***********************************
+  * Parse a D or ImportC primary expression
+  */
+ Expression parsePrimary(Parser)(Parser p)
+ {
+     if (p.Ccompile)
+         return (cast(CParser!ASTCodegen)p).cparsePrimaryExp();
+ 
+     return p.parsePrimaryExp();
+ }
+ 
+ /***********************************
+  * Parse an expression that evaluates to a string.
+  * Grammar:
+  *      | AsmStringExpr:
+  *      |     StringLiteral
+  *      |     ( ConditionalExpression )
+  * Params:
+  *      p = parser state
+  * Returns:
+  *      the parsed string expression
+  */
+ Expression parseAsmString(Parser)(Parser p)
+ {
+     if (p.token.value == TOK.leftParenthesis)
+     {
+         // Skip over opening `(`
+         p.nextToken();
+         Expression insn = p.parseConditional();
+         if (insn.isErrorExp())
+             return insn;
+ 
+         // Look for closing `)`.
+         if (!p.requireToken(TOK.rightParenthesis))
+             return ErrorExp.get();
+ 
+         return insn;
+     }
+     else if (p.token.value != TOK.string_)
+     {
+         p.eSink.error(p.token.loc, "expected string literal or expression in parentheses");
+         return ErrorExp.get();
+     }
+ 
+     return p.parsePrimary();
+ }
+ 
+ /***********************************
+  * Parse list of extended asm input or output operands.
+  * Grammar:
+  *      | Operands:
+  *      |     SymbolicName(opt) AsmStringExpr ( AssignExpression )
+  *      |     SymbolicName(opt) AsmStringExpr ( AssignExpression ), Operands
+  *      |
+  *      | SymbolicName:
+  *      |     [ Identifier ]
+  * Params:
+  *      p = parser state
+  *      s = asm statement to parse
+  * Returns:
+  *      number of operands added to the gcc asm statement
+  */
+ int parseExtAsmOperands(Parser)(Parser p, GccAsmStatement s)
+ {
+     int numargs = 0;
+ 
+     if (p.token.value == TOK.colon ||
+         p.token.value == TOK.colonColon ||
+         p.token.value == TOK.semicolon ||
+         p.token.value == TOK.endOfFile)
+         return numargs;
+ 
+     while (1)
+     {
+         Expression arg;
+         Identifier name;
+ 
+         if (p.token.value == TOK.leftBracket)
+         {
+             // Skip over opening `[`
+             p.nextToken();
+             if (p.token.value == TOK.identifier)
+             {
+                 // Store the symbolic name
+                 name = p.token.ident;
+                 p.nextToken();
+             }
+             else
+             {
+                 p.eSink.error(p.token.loc, "identifier expected after `[`");
+                 goto Lerror;
+             }
+             // Look for closing `]`
+             if (!p.requireToken(TOK.rightBracket))
+                 goto Lerror;
+         }
+ 
+         // Look for the constraint string.
+         Expression constraint = p.parseAsmString();
+         if (constraint.isErrorExp())
+             goto Lerror;
+ 
+         // Look for the opening `(`
+         if (!p.requireToken(TOK.leftParenthesis))
+             goto Lerror;
+ 
+         // Parse the assign expression
+         arg = p.parseAssignment();
+         if (arg.isErrorExp())
+             goto Lerror;
+ 
+         // Look for the closing `)`
+         if (!p.requireToken(TOK.rightParenthesis))
+             goto Lerror;
+ 
+         // Add this operand to the list.
+         if (!s.args)
+         {
+             s.names = new Identifiers();
+             s.constraints = new Expressions();
+             s.args = new Expressions();
+         }
+         s.names.push(name);
+         s.args.push(arg);
+         s.constraints.push(constraint);
+         numargs++;
+ 
+         // If the next token is not a `,`, there are no more operands.
+         if (p.token.value != TOK.comma)
+             return numargs;
+ 
+         // Skip over the `,` token.
+         p.nextToken();
+     }
+ Lerror:
+     while (p.token.value != TOK.semicolon &&
+            p.token.value != TOK.endOfFile)
+         p.nextToken();
+ 
+     return 0;
+ }
+ 
+ /***********************************
+  * Parse list of extended asm clobbers.
+  * Grammar:
+  *      | Clobbers:
+  *      |     AsmStringExpr
+  *      |     AsmStringExpr , Clobbers
+  * Params:
+  *      p = parser state
+  * Returns:
+  *      array of parsed clobber expressions
+  */
+ Expressions* parseExtAsmClobbers(Parser)(Parser p)
+ {
+     Expressions* clobbers;
+ 
+     if (p.token.value == TOK.colon ||
+         p.token.value == TOK.colonColon ||
+         p.token.value == TOK.semicolon ||
+         p.token.value == TOK.endOfFile)
+         return clobbers;
+ 
+     while (1)
+     {
+         // Look for the clobbers string
+         Expression clobber = p.parseAsmString();
+         if (clobber.isErrorExp())
+             goto Lerror;
+ 
+         // Add it to the list.
+         if (!clobbers)
+             clobbers = new Expressions();
+         clobbers.push(clobber);
+ 
+         // If the next token is not a `,`, there are no more clobbers.
+         if (p.token.value != TOK.comma)
+             return clobbers;
+ 
+         // Skip over the `,` token.
+         p.nextToken();
+     }
+ Lerror:
+     while (p.token.value != TOK.semicolon &&
+            p.token.value != TOK.endOfFile)
+         p.nextToken();
+ 
+     return null;
+ }
+ 
+ /***********************************
+  * Parse list of extended asm goto labels.
+  * Grammar:
+  *      | GotoLabels:
+  *      |     Identifier
+  *      |     Identifier , GotoLabels
+  * Params:
+  *      p = parser state
+  * Returns:
+  *      array of parsed goto labels
+  */
+ Identifiers* parseExtAsmGotoLabels(Parser)(Parser p)
+ {
+     Identifiers* labels;
+ 
+     while (1)
+     {
+         if (p.token.value == TOK.identifier)
+         {
+             if (!labels)
+                 labels = new Identifiers();
+             labels.push(p.token.ident);
+ 
+             // If the next token is not a `,`, there are no more labels.
+             if (p.nextToken() != TOK.comma)
+                 return labels;
+ 
+             // Skip over the `,` token.
+             p.nextToken();
+         }
+         else
+         {
+             p.eSink.error(p.token.loc, "identifier expected for goto label name, not `%s`",
+                           p.token.toChars());
+             goto Lerror;
+         }
+     }
+ Lerror:
+     while (p.token.value != TOK.semicolon &&
+            p.token.value != TOK.endOfFile)
+         p.nextToken();
+ 
+     return null;
+ }
+ 
+ /***********************************
+  * Parse a gcc asm statement.
+  * There are three forms of inline asm statements, basic, extended, and goto.
+  * Grammar:
+  *      | AsmInstruction:
+  *      |     BasicAsmInstruction
+  *      |     ExtAsmInstruction
+  *      |     GotoAsmInstruction
+  *      |
+  *      | BasicAsmInstruction:
+  *      |     AsmStringExpr
+  *      |
+  *      | ExtAsmInstruction:
+  *      |     AsmStringExpr : Operands(opt) : Operands(opt) : Clobbers(opt)
+  *      |
+  *      | GotoAsmInstruction:
+  *      |     AsmStringExpr : : Operands(opt) : Clobbers(opt) : GotoLabels(opt)
+  * Params:
+  *      p = parser state
+  *      s = asm statement to parse
+  * Returns:
+  *      the parsed gcc asm statement
+  */
+ GccAsmStatement parseGccAsm(Parser)(Parser p, GccAsmStatement s)
+ {
+     s.insn = p.parseAsmString();
+     if (s.insn.isErrorExp())
+         return s;
+ 
+     // No semicolon followed after instruction template, treat as extended asm.
+     if (p.token.value == TOK.colon || p.token.value == TOK.colonColon)
+     {
+         bool inputs;
+         bool clobbers;
+         bool labels;
+ 
+         // Look for outputs.
+         if (p.token.value == TOK.colon)
+         {
+             // Skip over the `:` token.
+             p.nextToken();
+             // Parse the output operands.
+             s.outputargs = p.parseExtAsmOperands(s);
+         }
+         else if (p.token.value == TOK.colonColon)
+             inputs = true;
+ 
+         // Look for inputs.
+         if (inputs || p.token.value == TOK.colon)
+         {
+             // Skip over the `:` or `::` token.
+             p.nextToken();
+             // Parse the input operands.
+             p.parseExtAsmOperands(s);
+         }
+         else if (p.token.value == TOK.colonColon)
+             clobbers = true;
+ 
+         // Look for clobbers.
+         if (clobbers || p.token.value == TOK.colon)
+         {
+             // Skip over the `:` or `::` token.
+             p.nextToken();
+             // Parse the clobbers.
+             s.clobbers = p.parseExtAsmClobbers();
+         }
+         else if (p.token.value == TOK.colonColon)
+             labels = true;
+ 
+         // Look for labels.
+         if (labels || p.token.value == TOK.colon)
+         {
+             // Skip over the `:` or `::` token.
+             p.nextToken();
+             // Parse the labels.
+             s.labels = p.parseExtAsmGotoLabels();
+         }
+     }
+ 
+     if (p.token.value == TOK.endOfFile)
+         assert(global.errors);
+     else
+         p.requireToken(TOK.semicolon);
+ 
+     return s;
+ }
+ 
+ unittest
+ {
+     import dmd.mtype : TypeBasic;
+ 
+     if (!global.errorSink)
+         global.errorSink = new ErrorSinkCompiler;
+ 
+     const errors = global.startGagging();
+     scope(exit) global.endGagging(errors);
+ 
+     // If this check fails, then Type._init() was called before reaching here,
+     // and the entire chunk of code that follows can be removed.
+     assert(ASTCodegen.Type.tint32 is null);
+     // Minimally initialize the cached types in ASTCodegen.Type, as they are
+     // dependencies for some fail asm tests to succeed.
+     ASTCodegen.Type.stringtable._init();
+     scope(exit)
+     {
+         ASTCodegen.Type.deinitialize();
+         ASTCodegen.Type.tint32 = null;
+         ASTCodegen.Type.tchar = null;
+     }
+     scope tint32 = new TypeBasic(ASTCodegen.Tint32);
+     ASTCodegen.Type.tint32 = tint32;
+     scope tchar = new TypeBasic(ASTCodegen.Tchar);
+     ASTCodegen.Type.tchar = tchar;
+ 
+     // Imitates asmSemantic if version = IN_GCC.
+     static int semanticAsm(Token* tokens, bool importC)
+     {
+         const errors = global.errors;
+         scope gas = new GccAsmStatement(Loc.initial, tokens);
+         const bool doUnittests = false;
+         scope p = importC
+             ? new CParser!ASTCodegen(null, ";", false, global.errorSink, target.c, null, &global.compileEnv)
+             : new Parser!ASTCodegen(null, ";", false, global.errorSink, &global.compileEnv, doUnittests);
+         p.token = *tokens;
+         p.parseGccAsm(gas);
+         return global.errors - errors;
+     }
+ 
+     // Imitates parseStatement for asm statements.
+     static void parseAsm(string input, bool expectError, bool importC = false)
+     {
+         // Generate tokens from input test.
+         const bool doUnittests = false;
+         scope p = new Parser!ASTCodegen(null, input, false, global.errorSink, &global.compileEnv, doUnittests);
+         p.nextToken();
+ 
+         Token* toklist = null;
+         Token** ptoklist = &toklist;
+         p.check(TOK.asm_);
+         p.check(TOK.leftCurly);
+         while (1)
+         {
+             if (p.token.value == TOK.rightCurly || p.token.value == TOK.endOfFile)
+                 break;
+             if (p.token.value == TOK.colonColon)
+             {
+                 *ptoklist = p.allocateToken();
+                 memcpy(*ptoklist, &p.token, Token.sizeof);
+                 (*ptoklist).value = TOK.colon;
+                 ptoklist = &(*ptoklist).next;
+ 
+                 *ptoklist = p.allocateToken();
+                 memcpy(*ptoklist, &p.token, Token.sizeof);
+                 (*ptoklist).value = TOK.colon;
+                 ptoklist = &(*ptoklist).next;
+             }
+             else
+             {
+                 *ptoklist = p.allocateToken();
+                 memcpy(*ptoklist, &p.token, Token.sizeof);
+                 ptoklist = &(*ptoklist).next;
+             }
+             *ptoklist = null;
+             p.nextToken();
+         }
+         p.check(TOK.rightCurly);
+ 
+         auto res = semanticAsm(toklist, importC);
+         // Checks for both unexpected passes and failures.
+         assert((res == 0) != expectError, input);
+     }
+ 
+     /// Assembly Tests, all should pass.
+     /// Note: Frontend is not initialized, use only strings and identifiers.
+     immutable string[] passAsmTests = [
+         // Basic asm statement
+         q{ asm { "nop";
+         } },
+ 
+         // Extended asm statement
+         q{ asm { "cpuid"
+                : "=a" (a), "=b" (b), "=c" (c), "=d" (d)
+                : "a" (input);
+         } },
+ 
+         // Assembly with symbolic names
+         q{ asm { "bts %[base], %[offset]"
+                : [base] "+rm" (*ptr)
+                : [offset] "Ir" (bitnum);
+         } },
+ 
+         // Assembly with clobbers
+         q{ asm { "cpuid"
+                : "=a" (a)
+                : "a" (input)
+                : "ebx", "ecx", "edx";
+         } },
+ 
+         // Goto asm statement
+         q{ asm { "jmp %l0"
+                :
+                :
+                :
+                : Ljmplabel;
+         } },
+ 
+         // Any CTFE-able string allowed as instruction template.
+         q{ asm { (generateAsm);
+         } },
+ 
+         // Likewise mixins, permissible so long as the result is a string.
+         q{ asm { (mixin(`"repne"`, `~ "scasb"`));
+         } },
+ 
+         // :: token tests
+         q{ asm { "" : : : "memory"; } },
+         q{ asm { "" :: : "memory"; } },
+         q{ asm { "" : :: "memory"; } },
+         q{ asm { "" ::: "memory"; } },
+         q{ asm { "" :::: label; } },
+ 
+         // https://github.com/dlang/dmd/issues/21299
+         q{ asm { (insn) : (output) (a) : (input) (1) : (clobber); } },
+         q{ asm { (['t','e','s','t']) : (['=','r']) (a) : (['r']) (1) : (['m','e','m','o','r','y']); } },
+ 
+         // https://github.com/dlang/dmd/issues/21679
+         q{ asm { "" : "=r" (s.x); } },
+     ];
+ 
+     immutable string[] failAsmTests = [
+         // Found 'h' when expecting ';'
+         q{ asm { ""h;
+         } },
+ 
+         // https://issues.dlang.org/show_bug.cgi?id=20592
+         q{ asm { "nop" : [name] string (expr); } },
+ 
+         // Expression expected, not ';'
+         q{ asm { ""[;
+         } },
+ 
+         // Expression expected, not ':'
+         q{ asm { ""
+                :
+                : "g" (a ? b : : c);
+         } },
+ 
+         // Found ',' when expecting ':'
+         q{ asm { "", "";
+         } },
+ 
+         // Identifier expected, not ';'
+         q{ asm { "" : ::: ; } },
+         q{ asm { "" :: :: ; } },
+         q{ asm { "" ::: : ; } },
+         q{ asm { "" :::: ; } },
+ 
+         // https://issues.dlang.org/show_bug.cgi?id=20593
+         q{ asm { "instruction" : : "operand" 123; } },
+ 
+         // https://github.com/dlang/dmd/issues/21298
+         q{ asm { 1; }   },
+         q{ asm { int; } },
+         q{ asm { : "=r" (i); } },
+         q{ asm { (; } },
+         q{ asm { (""; } },
+         q{ asm { "" ,; } },
+         q{ asm { "" d; } },
+         q{ asm { "" : (; } },
+         q{ asm { "" : (""; } },
+         q{ asm { "" : ""; } },
+         q{ asm { "" : "" (; } },
+         q{ asm { "" : "" (a; } },
+         q{ asm { "" : "" (a) ,; } },
+         q{ asm { "" : "" (a) d; } },
+         q{ asm { "" : "" (a) : (; } },
+         q{ asm { "" : "" (a) : (""; } },
+         q{ asm { "" : "" (a) : ""; } },
+         q{ asm { "" : "" (a) : "" (; } },
+         q{ asm { "" : "" (a) : "" (b; } },
+         q{ asm { "" : "" (a) : "" (b) ,; } },
+         q{ asm { "" : "" (a) : "" (b) d; } },
+         q{ asm { "" : "" (a) : "" (b) : (; } },
+         q{ asm { "" : "" (a) : "" (b) : (""; } },
+         q{ asm { "" : "" (a) : "" (b) : "" ,; } },
+         q{ asm { "" : "" (a) : "" (b) : "" d; } },
+         q{ asm { "" : "" (a) : "" (b) : "" : (; } },
+         q{ asm { "" : "" (a) : "" (b) : "" : c ,; } },
+         q{ asm { "" : "" (a) : "" (b) : "" : c d; } },
+         q{ asm { "" : "" (a) : "" (b) : "" : c :; } },
+         q{ asm { "" : "" (a) : "" (b) : "" : c : (; } },
+         q{ asm { "" : "" (a) : "" (b) : "" : c : (""; } },
+         q{ asm { "" : "" (a) : "" (b) : "" : c : "" (; } },
+         q{ asm { "" : "" (a) : "" (b) : "" : c : "" (d; } },
+         q{ asm { "" : "" (a) : "" (b) : "" : c : "" (d); } },
+ 
+         // https://github.com/dlang/dmd/issues/21679
+         q{ asm { "" : "=r" (s->x); } },
+     ];
+ 
+     immutable string[] passCAsmTests = [
+         // https://github.com/dlang/dmd/issues/21679
+         q{ asm { "" : "=r" (s->x); } },
+         q{ asm { "" : "=r" (s.x); } }
+     ];
+ 
+     foreach (test; passAsmTests)
+         parseAsm(test, false);
+ 
+     foreach (test; failAsmTests)
+         parseAsm(test, true);
+ 
+     foreach (test; passCAsmTests)
+         parseAsm(test, false, /*importC*/true);
+ }
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/iasm/package.d gcc-16-20260201/gcc/d/dmd/iasm/package.d
*** gcc-16-20260125/gcc/d/dmd/iasm/package.d	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/d/dmd/iasm/package.d	Sun Feb  1 22:32:07 2026
***************
*** 0 ****
--- 1,119 ----
+ /**
+  * Inline assembler for the D programming language compiler.
+  *
+  * Specification: $(LINK2 https://dlang.org/spec/iasm.html, Inline Assembler)
+  *
+  *              Copyright (C) 2018-2025 by The D Language Foundation, All Rights Reserved
+  * Authors:     $(LINK2 https://www.digitalmars.com, Walter Bright)
+  * License:     $(LINK2 https://www.boost.org/LICENSE_1_0.txt, Boost License 1.0)
+  * Source:      $(LINK2 https://github.com/dlang/dmd/blob/master/compiler/src/dmd/iasm.d, _iasm.d)
+  * Documentation:  https://dlang.org/phobos/dmd_iasm.html
+  * Coverage:    https://codecov.io/gh/dlang/dmd/src/master/compiler/src/dmd/iasm.d
+  */
+ 
+ module dmd.iasm;
+ 
+ import core.stdc.stdio;
+ 
+ import dmd.dscope;
+ import dmd.dsymbol;
+ import dmd.expression;
+ import dmd.func;
+ import dmd.mtype;
+ import dmd.target;
+ import dmd.tokens;
+ import dmd.statement;
+ import dmd.statementsem;
+ 
+ version (NoBackend)
+ {
+ }
+ else version (IN_GCC)
+ {
+     version = Asm_GCC;
+ }
+ else version (IN_LLVM)
+ {
+     version = Asm_GCC;
+ }
+ else
+ {
+     import dmd.iasm.dmdx86;
+     import dmd.iasm.dmdaarch64;
+     version = MARS;
+ }
+ 
+ version (Asm_GCC)
+ {
+     import dmd.iasm.gcc;
+ }
+ 
+ /************************ AsmStatement ***************************************/
+ 
+ Statement asmSemantic(AsmStatement s, Scope* sc)
+ {
+     //printf("AsmStatement.semantic()\n");
+ 
+     FuncDeclaration fd = sc.parent.isFuncDeclaration();
+     assert(fd);
+ 
+     if (!s.tokens)
+         return null;
+ 
+     // Assume assembler code takes care of setting the return value
+     sc.func.hasInlineAsm = true;
+ 
+     version (NoBackend)
+     {
+         return null;
+     }
+     else version (MARS)
+     {
+         /* If it starts with a string literal, it's gcc inline asm
+          */
+         if (s.tokens.value == TOK.string_)
+         {
+             /* Replace the asm statement with an assert(0, msg) that trips at runtime.
+              */
+             const loc = s.loc;
+             auto e = new IntegerExp(loc, 0, Type.tint32);
+             auto msg = new StringExp(loc, "Gnu Asm not supported - compile this function with gcc or clang");
+             auto ae = new AssertExp(loc, e, msg);
+             auto se = new ExpStatement(loc, ae);
+             return statementSemantic(se, sc);
+         }
+         auto ias = new InlineAsmStatement(s.loc, s.tokens);
+         ias.caseSensitive = s.caseSensitive;
+         return (target.isAArch64)
+             ? inlineAsmAArch64Semantic(ias, sc)
+             : inlineAsmSemantic(ias, sc);       // X86_64
+     }
+     else version (Asm_GCC)
+     {
+         auto eas = new GccAsmStatement(s.loc, s.tokens);
+         return gccAsmSemantic(eas, sc);
+     }
+     else
+     {
+         s.error("D inline assembler statements are not supported");
+         return new ErrorStatement();
+     }
+ }
+ 
+ /************************ CAsmDeclaration ************************************/
+ 
+ void asmSemantic(CAsmDeclaration ad, Scope* sc)
+ {
+     version (NoBackend)
+     {
+     }
+     else version (Asm_GCC)
+     {
+         return gccAsmSemantic(ad, sc);
+     }
+     else
+     {
+         import dmd.errors : error;
+         error(ad.code.loc, "Gnu Asm not supported - compile this file with gcc or clang");
+     }
+ }
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/iasm.d gcc-16-20260201/gcc/d/dmd/iasm.d
*** gcc-16-20260125/gcc/d/dmd/iasm.d	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/iasm.d	Thu Jan  1 00:00:00 1970
***************
*** 1,106 ****
- /**
-  * Inline assembler for the D programming language compiler.
-  *
-  * Specification: $(LINK2 https://dlang.org/spec/iasm.html, Inline Assembler)
-  *
-  *              Copyright (C) 2018-2025 by The D Language Foundation, All Rights Reserved
-  * Authors:     $(LINK2 https://www.digitalmars.com, Walter Bright)
-  * License:     $(LINK2 https://www.boost.org/LICENSE_1_0.txt, Boost License 1.0)
-  * Source:      $(LINK2 https://github.com/dlang/dmd/blob/master/compiler/src/dmd/iasm.d, _iasm.d)
-  * Documentation:  https://dlang.org/phobos/dmd_iasm.html
-  * Coverage:    https://codecov.io/gh/dlang/dmd/src/master/compiler/src/dmd/iasm.d
-  */
- 
- module dmd.iasm;
- 
- import core.stdc.stdio;
- 
- import dmd.dscope;
- import dmd.dsymbol;
- import dmd.expression;
- import dmd.func;
- import dmd.mtype;
- import dmd.tokens;
- import dmd.statement;
- import dmd.statementsem;
- 
- version (NoBackend)
- {
- }
- else version (IN_GCC)
- {
-     import dmd.iasmgcc;
- }
- else
- {
-     import dmd.iasmdmd;
-     version = MARS;
- }
- 
- /************************ AsmStatement ***************************************/
- 
- Statement asmSemantic(AsmStatement s, Scope* sc)
- {
-     //printf("AsmStatement.semantic()\n");
- 
-     FuncDeclaration fd = sc.parent.isFuncDeclaration();
-     assert(fd);
- 
-     if (!s.tokens)
-         return null;
- 
-     // Assume assembler code takes care of setting the return value
-     sc.func.hasInlineAsm = true;
- 
-     version (NoBackend)
-     {
-         return null;
-     }
-     else version (MARS)
-     {
-         /* If it starts with a string literal, it's gcc inline asm
-          */
-         if (s.tokens.value == TOK.string_)
-         {
-             /* Replace the asm statement with an assert(0, msg) that trips at runtime.
-              */
-             const loc = s.loc;
-             auto e = new IntegerExp(loc, 0, Type.tint32);
-             auto msg = new StringExp(loc, "Gnu Asm not supported - compile this function with gcc or clang");
-             auto ae = new AssertExp(loc, e, msg);
-             auto se = new ExpStatement(loc, ae);
-             return statementSemantic(se, sc);
-         }
-         auto ias = new InlineAsmStatement(s.loc, s.tokens);
-         ias.caseSensitive = s.caseSensitive;
-         return inlineAsmSemantic(ias, sc);
-     }
-     else version (IN_GCC)
-     {
-         auto eas = new GccAsmStatement(s.loc, s.tokens);
-         return gccAsmSemantic(eas, sc);
-     }
-     else
-     {
-         s.error("D inline assembler statements are not supported");
-         return new ErrorStatement();
-     }
- }
- 
- /************************ CAsmDeclaration ************************************/
- 
- void asmSemantic(CAsmDeclaration ad, Scope* sc)
- {
-     version (NoBackend)
-     {
-     }
-     else version (IN_GCC)
-     {
-         return gccAsmSemantic(ad, sc);
-     }
-     else
-     {
-         import dmd.errors : error;
-         error(ad.code.loc, "Gnu Asm not supported - compile this file with gcc or clang");
-     }
- }
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/iasmgcc.d gcc-16-20260201/gcc/d/dmd/iasmgcc.d
*** gcc-16-20260125/gcc/d/dmd/iasmgcc.d	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/iasmgcc.d	Thu Jan  1 00:00:00 1970
***************
*** 1,567 ****
- /**
-  * Inline assembler for the GCC D compiler.
-  *
-  *              Copyright (C) 2018-2025 by The D Language Foundation, All Rights Reserved
-  * Authors:     Iain Buclaw
-  * License:     $(LINK2 https://www.boost.org/LICENSE_1_0.txt, Boost License 1.0)
-  * Source:      $(LINK2 https://github.com/dlang/dmd/blob/master/compiler/src/dmd/iasmgcc.d, _iasmgcc.d)
-  * Documentation:  https://dlang.org/phobos/dmd_iasmgcc.html
-  * Coverage:    https://codecov.io/gh/dlang/dmd/src/master/compiler/src/dmd/iasmgcc.d
-  */
- 
- module dmd.iasmgcc;
- 
- import core.stdc.string;
- 
- import dmd.arraytypes;
- import dmd.astcodegen;
- import dmd.dscope;
- import dmd.dsymbol;
- import dmd.errors;
- import dmd.errorsink;
- import dmd.expression;
- import dmd.expressionsem;
- import dmd.identifier;
- import dmd.globals;
- import dmd.location;
- import dmd.parse;
- import dmd.tokens;
- import dmd.statement;
- import dmd.statementsem;
- 
- /***********************************
-  * Parse and run semantic analysis on a GccAsmStatement.
-  * Params:
-  *      s  = gcc asm statement being parsed
-  *      sc = the scope where the asm statement is located
-  * Returns:
-  *      the completed gcc asm statement, or null if errors occurred
-  */
- public Statement gccAsmSemantic(GccAsmStatement s, Scope* sc)
- {
-     //printf("GccAsmStatement.semantic()\n");
-     const bool doUnittests = global.params.parsingUnittestsRequired();
-     scope p = new Parser!ASTCodegen(sc._module, ";", false, global.errorSink, &global.compileEnv, doUnittests);
- 
-     // Make a safe copy of the token list before parsing.
-     Token* toklist = null;
-     Token **ptoklist = &toklist;
- 
-     for (Token* token = s.tokens; token; token = token.next)
-     {
-         *ptoklist = p.allocateToken();
-         memcpy(*ptoklist, token, Token.sizeof);
-         ptoklist = &(*ptoklist).next;
-         *ptoklist = null;
-     }
-     p.token = *toklist;
-     p.baseLoc.startLine = s.loc.linnum;
-     p.linnum = s.loc.linnum;
- 
-     // Parse the gcc asm statement.
-     const errors = global.errors;
-     s = p.parseGccAsm(s);
-     if (errors != global.errors)
-         return null;
-     s.stc = sc.stc;
- 
-     // Fold the instruction template string.
-     s.insn = semanticString(sc, s.insn, "asm instruction template");
- 
-     if (s.labels && s.outputargs)
-         error(s.loc, "extended asm statements with labels cannot have output constraints");
- 
-     // Analyse all input and output operands.
-     if (s.args)
-     {
-         foreach (i; 0 .. s.args.length)
-         {
-             Expression e = (*s.args)[i];
-             e = e.expressionSemantic(sc);
-             // Check argument is a valid lvalue/rvalue.
-             if (i < s.outputargs)
-                 e = e.modifiableLvalue(sc);
-             else if (e.checkValue())
-                 e = ErrorExp.get();
-             (*s.args)[i] = e;
- 
-             e = (*s.constraints)[i];
-             e = e.expressionSemantic(sc);
-             assert(e.op == EXP.string_ && (cast(StringExp) e).sz == 1);
-             (*s.constraints)[i] = e;
-         }
-     }
- 
-     // Analyse all clobbers.
-     if (s.clobbers)
-     {
-         foreach (i; 0 .. s.clobbers.length)
-         {
-             Expression e = (*s.clobbers)[i];
-             e = e.expressionSemantic(sc);
-             assert(e.op == EXP.string_ && (cast(StringExp) e).sz == 1);
-             (*s.clobbers)[i] = e;
-         }
-     }
- 
-     // Analyse all goto labels.
-     if (s.labels)
-     {
-         foreach (i; 0 .. s.labels.length)
-         {
-             Identifier ident = (*s.labels)[i];
-             GotoStatement gs = new GotoStatement(s.loc, ident);
-             if (!s.gotos)
-                 s.gotos = new GotoStatements();
-             s.gotos.push(gs);
-             gs.statementSemantic(sc);
-         }
-     }
- 
-     return s;
- }
- 
- /***********************************
-  * Run semantic analysis on an CAsmDeclaration.
-  * Params:
-  *      ad  = asm declaration
-  *      sc = the scope where the asm declaration is located
-  */
- public void gccAsmSemantic(CAsmDeclaration ad, Scope* sc)
- {
-     import dmd.typesem : pointerTo;
-     ad.code = semanticString(sc, ad.code, "asm definition");
-     ad.code.type = ad.code.type.nextOf().pointerTo();
- 
-     // Asm definition always needs emitting into the root module.
-     import dmd.dmodule : Module;
-     if (sc._module && sc._module.isRoot())
-         return;
-     if (Module m = Module.rootModule)
-         m.members.push(ad);
- }
- 
- private:
- 
- /***********************************
-  * Parse list of extended asm input or output operands.
-  * Grammar:
-  *      | Operands:
-  *      |     SymbolicName(opt) StringLiteral ( AssignExpression )
-  *      |     SymbolicName(opt) StringLiteral ( AssignExpression ), Operands
-  *      |
-  *      | SymbolicName:
-  *      |     [ Identifier ]
-  * Params:
-  *      p = parser state
-  *      s = asm statement to parse
-  * Returns:
-  *      number of operands added to the gcc asm statement
-  */
- int parseExtAsmOperands(Parser)(Parser p, GccAsmStatement s)
- {
-     int numargs = 0;
- 
-     while (1)
-     {
-         Expression arg;
-         Identifier name;
-         Expression constraint;
- 
-         switch (p.token.value)
-         {
-             case TOK.semicolon:
-             case TOK.colon:
-             case TOK.endOfFile:
-                 return numargs;
- 
-             case TOK.leftBracket:
-                 if (p.peekNext() == TOK.identifier)
-                 {
-                     // Skip over opening `[`
-                     p.nextToken();
-                     // Store the symbolic name
-                     name = p.token.ident;
-                     p.nextToken();
-                 }
-                 else
-                 {
-                     p.eSink.error(s.loc, "expected identifier after `[`");
-                     goto Lerror;
-                 }
-                 // Look for closing `]`
-                 p.check(TOK.rightBracket);
-                 // Look for the string literal and fall through
-                 if (p.token.value == TOK.string_)
-                     goto case;
-                 else
-                     goto default;
- 
-             case TOK.string_:
-                 constraint = p.parsePrimaryExp();
-                 if (p.token.value != TOK.leftParenthesis)
-                 {
-                     arg = p.parseAssignExp();
-                     error(arg.loc, "`%s` must be surrounded by parentheses", arg.toChars());
-                 }
-                 else
-                 {
-                     // Look for the opening `(`
-                     p.check(TOK.leftParenthesis);
-                     // Parse the assign expression
-                     arg = p.parseAssignExp();
-                     // Look for the closing `)`
-                     p.check(TOK.rightParenthesis);
-                 }
- 
-                 if (!s.args)
-                 {
-                     s.names = new Identifiers();
-                     s.constraints = new Expressions();
-                     s.args = new Expressions();
-                 }
-                 s.names.push(name);
-                 s.args.push(arg);
-                 s.constraints.push(constraint);
-                 numargs++;
- 
-                 if (p.token.value == TOK.comma)
-                     p.nextToken();
-                 break;
- 
-             default:
-                 p.eSink.error(p.token.loc, "expected constant string constraint for operand, not `%s`",
-                         p.token.toChars());
-                 goto Lerror;
-         }
-     }
- Lerror:
-     while (p.token.value != TOK.rightCurly &&
-            p.token.value != TOK.semicolon &&
-            p.token.value != TOK.endOfFile)
-         p.nextToken();
- 
-     return numargs;
- }
- 
- /***********************************
-  * Parse list of extended asm clobbers.
-  * Grammar:
-  *      | Clobbers:
-  *      |     StringLiteral
-  *      |     StringLiteral , Clobbers
-  * Params:
-  *      p = parser state
-  * Returns:
-  *      array of parsed clobber expressions
-  */
- Expressions* parseExtAsmClobbers(Parser)(Parser p)
- {
-     Expressions* clobbers;
- 
-     while (1)
-     {
-         Expression clobber;
- 
-         switch (p.token.value)
-         {
-             case TOK.semicolon:
-             case TOK.colon:
-             case TOK.endOfFile:
-                 return clobbers;
- 
-             case TOK.string_:
-                 clobber = p.parsePrimaryExp();
-                 if (!clobbers)
-                     clobbers = new Expressions();
-                 clobbers.push(clobber);
- 
-                 if (p.token.value == TOK.comma)
-                     p.nextToken();
-                 break;
- 
-             default:
-                 p.eSink.error(p.token.loc, "expected constant string constraint for clobber name, not `%s`",
-                         p.token.toChars());
-                 goto Lerror;
-         }
-     }
- Lerror:
-     while (p.token.value != TOK.rightCurly &&
-            p.token.value != TOK.semicolon &&
-            p.token.value != TOK.endOfFile)
-         p.nextToken();
- 
-     return clobbers;
- }
- 
- /***********************************
-  * Parse list of extended asm goto labels.
-  * Grammar:
-  *      | GotoLabels:
-  *      |     Identifier
-  *      |     Identifier , GotoLabels
-  * Params:
-  *      p = parser state
-  * Returns:
-  *      array of parsed goto labels
-  */
- Identifiers* parseExtAsmGotoLabels(Parser)(Parser p)
- {
-     Identifiers* labels;
- 
-     while (1)
-     {
-         switch (p.token.value)
-         {
-             case TOK.semicolon:
-             case TOK.endOfFile:
-                 return labels;
- 
-             case TOK.identifier:
-                 if (!labels)
-                     labels = new Identifiers();
-                 labels.push(p.token.ident);
- 
-                 if (p.nextToken() == TOK.comma)
-                     p.nextToken();
-                 break;
- 
-             default:
-                 p.eSink.error(p.token.loc, "expected identifier for goto label name, not `%s`",
-                         p.token.toChars());
-                 goto Lerror;
-         }
-     }
- Lerror:
-     while (p.token.value != TOK.rightCurly &&
-            p.token.value != TOK.semicolon &&
-            p.token.value != TOK.endOfFile)
-         p.nextToken();
- 
-     return labels;
- }
- 
- /***********************************
-  * Parse a gcc asm statement.
-  * There are three forms of inline asm statements, basic, extended, and goto.
-  * Grammar:
-  *      | AsmInstruction:
-  *      |     BasicAsmInstruction
-  *      |     ExtAsmInstruction
-  *      |     GotoAsmInstruction
-  *      |
-  *      | BasicAsmInstruction:
-  *      |     AssignExpression
-  *      |
-  *      | ExtAsmInstruction:
-  *      |     AssignExpression : Operands(opt) : Operands(opt) : Clobbers(opt)
-  *      |
-  *      | GotoAsmInstruction:
-  *      |     AssignExpression : : Operands(opt) : Clobbers(opt) : GotoLabels(opt)
-  * Params:
-  *      p = parser state
-  *      s = asm statement to parse
-  * Returns:
-  *      the parsed gcc asm statement
-  */
- GccAsmStatement parseGccAsm(Parser)(Parser p, GccAsmStatement s)
- {
-     s.insn = p.parseAssignExp();
-     if (p.token.value == TOK.semicolon || p.token.value == TOK.endOfFile)
-         goto Ldone;
- 
-     // No semicolon followed after instruction template, treat as extended asm.
-     foreach (section; 0 .. 4)
-     {
-         p.check(TOK.colon);
- 
-         final switch (section)
-         {
-             case 0:
-                 s.outputargs = p.parseExtAsmOperands(s);
-                 break;
- 
-             case 1:
-                 p.parseExtAsmOperands(s);
-                 break;
- 
-             case 2:
-                 s.clobbers = p.parseExtAsmClobbers();
-                 break;
- 
-             case 3:
-                 s.labels = p.parseExtAsmGotoLabels();
-                 break;
-         }
- 
-         if (p.token.value == TOK.semicolon || p.token.value == TOK.endOfFile)
-             goto Ldone;
-     }
- Ldone:
-     p.check(TOK.semicolon);
- 
-     return s;
- }
- 
- unittest
- {
-     import dmd.mtype : TypeBasic;
- 
-     if (!global.errorSink)
-         global.errorSink = new ErrorSinkCompiler;
- 
-     const errors = global.startGagging();
-     scope(exit) global.endGagging(errors);
- 
-     // If this check fails, then Type._init() was called before reaching here,
-     // and the entire chunk of code that follows can be removed.
-     assert(ASTCodegen.Type.tint32 is null);
-     // Minimally initialize the cached types in ASTCodegen.Type, as they are
-     // dependencies for some fail asm tests to succeed.
-     ASTCodegen.Type.stringtable._init();
-     scope(exit)
-     {
-         ASTCodegen.Type.deinitialize();
-         ASTCodegen.Type.tint32 = null;
-     }
-     scope tint32 = new TypeBasic(ASTCodegen.Tint32);
-     ASTCodegen.Type.tint32 = tint32;
- 
-     // Imitates asmSemantic if version = IN_GCC.
-     static int semanticAsm(Token* tokens)
-     {
-         const errors = global.errors;
-         scope gas = new GccAsmStatement(Loc.initial, tokens);
-         const bool doUnittests = false;
-         scope p = new Parser!ASTCodegen(null, ";", false, global.errorSink, &global.compileEnv, doUnittests);
-         p.token = *tokens;
-         p.parseGccAsm(gas);
-         return global.errors - errors;
-     }
- 
-     // Imitates parseStatement for asm statements.
-     static void parseAsm(string input, bool expectError)
-     {
-         // Generate tokens from input test.
-         const bool doUnittests = false;
-         scope p = new Parser!ASTCodegen(null, input, false, global.errorSink, &global.compileEnv, doUnittests);
-         p.nextToken();
- 
-         Token* toklist = null;
-         Token** ptoklist = &toklist;
-         p.check(TOK.asm_);
-         p.check(TOK.leftCurly);
-         while (1)
-         {
-             if (p.token.value == TOK.rightCurly || p.token.value == TOK.endOfFile)
-                 break;
-             if (p.token.value == TOK.colonColon)
-             {
-                 *ptoklist = p.allocateToken();
-                 memcpy(*ptoklist, &p.token, Token.sizeof);
-                 (*ptoklist).value = TOK.colon;
-                 ptoklist = &(*ptoklist).next;
- 
-                 *ptoklist = p.allocateToken();
-                 memcpy(*ptoklist, &p.token, Token.sizeof);
-                 (*ptoklist).value = TOK.colon;
-                 ptoklist = &(*ptoklist).next;
-             }
-             else
-             {
-                 *ptoklist = p.allocateToken();
-                 memcpy(*ptoklist, &p.token, Token.sizeof);
-                 ptoklist = &(*ptoklist).next;
-             }
-             *ptoklist = null;
-             p.nextToken();
-         }
-         p.check(TOK.rightCurly);
- 
-         auto res = semanticAsm(toklist);
-         // Checks for both unexpected passes and failures.
-         assert((res == 0) != expectError);
-     }
- 
-     /// Assembly Tests, all should pass.
-     /// Note: Frontend is not initialized, use only strings and identifiers.
-     immutable string[] passAsmTests = [
-         // Basic asm statement
-         q{ asm { "nop";
-         } },
- 
-         // Extended asm statement
-         q{ asm { "cpuid"
-                : "=a" (a), "=b" (b), "=c" (c), "=d" (d)
-                : "a" (input);
-         } },
- 
-         // Assembly with symbolic names
-         q{ asm { "bts %[base], %[offset]"
-                : [base] "+rm" (*ptr),
-                : [offset] "Ir" (bitnum);
-         } },
- 
-         // Assembly with clobbers
-         q{ asm { "cpuid"
-                : "=a" (a)
-                : "a" (input)
-                : "ebx", "ecx", "edx";
-         } },
- 
-         // Goto asm statement
-         q{ asm { "jmp %l0"
-                :
-                :
-                :
-                : Ljmplabel;
-         } },
- 
-         // Any CTFE-able string allowed as instruction template.
-         q{ asm { generateAsm();
-         } },
- 
-         // Likewise mixins, permissible so long as the result is a string.
-         q{ asm { mixin(`"repne"`, `~ "scasb"`);
-         } },
- 
-         // :: token tests
-         q{ asm { "" : : : "memory"; } },
-         q{ asm { "" :: : "memory"; } },
-         q{ asm { "" : :: "memory"; } },
-         q{ asm { "" ::: "memory"; } },
-     ];
- 
-     immutable string[] failAsmTests = [
-         // Found 'h' when expecting ';'
-         q{ asm { ""h;
-         } },
- 
-         // https://issues.dlang.org/show_bug.cgi?id=20592
-         q{ asm { "nop" : [name] string (expr); } },
- 
-         // Expression expected, not ';'
-         q{ asm { ""[;
-         } },
- 
-         // Expression expected, not ':'
-         q{ asm { ""
-                :
-                : "g" (a ? b : : c);
-         } },
- 
-         // Found ',' when expecting ':'
-         q{ asm { "", "";
-         } },
- 
-         // https://issues.dlang.org/show_bug.cgi?id=20593
-         q{ asm { "instruction" : : "operand" 123; } },
-     ];
- 
-     foreach (test; passAsmTests)
-         parseAsm(test, false);
- 
-     foreach (test; failAsmTests)
-         parseAsm(test, true);
- }
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/id.d gcc-16-20260201/gcc/d/dmd/id.d
*** gcc-16-20260125/gcc/d/dmd/id.d	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/id.d	Sun Feb  1 22:32:07 2026
*************** immutable Msgtable[] msgtable =
*** 206,211 ****
--- 206,212 ----
      { "keys" },
      { "values" },
      { "rehash" },
+     { "dup" },
  
      { "future", "__future" },
      { "property" },
*************** immutable Msgtable[] msgtable =
*** 259,269 ****
      { "FpopBack", "popBack" },
  
      // For internal functions
!     { "aaLen", "_aaLen" },
!     { "aaKeys", "_aaKeys" },
!     { "aaValues", "_aaValues" },
!     { "aaRehash", "_aaRehash" },
!     { "_aaAsStruct" },
      { "monitorenter", "_d_monitorenter" },
      { "monitorexit", "_d_monitorexit" },
      { "criticalenter", "_d_criticalenter2" },
--- 260,274 ----
      { "FpopBack", "popBack" },
  
      // For internal functions
!     { "_d_aaGetY" },
!     { "_d_aaGetRvalueX" },
!     { "_d_aaDel" },
!     { "_d_aaEqual" },
!     { "_d_aaIn" },
!     { "_d_aaNew" },
!     { "_d_aaLen" },
!     { "_d_aaApply" },
!     { "_d_aaApply2" },
      { "monitorenter", "_d_monitorenter" },
      { "monitorexit", "_d_monitorexit" },
      { "criticalenter", "_d_criticalenter2" },
*************** immutable Msgtable[] msgtable =
*** 280,294 ****
      { "_d_newarrayTTrace" },
      { "_d_newarraymTX" },
      { "_d_newarraymTXTrace" },
      { "_d_assert_fail" },
-     { "dup" },
-     { "_aaApply" },
-     { "_aaApply2" },
      { "_d_arrayctor" },
      { "_d_arraysetctor" },
      { "_d_arraysetassign" },
      { "_d_arrayassign_l" },
      { "_d_arrayassign_r" },
  
      { "imported" },
      { "InterpolationHeader" },
--- 285,299 ----
      { "_d_newarrayTTrace" },
      { "_d_newarraymTX" },
      { "_d_newarraymTXTrace" },
+     { "_d_arrayliteralTX" },
+     { "_d_arrayliteralTXTrace" },
      { "_d_assert_fail" },
      { "_d_arrayctor" },
      { "_d_arraysetctor" },
      { "_d_arraysetassign" },
      { "_d_arrayassign_l" },
      { "_d_arrayassign_r" },
+     { "_d_cast" },
  
      { "imported" },
      { "InterpolationHeader" },
*************** immutable Msgtable[] msgtable =
*** 324,330 ****
      { "__switch_error"},
      { "__ArrayCast"},
      { "_d_HookTraceImpl" },
-     { "_d_arraysetlengthTImpl"},
      { "_d_arraysetlengthT"},
      { "_d_arraysetlengthTTrace"},
      { "_d_arrayappendT" },
--- 329,334 ----
*************** immutable Msgtable[] msgtable =
*** 333,338 ****
--- 337,343 ----
      { "_d_arrayappendcTXTrace" },
      { "_d_arraycatnTX" },
      { "_d_arraycatnTXTrace" },
+     { "_d_assocarrayliteralTX" },
  
      // varargs implementation
      { "stdc" },
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/identifier.d gcc-16-20260201/gcc/d/dmd/identifier.d
*** gcc-16-20260125/gcc/d/dmd/identifier.d	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/identifier.d	Sun Feb  1 22:32:07 2026
*************** nothrow:
*** 221,227 ****
       *      Identifier (inside Identifier.idPool) with deterministic name based
       *      on the source location.
       */
!     extern (D) static Identifier generateIdWithLoc(string prefix, Loc loc, string parent = "")
      {
          // generate `<prefix>_L<line>_C<col>`
          auto sl = SourceLoc(loc);
--- 221,227 ----
       *      Identifier (inside Identifier.idPool) with deterministic name based
       *      on the source location.
       */
!     extern (D) static Identifier generateIdWithLoc(string prefix, Loc loc, const void* parent = null)
      {
          // generate `<prefix>_L<line>_C<col>`
          auto sl = SourceLoc(loc);
*************** nothrow:
*** 248,261 ****
           * directly, but that would unnecessary lengthen symbols names. See issue:
           * https://issues.dlang.org/show_bug.cgi?id=23722
           */
!         static struct Key { string locKey; string prefix; string parent; }
          __gshared uint[Key] counters;
  
!         string locKey = cast(string) (sl.filename ~ idBuf[]);
          static if (__traits(compiles, counters.update(Key.init, () => 0u, (ref uint a) => 0u)))
          {
              // 2.082+
!             counters.update(Key(locKey, prefix, parent),
                  () => 1u,          // insertion
                  (ref uint counter) // update
                  {
--- 248,262 ----
           * directly, but that would unnecessary lengthen symbols names. See issue:
           * https://issues.dlang.org/show_bug.cgi?id=23722
           */
!         static struct Key { string locKey; string prefix; const(void)* parent; }
          __gshared uint[Key] counters;
  
!         const locKey = cast(string) (sl.filename ~ idBuf[]);
!         const key = Key(locKey, prefix, parent);
          static if (__traits(compiles, counters.update(Key.init, () => 0u, (ref uint a) => 0u)))
          {
              // 2.082+
!             counters.update(key,
                  () => 1u,          // insertion
                  (ref uint counter) // update
                  {
*************** nothrow:
*** 267,273 ****
          }
          else
          {
-             const key = Key(locKey, prefix, parent);
              if (auto pCounter = key in counters)
              {
                  idBuf.writestring("_");
--- 268,273 ----
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/imphint.d gcc-16-20260201/gcc/d/dmd/imphint.d
*** gcc-16-20260125/gcc/d/dmd/imphint.d	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/imphint.d	Sun Feb  1 22:32:07 2026
*************** const(char)[] importHint(const(char)[] s
*** 26,33 ****
--- 26,40 ----
          return *entry;
      return null;
  }
+ const(char)[] cIncludeHint(const(char)[] s) @safe
+ {
+     if (auto entry = s in cHints)
+         return *entry;
+     return null;
+ }
  
  private immutable string[string] hints;
+ private immutable string[string] cHints;
  
  shared static this()
  {
*************** shared static this()
*** 83,88 ****
--- 90,112 ----
          "InterpolationHeader": "core.interpolation",
          "InterpolationFooter": "core.interpolation",
      ];
+     cHints = [
+         "NULL": "<stddef.h>",
+         "calloc": "<stdlib.h>",
+         "fopen": "<stdio.h>",
+         "fprintf": "<stdio.h>",
+         "free": "<stdlib.h>",
+         "malloc": "<stdlib.h>",
+         "memcpy": "<string.h>",
+         "memmove": "<string.h>",
+         "memset": "<string.h>",
+         "printf": "<stdio.h>",
+         "ptrdiff_t": "<stddef.h>",
+         "size_t": "<stddef.h>",
+         "stderr": "<stdio.h>",
+         "stdin": "<stdio.h>",
+         "stdout": "<stdio.h>",
+     ];
  }
  
  unittest
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/import.h gcc-16-20260201/gcc/d/dmd/import.h
*** gcc-16-20260125/gcc/d/dmd/import.h	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/import.h	Sun Feb  1 22:32:07 2026
*************** public:
*** 41,47 ****
      const char *kind() const override;
      Visibility visible() override;
      Import *syntaxCopy(Dsymbol *s) override; // copy only syntax trees
-     Dsymbol *toAlias() override;
      bool overloadInsert(Dsymbol *s) override;
  
      void accept(Visitor *v) override { v->visit(this); }
--- 41,46 ----
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/importc.d gcc-16-20260201/gcc/d/dmd/importc.d
*** gcc-16-20260125/gcc/d/dmd/importc.d	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/importc.d	Sun Feb  1 22:32:07 2026
*************** import core.stdc.stdio;
*** 17,32 ****
--- 17,38 ----
  
  import dmd.astenums;
  import dmd.dcast;
+ import dmd.denum;
  import dmd.declaration;
  import dmd.dscope;
  import dmd.dsymbol;
  import dmd.dsymbolsem;
+ import dmd.dinterpret : ctfeInterpret;
  import dmd.errors;
  import dmd.expression;
  import dmd.expressionsem;
  import dmd.identifier;
+ import dmd.id : Id;
  import dmd.init;
+ import dmd.intrange : IntRange;
  import dmd.mtype;
+ import dmd.optimize : optimize;
+ import dmd.rootobject : DYNCAST;
  import dmd.tokens;
  import dmd.typesem;
  
*************** Expression arrayFuncConv(Expression e, S
*** 83,95 ****
      auto t = e.type.toBasetype();
      if (auto ta = t.isTypeDArray())
      {
!         if (!checkAddressable(e, sc))
              return ErrorExp.get();
          e = e.castTo(sc, ta.next.pointerTo());
      }
      else if (auto ts = t.isTypeSArray())
      {
!         if (!checkAddressable(e, sc))
              return ErrorExp.get();
          e = e.castTo(sc, ts.next.pointerTo());
      }
--- 89,101 ----
      auto t = e.type.toBasetype();
      if (auto ta = t.isTypeDArray())
      {
!         if (!checkAddressable(e, sc, "take address of"))
              return ErrorExp.get();
          e = e.castTo(sc, ta.next.pointerTo());
      }
      else if (auto ts = t.isTypeSArray())
      {
!         if (!checkAddressable(e, sc, "take address of"))
              return ErrorExp.get();
          e = e.castTo(sc, ts.next.pointerTo());
      }
*************** Expression fieldLookup(Expression e, Sco
*** 120,125 ****
--- 126,137 ----
      e = e.expressionSemantic(sc);
      if (e.isErrorExp())
          return e;
+     if (arrow)
+     {
+         e = arrayFuncConv(e, sc);
+         if (e.isErrorExp())
+             return e;
+     }
  
      auto t = e.type;
      if (t.isTypePointer())
*************** Dsymbol handleSymbolRedeclarations(ref S
*** 532,544 ****
          }
      }
  
      auto vd = s.isVarDeclaration(); // new declaration
      auto vd2 = s2.isVarDeclaration(); // existing declaration
  
!     if (vd && vd.isCmacro())
!         return vd2;
  
!     assert(!(vd2 && vd2.isCmacro()));
  
      if (vd && vd2)
      {
--- 544,562 ----
          }
      }
  
+     // Don't let macros shadow real symbols
+     if (auto td = s.isTemplateDeclaration())
+     {
+         if (td.isCmacro) return s2;
+     }
+ 
      auto vd = s.isVarDeclaration(); // new declaration
      auto vd2 = s2.isVarDeclaration(); // existing declaration
  
!     if (vd && vd.isCmacro)
!         return s2;
  
!     assert(!(vd2 && vd2.isCmacro));
  
      if (vd && vd2)
      {
*************** Dsymbol handleSymbolRedeclarations(ref S
*** 638,640 ****
--- 656,770 ----
  
      return collision();
  }
+ 
+ /*********************************
+  * ImportC-specific semantic analysis on enum declaration `ed`
+  */
+ void cEnumSemantic(Scope* sc, EnumDeclaration ed)
+ {
+     // C11 6.7.2.2
+     Type commonType = ed.memtype;
+     if (!commonType)
+         commonType = Type.tint32;
+     ulong nextValue = 0;        // C11 6.7.2.2-3 first member value defaults to 0
+ 
+     // C11 6.7.2.2-2 value must be representable as an int.
+     // The sizemask represents all values that int will fit into,
+     // from 0..uint.max.  We want to cover int.min..uint.max.
+     IntRange ir = IntRange.fromType(commonType);
+ 
+     void emSemantic(EnumMember em, ref ulong nextValue)
+     {
+         static void errorReturn(EnumMember em)
+         {
+             em.value = ErrorExp.get();
+             em.errors = true;
+             em.semanticRun = PASS.semanticdone;
+         }
+ 
+         em.semanticRun = PASS.semantic;
+         em.type = commonType;
+         em._linkage = LINK.c;
+         em.storage_class |= STC.manifest;
+         if (em.value)
+         {
+             Expression e = em.value;
+             assert(e.dyncast() == DYNCAST.expression);
+ 
+             /* To merge the type of e with commonType, add 0 of type commonType
+                 */
+             if (!ed.memtype)
+                 e = new AddExp(em.loc, e, new IntegerExp(em.loc, 0, commonType));
+ 
+             e = e.expressionSemantic(sc);
+             e = resolveProperties(sc, e);
+             e = e.integralPromotions(sc);
+             e = e.ctfeInterpret();
+             if (e.op == EXP.error)
+                 return errorReturn(em);
+             auto ie = e.isIntegerExp();
+             if (!ie)
+             {
+                 // C11 6.7.2.2-2
+                 .error(em.loc, "%s `%s` enum member must be an integral constant expression, not `%s` of type `%s`", em.kind, em.toPrettyChars, e.toChars(), e.type.toChars());
+                 return errorReturn(em);
+             }
+             if (ed.memtype && !ir.contains(getIntRange(ie)))
+             {
+                 // C11 6.7.2.2-2
+                 .error(em.loc, "%s `%s` enum member value `%s` does not fit in `%s`", em.kind, em.toPrettyChars, e.toChars(), commonType.toChars());
+                 return errorReturn(em);
+             }
+             nextValue = ie.toInteger();
+             if (!ed.memtype)
+                 commonType = e.type;
+             em.value = new IntegerExp(em.loc, nextValue, commonType);
+         }
+         else
+         {
+             // C11 6.7.2.2-3 add 1 to value of previous enumeration constant
+             bool first = (em == (*em.ed.members)[0]);
+             if (!first)
+             {
+                 Expression max = getProperty(commonType, null, em.loc, Id.max, 0);
+                 if (nextValue == max.toInteger())
+                 {
+                     .error(em.loc, "%s `%s` initialization with `%s+1` causes overflow for type `%s`", em.kind, em.toPrettyChars, max.toChars(), commonType.toChars());
+                     return errorReturn(em);
+                 }
+                 nextValue += 1;
+             }
+             em.value = new IntegerExp(em.loc, nextValue, commonType);
+         }
+         em.type = commonType;
+         em.semanticRun = PASS.semanticdone;
+     }
+ 
+     ed.members.foreachDsymbol( (s)
+     {
+         if (EnumMember em = s.isEnumMember())
+             emSemantic(em, nextValue);
+     });
+ 
+     if (!ed.memtype)
+     {
+         // cast all members to commonType
+         ed.members.foreachDsymbol( (s)
+         {
+             if (EnumMember em = s.isEnumMember())
+             {
+                 em.type = commonType;
+                 // optimize out the cast so that other parts of the compiler can
+                 // assume that an integral enum's members are `IntegerExp`s.
+                 // https://issues.dlang.org/show_bug.cgi?id=24504
+                 em.value = em.value.castTo(sc, commonType).optimize(WANTvalue);
+             }
+         });
+     }
+ 
+     ed.memtype = commonType;
+     // Set semantic2done to mark C enums as fully processed
+     // Prevents issues with final switch statements that reference C enums
+     ed.semanticRun = PASS.semantic2done;
+     return;
+ }
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/initsem.d gcc-16-20260201/gcc/d/dmd/initsem.d
*** gcc-16-20260125/gcc/d/dmd/initsem.d	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/initsem.d	Sun Feb  1 22:32:07 2026
*************** Initializer initializerSemantic(Initiali
*** 153,159 ****
              // that is not disabled.
              if (sd.hasRegularCtor(true))
              {
!                 error(i.loc, "%s `%s` has constructors, cannot use `{ initializers }`, use `%s( initializers )` instead", sd.kind(), sd.toChars(), sd.toChars());
                  return err();
              }
              sd.size(i.loc);
--- 153,162 ----
              // that is not disabled.
              if (sd.hasRegularCtor(true))
              {
!                 error(i.loc, "Cannot use %s initializer syntax for %s `%s` because it has a constructor",
!                     sd.kind(), sd.kind(), sd.toChars());
!                 errorSupplemental(i.loc, "Use `%s( arguments )` instead of `{ initializers }`",
!                     sd.toChars());
                  return err();
              }
              sd.size(i.loc);
*************** Initializer initializerSemantic(Initiali
*** 171,177 ****
                  return ex;
              }
  
!             auto elements = resolveStructLiteralNamedArgs(sd, t, sc, i.loc, i.field[], &getExp, (size_t j) => i.value[j].loc);
              if (!elements)
                  return err();
  
--- 174,181 ----
                  return ex;
              }
  
!             auto elements = resolveStructLiteralNamedArgs(sd, t, sc, i.loc, i.field.length, (size_t j) => i.field[j], &getExp, (size_t j) => i.value[j].loc, (size_t j) => i.value[j].loc);
!             //Keeping both the getArgLoc and getNameLoc same as i.field doesn't have a .loc value here.
              if (!elements)
                  return err();
  
*************** Initializer initializerSemantic(Initiali
*** 240,245 ****
--- 244,252 ----
                  goto default;
              break;
  
+         case Terror:
+             return err();
+ 
          default:
              error(i.loc, "cannot use array to initialize `%s`", t.toChars());
              return err();
*************** Initializer initializerSemantic(Initiali
*** 394,400 ****
              if (needInterpret)
                  i.exp = i.exp.ctfeInterpret();
              if (i.exp.op == EXP.voidExpression)
!                 error(i.loc, "variables cannot be initialized with an expression of type `void`. Use `void` initialization instead.");
          }
          else
          {
--- 401,410 ----
              if (needInterpret)
                  i.exp = i.exp.ctfeInterpret();
              if (i.exp.op == EXP.voidExpression)
!             {
!                 error(i.loc, "variables cannot be initialized with an expression of type `void`");
!                 errorSupplemental(i.loc, "only `= void;` is allowed, which prevents default initialization");
!             }
          }
          else
          {
*************** Initializer initializerSemantic(Initiali
*** 755,763 ****
                  // C11 6.2.5-20 "element type shall be complete whenever the array type is specified"
                  assert(0); // should have been detected by parser
              }
  
!             auto tnsa = tsa.nextOf().toBasetype().isTypeSArray();
! 
              auto ai = new ArrayInitializer(ci.loc);
              ai.isCarray = true;
  
--- 765,777 ----
                  // C11 6.2.5-20 "element type shall be complete whenever the array type is specified"
                  assert(0); // should have been detected by parser
              }
+             auto bt = tsa.nextOf().toBasetype();
  
!             if (auto tnss = bt.isTypeStruct())
!             {
!                 return subStruct(tnss, index);
!             }
!             auto tnsa = bt.isTypeSArray();
              auto ai = new ArrayInitializer(ci.loc);
              ai.isCarray = true;
  
*************** Params:
*** 1505,1519 ****
      t = type of struct (potentially including qualifiers such as `const` or `immutable`)
      sc = scope of the expression initializing the struct
      iloc = location of expression initializing the struct
!     names = identifiers passed in argument list, `null` entries for positional arguments
!     getExp = function that, given an index into `names` and destination type, returns the initializing expression
!     getLoc = function that, given an index into `names`, returns a location for error messages
  
  Returns: list of expressions ordered to the struct's fields, or `null` on error
  */
  Expressions* resolveStructLiteralNamedArgs(StructDeclaration sd, Type t, Scope* sc,
!     Loc iloc, Identifier[] names, scope Expression delegate(size_t i, Type fieldType) getExp,
!     scope Loc delegate(size_t i) getLoc
  )
  {
      //expandTuples for non-identity arguments?
--- 1519,1536 ----
      t = type of struct (potentially including qualifiers such as `const` or `immutable`)
      sc = scope of the expression initializing the struct
      iloc = location of expression initializing the struct
!     argCount = count of argumnet present
!     getExp = function that, given an index into `argNames` and destination type, returns the initializing expression
!     getArgName = function that, given an index into `argNames`, returns the name of argument for error messages
!     getArgLoc = function that, given an index into `argNames`, returns a location of argument for error messages
!     getNameLoc = function that, given an index into `argNames`, returns a location of that `name` for error messages
  
  Returns: list of expressions ordered to the struct's fields, or `null` on error
  */
  Expressions* resolveStructLiteralNamedArgs(StructDeclaration sd, Type t, Scope* sc,
!     Loc iloc, size_t argCount, scope Identifier delegate(size_t i) getArgName, scope Expression delegate(size_t i, Type fieldType) getExp,
!     scope Loc delegate(size_t i) getArgLoc,
!     scope Loc delegate(size_t i) getNameLoc
  )
  {
      //expandTuples for non-identity arguments?
*************** Expressions* resolveStructLiteralNamedAr
*** 1527,1535 ****
      // TODO: this part is slightly different from StructLiteralExp::semantic.
      bool errors = false;
      size_t fieldi = 0;
!     foreach (j, id; names)
      {
!         const argLoc = getLoc(j);
          if (id)
          {
              // Determine `fieldi` that `id` matches
--- 1544,1554 ----
      // TODO: this part is slightly different from StructLiteralExp::semantic.
      bool errors = false;
      size_t fieldi = 0;
!     foreach (j; 0 .. argCount)
      {
!         const argLoc = getArgLoc(j);
!         const nameLoc = getNameLoc(j);
!         Identifier id = getArgName(j);
          if (id)
          {
              // Determine `fieldi` that `id` matches
*************** Expressions* resolveStructLiteralNamedAr
*** 1538,1546 ****
              {
                  s = sd.search_correct(id);
                  if (s)
!                     error(argLoc, "`%s` is not a member of `%s`, did you mean %s `%s`?", id.toChars(), sd.toChars(), s.kind(), s.toChars());
                  else
!                     error(argLoc, "`%s` is not a member of `%s`", id.toChars(), sd.toChars());
                  return null;
              }
              s.checkDeprecated(iloc, sc);
--- 1557,1565 ----
              {
                  s = sd.search_correct(id);
                  if (s)
!                     error(nameLoc, "`%s` is not a member of `%s`, did you mean %s `%s`?", id.toChars(), sd.toChars(), s.kind(), s.toChars());
                  else
!                     error(nameLoc, "`%s` is not a member of `%s`", id.toChars(), sd.toChars());
                  return null;
              }
              s.checkDeprecated(iloc, sc);
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/lambdacomp.d gcc-16-20260201/gcc/d/dmd/lambdacomp.d
*** gcc-16-20260125/gcc/d/dmd/lambdacomp.d	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/lambdacomp.d	Sun Feb  1 22:32:07 2026
*************** import dmd.dsymbol;
*** 25,30 ****
--- 25,31 ----
  import dmd.dsymbolsem;
  import dmd.dtemplate;
  import dmd.expression;
+ import dmd.expressionsem : getConstInitializer;
  import dmd.func;
  import dmd.hdrgen;
  import dmd.mangle;
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/lexer.d gcc-16-20260201/gcc/d/dmd/lexer.d
*** gcc-16-20260125/gcc/d/dmd/lexer.d	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/lexer.d	Sun Feb  1 22:32:07 2026
*************** class Lexer
*** 1706,1712 ****
                  }
                  break;
              }
!             stringbuffer.writeByte(c);
          }
      }
  
--- 1706,1712 ----
                  }
                  break;
              }
!             stringbuffer.writeByte(cast(char)c);
          }
      }
  
*************** class Lexer
*** 1750,1756 ****
                  if (n & 1)
                  {
                      error("odd number (%d) of hex characters in hex string", n);
!                     stringbuffer.writeByte(v);
                  }
                  t.setString(stringbuffer);
                  stringPostfix(t);
--- 1750,1756 ----
                  if (n & 1)
                  {
                      error("odd number (%d) of hex characters in hex string", n);
!                     stringbuffer.writeByte(cast(char)v);
                  }
                  t.setString(stringbuffer);
                  stringPostfix(t);
*************** class Lexer
*** 1777,1783 ****
                  if (n & 1)
                  {
                      v = (v << 4) | c;
!                     stringbuffer.writeByte(v);
                  }
                  else
                      v = c;
--- 1777,1783 ----
                  if (n & 1)
                  {
                      v = (v << 4) | c;
!                     stringbuffer.writeByte(cast(char)v);
                  }
                  else
                      v = c;
*************** class Lexer
*** 2195,2201 ****
                  }
                  break;
              }
!             stringbuffer.writeByte(c);
          }
      }
  
--- 2195,2201 ----
                  }
                  break;
              }
!             stringbuffer.writeByte(cast(char)c);
          }
      }
  
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/location.d gcc-16-20260201/gcc/d/dmd/location.d
*** gcc-16-20260125/gcc/d/dmd/location.d	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/location.d	Sun Feb  1 22:32:07 2026
*************** struct Loc
*** 48,53 ****
--- 48,62 ----
  
  nothrow:
  
+     /// Reset global (Base)Loc tables, invalidating every existing `Loc` out there
+     /// and giving room to create new `Loc`s
+     static void _init()
+     {
+         locIndex = 1;
+         locFileTable = null;
+         lastFileTableIndex = 0;
+     }
+ 
      /*******************************
       * Configure how display is done
       * Params:
*************** private size_t fileTableIndex(uint index
*** 282,290 ****
      // To speed up linear find, we cache the last hit and compare that first,
      // since usually we stay in the same file for some time when resolving source locations.
      // If it's a different file now, either scan forwards / backwards
!     __gshared size_t lastI = 0; // index of last found hit
! 
!     size_t i = lastI;
      if (index >= locFileTable[i].startIndex)
      {
          while (i + 1 < locFileTable.length && index >= locFileTable[i+1].startIndex)
--- 291,297 ----
      // To speed up linear find, we cache the last hit and compare that first,
      // since usually we stay in the same file for some time when resolving source locations.
      // If it's a different file now, either scan forwards / backwards
!     size_t i = lastFileTableIndex;
      if (index >= locFileTable[i].startIndex)
      {
          while (i + 1 < locFileTable.length && index >= locFileTable[i+1].startIndex)
*************** private size_t fileTableIndex(uint index
*** 296,302 ****
              i--;
      }
  
!     lastI = i;
      return i;
  }
  
--- 303,309 ----
              i--;
      }
  
!     lastFileTableIndex = i;
      return i;
  }
  
*************** struct BaseLoc
*** 364,369 ****
--- 371,381 ----
      uint[] lines; /// For each line, the file offset at which it starts. At index 0 there's always a 0 entry.
      BaseLoc[] substitutions; /// Substitutions from #line / #file directives
  
+     /// Cache for the last line lookup
+     private size_t lastLineIndex = 0;
+     /// Cache for the last substitution lookup
+     private size_t lastSubstIndex = 0;
+ 
      /// Register that a new line starts at `offset` bytes from the start of the source file
      void newLine(uint offset)
      {
*************** struct BaseLoc
*** 419,426 ****
  
      private size_t getSubstitutionIndex(uint offset) @nogc
      {
          size_t lo = 0;
!         size_t hi = substitutions.length + -1;
          size_t mid = 0;
          while (lo <= hi)
          {
--- 431,491 ----
  
      private size_t getSubstitutionIndex(uint offset) @nogc
      {
+         if (substitutions.length <= 1)
+             return 0;
+ 
+         // Check if the offset falls within the current cached substitution or the next one
+         if (lastSubstIndex < substitutions.length - 1)
+         {
+             // For the current substitution's range
+             if (substitutions[lastSubstIndex].startIndex <= offset &&
+                 (lastSubstIndex == substitutions.length - 1 ||
+                  substitutions[lastSubstIndex + 1].startIndex > offset))
+                 return lastSubstIndex;
+ 
+             // For the next substitution's range
+             if (lastSubstIndex + 1 < substitutions.length - 1 &&
+                 substitutions[lastSubstIndex + 1].startIndex <= offset &&
+                 substitutions[lastSubstIndex + 2].startIndex > offset)
+             {
+                 lastSubstIndex++;
+                 return lastSubstIndex;
+             }
+ 
+             // For the previous substitution's range
+             if (lastSubstIndex > 0 &&
+                 substitutions[lastSubstIndex - 1].startIndex <= offset &&
+                 substitutions[lastSubstIndex].startIndex > offset)
+             {
+                 lastSubstIndex--;
+                 return lastSubstIndex;
+             }
+         }
+         else if (lastSubstIndex == substitutions.length - 1 &&
+                  substitutions[lastSubstIndex].startIndex <= offset)
+         {
+             // Last substitution case
+             return lastSubstIndex;
+         }
+ 
+         // Fall back to binary search, but start near
          size_t lo = 0;
!         size_t hi = substitutions.length - 1;
! 
!         // Adjust the range based on the offset relative to lastSubstIndex
!         if (offset < substitutions[lastSubstIndex].startIndex)
!         {
!             // Search backward
!             lo = 0;
!             hi = lastSubstIndex;
!         }
!         else
!         {
!             // Search forward
!             lo = lastSubstIndex;
!             hi = substitutions.length - 1;
!         }
! 
          size_t mid = 0;
          while (lo <= hi)
          {
*************** struct BaseLoc
*** 428,434 ****
--- 493,502 ----
              if (substitutions[mid].startIndex <= offset)
              {
                  if (mid == substitutions.length - 1 || substitutions[mid + 1].startIndex > offset)
+                 {
+                     lastSubstIndex = mid; // Update cache
                      return mid;
+                 }
  
                  lo = mid + 1;
              }
*************** struct BaseLoc
*** 441,450 ****
      }
  
      /// Binary search the index in `this.lines` corresponding to `offset`
      private size_t getLineIndex(uint offset) @nogc
      {
          size_t lo = 0;
!         size_t hi = lines.length + -1;
          size_t mid = 0;
          while (lo <= hi)
          {
--- 509,559 ----
      }
  
      /// Binary search the index in `this.lines` corresponding to `offset`
+     /// lastLineIndex cache to avoid full binary search when possible
      private size_t getLineIndex(uint offset) @nogc
      {
+         if (lines.length <= 1)
+             return 0;
+ 
+         if (lastLineIndex < lines.length - 1)
+         {
+             if (lines[lastLineIndex] <= offset && offset < lines[lastLineIndex + 1])
+                 return lastLineIndex;
+ 
+             if (lastLineIndex + 1 < lines.length - 1 &&
+                 lines[lastLineIndex + 1] <= offset && offset < lines[lastLineIndex + 2])
+             {
+                 lastLineIndex++;
+                 return lastLineIndex;
+             }
+ 
+             if (lastLineIndex > 0 &&
+                 lines[lastLineIndex - 1] <= offset && offset < lines[lastLineIndex])
+             {
+                 lastLineIndex--;
+                 return lastLineIndex;
+             }
+         }
+         else if (lastLineIndex == lines.length - 1 && lines[lastLineIndex] <= offset)
+         {
+             return lastLineIndex;
+         }
+ 
+         // Fall back to binary search
          size_t lo = 0;
!         size_t hi = lines.length - 1;
! 
!         if (offset < lines[lastLineIndex])
!         {
!             lo = 0;
!             hi = lastLineIndex;
!         }
!         else
!         {
!             lo = lastLineIndex;
!             hi = lines.length - 1;
!         }
! 
          size_t mid = 0;
          while (lo <= hi)
          {
*************** struct BaseLoc
*** 452,458 ****
--- 561,570 ----
              if (lines[mid] <= offset)
              {
                  if (mid == lines.length - 1 || lines[mid + 1] > offset)
+                 {
+                     lastLineIndex = mid; // Update cache
                      return mid;
+                 }
  
                  lo = mid + 1;
              }
*************** private __gshared uint locIndex = 1;
*** 470,472 ****
--- 582,587 ----
  
  // Global mapping of Loc indices to source file offset/line/column, see `BaseLoc`
  private __gshared BaseLoc*[] locFileTable;
+ 
+ // Index of last found hit in locFileTable, for optimization
+ private __gshared size_t lastFileTableIndex = 0;
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/mangle/cpp.d gcc-16-20260201/gcc/d/dmd/mangle/cpp.d
*** gcc-16-20260125/gcc/d/dmd/mangle/cpp.d	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/mangle/cpp.d	Sun Feb  1 22:32:07 2026
*************** import dmd.astenums;
*** 26,32 ****
  import dmd.attrib;
  import dmd.declaration;
  import dmd.dsymbol;
! import dmd.dsymbolsem : isGNUABITag;
  import dmd.dtemplate;
  import dmd.errors;
  import dmd.expression;
--- 26,32 ----
  import dmd.attrib;
  import dmd.declaration;
  import dmd.dsymbol;
! import dmd.dsymbolsem : isGNUABITag, toAlias;
  import dmd.dtemplate;
  import dmd.errors;
  import dmd.expression;
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/mangle/package.d gcc-16-20260201/gcc/d/dmd/mangle/package.d
*** gcc-16-20260125/gcc/d/dmd/mangle/package.d	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/mangle/package.d	Sun Feb  1 22:32:07 2026
*************** import dmd.declaration;
*** 145,150 ****
--- 145,151 ----
  import dmd.dinterpret;
  import dmd.dmodule;
  import dmd.dsymbol;
+ import dmd.dsymbolsem : toAlias;
  import dmd.dtemplate;
  import dmd.errors;
  import dmd.expression;
*************** void mangleType(Type t, ubyte modMask, r
*** 318,323 ****
--- 319,332 ----
  
  
  /*************************************************************
+  * Mangle type of function. writing it to `buf`
+  * Params:
+  *	t = function type
+  *	ta = consult original function type for attributes
+  *	modMask = type modifiers
+  *	tret = function return type
+  *	buf = sink for mangling characters
+  *	backref = back reference
   */
  void mangleFuncType(TypeFunction t, TypeFunction ta, ubyte modMask, Type tret, ref OutBuffer buf, ref Backref backref)
  {
*************** void mangleFuncType(TypeFunction t, Type
*** 401,407 ****
      foreach (idx, param; t.parameterList)
          mangleParameter(param, buf, backref);
      //if (buf.data[buf.length - 1] == '@') assert(0);
!     buf.writeByte('Z' - t.parameterList.varargs); // mark end of arg list
      if (tret !is null)
          mangleType(tret, 0, buf, backref);
      t.inuse--;
--- 410,416 ----
      foreach (idx, param; t.parameterList)
          mangleParameter(param, buf, backref);
      //if (buf.data[buf.length - 1] == '@') assert(0);
!     buf.writeByte(cast(ubyte)('Z' - t.parameterList.varargs)); // mark end of arg list
      if (tret !is null)
          mangleType(tret, 0, buf, backref);
      t.inuse--;
*************** void writeBackRef(ref OutBuffer buf, siz
*** 1205,1215 ****
      while (mul >= base)
      {
          auto dig = cast(ubyte)(pos / mul);
!         buf.writeByte('A' + dig);
          pos -= dig * mul;
          mul /= base;
      }
!     buf.writeByte('a' + cast(ubyte)pos);
  }
  
  
--- 1214,1224 ----
      while (mul >= base)
      {
          auto dig = cast(ubyte)(pos / mul);
!         buf.writeByte(cast(char)('A' + dig));
          pos -= dig * mul;
          mul /= base;
      }
!     buf.writeByte(cast(char)('a' + pos));
  }
  
  
*************** extern (D) const(char)[] externallyMangl
*** 1339,1345 ****
      const par = d.toParent(); //toParent() skips over mixin templates
      if (!par || par.isModule() || linkage == LINK.cpp ||
          (linkage == LINK.c && d.isCsymbol() &&
!          (d.isFuncDeclaration() ||
            (d.isVarDeclaration() && d.isDataseg() && d.storage_class & STC.extern_))))
      {
          if (linkage != LINK.d && d.localNum)
--- 1348,1358 ----
      const par = d.toParent(); //toParent() skips over mixin templates
      if (!par || par.isModule() || linkage == LINK.cpp ||
          (linkage == LINK.c && d.isCsymbol() &&
!          // https://github.com/dlang/dmd/issues/21241
!          // Static check is so C static functions get a unique mangle so the linker
!          // won't merge them if compiling all-at-once.
!          // Non-static functions can use their ident as their mangle.
!          ((d.isFuncDeclaration() && !d.isStatic()) ||
            (d.isVarDeclaration() && d.isDataseg() && d.storage_class & STC.extern_))))
      {
          if (linkage != LINK.d && d.localNum)
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/module.h gcc-16-20260201/gcc/d/dmd/module.h
*** gcc-16-20260125/gcc/d/dmd/module.h	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/module.h	Sun Feb  1 22:32:07 2026
***************
*** 10,15 ****
--- 10,17 ----
  
  #pragma once
  
+ #include <stdint.h>
+ 
  #include "dsymbol.h"
  
  struct ModuleDeclaration;
*************** enum PKG
*** 28,39 ****
      PKGpackage  // already determined that's an actual package
  };
  
! enum class Edition : unsigned char
  {
!     none = 0u,
!     legacy = 1u,
!     v2024 = 2u,
!     latest = 2u,
  };
  
  class Package : public ScopeDsymbol
--- 30,40 ----
      PKGpackage  // already determined that's an actual package
  };
  
! enum class Edition : uint16_t
  {
!     v2023 = 2023,
!     v2024,
!     v2025,
  };
  
  class Package : public ScopeDsymbol
*************** public:
*** 98,103 ****
--- 99,106 ----
      SearchOptFlags searchCacheFlags;       // cached flags
      d_bool insearch;
  
+     d_bool isExplicitlyOutOfBinary; // Is this module known to be out of binary, and must be DllImport'd?
+ 
      // module from command line we're imported from,
      // i.e. a module that will be taken all the
      // way to an object file
*************** public:
*** 120,126 ****
      size_t namelen;             // length of module name in characters
  
      static Module* create(const char *arg, Identifier *ident, int doDocComment, int doHdrGen);
-     static const char *find(const char *filename);
      static Module *load(Loc loc, Identifiers *packages, Identifier *ident);
  
      const char *kind() const override;
--- 123,128 ----
*************** public:
*** 140,158 ****
      bool isCoreModule(Identifier *ident);
  
      // Back end
- 
-     int doppelganger;           // sub-module
      Symbol *cov;                // private uint[] __coverage;
      DArray<unsigned> covb;      // bit array of valid code line numbers
  
-     Symbol *sictor;             // module order independent constructor
-     Symbol *sctor;              // module constructor
-     Symbol *sdtor;              // module destructor
-     Symbol *ssharedctor;        // module shared constructor
-     Symbol *sshareddtor;        // module shared destructor
-     Symbol *stest;              // module unit test
- 
      Symbol *sfilename;          // symbol for filename
  
      void *ctfe_cov;             // stores coverage information from ctfe
  
--- 142,152 ----
      bool isCoreModule(Identifier *ident);
  
      // Back end
      Symbol *cov;                // private uint[] __coverage;
      DArray<unsigned> covb;      // bit array of valid code line numbers
  
      Symbol *sfilename;          // symbol for filename
+     bool hasCDtor;
  
      void *ctfe_cov;             // stores coverage information from ctfe
  
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/mtype.d gcc-16-20260201/gcc/d/dmd/mtype.d
*** gcc-16-20260125/gcc/d/dmd/mtype.d	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/mtype.d	Sun Feb  1 22:32:07 2026
*************** import dmd.dtemplate;
*** 30,37 ****
  import dmd.enumsem;
  import dmd.errors;
  import dmd.expression;
- import dmd.dsymbolsem : determineSize;
- import dmd.globals;
  import dmd.hdrgen;
  import dmd.id;
  import dmd.identifier;
--- 30,35 ----
*************** import dmd.typesem;
*** 47,55 ****
  import dmd.visitor;
  
  enum LOGDOTEXP = 0;         // log ::dotExp()
- enum LOGDEFAULTINIT = 0;    // log ::defaultInit()
  
! enum SIZE_INVALID = (~cast(uinteger_t)0);   // error return from size() functions
  
  static if (__VERSION__ < 2095)
  {
--- 45,52 ----
  import dmd.visitor;
  
  enum LOGDOTEXP = 0;         // log ::dotExp()
  
! enum SIZE_INVALID = (~cast(ulong)0);   // error return from size() functions
  
  static if (__VERSION__ < 2095)
  {
*************** extern (C++) abstract class Type : ASTNo
*** 689,707 ****
      }
  
      /**************************
-      * When T is mutable,
-      * Given:
-      *      T a, b;
-      * Can we bitwise assign:
-      *      a = b;
-      * ?
-      */
-     bool isAssignable()
-     {
-         return true;
-     }
- 
-     /**************************
       * Returns true if T can be converted to boolean value.
       */
      bool isBoolean()
--- 686,691 ----
*************** extern (C++) abstract class Type : ASTNo
*** 1324,1342 ****
      }
  
      /***************************************
-      * Use when we prefer the default initializer to be a literal,
-      * rather than a global immutable variable.
-      */
-     Expression defaultInitLiteral(Loc loc)
-     {
-         static if (LOGDEFAULTINIT)
-         {
-             printf("Type::defaultInitLiteral() '%s'\n", toChars());
-         }
-         return defaultInit(this, loc);
-     }
- 
-     /***************************************
       * Return !=0 if the type or any of its subtypes is wild.
       */
      int hasWild() const
--- 1308,1313 ----
*************** extern (C++) abstract class Type : ASTNo
*** 1399,1407 ****
       * Return the mask that an integral type will
       * fit into.
       */
!     extern (D) final uinteger_t sizemask()
      {
!         uinteger_t m;
          switch (toBasetype().ty)
          {
          case Tbool:
--- 1370,1378 ----
       * Return the mask that an integral type will
       * fit into.
       */
!     extern (D) final ulong sizemask()
      {
!         ulong m;
          switch (toBasetype().ty)
          {
          case Tbool:
*************** extern (C++) final class TypeError : Typ
*** 1572,1582 ****
          return this;
      }
  
-     override Expression defaultInitLiteral(Loc loc)
-     {
-         return ErrorExp.get();
-     }
- 
      override void accept(Visitor v)
      {
          v.visit(this);
--- 1543,1548 ----
*************** extern (C++) final class TypeVector : Ty
*** 2118,2134 ****
          return false;
      }
  
-     override Expression defaultInitLiteral(Loc loc)
-     {
-         //printf("TypeVector::defaultInitLiteral()\n");
-         assert(basetype.ty == Tsarray);
-         Expression e = basetype.defaultInitLiteral(loc);
-         auto ve = new VectorExp(loc, e, this);
-         ve.type = this;
-         ve.dim = cast(int)(basetype.size(loc) / elementType().size(loc));
-         return ve;
-     }
- 
      TypeBasic elementType()
      {
          assert(basetype.ty == Tsarray);
--- 2084,2089 ----
*************** extern (C++) final class TypeSArray : Ty
*** 2219,2243 ****
          return next.alignment();
      }
  
-     override Expression defaultInitLiteral(Loc loc)
-     {
-         static if (LOGDEFAULTINIT)
-         {
-             printf("TypeSArray::defaultInitLiteral() '%s'\n", toChars());
-         }
-         size_t d = cast(size_t)dim.toInteger();
-         Expression elementinit;
-         if (next.ty == Tvoid)
-             elementinit = tuns8.defaultInitLiteral(loc);
-         else
-             elementinit = next.defaultInitLiteral(loc);
-         auto elements = new Expressions(d);
-         foreach (ref e; *elements)
-             e = null;
-         auto ae = new ArrayLiteralExp(Loc.initial, this, elementinit, elements);
-         return ae;
-     }
- 
      override bool hasUnsafeBitpatterns()
      {
          return next.hasUnsafeBitpatterns();
--- 2174,2179 ----
*************** extern (C++) final class TypeFunction :
*** 2603,2712 ****
          return linkage == LINK.d && parameterList.varargs == VarArg.variadic;
      }
  
-     /*********************************
-      * Append error message to buf.
-      * Input:
-      *  buf = message sink
-      *  format = printf format
-      */
-     extern(C) static void getMatchError(ref OutBuffer buf, const(char)* format, ...)
-     {
-         if (global.gag && !global.params.v.showGaggedErrors)
-             return;
-         va_list ap;
-         va_start(ap, format);
-         buf.vprintf(format, ap);
-         va_end(ap);
-     }
- 
-     /********************************
-      * Convert an `argumentList`, which may contain named arguments, into
-      * a list of arguments in the order of the parameter list.
-      *
-      * Params:
-      *      argumentList = array of function arguments
-      *      buf = if not null, append error message to it
-      * Returns: re-ordered argument list, or `null` on error
-      */
-     extern(D) Expressions* resolveNamedArgs(ArgumentList argumentList, OutBuffer* buf)
-     {
-         Expression[] args = argumentList.arguments ? (*argumentList.arguments)[] : null;
-         Identifier[] names = argumentList.names ? (*argumentList.names)[] : null;
-         const nParams = parameterList.length(); // cached because O(n)
-         auto newArgs = new Expressions(nParams);
-         newArgs.zero();
-         size_t ci = 0;
-         bool hasNamedArgs = false;
-         const bool isVariadic = parameterList.varargs != VarArg.none;
-         foreach (i, arg; args)
-         {
-             if (!arg)
-             {
-                 ci++;
-                 continue;
-             }
-             auto name = i < names.length ? names[i] : null;
-             if (name)
-             {
-                 hasNamedArgs = true;
-                 const pi = findParameterIndex(name);
-                 if (pi == -1)
-                 {
-                     if (buf)
-                         getMatchError(*buf, "no parameter named `%s`", name.toChars());
-                     return null;
-                 }
-                 ci = pi;
-             }
-             if (ci >= newArgs.length)
-             {
-                 if (!isVariadic)
-                 {
-                     // Without named args, let the caller diagnose argument overflow
-                     if (hasNamedArgs && buf)
-                         getMatchError(*buf, "argument `%s` goes past end of parameter list", arg.toChars());
-                     return null;
-                 }
-                 while (ci >= newArgs.length)
-                     newArgs.push(null);
-             }
- 
-             if ((*newArgs)[ci])
-             {
-                 if (buf)
-                     getMatchError(*buf, "parameter `%s` assigned twice", parameterList[ci].toChars());
-                 return null;
-             }
-             (*newArgs)[ci++] = arg;
-         }
-         foreach (i, arg; (*newArgs)[])
-         {
-             if (arg || parameterList[i].defaultArg)
-                 continue;
- 
-             if (isVariadic && i + 1 == newArgs.length)
-                 continue;
- 
-             // dtemplate sets `defaultArg=null` to avoid semantic on default arguments,
-             // don't complain about missing arguments in that case
-             if (this.incomplete)
-                 continue;
- 
-             if (buf)
-                 getMatchError(*buf, "missing argument for parameter #%d: `%s`",
-                     i + 1, parameterToChars(parameterList[i], this, false));
-             return null;
-         }
-         // strip trailing nulls from default arguments
-         size_t e = newArgs.length;
-         while (e > 0 && (*newArgs)[e - 1] is null)
-         {
-             --e;
-         }
-         newArgs.setDim(e);
-         return newArgs;
-     }
- 
      /// Returns: `true` the function is `isInOutQual` or `isInOutParam` ,`false` otherwise.
      bool iswild() const pure nothrow @safe @nogc
      {
--- 2539,2544 ----
*************** extern (C++) final class TypeFunction :
*** 2736,2758 ****
      {
          v.visit(this);
      }
- 
-     /**
-      * Look for the index of parameter `ident` in the parameter list
-      *
-      * Params:
-      *   ident = identifier of parameter to search for
-      * Returns: index of parameter with name `ident` or -1 if not found
-      */
-     private extern(D) ptrdiff_t findParameterIndex(Identifier ident)
-     {
-         foreach (i, p; this.parameterList)
-         {
-             if (p.ident == ident)
-                 return i;
-         }
-         return -1;
-     }
  }
  
  /***********************************************************
--- 2568,2573 ----
*************** extern (C++) final class TypeStruct : Ty
*** 3129,3227 ****
          return sym.alignment;
      }
  
-     /***************************************
-      * Use when we prefer the default initializer to be a literal,
-      * rather than a global immutable variable.
-      */
-     override Expression defaultInitLiteral(Loc loc)
-     {
-         static if (LOGDEFAULTINIT)
-         {
-             printf("TypeStruct::defaultInitLiteral() '%s'\n", toChars());
-         }
-         sym.size(loc);
-         if (sym.sizeok != Sizeok.done)
-             return ErrorExp.get();
- 
-         auto structelems = new Expressions(sym.nonHiddenFields());
-         uint offset = 0;
-         foreach (j; 0 .. structelems.length)
-         {
-             VarDeclaration vd = sym.fields[j];
-             Expression e;
-             if (vd.inuse)
-             {
-                 error(loc, "circular reference to `%s`", vd.toPrettyChars());
-                 return ErrorExp.get();
-             }
-             if (vd.offset < offset || vd.type.size() == 0)
-                 e = null;
-             else if (vd._init)
-             {
-                 if (vd._init.isVoidInitializer())
-                     e = null;
-                 else
-                     e = vd.getConstInitializer(false);
-             }
-             else
-                 e = vd.type.defaultInitLiteral(loc);
-             if (e && e.op == EXP.error)
-                 return e;
-             if (e)
-                 offset = vd.offset + cast(uint)vd.type.size();
-             (*structelems)[j] = e;
-         }
-         auto structinit = new StructLiteralExp(loc, sym, structelems);
- 
-         /* Copy from the initializer symbol for larger symbols,
-          * otherwise the literals expressed as code get excessively large.
-          */
-         if (size(this, loc) > target.ptrsize * 4 && !needsNested())
-             structinit.useStaticInit = true;
- 
-         structinit.type = this;
-         return structinit;
-     }
- 
-     override bool isAssignable()
-     {
-         bool assignable = true;
-         uint offset = ~0; // dead-store initialize to prevent spurious warning
- 
-         sym.determineSize(sym.loc);
- 
-         /* If any of the fields are const or immutable,
-          * then one cannot assign this struct.
-          */
-         for (size_t i = 0; i < sym.fields.length; i++)
-         {
-             VarDeclaration v = sym.fields[i];
-             //printf("%s [%d] v = (%s) %s, v.offset = %d, v.parent = %s\n", sym.toChars(), i, v.kind(), v.toChars(), v.offset, v.parent.kind());
-             if (i == 0)
-             {
-             }
-             else if (v.offset == offset)
-             {
-                 /* If any fields of anonymous union are assignable,
-                  * then regard union as assignable.
-                  * This is to support unsafe things like Rebindable templates.
-                  */
-                 if (assignable)
-                     continue;
-             }
-             else
-             {
-                 if (!assignable)
-                     return false;
-             }
-             assignable = v.type.isMutable() && v.type.isAssignable();
-             offset = v.offset;
-             //printf(" -> assignable = %d\n", assignable);
-         }
- 
-         return assignable;
-     }
- 
      override bool isBoolean()
      {
          return false;
--- 2944,2949 ----
*************** extern (C++) final class TypeEnum : Type
*** 3383,3393 ****
          return memType().isString();
      }
  
-     override bool isAssignable()
-     {
-         return memType().isAssignable();
-     }
- 
      override bool needsDestruction()
      {
          return memType().needsDestruction();
--- 3105,3110 ----
*************** extern (C++) final class TypeTuple : Typ
*** 3576,3591 ****
      extern (D) this(Type t1)
      {
          super(Ttuple);
!         arguments = new Parameters();
!         arguments.push(new Parameter(Loc.initial, STC.none, t1, null, null, null));
      }
  
      extern (D) this(Type t1, Type t2)
      {
          super(Ttuple);
!         arguments = new Parameters();
!         arguments.push(new Parameter(Loc.initial, STC.none, t1, null, null, null));
!         arguments.push(new Parameter(Loc.initial, STC.none, t2, null, null, null));
      }
  
      static TypeTuple create() @safe
--- 3293,3306 ----
      extern (D) this(Type t1)
      {
          super(Ttuple);
!         arguments = new Parameters(new Parameter(Loc.initial, STC.none, t1, null, null, null));
      }
  
      extern (D) this(Type t1, Type t2)
      {
          super(Ttuple);
!         arguments = new Parameters(new Parameter(Loc.initial, STC.none, t1, null, null, null),
!                                    new Parameter(Loc.initial, STC.none, t2, null, null, null));
      }
  
      static TypeTuple create() @safe
*************** extern (C++) final class TypeTag : Type
*** 3761,3766 ****
--- 3476,3482 ----
      Loc loc;                /// location of declaration
      TOK tok;                /// TOK.struct_, TOK.union_, TOK.enum_
      structalign_t packalign; /// alignment of struct/union fields
+     Expressions* alignExps; /// alignment of struct itself
      Identifier id;          /// tag name identifier
      Type base;              /// base type for enums otherwise null
      Dsymbols* members;      /// members of struct, null if none
*************** extern (C++) final class TypeTag : Type
*** 3770,3776 ****
                              ///   struct S { int a; } s1, *s2;
      MOD mod;                /// modifiers to apply after type is resolved (only MODFlags.const_ at the moment)
  
!     extern (D) this(Loc loc, TOK tok, Identifier id, structalign_t packalign, Type base, Dsymbols* members) @safe
      {
          //printf("TypeTag ctor %s %p\n", id ? id.toChars() : "null".ptr, this);
          super(Ttag);
--- 3486,3492 ----
                              ///   struct S { int a; } s1, *s2;
      MOD mod;                /// modifiers to apply after type is resolved (only MODFlags.const_ at the moment)
  
!     extern (D) this(Loc loc, TOK tok, Identifier id, structalign_t packalign, Expressions* alignExps, Type base, Dsymbols* members) @safe
      {
          //printf("TypeTag ctor %s %p\n", id ? id.toChars() : "null".ptr, this);
          super(Ttag);
*************** extern (C++) final class TypeTag : Type
*** 3778,3783 ****
--- 3494,3500 ----
          this.tok = tok;
          this.id = id;
          this.packalign = packalign;
+         this.alignExps = alignExps;
          this.base = base;
          this.members = members;
          this.mod = 0;
*************** void attributesApply(const TypeFunction
*** 4292,4303 ****
          dg("@nogc");
      if (tf.isProperty)
          dg("@property");
      if (tf.isRef)
!         dg("ref");
      if (tf.isReturn && !tf.isReturnInferred)
!         dg("return");
      if (tf.isScopeQual && !tf.isScopeInferred)
!         dg("scope");
      if (tf.isLive)
          dg("@live");
  
--- 4009,4040 ----
          dg("@nogc");
      if (tf.isProperty)
          dg("@property");
+ 
+     /* The following is more or less like dmd.hdrgen.stcToBuffer(), in the future
+      * it should be merged. The idea is consistent ordering
+      */
+     STC stc;
      if (tf.isRef)
!         stc |= STC.ref_;
      if (tf.isReturn && !tf.isReturnInferred)
!         stc |= STC.return_;
      if (tf.isScopeQual && !tf.isScopeInferred)
!         stc |= STC.scope_;
!     if (tf.isReturnScope)
!         stc |= STC.returnScope;
!     final switch (buildScopeRef(stc))
!     {
!         case ScopeRef.None:                                                      break;
!         case ScopeRef.Scope:            dg("scope");                             break;
!         case ScopeRef.Return:           dg("return");                            break;
!         case ScopeRef.ReturnScope:      dg("return"); dg("scope");               break;
!         case ScopeRef.ReturnRef:        dg("return"); dg("ref");                 break;
!         case ScopeRef.Ref:              dg("ref");                               break;
!         case ScopeRef.RefScope:         dg("ref");    dg("scope");               break;
!         case ScopeRef.ReturnRef_Scope:  dg("return"); dg("ref");    dg("scope"); break;
!         case ScopeRef.Ref_ReturnScope:  dg("ref");    dg("return"); dg("scope"); break;
!     }
! 
      if (tf.isLive)
          dg("@live");
  
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/mtype.h gcc-16-20260201/gcc/d/dmd/mtype.h
*** gcc-16-20260125/gcc/d/dmd/mtype.h	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/mtype.h	Sun Feb  1 22:32:07 2026
*************** namespace dmd
*** 44,49 ****
--- 44,50 ----
  {
      Type *typeSemantic(Type *t, Loc loc, Scope *sc);
      Type *merge(Type *type);
+     Expression *defaultInitLiteral(Type *t, Loc loc);
  }
  
  enum class TY : uint8_t
*************** public:
*** 238,244 ****
      virtual bool isUnsigned();
      virtual bool isScopeClass();
      virtual bool isString();
-     virtual bool isAssignable();
      virtual bool isBoolean();
      bool isConst() const       { return (mod & MODconst) != 0; }
      bool isImmutable() const   { return (mod & MODimmutable) != 0; }
--- 239,244 ----
*************** public:
*** 265,271 ****
  
      virtual ClassDeclaration *isClassHandle();
      virtual structalign_t alignment();
-     virtual Expression *defaultInitLiteral(Loc loc);
      virtual int hasWild() const;
      virtual bool hasVoidInitPointers();
      virtual bool hasUnsafeBitpatterns();
--- 265,270 ----
*************** public:
*** 315,321 ****
      const char *kind() override;
      TypeError *syntaxCopy() override;
  
-     Expression *defaultInitLiteral(Loc loc) override;
      void accept(Visitor *v) override { v->visit(this); }
  };
  
--- 314,319 ----
*************** public:
*** 376,382 ****
      bool isScalar() override;
      bool isUnsigned() override;
      bool isBoolean() override;
-     Expression *defaultInitLiteral(Loc loc) override;
      TypeBasic *elementType();
  
      void accept(Visitor *v) override { v->visit(this); }
--- 374,379 ----
*************** public:
*** 400,406 ****
      unsigned alignsize() override;
      bool isString() override;
      structalign_t alignment() override;
-     Expression *defaultInitLiteral(Loc loc) override;
      bool hasUnsafeBitpatterns() override;
      bool hasVoidInitPointers() override;
      bool hasInvariant() override;
--- 397,402 ----
*************** public:
*** 554,559 ****
--- 550,557 ----
      void isReturn(bool v);
      bool isReturnScope() const;
      void isReturnScope(bool v);
+     bool isRvalue() const;
+     void isRvalue(bool v);
      bool isScopeQual() const;
      void isScopeQual(bool v);
      bool isReturnInferred() const;
*************** public:
*** 689,696 ****
      unsigned alignsize() override;
      TypeStruct *syntaxCopy() override;
      structalign_t alignment() override;
-     Expression *defaultInitLiteral(Loc loc) override;
-     bool isAssignable() override;
      bool isBoolean() override;
      bool needsDestruction() override;
      bool needsCopyOrPostblit() override;
--- 687,692 ----
*************** public:
*** 721,727 ****
      bool isUnsigned() override;
      bool isBoolean() override;
      bool isString() override;
-     bool isAssignable() override;
      bool needsDestruction() override;
      bool needsCopyOrPostblit() override;
      bool needsNested() override;
--- 717,722 ----
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/mustuse.d gcc-16-20260201/gcc/d/dmd/mustuse.d
*** gcc-16-20260125/gcc/d/dmd/mustuse.d	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/mustuse.d	Sun Feb  1 22:32:07 2026
*************** import dmd.dscope;
*** 14,20 ****
  import dmd.dsymbol;
  import dmd.errors;
  import dmd.expression;
- import dmd.globals;
  import dmd.identifier;
  import dmd.location;
  
--- 14,19 ----
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/nogc.d gcc-16-20260201/gcc/d/dmd/nogc.d
*** gcc-16-20260125/gcc/d/dmd/nogc.d	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/nogc.d	Sun Feb  1 22:32:07 2026
*************** module dmd.nogc;
*** 16,32 ****
  import core.stdc.stdio;
  
  import dmd.aggregate;
  import dmd.astenums;
- import dmd.declaration;
  import dmd.common.outbuffer;
  import dmd.dmodule;
  import dmd.dscope;
- import dmd.dtemplate : isDsymbol;
  import dmd.dsymbol : PASS;
  import dmd.errors;
  import dmd.expression;
  import dmd.func;
  import dmd.globals;
  import dmd.init;
  import dmd.location;
  import dmd.mtype;
--- 16,37 ----
  import core.stdc.stdio;
  
  import dmd.aggregate;
+ import dmd.arraytypes;
  import dmd.astenums;
  import dmd.common.outbuffer;
+ import dmd.declaration;
  import dmd.dmodule;
  import dmd.dscope;
  import dmd.dsymbol : PASS;
+ import dmd.dtemplate : isDsymbol;
  import dmd.errors;
+ import dmd.escape;
  import dmd.expression;
+ import dmd.expressionsem;
  import dmd.func;
  import dmd.globals;
+ import dmd.id;
+ import dmd.identifier;
  import dmd.init;
  import dmd.location;
  import dmd.mtype;
*************** import dmd.rootobject : RootObject, DYNC
*** 34,39 ****
--- 39,45 ----
  import dmd.semantic2;
  import dmd.semantic3;
  import dmd.tokens;
+ import dmd.typesem : unqualify;
  import dmd.visitor;
  import dmd.visitor.postorder;
  
*************** extern (C++) final class NOGCVisitor : S
*** 45,57 ****
      alias visit = typeof(super).visit;
  public:
      FuncDeclaration f;
      bool checkOnly;     // don't print errors
      bool err;
      bool nogcExceptions; // -preview=dip1008 enabled
  
!     extern (D) this(FuncDeclaration f) scope @safe
      {
          this.f = f;
      }
  
      void doCond(Expression exp)
--- 51,65 ----
      alias visit = typeof(super).visit;
  public:
      FuncDeclaration f;
+     Scope* sc;
      bool checkOnly;     // don't print errors
      bool err;
      bool nogcExceptions; // -preview=dip1008 enabled
  
!     extern (D) this(FuncDeclaration f, Scope* sc) scope @safe
      {
          this.f = f;
+         this.sc = sc;
      }
  
      void doCond(Expression exp)
*************** public:
*** 86,91 ****
--- 94,101 ----
       */
      private bool setGC(Expression e, const(char)* msg)
      {
+         if (sc.debug_)
+             return false;
          if (checkOnly)
          {
              err = true;
*************** public:
*** 119,128 ****
  
      override void visit(ArrayLiteralExp e)
      {
!         if (e.type.ty != Tarray || !e.elements || !e.elements.length || e.onstack)
              return;
          if (setGC(e, "this array literal"))
              return;
          f.printGCUsage(e.loc, "array literal may cause a GC allocation");
      }
  
--- 129,165 ----
  
      override void visit(ArrayLiteralExp e)
      {
!         const dim = e.elements ? e.elements.length : 0;
!         if (e.type.toBasetype().isTypeSArray() || dim == 0 || e.onstack)
              return;
          if (setGC(e, "this array literal"))
              return;
+ 
+         if (checkArrayLiteralEscape(*sc, e, false))
+         {
+             err = true;
+             return;
+         }
+ 
+         if (!global.params.useGC)
+         {
+             if (!checkOnly)
+             {
+                 version (IN_GCC)
+                     error(e.loc, "this array literal requires the GC and cannot be used with `???`");
+                 else
+                     error(e.loc, "this array literal requires the GC and cannot be used with `-betterC`");
+             }
+             err = true;
+             return;
+         }
+ 
+         if (!lowerArrayLiteral(e, sc))
+         {
+             err = true;
+             return;
+         }
+ 
          f.printGCUsage(e.loc, "array literal may cause a GC allocation");
      }
  
*************** public:
*** 208,216 ****
      }
  }
  
! Expression checkGC(Scope* sc, Expression e)
  {
!     if (sc.ctfeBlock)     // ignore GC in ctfe blocks
          return e;
  
      /* If betterC, allow GC to happen in non-CTFE code.
--- 245,254 ----
      }
  }
  
! Expression checkGC(Expression e, Scope* sc)
  {
!     // printf("%s checkGC(%s)\n", e.loc.toChars, e.toChars);
!     if (e.gcPassDone || sc.ctfeBlock || sc.ctfe || sc.intypeof == 1 || !sc.func)
          return e;
  
      /* If betterC, allow GC to happen in non-CTFE code.
*************** Expression checkGC(Scope* sc, Expression
*** 219,246 ****
       */
      const betterC = !global.params.useGC;
      FuncDeclaration f = sc.func;
!     if (e && e.op != EXP.error && f && sc.intypeof != 1 &&
!            (!sc.ctfe || betterC) &&
!            (f.type.ty == Tfunction &&
!             (cast(TypeFunction)f.type).isNogc || f.nogcInprocess || global.params.v.gc) &&
!            !sc.debug_)
!     {
!         scope NOGCVisitor gcv = new NOGCVisitor(f);
!         gcv.checkOnly = betterC;
!         gcv.nogcExceptions = sc.previews.dip1008;
!         walkPostorder(e, gcv);
!         if (gcv.err)
!         {
!             if (betterC)
!             {
!                 /* Allow ctfe to use the gc code, but don't let it into the runtime
!                  */
!                 f.skipCodegen = true;
!             }
!             else
!                 return ErrorExp.get();
!         }
!     }
      return e;
  }
  
--- 257,276 ----
       */
      const betterC = !global.params.useGC;
      FuncDeclaration f = sc.func;
!     scope NOGCVisitor gcv = new NOGCVisitor(f, sc);
!     gcv.checkOnly = betterC && (f.type.isTypeFunction().isNogc || f.nogcInprocess);
!     gcv.nogcExceptions = sc.previews.dip1008;
!     walkPostorder(e, gcv);
!     e.gcPassDone = true;
! 
!     if (!gcv.err)
!         return e;
! 
!     if (!betterC)
!         return ErrorExp.get();
! 
!     // Allow ctfe to use the gc code, but don't let it into the runtime
!     f.skipCodegen = true;
      return e;
  }
  
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/nspace.d gcc-16-20260201/gcc/d/dmd/nspace.d
*** gcc-16-20260125/gcc/d/dmd/nspace.d	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/nspace.d	Sun Feb  1 22:32:07 2026
*************** extern (C++) final class Nspace : ScopeD
*** 78,89 ****
          return ns;
      }
  
-     override bool hasPointers()
-     {
-         //printf("Nspace::hasPointers() %s\n", toChars());
-         return members.foreachDsymbol( (s) { return s.hasPointers(); } ) != 0;
-     }
- 
      override const(char)* kind() const
      {
          return "namespace";
--- 78,83 ----
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/nspace.h gcc-16-20260201/gcc/d/dmd/nspace.h
*** gcc-16-20260125/gcc/d/dmd/nspace.h	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/nspace.h	Sun Feb  1 22:32:07 2026
*************** class Nspace final : public ScopeDsymbol
*** 21,27 ****
    public:
      Expression *identExp;
      Nspace *syntaxCopy(Dsymbol *s) override;
-     bool hasPointers() override;
      const char *kind() const override;
      void accept(Visitor *v) override { v->visit(this); }
  };
--- 21,26 ----
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/ob.d gcc-16-20260201/gcc/d/dmd/ob.d
*** gcc-16-20260125/gcc/d/dmd/ob.d	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/ob.d	Sun Feb  1 22:32:07 2026
*************** import dmd.astenums;
*** 26,38 ****
  import dmd.declaration;
  import dmd.dscope;
  import dmd.dsymbol;
  import dmd.dtemplate;
  import dmd.errors;
  import dmd.escape;
  import dmd.expression;
- 
  import dmd.func;
- import dmd.globals;
  import dmd.hdrgen;
  import dmd.identifier;
  import dmd.init;
--- 26,37 ----
  import dmd.declaration;
  import dmd.dscope;
  import dmd.dsymbol;
+ import dmd.dsymbolsem : toAlias;
  import dmd.dtemplate;
  import dmd.errors;
  import dmd.escape;
  import dmd.expression;
  import dmd.func;
  import dmd.hdrgen;
  import dmd.identifier;
  import dmd.init;
*************** void oblive(FuncDeclaration funcdecl)
*** 79,84 ****
--- 78,85 ----
      checkObErrors(obstate);
  }
  
+ private:
+ 
  alias ObNodes = Array!(ObNode*);
  
  alias StmtState = dmd.stmtstate.StmtState!ObNode;
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/objc.d gcc-16-20260201/gcc/d/dmd/objc.d
*** gcc-16-20260125/gcc/d/dmd/objc.d	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/objc.d	Sun Feb  1 22:32:07 2026
*************** import dmd.errors;
*** 31,38 ****
  import dmd.expression;
  import dmd.expressionsem;
  import dmd.func;
- import dmd.globals;
- import dmd.gluelayer;
  import dmd.hdrgen;
  import dmd.id;
  import dmd.identifier;
--- 31,36 ----
*************** extern(C++) private final class Unsuppor
*** 433,439 ****
  {
      extern(D) final this()
      {
!         ObjcGlue.initialize();
      }
  
      override void setObjc(ClassDeclaration cd)
--- 431,437 ----
  {
      extern(D) final this()
      {
! 
      }
  
      override void setObjc(ClassDeclaration cd)
*************** extern(C++) private final class Supporte
*** 545,551 ****
      {
          VersionCondition.addPredefinedGlobalIdent("D_ObjectiveC");
  
-         ObjcGlue.initialize();
          ObjcSelector._init();
      }
  
--- 543,548 ----
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/opover.d gcc-16-20260201/gcc/d/dmd/opover.d
*** gcc-16-20260125/gcc/d/dmd/opover.d	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/opover.d	Sun Feb  1 22:32:07 2026
*************** import dmd.expression;
*** 30,36 ****
  import dmd.expressionsem;
  import dmd.func;
  import dmd.funcsem;
- import dmd.globals;
  import dmd.hdrgen;
  import dmd.id;
  import dmd.identifier;
--- 30,35 ----
*************** Objects* opToArg(Scope* sc, EXP op)
*** 129,136 ****
  {
      Expression e = new StringExp(Loc.initial, EXPtoString(stripAssignOp(op)));
      e = e.expressionSemantic(sc);
!     auto tiargs = new Objects();
!     tiargs.push(e);
      return tiargs;
  }
  
--- 128,134 ----
  {
      Expression e = new StringExp(Loc.initial, EXPtoString(stripAssignOp(op)));
      e = e.expressionSemantic(sc);
!     auto tiargs = new Objects(e);
      return tiargs;
  }
  
*************** Expression opOverloadArray(ArrayExp ae,
*** 340,346 ****
  
                  // Convert to IndexExp
                  if (ae.arguments.length == 1)
!                     return new IndexExp(ae.loc, ae.e1, (*ae.arguments)[0]).expressionSemantic(sc);
              }
              break;
          }
--- 338,348 ----
  
                  // Convert to IndexExp
                  if (ae.arguments.length == 1)
!                 {
!                     auto idxexp = new IndexExp(ae.loc, ae.e1, (*ae.arguments)[0]);
!                     idxexp.modifiable = ae.modifiable;
!                     return idxexp.expressionSemantic(sc);
!                 }
              }
              break;
          }
*************** Expression opOverloadCast(CastExp e, Sco
*** 439,446 ****
                  return build_overload(e.loc, sc, e.e1, null, fd);
              }
          }
!         auto tiargs = new Objects();
!         tiargs.push(e.to);
          return dotTemplateCall(e.e1, Id.opCast, tiargs).expressionSemantic(sc);
      }
      // Didn't find it. Forward to aliasthis
--- 441,447 ----
                  return build_overload(e.loc, sc, e.e1, null, fd);
              }
          }
!         auto tiargs = new Objects(e.to);
          return dotTemplateCall(e.e1, Id.opCast, tiargs).expressionSemantic(sc);
      }
      // Didn't find it. Forward to aliasthis
*************** Expression opOverloadBinary(BinExp e, Sc
*** 551,564 ****
  
      // Try opBinary and opBinaryRight
      Dsymbol s = search_function(ad1, Id.opBinary);
!     if (s && !s.isTemplateDeclaration())
      {
          error(e.e1.loc, "`%s.opBinary` isn't a template", e.e1.toChars());
          return ErrorExp.get();
      }
  
      Dsymbol s_r = search_function(ad2, Id.opBinaryRight);
!     if (s_r && !s_r.isTemplateDeclaration())
      {
          error(e.e2.loc, "`%s.opBinaryRight` isn't a template", e.e2.toChars());
          return ErrorExp.get();
--- 552,566 ----
  
      // Try opBinary and opBinaryRight
      Dsymbol s = search_function(ad1, Id.opBinary);
! 
!     if (s && !(s.isTemplateDeclaration() || s.isOverloadSet))
      {
          error(e.e1.loc, "`%s.opBinary` isn't a template", e.e1.toChars());
          return ErrorExp.get();
      }
  
      Dsymbol s_r = search_function(ad2, Id.opBinaryRight);
!     if (s_r && !(s_r.isTemplateDeclaration() || s_r.isOverloadSet()))
      {
          error(e.e2.loc, "`%s.opBinaryRight` isn't a template", e.e2.toChars());
          return ErrorExp.get();
*************** Expression opOverloadBinaryAssign(BinAss
*** 906,911 ****
--- 908,915 ----
  {
      if (auto ae = e.e1.isArrayExp())
      {
+         markArrayExpModifiable(ae);
+ 
          ae.e1 = ae.e1.expressionSemantic(sc);
          ae.e1 = resolveProperties(sc, ae.e1);
          Expression ae1old = ae.e1;
*************** Expression opOverloadBinaryAssign(BinAss
*** 993,1005 ****
      if (Expression result = e.binSemanticProp(sc))
          return result;
  
      // Don't attempt 'alias this' if an error occurred
      if (e.e1.type.isTypeError() || e.e2.type.isTypeError())
          return ErrorExp.get();
  
      AggregateDeclaration ad1 = isAggregate(e.e1.type);
      Dsymbol s = search_function(ad1, Id.opOpAssign);
!     if (s && !s.isTemplateDeclaration())
      {
          error(e.loc, "`%s.opOpAssign` isn't a template", e.e1.toChars());
          return ErrorExp.get();
--- 997,1012 ----
      if (Expression result = e.binSemanticProp(sc))
          return result;
  
+     if (auto result = rewriteIndexAssign(e, sc, aliasThisStop))
+         return result;
+ 
      // Don't attempt 'alias this' if an error occurred
      if (e.e1.type.isTypeError() || e.e2.type.isTypeError())
          return ErrorExp.get();
  
      AggregateDeclaration ad1 = isAggregate(e.e1.type);
      Dsymbol s = search_function(ad1, Id.opOpAssign);
!     if (s && !(s.isTemplateDeclaration() || s.isOverloadSet()))
      {
          error(e.loc, "`%s.opOpAssign` isn't a template", e.e1.toChars());
          return ErrorExp.get();
*************** private Expression pickBestBinaryOverloa
*** 1046,1052 ****
      if (s)
      {
          functionResolve(m, s, e.loc, sc, tiargs, e.e1.type, ArgumentList(args2), null);
!         if (m.lastf && (m.lastf.errors || m.lastf.hasSemantic3Errors()))
              return ErrorExp.get();
      }
      FuncDeclaration lastf = m.lastf;
--- 1053,1059 ----
      if (s)
      {
          functionResolve(m, s, e.loc, sc, tiargs, e.e1.type, ArgumentList(args2), null);
!         if (m.lastf && (m.lastf.errors || m.lastf.hasSemantic3Errors))
              return ErrorExp.get();
      }
      FuncDeclaration lastf = m.lastf;
*************** private Expression pickBestBinaryOverloa
*** 1054,1060 ****
      if (s_r)
      {
          functionResolve(m, s_r, e.loc, sc, tiargs, e.e2.type, ArgumentList(args1), null);
!         if (m.lastf && (m.lastf.errors || m.lastf.hasSemantic3Errors()))
              return ErrorExp.get();
      }
      if (m.count > 1)
--- 1061,1067 ----
      if (s_r)
      {
          functionResolve(m, s_r, e.loc, sc, tiargs, e.e2.type, ArgumentList(args1), null);
!         if (m.lastf && (m.lastf.errors || m.lastf.hasSemantic3Errors))
              return ErrorExp.get();
      }
      if (m.count > 1)
*************** Dsymbol search_function(ScopeDsymbol ad,
*** 1187,1192 ****
--- 1194,1201 ----
              return fd;
          if (TemplateDeclaration td = s2.isTemplateDeclaration())
              return td;
+         if (OverloadSet os = s2.isOverloadSet())
+             return os;
      }
      return null;
  }
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/optimize.d gcc-16-20260201/gcc/d/dmd/optimize.d
*** gcc-16-20260125/gcc/d/dmd/optimize.d	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/optimize.d	Sun Feb  1 22:32:07 2026
*************** Expression optimize(Expression e, int re
*** 1072,1078 ****
          // All negative integral powers are illegal.
          if (e.e1.type.isIntegral() && (e.e2.op == EXP.int64) && cast(sinteger_t)e.e2.toInteger() < 0)
          {
!             error(e.loc, "cannot raise `%s` to a negative integer power. Did you mean `(cast(real)%s)^^%s` ?", e.e1.type.toBasetype().toChars(), e.e1.toChars(), e.e2.toChars());
              return errorReturn();
          }
          // If e2 *could* have been an integer, make it one.
--- 1072,1079 ----
          // All negative integral powers are illegal.
          if (e.e1.type.isIntegral() && (e.e2.op == EXP.int64) && cast(sinteger_t)e.e2.toInteger() < 0)
          {
!             error(e.loc, "cannot raise `%s` to a negative integer power.", e.e1.type.toBasetype().toChars());
!             errorSupplemental(e.loc, "did you mean `(cast(real)%s)^^%s` ?", e.e1.toChars(), e.e2.toChars());
              return errorReturn();
          }
          // If e2 *could* have been an integer, make it one.
*************** Expression optimize(Expression e, int re
*** 1137,1145 ****
  
      void visitEqual(EqualExp e)
      {
!         //printf("EqualExp::optimize(result = %x) %s\n", result, e.toChars());
          if (binOptimize(e, WANTvalue))
              return;
          Expression e1 = fromConstInitializer(result, e.e1);
          Expression e2 = fromConstInitializer(result, e.e2);
          if (e1.op == EXP.error)
--- 1138,1153 ----
  
      void visitEqual(EqualExp e)
      {
!         //printf("EqualExp::optimize(result = %d) %s\n", result, e.toChars());
!         if (auto lowering = e.lowering)
!         {
!             optimize(lowering, result, keepLvalue);
!             return;
!         }
! 
          if (binOptimize(e, WANTvalue))
              return;
+ 
          Expression e1 = fromConstInitializer(result, e.e1);
          Expression e2 = fromConstInitializer(result, e.e2);
          if (e1.op == EXP.error)
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/parse.d gcc-16-20260201/gcc/d/dmd/parse.d
*** gcc-16-20260125/gcc/d/dmd/parse.d	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/parse.d	Sun Feb  1 22:32:07 2026
*************** import dmd.root.rmem;
*** 28,33 ****
--- 28,34 ----
  import dmd.rootobject;
  import dmd.root.string;
  import dmd.tokens;
+ import dmd.expression;
  
  alias CompileEnv = dmd.lexer.CompileEnv;
  
*************** class Parser(AST, Lexer = dmd.lexer.Lexe
*** 141,146 ****
--- 142,159 ----
  
          md = new AST.ModuleDeclaration(loc, a, id, msg, isdeprecated);
  
+         if (token.value == TOK.int32Literal)
+         {
+             auto edition = token.intvalue;
+             if (edition < Edition.min || Edition.max < edition)
+             {
+                 error("module edition %lld must be in the range %d ... %d", edition, Edition.min, Edition.max);
+                 edition = edition.min;
+             }
+             mod.edition = cast(Edition)edition;
+             nextToken();
+         }
+ 
          if (token.value != TOK.semicolon)
              error("`;` expected following module declaration instead of `%s`", token.toChars());
          nextToken();
*************** class Parser(AST, Lexer = dmd.lexer.Lexe
*** 237,243 ****
                                  if (auto id = (*exps)[0].isIdentifierExp())
                                      if (id.ident == Id.__edition_latest_do_not_use)
                                      {
!                                         mod.edition = Edition.latest;
                                          continue;
                                      }
  
--- 250,256 ----
                                  if (auto id = (*exps)[0].isIdentifierExp())
                                      if (id.ident == Id.__edition_latest_do_not_use)
                                      {
!                                         mod.edition = Edition.max;      // latest edition
                                          continue;
                                      }
  
*************** class Parser(AST, Lexer = dmd.lexer.Lexe
*** 1286,1291 ****
--- 1299,1336 ----
              return orig;
          }
  
+         if (0) // replace this with -preview=return in next PR
+             switch (orig & (STC.out_ | STC.ref_ | STC.scope_ | STC.return_))
+             {
+                 case STC.return_ | STC.ref_:
+                     if (!(orig & STC.returnRef))
+                         error("`return` `ref` attribute pair must be written as '`return ref`'");
+                     break;
+ 
+                 case STC.return_ | STC.out_:
+                     if (!(orig & STC.returnRef))
+                         error("`return` `out` attribute pair must be written as '`return out`'");
+                     break;
+ 
+                 case STC.return_ | STC.scope_:
+                     if (!(orig & STC.returnScope))
+                         error("`return` `scope` attribute pair must be written as '`return scope`'");
+                     break;
+ 
+                 case STC.return_ | STC.ref_ | STC.scope_:
+                     if (!(orig & (STC.returnRef | STC.returnScope)))
+                         error("`return` `ref` `scope` attribute triple must be written as '`return ref`' and '`scope`' or '`return scope`' and '`ref`'");
+                     break;
+ 
+                 case STC.return_ | STC.out_ | STC.scope_:
+                     if (!(orig & (STC.returnRef | STC.returnScope)))
+                         error("`return` `out` `scope` attribute triple must be written as '`return out`' and '`scope`' or '`return scope`' and '`out`'");
+                     break;
+ 
+                 default:
+                     break;
+             }
+ 
          checkConflictSTCGroup(STC.const_ | STC.immutable_ | STC.manifest);
          checkConflictSTCGroup(STC.gshared | STC.shared_);
          checkConflictSTCGroup!true(STC.safeGroup);
*************** class Parser(AST, Lexer = dmd.lexer.Lexe
*** 1319,1330 ****
  
              // Allow identifier, template instantiation, or function call
              // for `@Argument` (single UDA) form.
!             AST.Expression exp = parsePrimaryExp();
              if (token.value == TOK.leftParenthesis)
              {
                  const loc = token.loc;
                  AST.Expressions* args = new AST.Expressions();
!                 AST.Identifiers* names = new AST.Identifiers();
                  parseNamedArguments(args, names);
                  exp = new AST.CallExp(loc, exp, args, names);
              }
--- 1364,1389 ----
  
              // Allow identifier, template instantiation, or function call
              // for `@Argument` (single UDA) form.
!             AST.Expression exp;
! 
!             {
!                 const loc = token.loc;
!                 Identifier id = token.ident;
!                 nextToken();
!                 if (token.value == TOK.not)
!                 {
!                     auto tempinst = new AST.TemplateInstance(loc, id, parseTemplateArguments());
!                     exp = new AST.ScopeExp(loc, tempinst);
!                 }
!                 else
!                     exp = new AST.IdentifierExp(loc, id);
!             }
! 
              if (token.value == TOK.leftParenthesis)
              {
                  const loc = token.loc;
                  AST.Expressions* args = new AST.Expressions();
!                 AST.ArgumentLabels* names = new AST.ArgumentLabels();
                  parseNamedArguments(args, names);
                  exp = new AST.CallExp(loc, exp, args, names);
              }
*************** class Parser(AST, Lexer = dmd.lexer.Lexe
*** 1383,1388 ****
--- 1442,1448 ----
       */
      private STC parsePostfix(STC storageClass, AST.Expressions** pudas)
      {
+         const STC prefix = storageClass;
          while (1)
          {
              STC stc;
*************** class Parser(AST, Lexer = dmd.lexer.Lexe
*** 1413,1422 ****
                  break;
  
              case TOK.return_:
                  stc = STC.return_;
!                 if (peekNext() == TOK.scope_)
!                     stc |= STC.returnScope;     // recognize `return scope`
                  break;
  
              case TOK.scope_:
                  stc = STC.scope_;
--- 1473,1495 ----
                  break;
  
              case TOK.return_:
+             {
                  stc = STC.return_;
!                 TOK next = peekNext();
!                 if (next == TOK.scope_)     // recognize the `return scope` pair
!                 {
!                     stc |= STC.scope_ | STC.returnScope;
!                     nextToken();            // consume it
!                 }
!                 else if (next == TOK.ref_)  // recognize the `return ref` pair
!                 {
!                     stc |= STC.ref_ | STC.returnRef;
!                     nextToken();            // consume it
!                 }
!                 else if (prefix & STC.ref_) // https://dlang.org/spec/function.html#struct-return-methods
!                     stc |= STC.returnRef;   // treat member function `ref int fp() return;` as `int fp() return ref;`
                  break;
+             }
  
              case TOK.scope_:
                  stc = STC.scope_;
*************** class Parser(AST, Lexer = dmd.lexer.Lexe
*** 1455,1460 ****
--- 1528,1541 ----
                      nextToken();
                      continue;
                  }
+ 
+                 /* This is so we can enforce `return ref`, but not foul things up with an extra `ref`
+                  * which is not accounted for in the semantic routines. The problem comes about because
+                  * there's no way to attach `return ref` to the implicit `this` parameter but not the return value.
+                  */
+                 if (!(prefix & STC.ref_) && storageClass & STC.ref_ && storageClass & STC.returnRef)
+                     storageClass &= ~STC.ref_;
+ 
                  return storageClass;
              }
              storageClass = appendStorageClass(storageClass, stc);
*************** class Parser(AST, Lexer = dmd.lexer.Lexe
*** 2758,2764 ****
              if (len > 0)
              {
                  docline = cast(char*)mem.xmalloc_noscan(len + 2);
!                 memcpy(docline, begPtr, len);
                  docline[len] = '\n'; // Terminate all lines by LF
                  docline[len + 1] = '\0';
              }
--- 2839,2845 ----
              if (len > 0)
              {
                  docline = cast(char*)mem.xmalloc_noscan(len + 2);
!                 docline[0 .. len] = begPtr[0 .. len];
                  docline[len] = '\n'; // Terminate all lines by LF
                  docline[len + 1] = '\0';
              }
*************** class Parser(AST, Lexer = dmd.lexer.Lexe
*** 2799,2805 ****
          STC varargsStc;
  
          // Attributes allowed for ...
!         enum VarArgsStc = STC.const_ | STC.immutable_ | STC.shared_ | STC.scope_ | STC.return_ | STC.returnScope;
  
          check(TOK.leftParenthesis);
          while (1)
--- 2880,2886 ----
          STC varargsStc;
  
          // Attributes allowed for ...
!         enum VarArgsStc = STC.const_ | STC.immutable_ | STC.shared_ | STC.scope_ | STC.return_ | STC.returnScope | STC.returnRef;
  
          check(TOK.leftParenthesis);
          while (1)
*************** class Parser(AST, Lexer = dmd.lexer.Lexe
*** 2910,2919 ****
                      goto L2;
  
                  case TOK.return_:
                      stc = STC.return_;
!                     if (peekNext() == TOK.scope_)
!                         stc |= STC.returnScope;
                      goto L2;
                  L2:
                      storageClass = appendStorageClass(storageClass, stc);
                      continue;
--- 2991,3016 ----
                      goto L2;
  
                  case TOK.return_:
+                 {
                      stc = STC.return_;
!                     TOK next = peekNext();
!                     if (next == TOK.scope_)    // recognize the `return scope` pair
!                     {
!                         stc |= STC.scope_ | STC.returnScope;
!                         nextToken();           // consume it
!                     }
!                     else if (next == TOK.ref_) // recognize the `return ref` pair
!                     {
!                         stc |= STC.ref_ | STC.returnRef;
!                         nextToken();           // consume it
!                     }
!                     else if (next == TOK.out_) // recognize the `return out` pair
!                     {
!                         stc |= STC.out_ | STC.returnRef;
!                         nextToken();           // consume it
!                     }
                      goto L2;
+                 }
                  L2:
                      storageClass = appendStorageClass(storageClass, stc);
                      continue;
*************** class Parser(AST, Lexer = dmd.lexer.Lexe
*** 4067,4073 ****
                   */
                  if (isParameters(&peekt))
                  {
!                     error("function declaration without return type. (Note that constructors are always named `this`)");
                  }
                  else
                      error("unexpected `(` in declarator");
--- 4164,4171 ----
                   */
                  if (isParameters(&peekt))
                  {
!                     error("function declaration without return type");
!                     errorSupplemental("Note that constructors are always named `this`");
                  }
                  else
                      error("unexpected `(` in declarator");
*************** class Parser(AST, Lexer = dmd.lexer.Lexe
*** 4691,4699 ****
                  if (width)
                  {
                      if (_init)
!                         error("initializer not allowed for bit-field declaration");
                      if (storage_class)
!                         error("storage class not allowed for bit-field declaration");
                      s = new AST.BitFieldDeclaration(width.loc, t, ident, width);
                  }
                  else
--- 4789,4797 ----
                  if (width)
                  {
                      if (_init)
!                         error("initializer not allowed for bitfield declaration");
                      if (storage_class)
!                         error("storage class not allowed for bitfield declaration");
                      s = new AST.BitFieldDeclaration(width.loc, t, ident, width);
                  }
                  else
*************** class Parser(AST, Lexer = dmd.lexer.Lexe
*** 7088,7111 ****
                  error("matching `}` expected, not end of file");
                  break;
  
-             case TOK.colonColon:  // treat as two separate : tokens for iasmgcc
-                 *ptoklist = allocateToken();
-                 memcpy(*ptoklist, &token, Token.sizeof);
-                 (*ptoklist).value = TOK.colon;
-                 ptoklist = &(*ptoklist).next;
- 
-                 *ptoklist = allocateToken();
-                 memcpy(*ptoklist, &token, Token.sizeof);
-                 (*ptoklist).value = TOK.colon;
-                 ptoklist = &(*ptoklist).next;
- 
-                 *ptoklist = null;
-                 nextToken();
-                 continue;
- 
              default:
                  *ptoklist = allocateToken();
!                 memcpy(*ptoklist, &token, Token.sizeof);
                  ptoklist = &(*ptoklist).next;
                  *ptoklist = null;
                  nextToken();
--- 7186,7194 ----
                  error("matching `}` expected, not end of file");
                  break;
  
              default:
                  *ptoklist = allocateToken();
!                 **ptoklist = this.token;
                  ptoklist = &(*ptoklist).next;
                  *ptoklist = null;
                  nextToken();
*************** class Parser(AST, Lexer = dmd.lexer.Lexe
*** 8249,8257 ****
                          const len2 = token.len;
                          len = len1 + len2;
                          auto s2 = cast(char*)mem.xmalloc_noscan(len * char.sizeof);
!                         memcpy(s2, s, len1 * char.sizeof);
!                         memcpy(s2 + len1, token.ustring, len2 * char.sizeof);
!                         s = s2;
                      }
                      else
                          break;
--- 8332,8339 ----
                          const len2 = token.len;
                          len = len1 + len2;
                          auto s2 = cast(char*)mem.xmalloc_noscan(len * char.sizeof);
!                         s2[0 .. len1] = s[0 .. len1];
!                         s2[len1 .. len1 + len2] = token.ustring[0 .. len2];
                      }
                      else
                          break;
*************** class Parser(AST, Lexer = dmd.lexer.Lexe
*** 8454,8463 ****
                      nextToken();
                      if (token.value == TOK.identifier && peekNext() == TOK.leftParenthesis)
                      {
!                         error(loc, "unexpected `(` after `%s`, inside `is` expression. Try enclosing the contents of `is` with a `typeof` expression", token.toChars());
                          nextToken();
                          Token* tempTok = peekPastParen(&token);
!                         memcpy(&token, tempTok, Token.sizeof);
                          goto Lerr;
                      }
                      targ = parseType(&ident);
--- 8536,8546 ----
                      nextToken();
                      if (token.value == TOK.identifier && peekNext() == TOK.leftParenthesis)
                      {
!                         error(loc, "unexpected `(` after `%s`, inside `is` expression", token.toChars());
!                         errorSupplemental("try enclosing the contents of `is` with a `typeof` expression");
                          nextToken();
                          Token* tempTok = peekPastParen(&token);
!                         token = *tempTok;
                          goto Lerr;
                      }
                      targ = parseType(&ident);
*************** class Parser(AST, Lexer = dmd.lexer.Lexe
*** 9006,9012 ****
  
              case TOK.leftParenthesis:
                  AST.Expressions* args = new AST.Expressions();
!                 AST.Identifiers* names = new AST.Identifiers();
                  parseNamedArguments(args, names);
                  e = new AST.CallExp(loc, e, args, names);
                  continue;
--- 9089,9095 ----
  
              case TOK.leftParenthesis:
                  AST.Expressions* args = new AST.Expressions();
!                 AST.ArgumentLabels* names = new AST.ArgumentLabels();
                  parseNamedArguments(args, names);
                  e = new AST.CallExp(loc, e, args, names);
                  continue;
*************** class Parser(AST, Lexer = dmd.lexer.Lexe
*** 9053,9063 ****
  
      private AST.Expression parseMulExp()
      {
-         const loc = token.loc;
          auto e = parseUnaryExp();
  
          while (1)
          {
              switch (token.value)
              {
              case TOK.mul:
--- 9136,9146 ----
  
      private AST.Expression parseMulExp()
      {
          auto e = parseUnaryExp();
  
          while (1)
          {
+             const loc = token.loc;
              switch (token.value)
              {
              case TOK.mul:
*************** class Parser(AST, Lexer = dmd.lexer.Lexe
*** 9088,9098 ****
  
      private AST.Expression parseAddExp()
      {
-         const loc = token.loc;
          auto e = parseMulExp();
  
          while (1)
          {
              switch (token.value)
              {
              case TOK.add:
--- 9171,9181 ----
  
      private AST.Expression parseAddExp()
      {
          auto e = parseMulExp();
  
          while (1)
          {
+             const loc = token.loc;
              switch (token.value)
              {
              case TOK.add:
*************** class Parser(AST, Lexer = dmd.lexer.Lexe
*** 9123,9133 ****
  
      private AST.Expression parseShiftExp()
      {
-         const loc = token.loc;
          auto e = parseAddExp();
  
          while (1)
          {
              switch (token.value)
              {
              case TOK.leftShift:
--- 9206,9216 ----
  
      private AST.Expression parseShiftExp()
      {
          auto e = parseAddExp();
  
          while (1)
          {
+             const loc = token.loc;
              switch (token.value)
              {
              case TOK.leftShift:
*************** class Parser(AST, Lexer = dmd.lexer.Lexe
*** 9158,9167 ****
  
      private AST.Expression parseCmpExp()
      {
-         const loc = token.loc;
- 
          auto e = parseShiftExp();
          EXP op = EXP.reserved;
  
          switch (token.value)
          {
--- 9241,9249 ----
  
      private AST.Expression parseCmpExp()
      {
          auto e = parseShiftExp();
          EXP op = EXP.reserved;
+         const loc = token.loc;
  
          switch (token.value)
          {
*************** class Parser(AST, Lexer = dmd.lexer.Lexe
*** 9223,9250 ****
  
      private AST.Expression parseAndExp()
      {
-         Loc loc = token.loc;
          auto e = parseCmpExp();
          while (token.value == TOK.and)
          {
              checkParens(TOK.and, e);
              nextToken();
              auto e2 = parseCmpExp();
              checkParens(TOK.and, e2);
              e = new AST.AndExp(loc, e, e2);
-             loc = token.loc;
          }
          return e;
      }
  
      private AST.Expression parseXorExp()
      {
-         const loc = token.loc;
- 
          auto e = parseAndExp();
          while (token.value == TOK.xor)
          {
              checkParens(TOK.xor, e);
              nextToken();
              auto e2 = parseAndExp();
              checkParens(TOK.xor, e2);
--- 9305,9330 ----
  
      private AST.Expression parseAndExp()
      {
          auto e = parseCmpExp();
          while (token.value == TOK.and)
          {
              checkParens(TOK.and, e);
+             const loc = token.loc;
              nextToken();
              auto e2 = parseCmpExp();
              checkParens(TOK.and, e2);
              e = new AST.AndExp(loc, e, e2);
          }
          return e;
      }
  
      private AST.Expression parseXorExp()
      {
          auto e = parseAndExp();
          while (token.value == TOK.xor)
          {
              checkParens(TOK.xor, e);
+             const loc = token.loc;
              nextToken();
              auto e2 = parseAndExp();
              checkParens(TOK.xor, e2);
*************** class Parser(AST, Lexer = dmd.lexer.Lexe
*** 9255,9266 ****
  
      private AST.Expression parseOrExp()
      {
-         const loc = token.loc;
- 
          auto e = parseXorExp();
          while (token.value == TOK.or)
          {
              checkParens(TOK.or, e);
              nextToken();
              auto e2 = parseXorExp();
              checkParens(TOK.or, e2);
--- 9335,9345 ----
  
      private AST.Expression parseOrExp()
      {
          auto e = parseXorExp();
          while (token.value == TOK.or)
          {
              checkParens(TOK.or, e);
+             const loc = token.loc;
              nextToken();
              auto e2 = parseXorExp();
              checkParens(TOK.or, e2);
*************** class Parser(AST, Lexer = dmd.lexer.Lexe
*** 9271,9281 ****
  
      private AST.Expression parseAndAndExp()
      {
-         const loc = token.loc;
- 
          auto e = parseOrExp();
          while (token.value == TOK.andAnd)
          {
              nextToken();
              auto e2 = parseOrExp();
              e = new AST.LogicalExp(loc, EXP.andAnd, e, e2);
--- 9350,9359 ----
  
      private AST.Expression parseAndAndExp()
      {
          auto e = parseOrExp();
          while (token.value == TOK.andAnd)
          {
+             const loc = token.loc;
              nextToken();
              auto e2 = parseOrExp();
              e = new AST.LogicalExp(loc, EXP.andAnd, e, e2);
*************** class Parser(AST, Lexer = dmd.lexer.Lexe
*** 9285,9295 ****
  
      private AST.Expression parseOrOrExp()
      {
-         const loc = token.loc;
- 
          auto e = parseAndAndExp();
          while (token.value == TOK.orOr)
          {
              nextToken();
              auto e2 = parseAndAndExp();
              e = new AST.LogicalExp(loc, EXP.orOr, e, e2);
--- 9363,9372 ----
  
      private AST.Expression parseOrOrExp()
      {
          auto e = parseAndAndExp();
          while (token.value == TOK.orOr)
          {
+             const loc = token.loc;
              nextToken();
              auto e2 = parseAndAndExp();
              e = new AST.LogicalExp(loc, EXP.orOr, e, e2);
*************** class Parser(AST, Lexer = dmd.lexer.Lexe
*** 9297,9309 ****
          return e;
      }
  
!     private AST.Expression parseCondExp()
      {
-         const loc = token.loc;
- 
          auto e = parseOrOrExp();
          if (token.value == TOK.question)
          {
              nextToken();
              auto e1 = parseExpression();
              check(TOK.colon);
--- 9374,9385 ----
          return e;
      }
  
!     AST.Expression parseCondExp()
      {
          auto e = parseOrOrExp();
          if (token.value == TOK.question)
          {
+             const loc = token.loc;
              nextToken();
              auto e1 = parseExpression();
              check(TOK.colon);
*************** class Parser(AST, Lexer = dmd.lexer.Lexe
*** 9452,9458 ****
       * Collect argument list.
       * Assume current token is ',', '$(LPAREN)' or '['.
       */
!     private void parseNamedArguments(AST.Expressions* arguments, AST.Identifiers* names)
      {
          assert(arguments);
  
--- 9528,9534 ----
       * Collect argument list.
       * Assume current token is ',', '$(LPAREN)' or '['.
       */
!     private void parseNamedArguments(AST.Expressions* arguments, AST.ArgumentLabels* names)
      {
          assert(arguments);
  
*************** class Parser(AST, Lexer = dmd.lexer.Lexe
*** 9470,9483 ****
                  check(TOK.identifier);
                  check(TOK.colon);
                  if (names)
!                     names.push(ident);
                  else
                      error(loc, "named arguments not allowed here");
              }
              else
              {
                  if (names)
!                     names.push(null);
              }
  
              auto arg = parseAssignExp();
--- 9546,9559 ----
                  check(TOK.identifier);
                  check(TOK.colon);
                  if (names)
!                     names.push(ArgumentLabel(ident, loc));
                  else
                      error(loc, "named arguments not allowed here");
              }
              else
              {
                  if (names)
!                     names.push(ArgumentLabel(null, Loc.init));
              }
  
              auto arg = parseAssignExp();
*************** class Parser(AST, Lexer = dmd.lexer.Lexe
*** 9518,9524 ****
          }
  
          AST.Expressions* arguments = null;
!         AST.Identifiers* names = null;
  
          // An anonymous nested class starts with "class"
          if (token.value == TOK.class_)
--- 9594,9600 ----
          }
  
          AST.Expressions* arguments = null;
!         AST.ArgumentLabels* names = null;
  
          // An anonymous nested class starts with "class"
          if (token.value == TOK.class_)
*************** class Parser(AST, Lexer = dmd.lexer.Lexe
*** 9527,9533 ****
              if (token.value == TOK.leftParenthesis)
              {
                  arguments = new AST.Expressions();
!                 names = new AST.Identifiers();
                  parseNamedArguments(arguments, names);
              }
  
--- 9603,9609 ----
              if (token.value == TOK.leftParenthesis)
              {
                  arguments = new AST.Expressions();
!                 names = new AST.ArgumentLabels();
                  parseNamedArguments(arguments, names);
              }
  
*************** class Parser(AST, Lexer = dmd.lexer.Lexe
*** 9572,9578 ****
          else if (token.value == TOK.leftParenthesis && t.ty != Tsarray)
          {
              arguments = new AST.Expressions();
!             names = new AST.Identifiers();
              parseNamedArguments(arguments, names);
          }
  
--- 9648,9654 ----
          else if (token.value == TOK.leftParenthesis && t.ty != Tsarray)
          {
              arguments = new AST.Expressions();
!             names = new AST.ArgumentLabels();
              parseNamedArguments(arguments, names);
          }
  
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/root/array.d gcc-16-20260201/gcc/d/dmd/root/array.d
*** gcc-16-20260125/gcc/d/dmd/root/array.d	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/root/array.d	Sun Feb  1 22:32:07 2026
*************** public:
*** 55,60 ****
--- 55,72 ----
          if (data.ptr && data.ptr != &smallarray[0])
              mem.xfree(data.ptr);
      }
+ 
+     // this is using a template constraint because of ambiguity with this(size_t) when T is
+     // int, and c++ header generation doesn't accept wrapping this in static if
+     extern(D) this()(T[] elems ...) pure nothrow if (is(T == struct) || is(T == class))
+     {
+         this(elems.length);
+         foreach(i; 0 .. elems.length)
+         {
+             this[i] = elems[i];
+         }
+     }
+ 
      ///returns elements comma separated in []
      extern(D) const(char)[] toString() const
      {
*************** pure nothrow @nogc @safe unittest
*** 1181,1183 ****
--- 1193,1211 ----
      b.popFront();
      assert(b == expected[]);
  }
+ 
+ 
+ /// Test Array array constructor
+ pure nothrow unittest
+ {
+     //check to make sure that this works with the aliases in arraytypes.d
+     import dmd.rootobject;
+     alias Objects = Array!RootObject;
+ 
+     auto ro1 = new RootObject();
+     auto ro2 = new RootObject();
+ 
+     auto aoo = new Objects(ro1, ro2);
+     assert((*aoo)[0] is ro1);
+     assert((*aoo)[1] is ro2);
+ }
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/root/filename.d gcc-16-20260201/gcc/d/dmd/root/filename.d
*** gcc-16-20260125/gcc/d/dmd/root/filename.d	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/root/filename.d	Sun Feb  1 22:32:07 2026
*************** nothrow:
*** 468,474 ****
              assert(buildPath("a/", "bb", "ccc") == "a/bb/ccc");
      }
  
!     // Split a path and append the results to `array`
      extern (C++) static void appendSplitPath(const(char)* path, ref Strings array)
      {
          int sink(const(char)* p) nothrow
--- 468,487 ----
              assert(buildPath("a/", "bb", "ccc") == "a/bb/ccc");
      }
  
!     /****
!      * Splits a delimiter-separated path string (e.g., from an environment variable like `PATH`)
!      * into individual path fragments and appends them to the given array.
!      *
!      * This is a convenience wrapper around `splitPath` that collects all fragments
!      * into an `Array!(const(char)*)`.
!      *
!      * Params:
!      *   path  = A null-terminated string containing path fragments separated by platform-specific delimiters.
!      *   array = The array to which each extracted fragment will be appended.
!      *
!      * See_Also:
!      *   `splitPath`
!      */
      extern (C++) static void appendSplitPath(const(char)* path, ref Strings array)
      {
          int sink(const(char)* p) nothrow
*************** nothrow:
*** 487,493 ****
       *  sink = send the path pieces here, end when sink() returns !=0
       *  path = the path to split up.
       */
!     static void splitPath(int delegate(const(char)*) nothrow sink, const(char)* path)
      {
          if (!path)
              return;
--- 500,506 ----
       *  sink = send the path pieces here, end when sink() returns !=0
       *  path = the path to split up.
       */
!     static void splitPath(scope int delegate(const(char)*) nothrow sink, const(char)* path)
      {
          if (!path)
              return;
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/root/hash.d gcc-16-20260201/gcc/d/dmd/root/hash.d
*** gcc-16-20260125/gcc/d/dmd/root/hash.d	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/root/hash.d	Sun Feb  1 22:32:07 2026
*************** module dmd.root.hash;
*** 13,19 ****
  
  // MurmurHash2 was written by Austin Appleby, and is placed in the public
  // domain. The author hereby disclaims copyright to this source code.
! // https://sites.google.com/site/murmurhash/
  uint calcHash(scope const(char)[] data) @nogc nothrow pure @safe
  {
      return calcHash(cast(const(ubyte)[])data);
--- 13,19 ----
  
  // MurmurHash2 was written by Austin Appleby, and is placed in the public
  // domain. The author hereby disclaims copyright to this source code.
! // https://github.com/aappleby/smhasher/
  uint calcHash(scope const(char)[] data) @nogc nothrow pure @safe
  {
      return calcHash(cast(const(ubyte)[])data);
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/safe.d gcc-16-20260201/gcc/d/dmd/safe.d
*** gcc-16-20260125/gcc/d/dmd/safe.d	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/safe.d	Sun Feb  1 22:32:07 2026
*************** import dmd.errors;
*** 28,34 ****
  import dmd.expression;
  import dmd.func;
  import dmd.funcsem : isRootTraitsCompilesScope;
! import dmd.globals : FeatureState, global;
  import dmd.id;
  import dmd.identifier;
  import dmd.location;
--- 28,34 ----
  import dmd.expression;
  import dmd.func;
  import dmd.funcsem : isRootTraitsCompilesScope;
! import dmd.globals : FeatureState;
  import dmd.id;
  import dmd.identifier;
  import dmd.location;
*************** bool checkUnsafeAccess(Scope* sc, Expres
*** 85,91 ****
      if (ad.sizeok != Sizeok.done)
          ad.determineSize(ad.loc);
  
-     import dmd.globals : FeatureState;
      const hasPointers = v.type.hasPointers();
      if (hasPointers)
      {
--- 85,90 ----
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/scope.h gcc-16-20260201/gcc/d/dmd/scope.h
*** gcc-16-20260125/gcc/d/dmd/scope.h	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/scope.h	Sun Feb  1 22:32:07 2026
*************** struct Scope final
*** 67,76 ****
      ForeachStatement *fes;      // if nested function for ForeachStatement, this is it
      Scope *callsc;              // used for __FUNCTION__, __PRETTY_FUNCTION__ and __MODULE__
      Dsymbol *inunion;           // !=null if processing members of a union
-     d_bool nofree;                // true if shouldn't free it
-     d_bool inLoop;                // true if inside a loop (where constructor calls aren't allowed)
-     d_bool inDefaultArg;          // true if inside a default argument (where __FILE__, etc are evaluated at the call site)
-     int intypeof;               // in typeof(exp)
      VarDeclaration *lastVar;    // Previous symbol used to prevent goto-skips-init
      ErrorSink *eSink;           // sink for error messages
  
--- 67,72 ----
*************** struct Scope final
*** 96,108 ****
      PragmaDeclaration *inlining; // inlining strategy for functions
  
      Visibility visibility;            // visibility for class members
-     int explicitVisibility;     // set if in an explicit visibility attribute
  
      StorageClass stc;           // storage class
  
      DeprecatedDeclaration *depdecl; // customized deprecation message
  
!     uint16_t flags;
      uint16_t previews; // state of preview switches
  
      bool ctor() const;
--- 92,103 ----
      PragmaDeclaration *inlining; // inlining strategy for functions
  
      Visibility visibility;            // visibility for class members
  
      StorageClass stc;           // storage class
  
      DeprecatedDeclaration *depdecl; // customized deprecation message
  
!     uint16_t flags, flags2;
      uint16_t previews; // state of preview switches
  
      bool ctor() const;
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/semantic2.d gcc-16-20260201/gcc/d/dmd/semantic2.d
*** gcc-16-20260125/gcc/d/dmd/semantic2.d	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/semantic2.d	Sun Feb  1 22:32:07 2026
*************** private extern(C++) final class Semantic
*** 287,293 ****
                  }
  
                  if (hasInvalidEnumInitializer(ei.exp))
!                     .error(vd.loc, "%s `%s` : Unable to initialize enum with class or pointer to struct. Use static const variable instead.", vd.kind, vd.toPrettyChars);
              }
          }
          else if (vd._init && vd.isThreadlocal())
--- 287,296 ----
                  }
  
                  if (hasInvalidEnumInitializer(ei.exp))
!                 {
!                     .error(vd.loc, "%s `%s` : Unable to initialize enum with class or pointer to struct", vd.kind, vd.toPrettyChars);
!                     .errorSupplemental(vd.loc, "use static const variable instead");
!                 }
              }
          }
          else if (vd._init && vd.isThreadlocal())
*************** private extern(C++) final class Semantic
*** 298,310 ****
              {
                  ExpInitializer ei = vd._init.isExpInitializer();
                  if (ei && ei.exp.op == EXP.classReference)
!                     .error(vd.loc, "%s `%s` is a thread-local class and cannot have a static initializer. Use `static this()` to initialize instead.", vd.kind, vd.toPrettyChars);
              }
              else if (vd.type.ty == Tpointer && vd.type.nextOf().ty == Tstruct && vd.type.nextOf().isMutable() && !vd.type.nextOf().isShared())
              {
                  ExpInitializer ei = vd._init.isExpInitializer();
                  if (ei && ei.exp.op == EXP.address && (cast(AddrExp)ei.exp).e1.op == EXP.structLiteral)
!                     .error(vd.loc, "%s `%s` is a thread-local pointer to struct and cannot have a static initializer. Use `static this()` to initialize instead.", vd.kind, vd.toPrettyChars);
              }
          }
          vd.semanticRun = PASS.semantic2done;
--- 301,320 ----
              {
                  ExpInitializer ei = vd._init.isExpInitializer();
                  if (ei && ei.exp.op == EXP.classReference)
!                 {
!                     .error(vd.loc, "%s `%s` is a thread-local class and cannot have a static initializer", vd.kind, vd.toPrettyChars);
!                     .errorSupplemental(vd.loc, "use `static this()` to initialize instead");
!                 }
              }
              else if (vd.type.ty == Tpointer && vd.type.nextOf().ty == Tstruct && vd.type.nextOf().isMutable() && !vd.type.nextOf().isShared())
              {
                  ExpInitializer ei = vd._init.isExpInitializer();
                  if (ei && ei.exp.op == EXP.address && (cast(AddrExp)ei.exp).e1.op == EXP.structLiteral)
!                 {
!                     .error(vd.loc, "%s `%s` is a thread-local pointer to struct and cannot have a static initializer", vd.kind, vd.toPrettyChars);
!                     .errorSupplemental(vd.loc, "use `static this()` to initialize instead");
!                 }
! 
              }
          }
          vd.semanticRun = PASS.semantic2done;
*************** private void doGNUABITagSemantic(ref Exp
*** 803,812 ****
   */
  void lowerStaticAAs(VarDeclaration vd, Scope* sc)
  {
-     if (vd.storage_class & STC.manifest)
-         return;
      if (auto ei = vd._init.isExpInitializer())
!         lowerStaticAAs(ei.exp, sc);
  }
  
  /**
--- 813,823 ----
   */
  void lowerStaticAAs(VarDeclaration vd, Scope* sc)
  {
      if (auto ei = vd._init.isExpInitializer())
!     {
!         scope v = new StaticAAVisitor(sc, vd.storage_class);
!         ei.exp.accept(v);
!     }
  }
  
  /**
*************** void lowerStaticAAs(VarDeclaration vd, S
*** 818,824 ****
   */
  void lowerStaticAAs(Expression e, Scope* sc)
  {
!     scope v = new StaticAAVisitor(sc);
      e.accept(v);
  }
  
--- 829,835 ----
   */
  void lowerStaticAAs(Expression e, Scope* sc)
  {
!     scope v = new StaticAAVisitor(sc, STC.none);
      e.accept(v);
  }
  
*************** private extern(C++) final class StaticAA
*** 827,859 ****
  {
      alias visit = SemanticTimeTransitiveVisitor.visit;
      Scope* sc;
  
!     this(Scope* sc) scope @safe
      {
          this.sc = sc;
      }
  
      override void visit(AssocArrayLiteralExp aaExp)
      {
!         if (!verifyHookExist(aaExp.loc, *sc, Id._aaAsStruct, "initializing static associative arrays", Id.object))
!             return;
! 
!         Expression hookFunc = new IdentifierExp(aaExp.loc, Id.empty);
!         hookFunc = new DotIdExp(aaExp.loc, hookFunc, Id.object);
!         hookFunc = new DotIdExp(aaExp.loc, hookFunc, Id._aaAsStruct);
!         auto arguments = new Expressions();
!         arguments.push(aaExp);
!         Expression loweredExp = new CallExp(aaExp.loc, hookFunc, arguments);
! 
!         sc = sc.startCTFE();
!         loweredExp = loweredExp.expressionSemantic(sc);
!         loweredExp = resolveProperties(sc, loweredExp);
!         sc = sc.endCTFE();
!         loweredExp = loweredExp.ctfeInterpret();
! 
!         aaExp.lowering = loweredExp;
! 
!         semanticTypeInfo(sc, loweredExp.type);
      }
  
      // https://issues.dlang.org/show_bug.cgi?id=24602
--- 838,863 ----
  {
      alias visit = SemanticTimeTransitiveVisitor.visit;
      Scope* sc;
+     STC storage_class;
  
!     this(Scope* sc, STC storage_class) scope @safe
      {
          this.sc = sc;
+         this.storage_class = storage_class;
      }
  
      override void visit(AssocArrayLiteralExp aaExp)
      {
!         if (!aaExp.lowering)
!             expressionSemantic(aaExp, sc);
!         assert(aaExp.lowering);
!         if (!(storage_class & STC.manifest)) // manifest constants create runtime copies
!             if (!aaExp.loweringCtfe)
!             {
!                 aaExp.loweringCtfe = aaExp.lowering.ctfeInterpret();
!                 aaExp.loweringCtfe.accept(this); // lower AAs in keys and values
!             }
!         semanticTypeInfo(sc, aaExp.lowering.type);
      }
  
      // https://issues.dlang.org/show_bug.cgi?id=24602
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/semantic3.d gcc-16-20260201/gcc/d/dmd/semantic3.d
*** gcc-16-20260125/gcc/d/dmd/semantic3.d	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/semantic3.d	Sun Feb  1 22:32:07 2026
***************
*** 1,5 ****
  /**
!  * Performs the semantic3 stage, which deals with function bodies.
   *
   * Copyright:   Copyright (C) 1999-2025 by The D Language Foundation, All Rights Reserved
   * Authors:     $(LINK2 https://www.digitalmars.com, Walter Bright)
--- 1,7 ----
  /**
!  * Performs the semantic3 stage of semantic analysis, which finalizes
!  * function bodies and late semantic checks for templates, mixins,
!  * aggregates, and special members.
   *
   * Copyright:   Copyright (C) 1999-2025 by The D Language Foundation, All Rights Reserved
   * Authors:     $(LINK2 https://www.digitalmars.com, Walter Bright)
*************** private extern(C++) final class Semantic
*** 343,349 ****
              sc2.linkage = funcdecl.isCsymbol() ? LINK.c : LINK.d;
              sc2.stc &= STC.flowThruFunction;
              sc2.visibility = Visibility(Visibility.Kind.public_);
!             sc2.explicitVisibility = 0;
              sc2.aligndecl = null;
              if (funcdecl.ident != Id.require && funcdecl.ident != Id.ensure)
              {
--- 345,351 ----
              sc2.linkage = funcdecl.isCsymbol() ? LINK.c : LINK.d;
              sc2.stc &= STC.flowThruFunction;
              sc2.visibility = Visibility(Visibility.Kind.public_);
!             sc2.explicitVisibility = false;
              sc2.aligndecl = null;
              if (funcdecl.ident != Id.require && funcdecl.ident != Id.ensure)
              {
*************** private extern(C++) final class Semantic
*** 402,408 ****
              // functions may be widely used by dmd-compiled projects.
              // It also gives more time for the implementation of dual-context
              // functions to be reworked as a frontend-only feature.
!             if (funcdecl.hasDualContext())
              {
                  .deprecation(funcdecl.loc, "%s `%s` function requires a dual-context, which is deprecated", funcdecl.kind, funcdecl.toPrettyChars);
                  if (auto ti = sc2.parent ? sc2.parent.isInstantiated() : null)
--- 404,410 ----
              // functions may be widely used by dmd-compiled projects.
              // It also gives more time for the implementation of dual-context
              // functions to be reworked as a frontend-only feature.
!             if (funcdecl.hasDualContext)
              {
                  .deprecation(funcdecl.loc, "%s `%s` function requires a dual-context, which is deprecated", funcdecl.kind, funcdecl.toPrettyChars);
                  if (auto ti = sc2.parent ? sc2.parent.isInstantiated() : null)
*************** private extern(C++) final class Semantic
*** 615,621 ****
                  if (!funcdecl.fbody)
                      funcdecl.fbody = new CompoundStatement(Loc.initial, new Statements());
  
!                 if (funcdecl.isNaked())
                  {
                      fpreinv = null;         // can't accommodate with no stack frame
                      fpostinv = null;
--- 617,623 ----
                  if (!funcdecl.fbody)
                      funcdecl.fbody = new CompoundStatement(Loc.initial, new Statements());
  
!                 if (funcdecl.isNaked)
                  {
                      fpreinv = null;         // can't accommodate with no stack frame
                      fpostinv = null;
*************** private extern(C++) final class Semantic
*** 855,861 ****
                          if (tret.ty == Terror)
                          {
                              // https://issues.dlang.org/show_bug.cgi?id=13702
!                             exp = checkGC(sc2, exp);
                              continue;
                          }
  
--- 857,863 ----
                          if (tret.ty == Terror)
                          {
                              // https://issues.dlang.org/show_bug.cgi?id=13702
!                             exp = exp.checkGC(sc2);
                              continue;
                          }
  
*************** private extern(C++) final class Semantic
*** 925,930 ****
--- 927,933 ----
                                  exp = exp.implicitCastTo(sc2, tret);
  
                              exp = exp.toLvalue(sc2, "`ref` return");
+                             checkAddressable(exp, sc2, "`ref` return");
                              checkReturnEscapeRef(*sc2, exp, false);
                              exp = exp.optimize(WANTvalue, /*keepLvalue*/ true);
                          }
*************** private extern(C++) final class Semantic
*** 970,983 ****
                              /* https://issues.dlang.org/show_bug.cgi?id=10789
                               * If NRVO is not possible, all returned lvalues should call their postblits.
                               */
!                             if (!funcdecl.isNRVO())
                                  exp = doCopyOrMove(sc2, exp, f.next, true, true);
  
                              if (tret.hasPointers())
                                  checkReturnEscape(*sc2, exp, false);
                          }
  
!                         exp = checkGC(sc2, exp);
  
                          if (funcdecl.vresult)
                          {
--- 973,986 ----
                              /* https://issues.dlang.org/show_bug.cgi?id=10789
                               * If NRVO is not possible, all returned lvalues should call their postblits.
                               */
!                             if (!funcdecl.isNRVO)
                                  exp = doCopyOrMove(sc2, exp, f.next, true, true);
  
                              if (tret.hasPointers())
                                  checkReturnEscape(*sc2, exp, false);
                          }
  
!                         exp = exp.checkGC(sc2);
  
                          if (funcdecl.vresult)
                          {
*************** private extern(C++) final class Semantic
*** 1255,1261 ****
                              {
                                  // 'this' is the monitor
                                  vsync = new VarExp(funcdecl.loc, funcdecl.vthis);
!                                 if (funcdecl.hasDualContext())
                                  {
                                      vsync = new PtrExp(funcdecl.loc, vsync);
                                      vsync = new IndexExp(funcdecl.loc, vsync, IntegerExp.literal!0);
--- 1258,1264 ----
                              {
                                  // 'this' is the monitor
                                  vsync = new VarExp(funcdecl.loc, funcdecl.vthis);
!                                 if (funcdecl.hasDualContext)
                                  {
                                      vsync = new PtrExp(funcdecl.loc, vsync);
                                      vsync = new IndexExp(funcdecl.loc, vsync, IntegerExp.literal!0);
*************** private extern(C++) final class Semantic
*** 1298,1304 ****
                  }
              }
  
!             if (funcdecl.isNaked() && (funcdecl.fensures || funcdecl.frequires))
                  .error(funcdecl.loc, "%s `%s` naked assembly functions with contracts are not supported", funcdecl.kind, funcdecl.toPrettyChars);
  
              sc2.ctorflow.callSuper = CSX.none;
--- 1301,1307 ----
                  }
              }
  
!             if (funcdecl.isNaked && (funcdecl.fensures || funcdecl.frequires))
                  .error(funcdecl.loc, "%s `%s` naked assembly functions with contracts are not supported", funcdecl.kind, funcdecl.toPrettyChars);
  
              sc2.ctorflow.callSuper = CSX.none;
*************** private extern(C++) final class Semantic
*** 1516,1524 ****
              auto ts = new ThrowStatement(ctor.loc, new IdentifierExp(ctor.loc, id));
              auto handler = new CompoundStatement(ctor.loc, ss, ts);
  
-             auto catches = new Catches();
              auto ctch = new Catch(ctor.loc, getException(), id, handler);
!             catches.push(ctch);
  
              ctor.fbody = new TryCatchStatement(ctor.loc, ctor.fbody, catches);
          }
--- 1519,1526 ----
              auto ts = new ThrowStatement(ctor.loc, new IdentifierExp(ctor.loc, id));
              auto handler = new CompoundStatement(ctor.loc, ss, ts);
  
              auto ctch = new Catch(ctor.loc, getException(), id, handler);
!             auto catches = new Catches(ctch);
  
              ctor.fbody = new TryCatchStatement(ctor.loc, ctor.fbody, catches);
          }
*************** private extern(C++) final class Semantic
*** 1604,1611 ****
              (ad.type && ad.type.ty != Terror))
          {
              // Evaluate: RTinfo!type
!             auto tiargs = new Objects();
!             tiargs.push(ad.type);
              auto ti = new TemplateInstance(ad.loc, Type.rtinfo, tiargs);
  
              Scope* sc3 = ti.tempdecl._scope.startCTFE();
--- 1606,1612 ----
              (ad.type && ad.type.ty != Terror))
          {
              // Evaluate: RTinfo!type
!             auto tiargs = new Objects(ad.type);
              auto ti = new TemplateInstance(ad.loc, Type.rtinfo, tiargs);
  
              Scope* sc3 = ti.tempdecl._scope.startCTFE();
*************** private extern(C++) final class Semantic
*** 1628,1635 ****
--- 1629,1711 ----
              sd.semanticTypeInfoMembers();
          ad.semanticRun = PASS.semantic3done;
      }
+ 
+     override void visit(TypeInfoAssociativeArrayDeclaration ti)
+     {
+         if (ti.semanticRun >= PASS.semantic3)
+             return;
+         ti.semanticRun = PASS.semantic3;
+ 
+         auto t = ti.tinfo.isTypeAArray();
+         Loc loc = t.loc;
+         auto sc2 = sc ? sc : ti._scope;
+ 
+         auto makeDotExp(Identifier hook)
+         {
+             // always called with naked types
+             auto tiargs = new Objects(t.index, t.next);
+ 
+             Expression id = new IdentifierExp(loc, Id.empty);
+             id = new DotIdExp(loc, id, Id.object);
+             id = new DotIdExp(loc, id, Id.TypeInfo_AssociativeArray);
+             return new DotTemplateInstanceExp(loc, id, hook, tiargs);
+         }
+ 
+         void notTemplateFunction(Loc loc, Identifier id)
+         {
+             error(loc, "`%s` isn't a template function", id.toChars());
+         }
+ 
+         // generate ti.entry
+         auto tempinst = makeDotExp(Id.Entry);
+         auto e = expressionSemantic(tempinst, sc2);
+         assert(e.type);
+         ti.entry = e.type;
+         if (auto ts = ti.entry.isTypeStruct())
+         {
+             ts.sym.requestTypeInfo = true;
+             if (auto tmpl = ts.sym.isInstantiated())
+                 tmpl.minst = sc2._module.importedFrom; // ensure it gets emitted
+         }
+         semanticTypeInfo(sc2, ti.entry); // might get deferred
+ 
+         // generate ti.xtoHash
+         auto aaGetHash = Identifier.idPool("aaGetHash");
+         auto hashinst = makeDotExp(aaGetHash);
+         e = expressionSemantic(hashinst, sc2);
+         if (!e.isErrorExp())
+         {
+             if (!e.isVarExp() || !e.type.isTypeFunction())
+                 notTemplateFunction(e.loc, aaGetHash);
+             else
+             {
+                 ti.xtoHash = e.isVarExp().var;
+                 if (auto tmpl = ti.xtoHash.parent.isTemplateInstance())
+                     tmpl.minst = sc2._module.importedFrom; // ensure it gets emitted
+             }
+         }
+ 
+         // generate ti.xopEqual
+         auto aaOpEqual = Identifier.idPool("aaOpEqual");
+         auto equalinst = makeDotExp(aaOpEqual);
+         e = expressionSemantic(equalinst, sc2);
+         if (!e.isErrorExp())
+         {
+             if (!e.isVarExp() || !e.type.isTypeFunction())
+                 notTemplateFunction(e.loc, aaOpEqual);
+             else
+             {
+                 ti.xopEqual = e.isVarExp().var;
+                 if (auto tmpl = ti.xopEqual.parent.isTemplateInstance())
+                     tmpl.minst = sc2._module.importedFrom; // ensure it gets emitted
+             }
+         }
+         visit(cast(ASTCodegen.TypeInfoDeclaration)ti);
+     }
  }
  
+ /// Helper for semantic3 analysis of functions.
+ /// This struct is part of a WIP refactoring to simplify large `visit(FuncDeclaration)` logic.
  private struct FuncDeclSem3
  {
      // The FuncDeclaration subject to Semantic analysis
*************** private struct FuncDeclSem3
*** 1663,1668 ****
--- 1739,1775 ----
      }
  }
  
+ /***************************************
+  * Search sd for a member function of the form:
+  *   `extern (D) string toString();`
+  * Params:
+  *   sd = struct declaration to search
+  * Returns:
+  *   FuncDeclaration of `toString()` if found, `null` if not
+  */
+ FuncDeclaration search_toString(StructDeclaration sd)
+ {
+     Dsymbol s = search_function(sd, Id.tostring);
+     FuncDeclaration fd = s ? s.isFuncDeclaration() : null;
+     if (!fd)
+         return null;
+ 
+     __gshared TypeFunction tftostring;
+     if (!tftostring)
+     {
+         tftostring = new TypeFunction(ParameterList(), Type.tstring, LINK.d);
+         tftostring = tftostring.merge().toTypeFunction();
+     }
+     return fd.overloadExactMatch(tftostring);
+ }
+ 
+ /**
+  * Ensures special members of a struct are fully analysed
+  * before the backend emits TypeInfo.
+  *
+  * Handles late semantic analysis for members like `opEquals`, `opCmp`,
+  * `toString`, `toHash`, postblit, and destructor.
+  */
  void semanticTypeInfoMembers(StructDeclaration sd)
  {
      if (sd.xeq &&
*************** void semanticTypeInfoMembers(StructDecla
*** 1715,1727 ****
      }
  }
  
! /***********************************************
!  * Check that the function contains any closure.
!  * If it's @nogc, report suitable errors.
!  * This is mostly consistent with FuncDeclaration::needsClosure().
   *
!  * Returns:
!  *      true if any errors occur.
   */
  extern (D) bool checkClosure(FuncDeclaration fd)
  {
--- 1822,1843 ----
      }
  }
  
! /**
!  * Determine whether the given function will need to allocate a _closure_ and
!  * verify that such an allocation is allowed under the current compilation
!  * settings.
   *
!  * Whenever an error is emitted, every nested function that actually closes
!  * over a variable is listed in a supplemental diagnostic, together with the
!  * location of the captured variable’s declaration.  (This extra walk is
!  * skipped when the compiler is gagged.)
!  *
!  * See_Also:
!  *      $(UL
!  *        $(LI `FuncDeclaration.needsClosure`)
!  *        $(LI `FuncDeclaration.setGC`)
!  *        $(LI `FuncDeclaration.printGCUsage`)
!  *      )
   */
  extern (D) bool checkClosure(FuncDeclaration fd)
  {
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/sideeffect.d gcc-16-20260201/gcc/d/dmd/sideeffect.d
*** gcc-16-20260125/gcc/d/dmd/sideeffect.d	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/sideeffect.d	Sun Feb  1 22:32:07 2026
*************** import dmd.expression;
*** 19,25 ****
  import dmd.expressionsem;
  import dmd.func;
  import dmd.funcsem;
- import dmd.globals;
  import dmd.hdrgen;
  import dmd.id;
  import dmd.identifier;
--- 19,24 ----
*************** VarDeclaration copyToTemp(STC stc, const
*** 392,397 ****
--- 391,397 ----
   *  e0 = a new side effect part will be appended to it.
   *  e = original expression
   *  alwaysCopy = if true, build new temporary variable even if e is trivial.
+  *  stc = storage class flags to add to new temporary variable
   * Returns:
   *  When e is trivial and alwaysCopy == false, e itself is returned.
   *  Otherwise, a new VarExp is returned.
*************** VarDeclaration copyToTemp(STC stc, const
*** 399,405 ****
   *  e's lvalue-ness will be handled well by STC.ref_ or STC.rvalue.
   */
  Expression extractSideEffect(Scope* sc, const char[] name,
!     ref Expression e0, Expression e, bool alwaysCopy = false)
  {
      //printf("extractSideEffect(e: %s)\n", e.toChars());
  
--- 399,405 ----
   *  e's lvalue-ness will be handled well by STC.ref_ or STC.rvalue.
   */
  Expression extractSideEffect(Scope* sc, const char[] name,
!     ref Expression e0, Expression e, bool alwaysCopy = false, STC stc = STC.exptemp)
  {
      //printf("extractSideEffect(e: %s)\n", e.toChars());
  
*************** Expression extractSideEffect(Scope* sc,
*** 413,420 ****
          (sc.ctfe ? !hasSideEffect(e) : isTrivialExp(e)))
          return e;
  
!     auto vd = copyToTemp(STC.none, name, e);
!     vd.storage_class |= e.isLvalue() ? STC.ref_ : STC.rvalue;
  
      e0 = Expression.combine(e0, new DeclarationExp(vd.loc, vd)
                                  .expressionSemantic(sc));
--- 413,420 ----
          (sc.ctfe ? !hasSideEffect(e) : isTrivialExp(e)))
          return e;
  
!     stc |= (e.isLvalue() ? STC.ref_ : STC.rvalue);
!     auto vd = copyToTemp(stc, name, e);
  
      e0 = Expression.combine(e0, new DeclarationExp(vd.loc, vd)
                                  .expressionSemantic(sc));
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/statement.d gcc-16-20260201/gcc/d/dmd/statement.d
*** gcc-16-20260125/gcc/d/dmd/statement.d	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/statement.d	Sun Feb  1 22:32:07 2026
*************** extern (C++) final class MixinStatement
*** 439,446 ****
  
      extern (D) this(Loc loc, Expression exp)
      {
!         Expressions* exps = new Expressions();
!         exps.push(exp);
          this(loc, exps);
      }
  
--- 439,445 ----
  
      extern (D) this(Loc loc, Expression exp)
      {
!         Expressions* exps = new Expressions(exp);
          this(loc, exps);
      }
  
*************** extern (C++) final class LabelDsymbol :
*** 1740,1747 ****
   */
  extern (C++) class AsmStatement : Statement
  {
!     Token* tokens;
!     bool caseSensitive;  // for register names
  
      extern (D) this(Loc loc, Token* tokens) @safe
      {
--- 1739,1753 ----
   */
  extern (C++) class AsmStatement : Statement
  {
!     Token* tokens;       // linked list of tokens for one instruction or pseudo op
!     static struct BitFields
!     {
!     bool caseSensitive;  // for register names, and only turned on when doing MASM style inline asm
!     bool isVolatile;     // ImportC asm "volatile"
!     bool isInline;       // ImportC asm "inline"
!     }
!     import dmd.common.bitfields;
!     mixin(generateBitFields!(BitFields, ubyte));
  
      extern (D) this(Loc loc, Token* tokens) @safe
      {
*************** extern (C++) class AsmStatement : Statem
*** 1772,1781 ****
  extern (C++) final class InlineAsmStatement : AsmStatement
  {
      void* asmcode;
      uint asmalign;  // alignment of this statement
-     uint regs;      // mask of registers modified (must match regm_t in back end)
      bool refparam;  // true if function parameter is referenced
!     bool naked;     // true if function is to be naked
  
      extern (D) this(Loc loc, Token* tokens) @safe
      {
--- 1778,1787 ----
  extern (C++) final class InlineAsmStatement : AsmStatement
  {
      void* asmcode;
+     ulong regs;     // mask of registers modified (must match regm_t in back end)
      uint asmalign;  // alignment of this statement
      bool refparam;  // true if function parameter is referenced
!     bool naked;     // true if function is to be naked (no prolog/epilog)
  
      extern (D) this(Loc loc, Token* tokens) @safe
      {
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/statement.h gcc-16-20260201/gcc/d/dmd/statement.h
*** gcc-16-20260125/gcc/d/dmd/statement.h	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/statement.h	Sun Feb  1 22:32:07 2026
*************** class AsmStatement : public Statement
*** 715,721 ****
  {
  public:
      Token *tokens;
!     d_bool caseSensitive;  // for register names
  
      AsmStatement *syntaxCopy() override;
      void accept(Visitor *v) override { v->visit(this); }
--- 715,729 ----
  {
  public:
      Token *tokens;
! private:
!     uint8_t bitFields;
! public:
!     bool caseSensitive() const; // for register names
!     bool caseSensitive(bool v);
!     bool isVolatile() const;    // importC asm volatile
!     bool isVolatile(bool v);
!     bool isInline() const;      // importC asm inline
!     bool isInline(bool v);
  
      AsmStatement *syntaxCopy() override;
      void accept(Visitor *v) override { v->visit(this); }
*************** class InlineAsmStatement final : public
*** 725,732 ****
  {
  public:
      void *asmcode;
!     unsigned asmalign;          // alignment of this statement
!     unsigned regs;              // mask of registers modified (must match regm_t in back end)
      d_bool refparam;              // true if function parameter is referenced
      d_bool naked;                 // true if function is to be naked
  
--- 733,740 ----
  {
  public:
      void *asmcode;
!     unsigned long long regs;      // mask of registers modified (must match regm_t in back end)
!     unsigned asmalign;            // alignment of this statement
      d_bool refparam;              // true if function parameter is referenced
      d_bool naked;                 // true if function is to be naked
  
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/statementsem.d gcc-16-20260201/gcc/d/dmd/statementsem.d
*** gcc-16-20260125/gcc/d/dmd/statementsem.d	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/statementsem.d	Sun Feb  1 22:32:07 2026
*************** Statement statementSemanticVisit(Stateme
*** 219,225 ****
              s.exp = ErrorExp.get();
  
          s.exp = s.exp.optimize(WANTvalue);
!         s.exp = checkGC(sc, s.exp);
          if (s.exp.op == EXP.error)
              return setError();
          result = s;
--- 219,225 ----
              s.exp = ErrorExp.get();
  
          s.exp = s.exp.optimize(WANTvalue);
!         s.exp = s.exp.checkGC(sc);
          if (s.exp.op == EXP.error)
              return setError();
          result = s;
*************** Statement statementSemanticVisit(Stateme
*** 365,374 ****
                          handler = new CompoundStatement(Loc.initial, handler, ts);
                      }
  
-                     auto catches = new Catches();
                      auto ctch = new Catch(Loc.initial, getThrowable(), id, handler);
                      ctch.internalCatch = true;
!                     catches.push(ctch);
  
                      Statement st = new TryCatchStatement(Loc.initial, _body, catches);
                      if (sfinally)
--- 365,373 ----
                          handler = new CompoundStatement(Loc.initial, handler, ts);
                      }
  
                      auto ctch = new Catch(Loc.initial, getThrowable(), id, handler);
                      ctch.internalCatch = true;
!                     auto catches = new Catches(ctch);
  
                      Statement st = new TryCatchStatement(Loc.initial, _body, catches);
                      if (sfinally)
*************** Statement statementSemanticVisit(Stateme
*** 585,591 ****
          if (checkNonAssignmentArrayOp(ds.condition))
              ds.condition = ErrorExp.get();
          ds.condition = ds.condition.optimize(WANTvalue);
!         ds.condition = checkGC(sc, ds.condition);
  
          ds.condition = ds.condition.toBoolean(sc);
  
--- 584,590 ----
          if (checkNonAssignmentArrayOp(ds.condition))
              ds.condition = ErrorExp.get();
          ds.condition = ds.condition.optimize(WANTvalue);
!         ds.condition = ds.condition.checkGC(sc);
  
          ds.condition = ds.condition.toBoolean(sc);
  
*************** Statement statementSemanticVisit(Stateme
*** 621,628 ****
               *    } finally { v2.~this(); }
               *  } finally { v1.~this(); }
               */
!             auto ainit = new Statements();
!             ainit.push(fs._init);
              fs._init = null;
              ainit.push(fs);
              Statement s = new CompoundStatement(fs.loc, ainit);
--- 620,626 ----
               *    } finally { v2.~this(); }
               *  } finally { v1.~this(); }
               */
!             auto ainit = new Statements(fs._init);
              fs._init = null;
              ainit.push(fs);
              Statement s = new CompoundStatement(fs.loc, ainit);
*************** Statement statementSemanticVisit(Stateme
*** 658,664 ****
              if (checkNonAssignmentArrayOp(fs.condition))
                  fs.condition = ErrorExp.get();
              fs.condition = fs.condition.optimize(WANTvalue);
!             fs.condition = checkGC(sc, fs.condition);
  
              fs.condition = fs.condition.toBoolean(sc);
          }
--- 656,662 ----
              if (checkNonAssignmentArrayOp(fs.condition))
                  fs.condition = ErrorExp.get();
              fs.condition = fs.condition.optimize(WANTvalue);
!             fs.condition = fs.condition.checkGC(sc);
  
              fs.condition = fs.condition.toBoolean(sc);
          }
*************** Statement statementSemanticVisit(Stateme
*** 677,683 ****
              if (checkNonAssignmentArrayOp(fs.increment))
                  fs.increment = ErrorExp.get();
              fs.increment = fs.increment.optimize(WANTvalue);
!             fs.increment = checkGC(sc, fs.increment);
          }
  
          sc.sbreak = fs;
--- 675,681 ----
              if (checkNonAssignmentArrayOp(fs.increment))
                  fs.increment = ErrorExp.get();
              fs.increment = fs.increment.optimize(WANTvalue);
!             fs.increment = fs.increment.checkGC(sc);
          }
  
          sc.sbreak = fs;
*************** Statement statementSemanticVisit(Stateme
*** 1013,1019 ****
                      Type tindex = (*fs.parameters)[0].type;
                      if (!tindex.isIntegral())
                      {
!                         error(fs.loc, "foreach: key cannot be of non-integral type `%s`", tindex.toChars());
                          return retError();
                      }
                      /* What cases to deprecate implicit conversions for:
--- 1011,1017 ----
                      Type tindex = (*fs.parameters)[0].type;
                      if (!tindex.isIntegral())
                      {
!                         error(fs.loc, "foreach: index cannot be of non-integral type `%s`", tindex.toChars());
                          return retError();
                      }
                      /* What cases to deprecate implicit conversions for:
*************** Statement statementSemanticVisit(Stateme
*** 1382,1389 ****
                      Expression ve = new VarExp(loc, vd);
                      ve.type = tfront;
  
!                     auto exps = new Expressions();
!                     exps.push(ve);
                      int pos = 0;
                      while (exps.length < dim)
                      {
--- 1380,1386 ----
                      Expression ve = new VarExp(loc, vd);
                      ve.type = tfront;
  
!                     auto exps = new Expressions(ve);
                      int pos = 0;
                      while (exps.length < dim)
                      {
*************** Statement statementSemanticVisit(Stateme
*** 1461,1466 ****
--- 1458,1473 ----
           */
  
          //printf("ForeachRangeStatement::semantic() %p\n", fs);
+ 
+         if (fs.param.storageClass & STC.manifest)
+         {
+             error(fs.loc, "cannot declare `enum` loop variables for non-unrolled foreach");
+         }
+         if (fs.param.storageClass & STC.alias_)
+         {
+             error(fs.loc, "cannot declare `alias` loop variables for non-unrolled foreach");
+         }
+ 
          auto loc = fs.loc;
          fs.lwr = fs.lwr.expressionSemantic(sc);
          fs.lwr = resolveProperties(sc, fs.lwr);
*************** Statement statementSemanticVisit(Stateme
*** 1709,1715 ****
  
          // checkGC after optimizing the condition so that
          // compile time constants are reduced.
!         ifs.condition = checkGC(scd, ifs.condition);
  
          // Save 'root' of two branches (then and else) at the point where it forks
          CtorFlow ctorflow_root = scd.ctorflow.clone();
--- 1716,1722 ----
  
          // checkGC after optimizing the condition so that
          // compile time constants are reduced.
!         ifs.condition = ifs.condition.checkGC(scd);
  
          // Save 'root' of two branches (then and else) at the point where it forks
          CtorFlow ctorflow_root = scd.ctorflow.clone();
*************** Statement statementSemanticVisit(Stateme
*** 1897,1903 ****
          if (checkNonAssignmentArrayOp(ss.condition))
              ss.condition = ErrorExp.get();
          ss.condition = ss.condition.optimize(WANTvalue);
!         ss.condition = checkGC(sc, ss.condition);
          if (ss.condition.op == EXP.error)
              conditionError = true;
  
--- 1904,1910 ----
          if (checkNonAssignmentArrayOp(ss.condition))
              ss.condition = ErrorExp.get();
          ss.condition = ss.condition.optimize(WANTvalue);
!         ss.condition = ss.condition.checkGC(sc);
          if (ss.condition.op == EXP.error)
              conditionError = true;
  
*************** Statement statementSemanticVisit(Stateme
*** 1959,1964 ****
--- 1966,1981 ----
                  ed = ds.isEnumDeclaration(); // typedef'ed enum
              if (!ed && te && ((ds = te.toDsymbol(sc)) !is null))
                  ed = ds.isEnumDeclaration();
+ 
+             // Circular references
+             // Check if enum semantic analysis is not yet complete
+             if (ed && ed.semanticRun < PASS.semantic2done)
+             {
+                 error(ss.loc, "cannot use `final switch` on enum `%s` while it is being defined", ed.toChars());
+                 sc.pop();
+                 return setError();
+             }
+ 
              if (ed && ss.cases.length < ed.members.length)
              {
                  int missingMembers = 0;
*************** Statement statementSemanticVisit(Stateme
*** 2116,2125 ****
          auto arguments = new Expressions();
          arguments.push(ss.condition);
  
-         auto compileTimeArgs = new Objects();
  
          // The type & label no.
!         compileTimeArgs.push(new TypeExp(ss.loc, ss.condition.type.nextOf()));
  
          // The switch labels
          foreach (caseString; *csCopy)
--- 2133,2141 ----
          auto arguments = new Expressions();
          arguments.push(ss.condition);
  
  
          // The type & label no.
!         auto compileTimeArgs = new Objects(new TypeExp(ss.loc, ss.condition.type.nextOf()));
  
          // The switch labels
          foreach (caseString; *csCopy)
*************** Statement statementSemanticVisit(Stateme
*** 2593,2599 ****
  
              if (tbret && tbret.ty == Tvoid || convToVoid)
              {
!                 if (!convToVoid)
                  {
                      error(rs.loc, "cannot return non-void from `void` function");
                      errors = true;
--- 2609,2615 ----
  
              if (tbret && tbret.ty == Tvoid || convToVoid)
              {
!                 if (!convToVoid && !texp.isTypeError())
                  {
                      error(rs.loc, "cannot return non-void from `void` function");
                      errors = true;
*************** Statement statementSemanticVisit(Stateme
*** 2626,2632 ****
              if (e0)
              {
                  e0 = e0.optimize(WANTvalue);
!                 e0 = checkGC(sc, e0);
              }
          }
  
--- 2642,2648 ----
              if (e0)
              {
                  e0 = e0.optimize(WANTvalue);
!                 e0 = e0.checkGC(sc);
              }
          }
  
*************** Statement statementSemanticVisit(Stateme
*** 2699,2708 ****
                       */
                      Scope* sc2 = sc.push();
                      sc2.eSink = global.errorSinkNull;
!                     bool err = checkReturnEscapeRef(*sc2, rs.exp, true);
                      sc2.pop();
  
!                     if (err)
                          turnOffRef(() { checkReturnEscapeRef(*sc, rs.exp, false); });
                      else if (!rs.exp.type.constConv(tf.next))
                          turnOffRef(
--- 2715,2727 ----
                       */
                      Scope* sc2 = sc.push();
                      sc2.eSink = global.errorSinkNull;
!                     bool addressable = checkAddressable(rs.exp, sc2, "`ref` return");
!                     bool escapes = checkReturnEscapeRef(*sc2, rs.exp, true);
                      sc2.pop();
  
!                     if (!addressable)
!                         turnOffRef(() { checkAddressable(rs.exp, sc, "`ref` return"); });
!                     else if (escapes)
                          turnOffRef(() { checkReturnEscapeRef(*sc, rs.exp, false); });
                      else if (!rs.exp.type.constConv(tf.next))
                          turnOffRef(
*************** Statement statementSemanticVisit(Stateme
*** 3044,3050 ****
              ss.exp = ss.exp.expressionSemantic(sc);
              ss.exp = resolveProperties(sc, ss.exp);
              ss.exp = ss.exp.optimize(WANTvalue);
!             ss.exp = checkGC(sc, ss.exp);
              if (ss.exp.op == EXP.error)
              {
                  if (ss._body)
--- 3063,3069 ----
              ss.exp = ss.exp.expressionSemantic(sc);
              ss.exp = resolveProperties(sc, ss.exp);
              ss.exp = ss.exp.optimize(WANTvalue);
!             ss.exp = ss.exp.checkGC(sc);
              if (ss.exp.op == EXP.error)
              {
                  if (ss._body)
*************** Statement statementSemanticVisit(Stateme
*** 3086,3096 ****
                  auto tmp = copyToTemp(STC.none, "__sync", ss.exp);
                  tmp.dsymbolSemantic(sc);
  
!                 auto cs = new Statements();
!                 cs.push(new ExpStatement(ss.loc, tmp));
! 
!                 auto args = new Parameters();
!                 args.push(new Parameter(Loc.initial, STC.none, ClassDeclaration.object.type, null, null, null));
  
                  FuncDeclaration fdenter = FuncDeclaration.genCfunc(args, Type.tvoid, Id.monitorenter);
                  Expression e = new CallExp(ss.loc, fdenter, new VarExp(ss.loc, tmp));
--- 3105,3113 ----
                  auto tmp = copyToTemp(STC.none, "__sync", ss.exp);
                  tmp.dsymbolSemantic(sc);
  
!                 auto cs = new Statements(new ExpStatement(ss.loc, tmp));
!                 auto args = new Parameters(new Parameter(Loc.initial, STC.none, ClassDeclaration.object.type,
!                                                          null, null, null));
  
                  FuncDeclaration fdenter = FuncDeclaration.genCfunc(args, Type.tvoid, Id.monitorenter);
                  Expression e = new CallExp(ss.loc, fdenter, new VarExp(ss.loc, tmp));
*************** Statement statementSemanticVisit(Stateme
*** 3121,3128 ****
              tmp.storage_class |= STC.temp | STC.shared_ | STC.static_;
              Expression tmpExp = new VarExp(ss.loc, tmp);
  
!             auto cs = new Statements();
!             cs.push(new ExpStatement(ss.loc, tmp));
  
              /* This is just a dummy variable for "goto skips declaration" error.
               * Backend optimizer could remove this unused variable.
--- 3138,3144 ----
              tmp.storage_class |= STC.temp | STC.shared_ | STC.static_;
              Expression tmpExp = new VarExp(ss.loc, tmp);
  
!             auto cs = new Statements(new ExpStatement(ss.loc, tmp));
  
              /* This is just a dummy variable for "goto skips declaration" error.
               * Backend optimizer could remove this unused variable.
*************** Statement statementSemanticVisit(Stateme
*** 3131,3138 ****
              v.dsymbolSemantic(sc);
              cs.push(new ExpStatement(ss.loc, v));
  
!             auto enterArgs = new Parameters();
!             enterArgs.push(new Parameter(Loc.initial, STC.none, t.pointerTo(), null, null, null));
  
              FuncDeclaration fdenter = FuncDeclaration.genCfunc(enterArgs, Type.tvoid, Id.criticalenter, STC.nothrow_);
              Expression e = new AddrExp(ss.loc, tmpExp);
--- 3147,3153 ----
              v.dsymbolSemantic(sc);
              cs.push(new ExpStatement(ss.loc, v));
  
!             auto enterArgs = new Parameters(new Parameter(Loc.initial, STC.none, t.pointerTo(), null, null, null));
  
              FuncDeclaration fdenter = FuncDeclaration.genCfunc(enterArgs, Type.tvoid, Id.criticalenter, STC.nothrow_);
              Expression e = new AddrExp(ss.loc, tmpExp);
*************** Statement statementSemanticVisit(Stateme
*** 3141,3148 ****
              e.type = Type.tvoid; // do not run semantic on e
              cs.push(new ExpStatement(ss.loc, e));
  
!             auto exitArgs = new Parameters();
!             exitArgs.push(new Parameter(Loc.initial, STC.none, t, null, null, null));
  
              FuncDeclaration fdexit = FuncDeclaration.genCfunc(exitArgs, Type.tvoid, Id.criticalexit, STC.nothrow_);
              e = new CallExp(ss.loc, fdexit, tmpExp);
--- 3156,3162 ----
              e.type = Type.tvoid; // do not run semantic on e
              cs.push(new ExpStatement(ss.loc, e));
  
!             auto exitArgs = new Parameters(new Parameter(Loc.initial, STC.none, t, null, null, null));
  
              FuncDeclaration fdexit = FuncDeclaration.genCfunc(exitArgs, Type.tvoid, Id.criticalexit, STC.nothrow_);
              e = new CallExp(ss.loc, fdexit, tmpExp);
*************** Statement statementSemanticVisit(Stateme
*** 3168,3174 ****
          ws.exp = ws.exp.expressionSemantic(sc);
          ws.exp = resolveProperties(sc, ws.exp);
          ws.exp = ws.exp.optimize(WANTvalue);
!         ws.exp = checkGC(sc, ws.exp);
          if (ws.exp.op == EXP.error)
              return setError();
          if (ws.exp.op == EXP.scope_)
--- 3182,3188 ----
          ws.exp = ws.exp.expressionSemantic(sc);
          ws.exp = resolveProperties(sc, ws.exp);
          ws.exp = ws.exp.optimize(WANTvalue);
!         ws.exp = ws.exp.checkGC(sc);
          if (ws.exp.op == EXP.error)
              return setError();
          if (ws.exp.op == EXP.scope_)
*************** public bool throwSemantic(Loc loc, ref E
*** 3730,3739 ****
  
      exp = exp.expressionSemantic(sc);
      exp = resolveProperties(sc, exp);
!     exp = checkGC(sc, exp);
      if (exp.isErrorExp())
          return false;
!     if (!exp.type.isNaked())
      {
          // @@@DEPRECATED_2.112@@@
          // Deprecated in 2.102, change into an error & return false in 2.112
--- 3744,3753 ----
  
      exp = exp.expressionSemantic(sc);
      exp = resolveProperties(sc, exp);
!     exp = exp.checkGC(sc);
      if (exp.isErrorExp())
          return false;
!     if (!exp.type.isNaked)
      {
          // @@@DEPRECATED_2.112@@@
          // Deprecated in 2.102, change into an error & return false in 2.112
*************** private extern(D) Expression applyArray(
*** 3854,3863 ****
  
      FuncDeclaration fdapply;
      TypeDelegate dgty;
!     auto params = new Parameters();
!     params.push(new Parameter(Loc.initial, STC.in_, tn.arrayOf(), null, null, null));
!     auto dgparams = new Parameters();
!     dgparams.push(new Parameter(Loc.initial, STC.none, Type.tvoidptr, null, null, null));
      if (dim == 2)
          dgparams.push(new Parameter(Loc.initial, STC.none, Type.tvoidptr, null, null, null));
      dgty = new TypeDelegate(new TypeFunction(ParameterList(dgparams), Type.tint32, LINK.d));
--- 3868,3875 ----
  
      FuncDeclaration fdapply;
      TypeDelegate dgty;
!     auto params = new Parameters(new Parameter(Loc.initial, STC.in_, tn.arrayOf(), null, null, null));
!     auto dgparams = new Parameters(new Parameter(Loc.initial, STC.none, Type.tvoidptr, null, null, null));
      if (dim == 2)
          dgparams.push(new Parameter(Loc.initial, STC.none, Type.tvoidptr, null, null, null));
      dgty = new TypeDelegate(new TypeFunction(ParameterList(dgparams), Type.tint32, LINK.d));
*************** private extern(D) Expression applyArray(
*** 3882,3888 ****
  private extern(D) Expression applyAssocArray(ForeachStatement fs, Expression flde, Type tab)
  {
      auto taa = tab.isTypeAArray();
-     Expression ec;
      const dim = fs.parameters.length;
      // Check types
      Parameter p = (*fs.parameters)[0];
--- 3894,3899 ----
*************** private extern(D) Expression applyAssocA
*** 3893,3900 ****
          Type ti = (isRef ? taa.index.addMod(MODFlags.const_) : taa.index);
          if (isRef ? !ti.constConv(ta) : !ti.implicitConvTo(ta))
          {
!             error(fs.loc, "`foreach`: index must be type `%s`, not `%s`",
!                      ti.toChars(), ta.toChars());
              return null;
          }
          p = (*fs.parameters)[1];
--- 3904,3911 ----
          Type ti = (isRef ? taa.index.addMod(MODFlags.const_) : taa.index);
          if (isRef ? !ti.constConv(ta) : !ti.implicitConvTo(ta))
          {
!             error(fs.loc, "`foreach`: index parameter `%s%s` must be type `%s`, not `%s`",
!                  isRef ? "ref ".ptr : "".ptr, p.toChars(), ti.toChars(), ta.toChars());
              return null;
          }
          p = (*fs.parameters)[1];
*************** private extern(D) Expression applyAssocA
*** 3904,3958 ****
      Type taav = taa.nextOf();
      if (isRef ? !taav.constConv(ta) : !taav.implicitConvTo(ta))
      {
!         error(fs.loc, "`foreach`: value must be type `%s`, not `%s`",
!                  taav.toChars(), ta.toChars());
          return null;
      }
  
      /* Call:
!      *  extern(C) int _aaApply(void*, in size_t, int delegate(void*))
!      *      _aaApply(aggr, keysize, flde)
!      *
!      *  extern(C) int _aaApply2(void*, in size_t, int delegate(void*, void*))
!      *      _aaApply2(aggr, keysize, flde)
       */
!     __gshared FuncDeclaration* fdapply = [null, null];
!     __gshared TypeDelegate* fldeTy = [null, null];
!     ubyte i = (dim == 2 ? 1 : 0);
!     if (!fdapply[i])
!     {
!         auto params = new Parameters();
!         params.push(new Parameter(Loc.initial, STC.none, Type.tvoid.pointerTo(), null, null, null));
!         params.push(new Parameter(Loc.initial, STC.const_, Type.tsize_t, null, null, null));
!         auto dgparams = new Parameters();
!         dgparams.push(new Parameter(Loc.initial, STC.none, Type.tvoidptr, null, null, null));
!         if (dim == 2)
!             dgparams.push(new Parameter(Loc.initial, STC.none, Type.tvoidptr, null, null, null));
!         fldeTy[i] = new TypeDelegate(new TypeFunction(ParameterList(dgparams), Type.tint32, LINK.d));
!         params.push(new Parameter(Loc.initial, STC.none, fldeTy[i], null, null, null));
!         fdapply[i] = FuncDeclaration.genCfunc(params, Type.tint32, i ? Id._aaApply2 : Id._aaApply);
!     }
  
!     auto exps = new Expressions();
!     exps.push(fs.aggr);
!     auto keysize = taa.index.size();
!     if (keysize == SIZE_INVALID)
!         return null;
!     assert(keysize < keysize.max - target.ptrsize);
!     keysize = (keysize + (target.ptrsize - 1)) & ~(target.ptrsize - 1);
!     // paint delegate argument to the type runtime expects
!     Expression fexp = flde;
!     if (!fldeTy[i].equals(flde.type))
!     {
!         fexp = new CastExp(fs.loc, flde, flde.type);
!         fexp.type = fldeTy[i];
!     }
!     exps.push(new IntegerExp(Loc.initial, keysize, Type.tsize_t));
!     exps.push(fexp);
!     ec = new VarExp(Loc.initial, fdapply[i], false);
!     ec = new CallExp(fs.loc, ec, exps);
!     ec.type = Type.tint32; // don't run semantic() on ec
!     return ec;
  }
  
  private extern(D) Statement loopReturn(Expression e, Statements* cases, Loc loc)
--- 3915,3942 ----
      Type taav = taa.nextOf();
      if (isRef ? !taav.constConv(ta) : !taav.implicitConvTo(ta))
      {
!         error(fs.loc, "`foreach`: value parameter `%s%s` must be type `%s`, not `%s`",
!             isRef ? "ref ".ptr : "".ptr, p.toChars(), taav.toChars(), ta.toChars());
          return null;
      }
  
      /* Call:
!      *   int _d_aaApply(V[K] aa, int delegate(V*))
!      * or
!      *   int _d_aaApply2(V[K] aa, int delegate(K*, V*))
       */
!     auto loc = fs.loc;
!     Identifier hook = dim == 2 ? Id._d_aaApply2 : Id._d_aaApply;
!     Expression func = new IdentifierExp(loc, Id.empty);
!     func = new DotIdExp(loc, func, Id.object);
!     auto tiargs = new Objects(taa.index.substWildTo(MODFlags.const_),
!                               taav.substWildTo(MODFlags.const_),
!                               flde.type.substWildTo(MODFlags.const_));
!     func = new DotTemplateInstanceExp(loc, func, hook, tiargs);
  
!     auto arguments = new Expressions(fs.aggr, flde);
!     auto call = new CallExp(loc, func, arguments);
!     return call;
  }
  
  private extern(D) Statement loopReturn(Expression e, Statements* cases, Loc loc)
*************** private extern(D) Statement loopReturn(E
*** 3966,3977 ****
      // Construct a switch statement around the return value
      // of the apply function.
      Statement s;
-     auto a = new Statements();
  
      // default: break; takes care of cases 0 and 1
      s = new BreakStatement(Loc.initial, null);
      s = new DefaultStatement(Loc.initial, s);
!     a.push(s);
  
      // cases 2...
      foreach (i, c; *cases)
--- 3950,3960 ----
      // Construct a switch statement around the return value
      // of the apply function.
      Statement s;
  
      // default: break; takes care of cases 0 and 1
      s = new BreakStatement(Loc.initial, null);
      s = new DefaultStatement(Loc.initial, s);
!     auto a = new Statements(s);
  
      // cases 2...
      foreach (i, c; *cases)
*************** private extern(D) Statement loopReturn(E
*** 3997,4002 ****
--- 3980,3989 ----
   */
  private FuncExp foreachBodyToFunction(Scope* sc, ForeachStatement fs, TypeFunction tfld)
  {
+     auto tab = fs.aggr.type.toBasetype();
+     auto taa = tab.isTypeAArray();
+     const isStaticOrDynamicArray = tab.isTypeSArray() || tab.isTypeDArray();
+ 
      auto params = new Parameters();
      foreach (i, p; *fs.parameters)
      {
*************** private FuncExp foreachBodyToFunction(Sc
*** 4005,4010 ****
--- 3992,3998 ----
  
          p.type = p.type.typeSemantic(fs.loc, sc);
          p.type = p.type.addStorageClass(p.storageClass);
+         p.type = p.type.substWildTo(MODFlags.const_);
          if (tfld)
          {
              Parameter param = tfld.parameterList[i];
*************** private FuncExp foreachBodyToFunction(Sc
*** 4034,4041 ****
          LcopyArg:
              id = Identifier.generateId("__applyArg", cast(int)i);
  
!             Initializer ie = new ExpInitializer(fs.loc, new IdentifierExp(fs.loc, id));
!             auto v = new VarDeclaration(fs.loc, p.type, p.ident, ie);
              v.storage_class |= STC.temp | (stc & STC.scope_);
              Statement s = new ExpStatement(fs.loc, v);
              fs._body = new CompoundStatement(fs.loc, s, fs._body);
--- 4022,4047 ----
          LcopyArg:
              id = Identifier.generateId("__applyArg", cast(int)i);
  
!             // Make sure `p.type` matches the signature expected by the druntime helpers.
!             const isIndexParam = i == 0 && fs.parameters.length == 2;
!             Type userType = p.type;
!             Expression initExp = new IdentifierExp(fs.loc, id);
!             if (taa)
!             {
!                 p.type = isIndexParam ? taa.index : taa.nextOf();
!                 p.type = p.type.substWildTo(MODFlags.const_);
!             }
!             else if (isStaticOrDynamicArray && isIndexParam)
!             {
!                 p.type = Type.tsize_t;
!                 // If the user used an incompatible index type (e.g., `int` instead
!                 // of `size_t` - which is deprecated nowadays), then add a cast.
!                 if (!p.type.implicitConvTo(userType))
!                     initExp = new CastExp(fs.loc, initExp, userType);
!             }
! 
!             Initializer initializer = new ExpInitializer(fs.loc, initExp);
!             auto v = new VarDeclaration(fs.loc, userType, p.ident, initializer);
              v.storage_class |= STC.temp | (stc & STC.scope_);
              Statement s = new ExpStatement(fs.loc, v);
              fs._body = new CompoundStatement(fs.loc, s, fs._body);
*************** void catchSemantic(Catch c, Scope* sc)
*** 4094,4100 ****
          // reference .object.Throwable
          c.type = getThrowable();
      }
!     else if (!c.type.isNaked() && !c.type.isConst())
      {
          // @@@DEPRECATED_2.115@@@
          // Deprecated in 2.105, change into an error & uncomment assign in 2.115
--- 4100,4106 ----
          // reference .object.Throwable
          c.type = getThrowable();
      }
!     else if (!c.type.isNaked && !c.type.isConst())
      {
          // @@@DEPRECATED_2.115@@@
          // Deprecated in 2.105, change into an error & uncomment assign in 2.115
*************** public auto makeTupleForeach(Scope* sc,
*** 4342,4348 ****
      const bool skipCheck = isStatic && needExpansion;
      if (!skipCheck && (dim < 1 || dim > 2))
      {
!         error(fs.loc, "only one (value) or two (key,value) arguments allowed for sequence `foreach`");
          return returnEarly();
      }
  
--- 4348,4355 ----
      const bool skipCheck = isStatic && needExpansion;
      if (!skipCheck && (dim < 1 || dim > 2))
      {
!         error(fs.loc, "only one (element) or two (index, element) arguments allowed for sequence `foreach`, not %llu",
!             ulong(dim));
          return returnEarly();
      }
  
*************** public auto makeTupleForeach(Scope* sc,
*** 4401,4410 ****
          const bool skip = isStatic && needExpansion;
          if (!skip && dim == 2)
          {
!             // Declare key
              if (p.isReference() || p.isLazy())
              {
!                 error(fs.loc, "no storage class for key `%s`", p.ident.toChars());
                  return returnEarly();
              }
  
--- 4408,4418 ----
          const bool skip = isStatic && needExpansion;
          if (!skip && dim == 2)
          {
!             // Declare index
              if (p.isReference() || p.isLazy())
              {
!                 error(fs.loc, "invalid storage class `%s` for index `%s`",
!                     stcToString(p.storageClass).ptr, p.ident.toChars());
                  return returnEarly();
              }
  
*************** public auto makeTupleForeach(Scope* sc,
*** 4419,4425 ****
  
              if (!p.type.isIntegral())
              {
!                 error(fs.loc, "foreach: key cannot be of non-integral type `%s`",
                           p.type.toChars());
                  return returnEarly();
              }
--- 4427,4433 ----
  
              if (!p.type.isIntegral())
              {
!                 error(fs.loc, "foreach: index cannot be of non-integral type `%s`",
                           p.type.toChars());
                  return returnEarly();
              }
*************** public auto makeTupleForeach(Scope* sc,
*** 4464,4470 ****
              if (storageClass & (STC.out_ | STC.lazy_) ||
                  storageClass & STC.ref_ && !te)
              {
!                 error(fs.loc, "no storage class for value `%s`", ident.toChars());
                  return false;
              }
              Declaration var;
--- 4472,4479 ----
              if (storageClass & (STC.out_ | STC.lazy_) ||
                  storageClass & STC.ref_ && !te)
              {
!                 error(fs.loc, "invalid storage class `%s` for element `%s`",
!                     stcToString(p.storageClass).ptr, ident.toChars());
                  return false;
              }
              Declaration var;
*************** public auto makeTupleForeach(Scope* sc,
*** 4562,4568 ****
                  var = new AliasDeclaration(loc, ident, t);
                  if (paramtype)
                  {
!                     error(fs.loc, "cannot specify element type for symbol `%s`", fs.toChars());
                      return false;
                  }
              }
--- 4571,4583 ----
                  var = new AliasDeclaration(loc, ident, t);
                  if (paramtype)
                  {
!                     error(fs.loc, "cannot specify element type for symbol `%s`", ident.toChars());
!                     return false;
!                 }
!                 if (storageClass & STC.manifest)
!                 {
!                     error(fs.loc, "invalid storage class `enum` for element `%s`",
!                         ident.toChars());
                      return false;
                  }
              }
*************** private Statements* flatten(Statement st
*** 4679,4686 ****
  {
      static auto errorStatements()
      {
!         auto a = new Statements();
!         a.push(new ErrorStatement());
          return a;
      }
  
--- 4694,4700 ----
  {
      static auto errorStatements()
      {
!         auto a = new Statements(new ErrorStatement());
          return a;
      }
  
*************** private Statements* flatten(Statement st
*** 4724,4731 ****
                  toCBuffer(s, &buf, &hgs);
                  printf("tm ==> s = %s\n", buf.peekChars());
              }
!             auto a = new Statements();
!             a.push(s);
              return a;
  
          case STMT.Forwarding:
--- 4738,4744 ----
                  toCBuffer(s, &buf, &hgs);
                  printf("tm ==> s = %s\n", buf.peekChars());
              }
!             auto a = new Statements(s);
              return a;
  
          case STMT.Forwarding:
*************** private Statements* flatten(Statement st
*** 4777,4784 ****
              else
                  s = cs.elsebody;
  
!             auto a = new Statements();
!             a.push(s);
              return a;
  
          case STMT.StaticForeach:
--- 4790,4796 ----
              else
                  s = cs.elsebody;
  
!             auto a = new Statements(s);
              return a;
  
          case STMT.StaticForeach:
*************** private Statements* flatten(Statement st
*** 4792,4799 ****
                  {
                      return result;
                  }
!                 result = new Statements();
!                 result.push(s);
                  return result;
              }
              else
--- 4804,4810 ----
                  {
                      return result;
                  }
!                 result = new Statements(s);
                  return result;
              }
              else
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/target.d gcc-16-20260201/gcc/d/dmd/target.d
*** gcc-16-20260125/gcc/d/dmd/target.d	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/target.d	Sun Feb  1 22:32:07 2026
*************** struct TargetC
*** 335,344 ****
      BitFieldStyle bitFieldStyle; /// different C compilers do it differently
  
      /**
!      * Indicates whether the specified bit-field contributes to the alignment
       * of the containing aggregate.
       * E.g., (not all) ARM ABIs do NOT ignore anonymous (incl. 0-length)
!      * bit-fields.
       */
      extern (C++) bool contributesToAggregateAlignment(BitFieldDeclaration bfd);
  }
--- 335,344 ----
      BitFieldStyle bitFieldStyle; /// different C compilers do it differently
  
      /**
!      * Indicates whether the specified bitfield contributes to the alignment
       * of the containing aggregate.
       * E.g., (not all) ARM ABIs do NOT ignore anonymous (incl. 0-length)
!      * bitfields.
       */
      extern (C++) bool contributesToAggregateAlignment(BitFieldDeclaration bfd);
  }
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/template.h gcc-16-20260201/gcc/d/dmd/template.h
*** gcc-16-20260125/gcc/d/dmd/template.h	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/template.h	Sun Feb  1 22:32:07 2026
*************** class Expression;
*** 29,34 ****
--- 29,40 ----
  class FuncDeclaration;
  class Parameter;
  
+ namespace dmd
+ {
+     bool isDiscardable(TemplateInstance*);
+     bool needsCodegen(TemplateInstance*);
+ }
+ 
  class Tuple final : public RootObject
  {
  public:
*************** public:
*** 71,76 ****
--- 77,83 ----
      d_bool isTrivialAliasSeq;     // matches `template AliasSeq(T...) { alias AliasSeq = T; }
      d_bool isTrivialAlias;        // matches pattern `template Alias(T) { alias Alias = qualifiers(T); }`
      d_bool deprecated_;           // this template declaration is deprecated
+     d_bool isCmacro;              // Whether this template is a translation of a C macro
      Visibility visibility;
  
      TemplatePrevious *previous;         // threaded list of previous instantiation attempts on stack
*************** public:
*** 125,131 ****
      virtual bool declareParameter(Scope *sc) = 0;
      virtual void print(RootObject *oarg, RootObject *oded) = 0;
      virtual RootObject *specialization() = 0;
-     virtual RootObject *defaultArg(Loc instLoc, Scope *sc) = 0;
      virtual bool hasDefaultArg() = 0;
  
      DYNCAST dyncast() const override { return DYNCAST_TEMPLATEPARAMETER; }
--- 132,137 ----
*************** public:
*** 147,153 ****
      bool declareParameter(Scope *sc) override final;
      void print(RootObject *oarg, RootObject *oded) override final;
      RootObject *specialization() override final;
-     RootObject *defaultArg(Loc instLoc, Scope *sc) override final;
      bool hasDefaultArg() override final;
      void accept(Visitor *v) override { v->visit(this); }
  };
--- 153,158 ----
*************** public:
*** 178,184 ****
      bool declareParameter(Scope *sc) override;
      void print(RootObject *oarg, RootObject *oded) override;
      RootObject *specialization() override;
-     RootObject *defaultArg(Loc instLoc, Scope *sc) override;
      bool hasDefaultArg() override;
      void accept(Visitor *v) override { v->visit(this); }
  };
--- 183,188 ----
*************** public:
*** 198,204 ****
      bool declareParameter(Scope *sc) override;
      void print(RootObject *oarg, RootObject *oded) override;
      RootObject *specialization() override;
-     RootObject *defaultArg(Loc instLoc, Scope *sc) override;
      bool hasDefaultArg() override;
      void accept(Visitor *v) override { v->visit(this); }
  };
--- 202,207 ----
*************** public:
*** 214,220 ****
      bool declareParameter(Scope *sc) override;
      void print(RootObject *oarg, RootObject *oded) override;
      RootObject *specialization() override;
-     RootObject *defaultArg(Loc instLoc, Scope *sc) override;
      bool hasDefaultArg() override;
      void accept(Visitor *v) override { v->visit(this); }
  };
--- 217,222 ----
*************** public:
*** 266,279 ****
      unsigned char inuse;                 // for recursive expansion detection
  
      TemplateInstance *syntaxCopy(Dsymbol *) override;
-     Dsymbol *toAlias() override final;   // resolve real symbol
      const char *kind() const override;
      const char* toPrettyCharsHelper() override final;
      Identifier *getIdent() override final;
  
-     bool isDiscardable();
-     bool needsCodegen();
- 
      void accept(Visitor *v) override { v->visit(this); }
  };
  
--- 268,277 ----
*************** public:
*** 284,290 ****
  
      TemplateMixin *syntaxCopy(Dsymbol *s) override;
      const char *kind() const override;
-     bool hasPointers() override;
  
      void accept(Visitor *v) override { v->visit(this); }
  };
--- 282,287 ----
*************** namespace dmd
*** 302,305 ****
--- 299,303 ----
      TemplateParameter *isTemplateParameter(RootObject *o);
      bool isError(const RootObject *const o);
      void printTemplateStats(bool listInstances, ErrorSink* eSink);
+     void printInstantiationTrace(TemplateInstance *ti);
  }
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/templatesem.d gcc-16-20260201/gcc/d/dmd/templatesem.d
*** gcc-16-20260125/gcc/d/dmd/templatesem.d	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/templatesem.d	Sun Feb  1 22:32:07 2026
*************** import dmd.visitor;
*** 57,62 ****
--- 57,64 ----
  
  alias funcLeastAsSpecialized = dmd.funcsem.leastAsSpecialized;
  
+ enum LOG = false;
+ 
  /************************************
   * Perform semantic analysis on template.
   * Params:
*************** void templateDeclarationSemantic(Scope*
*** 188,194 ****
      if (tempdecl.members)
      {
          Dsymbol s;
!         if (Dsymbol.oneMembers(tempdecl.members, s, tempdecl.ident) && s)
          {
              tempdecl.onemember = s;
              s.parent = tempdecl;
--- 190,196 ----
      if (tempdecl.members)
      {
          Dsymbol s;
!         if (oneMembers(tempdecl.members, s, tempdecl.ident) && s)
          {
              tempdecl.onemember = s;
              s.parent = tempdecl;
*************** void templateDeclarationSemantic(Scope*
*** 205,210 ****
--- 207,789 ----
      tempdecl.semanticRun = PASS.semanticdone;
  }
  
+ /*******************************************
+  * Match to a particular TemplateParameter.
+  * Input:
+  *      instLoc         location that the template is instantiated.
+  *      tiargs[]        actual arguments to template instance
+  *      i               i'th argument
+  *      parameters[]    template parameters
+  *      dedtypes[]      deduced arguments to template instance
+  *      *psparam        set to symbol declared and initialized to dedtypes[i]
+  */
+ MATCH matchArg(TemplateParameter tp, Loc instLoc, Scope* sc, Objects* tiargs, size_t i, TemplateParameters* parameters, ref Objects dedtypes, Declaration* psparam)
+ {
+     MATCH matchArgNoMatch()
+     {
+         if (psparam)
+             *psparam = null;
+         return MATCH.nomatch;
+     }
+ 
+     MATCH matchArgParameter()
+     {
+         RootObject oarg;
+ 
+         if (i < tiargs.length)
+             oarg = (*tiargs)[i];
+         else
+         {
+             // Get default argument instead
+             oarg = tp.defaultArg(instLoc, sc);
+             if (!oarg)
+             {
+                 assert(i < dedtypes.length);
+                 // It might have already been deduced
+                 oarg = dedtypes[i];
+                 if (!oarg)
+                     return matchArgNoMatch();
+             }
+         }
+         return tp.matchArg(sc, oarg, i, parameters, dedtypes, psparam);
+     }
+ 
+     MATCH matchArgTuple(TemplateTupleParameter ttp)
+     {
+         /* The rest of the actual arguments (tiargs[]) form the match
+          * for the variadic parameter.
+          */
+         assert(i + 1 == dedtypes.length); // must be the last one
+         Tuple ovar;
+ 
+         if (Tuple u = isTuple(dedtypes[i]))
+         {
+             // It has already been deduced
+             ovar = u;
+         }
+         else if (i + 1 == tiargs.length && isTuple((*tiargs)[i]))
+             ovar = isTuple((*tiargs)[i]);
+         else
+         {
+             ovar = new Tuple();
+             //printf("ovar = %p\n", ovar);
+             if (i < tiargs.length)
+             {
+                 //printf("i = %d, tiargs.length = %d\n", i, tiargs.length);
+                 ovar.objects.setDim(tiargs.length - i);
+                 foreach (j, ref obj; ovar.objects)
+                     obj = (*tiargs)[i + j];
+             }
+         }
+         return ttp.matchArg(sc, ovar, i, parameters, dedtypes, psparam);
+     }
+ 
+     if (auto ttp = tp.isTemplateTupleParameter())
+         return matchArgTuple(ttp);
+ 
+     return matchArgParameter();
+ }
+ 
+ MATCH matchArg(TemplateParameter tp, Scope* sc, RootObject oarg, size_t i, TemplateParameters* parameters, ref Objects dedtypes, Declaration* psparam)
+ {
+     MATCH matchArgNoMatch()
+     {
+         //printf("\tm = %d\n", MATCH.nomatch);
+         if (psparam)
+             *psparam = null;
+         return MATCH.nomatch;
+     }
+ 
+     MATCH matchArgType(TemplateTypeParameter ttp)
+     {
+         //printf("TemplateTypeParameter.matchArg('%s')\n", ttp.ident.toChars());
+         MATCH m = MATCH.exact;
+         Type ta = isType(oarg);
+         if (!ta)
+         {
+             //printf("%s %p %p %p\n", oarg.toChars(), isExpression(oarg), isDsymbol(oarg), isTuple(oarg));
+             return matchArgNoMatch();
+         }
+         //printf("ta is %s\n", ta.toChars());
+ 
+         if (ttp.specType)
+         {
+             if (!ta || ta == TemplateTypeParameter.tdummy)
+                 return matchArgNoMatch();
+ 
+             //printf("\tcalling deduceType(): ta is %s, specType is %s\n", ta.toChars(), ttp.specType.toChars());
+             MATCH m2 = deduceType(ta, sc, ttp.specType, *parameters, dedtypes);
+             if (m2 == MATCH.nomatch)
+             {
+                 //printf("\tfailed deduceType\n");
+                 return matchArgNoMatch();
+             }
+ 
+             if (m2 < m)
+                 m = m2;
+             if (dedtypes[i])
+             {
+                 Type t = cast(Type)dedtypes[i];
+ 
+                 if (ttp.dependent && !t.equals(ta)) // https://issues.dlang.org/show_bug.cgi?id=14357
+                     return matchArgNoMatch();
+ 
+                 /* This is a self-dependent parameter. For example:
+                  *  template X(T : T*) {}
+                  *  template X(T : S!T, alias S) {}
+                  */
+                 //printf("t = %s ta = %s\n", t.toChars(), ta.toChars());
+                 ta = t;
+             }
+         }
+         else
+         {
+             if (dedtypes[i])
+             {
+                 // Must match already deduced type
+                 Type t = cast(Type)dedtypes[i];
+ 
+                 if (!t.equals(ta))
+                 {
+                     //printf("t = %s ta = %s\n", t.toChars(), ta.toChars());
+                     return matchArgNoMatch();
+                 }
+             }
+             else
+             {
+                 // So that matches with specializations are better
+                 m = MATCH.convert;
+             }
+         }
+         dedtypes[i] = ta;
+ 
+         if (psparam)
+             *psparam = new AliasDeclaration(ttp.loc, ttp.ident, ta);
+         //printf("\tm = %d\n", m);
+         return ttp.dependent ? MATCH.exact : m;
+     }
+ 
+     MATCH matchArgValue(TemplateValueParameter tvp)
+     {
+         //printf("TemplateValueParameter.matchArg('%s')\n", tvp.ident.toChars());
+         MATCH m = MATCH.exact;
+ 
+         Expression ei = isExpression(oarg);
+         Type vt;
+ 
+         if (!ei && oarg)
+         {
+             Dsymbol si = isDsymbol(oarg);
+             FuncDeclaration f = si ? si.isFuncDeclaration() : null;
+             if (!f || !f.fbody || f.needThis())
+                 return matchArgNoMatch();
+ 
+             ei = new VarExp(tvp.loc, f);
+             ei = ei.expressionSemantic(sc);
+ 
+             /* If a function is really property-like, and then
+              * it's CTFEable, ei will be a literal expression.
+              */
+             const olderrors = global.startGagging();
+             ei = resolveProperties(sc, ei);
+             ei = ei.ctfeInterpret();
+             if (global.endGagging(olderrors) || ei.op == EXP.error)
+                 return matchArgNoMatch();
+ 
+             /* https://issues.dlang.org/show_bug.cgi?id=14520
+              * A property-like function can match to both
+              * TemplateAlias and ValueParameter. But for template overloads,
+              * it should always prefer alias parameter to be consistent
+              * template match result.
+              *
+              *   template X(alias f) { enum X = 1; }
+              *   template X(int val) { enum X = 2; }
+              *   int f1() { return 0; }  // CTFEable
+              *   int f2();               // body-less function is not CTFEable
+              *   enum x1 = X!f1;    // should be 1
+              *   enum x2 = X!f2;    // should be 1
+              *
+              * e.g. The x1 value must be same even if the f1 definition will be moved
+              *      into di while stripping body code.
+              */
+             m = MATCH.convert;
+         }
+ 
+         if (ei && ei.op == EXP.variable)
+         {
+             // Resolve const variables that we had skipped earlier
+             ei = ei.ctfeInterpret();
+         }
+ 
+         //printf("\tvalType: %s, ty = %d\n", tvp.valType.toChars(), tvp.valType.ty);
+         vt = tvp.valType.typeSemantic(tvp.loc, sc);
+         //printf("ei: %s, ei.type: %s\n", ei.toChars(), ei.type.toChars());
+         //printf("vt = %s\n", vt.toChars());
+ 
+         if (ei.type)
+         {
+             MATCH m2 = ei.implicitConvTo(vt);
+             //printf("m: %d\n", m);
+             if (m2 < m)
+                 m = m2;
+             if (m == MATCH.nomatch)
+                 return matchArgNoMatch();
+             ei = ei.implicitCastTo(sc, vt);
+             ei = ei.ctfeInterpret();
+         }
+ 
+         if (tvp.specValue)
+         {
+             if (ei is null || (cast(void*)ei.type in TemplateValueParameter.edummies &&
+                                TemplateValueParameter.edummies[cast(void*)ei.type] == ei))
+                 return matchArgNoMatch();
+ 
+             Expression e = tvp.specValue;
+ 
+             sc = sc.startCTFE();
+             e = e.expressionSemantic(sc);
+             e = resolveProperties(sc, e);
+             sc = sc.endCTFE();
+             e = e.implicitCastTo(sc, vt);
+             e = e.ctfeInterpret();
+ 
+             ei = ei.syntaxCopy();
+             sc = sc.startCTFE();
+             ei = ei.expressionSemantic(sc);
+             sc = sc.endCTFE();
+             ei = ei.implicitCastTo(sc, vt);
+             ei = ei.ctfeInterpret();
+             //printf("\tei: %s, %s\n", ei.toChars(), ei.type.toChars());
+             //printf("\te : %s, %s\n", e.toChars(), e.type.toChars());
+             if (!ei.equals(e))
+                 return matchArgNoMatch();
+         }
+         else
+         {
+             if (dedtypes[i])
+             {
+                 // Must match already deduced value
+                 Expression e = cast(Expression)dedtypes[i];
+                 if (!ei || !ei.equals(e))
+                     return matchArgNoMatch();
+             }
+         }
+         dedtypes[i] = ei;
+ 
+         if (psparam)
+         {
+             Initializer _init = new ExpInitializer(tvp.loc, ei);
+             Declaration sparam = new VarDeclaration(tvp.loc, vt, tvp.ident, _init);
+             sparam.storage_class = STC.manifest;
+             *psparam = sparam;
+         }
+         return tvp.dependent ? MATCH.exact : m;
+     }
+ 
+     MATCH matchArgAlias(TemplateAliasParameter tap)
+     {
+         //printf("TemplateAliasParameter.matchArg('%s')\n", tap.ident.toChars());
+         MATCH m = MATCH.exact;
+         Type ta = isType(oarg);
+         RootObject sa = ta && !ta.deco ? null : getDsymbol(oarg);
+         Expression ea = isExpression(oarg);
+         if (ea)
+         {
+             if (auto te = ea.isThisExp())
+                 sa = te.var;
+             else if (auto se = ea.isSuperExp())
+                 sa = se.var;
+             else if (auto se = ea.isScopeExp())
+                 sa = se.sds;
+         }
+         if (sa)
+         {
+             if ((cast(Dsymbol)sa).isAggregateDeclaration())
+                 m = MATCH.convert;
+ 
+             /* specType means the alias must be a declaration with a type
+              * that matches specType.
+              */
+             if (tap.specType)
+             {
+                 tap.specType = typeSemantic(tap.specType, tap.loc, sc);
+                 Declaration d = (cast(Dsymbol)sa).isDeclaration();
+                 if (!d)
+                     return matchArgNoMatch();
+                 if (!d.type.equals(tap.specType))
+                     return matchArgNoMatch();
+             }
+         }
+         else
+         {
+             sa = oarg;
+             if (ea)
+             {
+                 if (tap.specType)
+                 {
+                     if (!ea.type.equals(tap.specType))
+                         return matchArgNoMatch();
+                 }
+             }
+             else if (ta && ta.ty == Tinstance && !tap.specAlias)
+             {
+                 /* Specialized parameter should be preferred
+                  * match to the template type parameter.
+                  *  template X(alias a) {}                      // a == this
+                  *  template X(alias a : B!A, alias B, A...) {} // B!A => ta
+                  */
+             }
+             else if (sa && sa == TemplateTypeParameter.tdummy)
+             {
+                 /* https://issues.dlang.org/show_bug.cgi?id=2025
+                  * Aggregate Types should preferentially
+                  * match to the template type parameter.
+                  *  template X(alias a) {}  // a == this
+                  *  template X(T) {}        // T => sa
+                  */
+             }
+             else if (ta && ta.ty != Tident)
+             {
+                 /* Match any type that's not a TypeIdentifier to alias parameters,
+                  * but prefer type parameter.
+                  * template X(alias a) { }  // a == ta
+                  *
+                  * TypeIdentifiers are excluded because they might be not yet resolved aliases.
+                  */
+                 m = MATCH.convert;
+             }
+             else
+                 return matchArgNoMatch();
+         }
+ 
+         if (tap.specAlias)
+         {
+             if (sa == TemplateAliasParameter.sdummy)
+                 return matchArgNoMatch();
+             // check specialization if template arg is a symbol
+             Dsymbol sx = isDsymbol(sa);
+             if (sa != tap.specAlias && sx)
+             {
+                 Type talias = isType(tap.specAlias);
+                 if (!talias)
+                     return matchArgNoMatch();
+ 
+                 TemplateInstance ti = sx.isTemplateInstance();
+                 if (!ti && sx.parent)
+                 {
+                     ti = sx.parent.isTemplateInstance();
+                     if (ti && ti.name != sx.ident)
+                         return matchArgNoMatch();
+                 }
+                 if (!ti)
+                     return matchArgNoMatch();
+ 
+                 Type t = new TypeInstance(Loc.initial, ti);
+                 MATCH m2 = deduceType(t, sc, talias, *parameters, dedtypes);
+                 if (m2 == MATCH.nomatch)
+                     return matchArgNoMatch();
+             }
+             // check specialization if template arg is a type
+             else if (ta)
+             {
+                 if (Type tspec = isType(tap.specAlias))
+                 {
+                     MATCH m2 = ta.implicitConvTo(tspec);
+                     if (m2 == MATCH.nomatch)
+                         return matchArgNoMatch();
+                 }
+                 else
+                 {
+                     error(tap.loc, "template parameter specialization for a type must be a type and not `%s`",
+                         tap.specAlias.toChars());
+                     return matchArgNoMatch();
+                 }
+             }
+         }
+         else if (dedtypes[i])
+         {
+             // Must match already deduced symbol
+             RootObject si = dedtypes[i];
+             if (!sa || si != sa)
+                 return matchArgNoMatch();
+         }
+         dedtypes[i] = sa;
+ 
+         if (psparam)
+         {
+             if (Dsymbol s = isDsymbol(sa))
+             {
+                 *psparam = new AliasDeclaration(tap.loc, tap.ident, s);
+             }
+             else if (Type t = isType(sa))
+             {
+                 *psparam = new AliasDeclaration(tap.loc, tap.ident, t);
+             }
+             else
+             {
+                 assert(ea);
+ 
+                 // Declare manifest constant
+                 Initializer _init = new ExpInitializer(tap.loc, ea);
+                 auto v = new VarDeclaration(tap.loc, null, tap.ident, _init);
+                 v.storage_class = STC.manifest;
+                 v.dsymbolSemantic(sc);
+                 *psparam = v;
+             }
+         }
+         return tap.dependent ? MATCH.exact : m;
+     }
+ 
+     MATCH matchArgTuple(TemplateTupleParameter ttp)
+     {
+         //printf("TemplateTupleParameter.matchArg('%s')\n", ttp.ident.toChars());
+         Tuple ovar = isTuple(oarg);
+         if (!ovar)
+             return MATCH.nomatch;
+         if (dedtypes[i])
+         {
+             Tuple tup = isTuple(dedtypes[i]);
+             if (!tup)
+                 return MATCH.nomatch;
+             if (!match(tup, ovar))
+                 return MATCH.nomatch;
+         }
+         dedtypes[i] = ovar;
+ 
+         if (psparam)
+             *psparam = new TupleDeclaration(ttp.loc, ttp.ident, &ovar.objects);
+         return ttp.dependent ? MATCH.exact : MATCH.convert;
+     }
+ 
+     if (auto ttp = tp.isTemplateTypeParameter())
+         return matchArgType(ttp);
+     if (auto tvp = tp.isTemplateValueParameter())
+         return matchArgValue(tvp);
+     if (auto tap = tp.isTemplateAliasParameter())
+         return matchArgAlias(tap);
+     if (auto ttp = tp.isTemplateTupleParameter())
+         return matchArgTuple(ttp);
+     assert(0);
+ }
+ 
+ /**********************************************
+  * Confirm s is a valid template, then store it.
+  * Input:
+  *      sc
+  *      s   candidate symbol of template. It may be:
+  *          TemplateDeclaration
+  *          FuncDeclaration with findTemplateDeclRoot() != NULL
+  *          OverloadSet which contains candidates
+  * Returns:
+  *      true if updating succeeds.
+  */
+ bool updateTempDecl(TemplateInstance ti, Scope* sc, Dsymbol s)
+ {
+     if (!s)
+         return ti.tempdecl !is null;
+ 
+     Identifier id = ti.name;
+     s = s.toAlias();
+ 
+     /* If an OverloadSet, look for a unique member that is a template declaration
+      */
+     if (OverloadSet os = s.isOverloadSet())
+     {
+         s = null;
+         foreach (s2; os.a)
+         {
+             if (FuncDeclaration f = s2.isFuncDeclaration())
+                 s2 = f.findTemplateDeclRoot();
+             else
+                 s2 = s2.isTemplateDeclaration();
+             if (s2)
+             {
+                 if (s)
+                 {
+                     ti.tempdecl = os;
+                     return true;
+                 }
+                 s = s2;
+             }
+         }
+         if (!s)
+         {
+             .error(ti.loc, "%s `%s` template `%s` is not defined", ti.kind, ti.toPrettyChars, id.toChars());
+             return false;
+         }
+     }
+ 
+     if (OverDeclaration od = s.isOverDeclaration())
+     {
+         ti.tempdecl = od; // TODO: more strict check
+         return true;
+     }
+ 
+     /* It should be a TemplateDeclaration, not some other symbol
+      */
+     if (FuncDeclaration f = s.isFuncDeclaration())
+         ti.tempdecl = f.findTemplateDeclRoot();
+     else
+         ti.tempdecl = s.isTemplateDeclaration();
+ 
+     // We're done
+     if (ti.tempdecl)
+         return true;
+ 
+     // Error already issued, just return `false`
+     if (!s.parent && global.errors)
+         return false;
+ 
+     if (!s.parent && s.getType())
+     {
+         Dsymbol s2 = s.getType().toDsymbol(sc);
+         if (!s2)
+         {
+             .error(ti.loc, "`%s` is not a valid template instance, because `%s` is not a template declaration but a type (`%s == %s`)", ti.toChars(), id.toChars(), id.toChars(), s.getType.kind());
+             return false;
+         }
+         // because s can be the alias created for a TemplateParameter
+         const AliasDeclaration ad = s.isAliasDeclaration();
+         version (none)
+         {
+             if (ad && ad.isAliasedTemplateParameter())
+                 printf("`%s` is an alias created from a template parameter\n", s.toChars());
+         }
+         if (!ad || !ad.isAliasedTemplateParameter())
+             s = s2;
+     }
+ 
+     TemplateInstance ti2 = s.parent ? s.parent.isTemplateInstance() : null;
+ 
+     /* This avoids the VarDeclaration.toAlias() which runs semantic() too soon
+      */
+     static bool matchId(TemplateInstance _ti, Identifier id)
+     {
+         if (_ti.aliasdecl && _ti.aliasdecl.isVarDeclaration())
+             return _ti.aliasdecl.isVarDeclaration().ident == id;
+         return _ti.toAlias().ident == id;
+     }
+ 
+     if (ti2 && (ti2.name == s.ident || matchId(ti2, s.ident)) && ti2.tempdecl)
+     {
+         /* This is so that one can refer to the enclosing
+          * template, even if it has the same name as a member
+          * of the template, if it has a !(arguments)
+          */
+         TemplateDeclaration td = ti2.tempdecl.isTemplateDeclaration();
+         assert(td);
+         if (td.overroot) // if not start of overloaded list of TemplateDeclaration's
+             td = td.overroot; // then get the start
+         ti.tempdecl = td;
+         return true;
+     }
+     else
+     {
+         .error(ti.loc, "%s `%s` `%s` is not a template declaration, it is a %s",
+                ti.kind, ti.toPrettyChars, id.toChars(), s.kind());
+         return false;
+     }
+ }
  
  /***************************************
   * Given that ti is an instance of this TemplateDeclaration,
*************** MATCH matchWithInstance(Scope* sc, Templ
*** 402,407 ****
--- 981,1212 ----
      return m;
  }
  
+ /**
+     Returns: true if the instances' innards are discardable.
+ 
+     The idea of this function is to see if the template instantiation
+     can be 100% replaced with its eponymous member. All other members
+     can be discarded, even in the compiler to free memory (for example,
+     the template could be expanded in a region allocator, deemed trivial,
+     the end result copied back out independently and the entire region freed),
+     and can be elided entirely from the binary.
+ 
+     The current implementation affects code that generally looks like:
+ 
+     ---
+     template foo(args...) {
+         some_basic_type_or_string helper() { .... }
+         enum foo = helper();
+     }
+     ---
+ 
+     since it was the easiest starting point of implementation but it can and
+     should be expanded more later.
+ */
+ bool isDiscardable(TemplateInstance ti)
+ {
+     if (ti.aliasdecl is null)
+         return false;
+ 
+     auto v = ti.aliasdecl.isVarDeclaration();
+     if (v is null)
+         return false;
+ 
+     if (!(v.storage_class & STC.manifest))
+         return false;
+ 
+     // Currently only doing basic types here because it is the easiest proof-of-concept
+     // implementation with minimal risk of side effects, but it could likely be
+     // expanded to any type that already exists outside this particular instance.
+     if (!(v.type.equals(Type.tstring) || (v.type.isTypeBasic() !is null)))
+         return false;
+ 
+     // Static ctors and dtors, even in an eponymous enum template, are still run,
+     // so if any of them are in here, we'd better not assume it is trivial lest
+     // we break useful code
+     foreach(member; *ti.members)
+     {
+         if(member.hasStaticCtorOrDtor())
+             return false;
+         if(member.isStaticDtorDeclaration())
+             return false;
+         if(member.isStaticCtorDeclaration())
+             return false;
+     }
+ 
+     // but if it passes through this gauntlet... it should be fine. D code will
+     // see only the eponymous member, outside stuff can never access it, even through
+     // reflection; the outside world ought to be none the wiser. Even dmd should be
+     // able to simply free the memory of everything except the final result.
+ 
+     return true;
+ }
+ 
+ 
+ /***********************************************
+  * Returns true if this is not instantiated in non-root module, and
+  * is a part of non-speculative instantiatiation.
+  *
+  * Note: minst does not stabilize until semantic analysis is completed,
+  * so don't call this function during semantic analysis to return precise result.
+  */
+ bool needsCodegen(TemplateInstance ti)
+ {
+     //printf("needsCodegen() %s\n", toChars());
+ 
+     // minst is finalized after the 1st invocation.
+     // tnext is only needed for the 1st invocation and
+     // cleared for further invocations.
+     TemplateInstance tnext = ti.tnext;
+     TemplateInstance tinst = ti.tinst;
+     ti.tnext = null;
+ 
+     // Don't do codegen if the instance has errors,
+     // is a dummy instance (see evaluateConstraint),
+     // or is determined to be discardable.
+     if (ti.errors || ti.inst is null || ti.inst.isDiscardable())
+     {
+         ti.minst = null; // mark as speculative
+         return false;
+     }
+ 
+     // This should only be called on the primary instantiation.
+     assert(ti is ti.inst);
+ 
+     /* Hack for suppressing linking errors against template instances
+     * of `_d_arrayliteralTX` (e.g. `_d_arrayliteralTX!(int[])`).
+     *
+     * This happens, for example, when a lib module is compiled with `preview=dip1000` and
+     * the array literal is placed on stack instead of using the lowering. In this case,
+     * if the root module is compiled without `preview=dip1000`, the compiler will consider
+     * the template already instantiated within the lib module, and thus skip the codegen for it
+     * in the root module object file, thinking that the linker will find the instance in the lib module.
+     *
+     * To bypass this edge case, we always do codegen for `_d_arrayliteralTX` template instances,
+     * even if an instance already exists in non-root module.
+     */
+     if (ti.inst && ti.inst.name == Id._d_arrayliteralTX)
+     {
+         return true;
+     }
+ 
+     if (global.params.allInst)
+     {
+         // Do codegen if there is an instantiation from a root module, to maximize link-ability.
+         static ThreeState needsCodegenAllInst(TemplateInstance tithis, TemplateInstance tinst)
+         {
+             // Do codegen if `this` is instantiated from a root module.
+             if (tithis.minst && tithis.minst.isRoot())
+                 return ThreeState.yes;
+ 
+             // Do codegen if the ancestor needs it.
+             if (tinst && tinst.inst && tinst.inst.needsCodegen())
+             {
+                 tithis.minst = tinst.inst.minst; // cache result
+                 assert(tithis.minst);
+                 assert(tithis.minst.isRoot());
+                 return ThreeState.yes;
+             }
+             return ThreeState.none;
+         }
+ 
+         if (const needsCodegen = needsCodegenAllInst(ti, tinst))
+             return needsCodegen == ThreeState.yes ? true : false;
+ 
+         // Do codegen if a sibling needs it.
+         for (; tnext; tnext = tnext.tnext)
+         {
+             const needsCodegen = needsCodegenAllInst(tnext, tnext.tinst);
+             if (needsCodegen == ThreeState.yes)
+             {
+                 ti.minst = tnext.minst; // cache result
+                 assert(ti.minst);
+                 assert(ti.minst.isRoot());
+                 return true;
+             }
+             else if (!ti.minst && tnext.minst)
+             {
+                 ti.minst = tnext.minst; // cache result from non-speculative sibling
+                 // continue searching
+             }
+             else if (needsCodegen != ThreeState.none)
+                 break;
+         }
+ 
+         // Elide codegen because there's no instantiation from any root modules.
+         return false;
+     }
+ 
+     // Prefer instantiations from non-root modules, to minimize object code size.
+ 
+     /* If a TemplateInstance is ever instantiated from a non-root module,
+      * we do not have to generate code for it,
+      * because it will be generated when the non-root module is compiled.
+      *
+      * But, if the non-root 'minst' imports any root modules, it might still need codegen.
+      *
+      * The problem is if A imports B, and B imports A, and both A
+      * and B instantiate the same template, does the compilation of A
+      * or the compilation of B do the actual instantiation?
+      *
+      * See https://issues.dlang.org/show_bug.cgi?id=2500.
+      *
+      * => Elide codegen if there is at least one instantiation from a non-root module
+      *    which doesn't import any root modules.
+      */
+     static ThreeState needsCodegenRootOnly(TemplateInstance tithis, TemplateInstance tinst)
+     {
+         // If the ancestor isn't speculative,
+         // 1. do codegen if the ancestor needs it
+         // 2. elide codegen if the ancestor doesn't need it (non-root instantiation of ancestor incl. subtree)
+         if (tinst && tinst.inst)
+         {
+             tinst = tinst.inst;
+             const needsCodegen = tinst.needsCodegen(); // sets tinst.minst
+             if (tinst.minst) // not speculative
+             {
+                 tithis.minst = tinst.minst; // cache result
+                 return needsCodegen ? ThreeState.yes : ThreeState.no;
+             }
+         }
+ 
+         // Elide codegen if `this` doesn't need it.
+         if (tithis.minst && !tithis.minst.isRoot() && !tithis.minst.rootImports())
+             return ThreeState.no;
+ 
+         return ThreeState.none;
+     }
+ 
+     if (const needsCodegen = needsCodegenRootOnly(ti, tinst))
+         return needsCodegen == ThreeState.yes ? true : false;
+ 
+     // Elide codegen if a (non-speculative) sibling doesn't need it.
+     for (; tnext; tnext = tnext.tnext)
+     {
+         const needsCodegen = needsCodegenRootOnly(tnext, tnext.tinst); // sets tnext.minst
+         if (tnext.minst) // not speculative
+         {
+             if (needsCodegen == ThreeState.no)
+             {
+                 ti.minst = tnext.minst; // cache result
+                 assert(!ti.minst.isRoot() && !ti.minst.rootImports());
+                 return false;
+             }
+             else if (!ti.minst)
+             {
+                 ti.minst = tnext.minst; // cache result from non-speculative sibling
+                 // continue searching
+             }
+             else if (needsCodegen != ThreeState.none)
+                 break;
+         }
+     }
+ 
+     // Unless `this` is still speculative (=> all further siblings speculative too),
+     // do codegen because we found no guaranteed-codegen'd non-root instantiation.
+     return ti.minst !is null;
+ }
+ 
  /****************************
   * Check to see if constraint is satisfied.
   */
*************** bool evaluateConstraint(TemplateDeclarat
*** 528,533 ****
--- 1333,1649 ----
      return result;
  }
  
+ /****************************
+  * Destructively get the error message from the last constraint evaluation
+  * Params:
+  *      td = TemplateDeclaration
+  *      tip = tip to show after printing all overloads
+  */
+ const(char)* getConstraintEvalError(TemplateDeclaration td, ref const(char)* tip)
+ {
+     import dmd.staticcond;
+ 
+     // there will be a full tree view in verbose mode, and more compact list in the usual
+     const full = global.params.v.verbose;
+     uint count;
+     const msg = visualizeStaticCondition(td.constraint, td.lastConstraint, td.lastConstraintNegs[], full, count);
+     scope (exit)
+     {
+         td.lastConstraint = null;
+         td.lastConstraintTiargs = null;
+         td.lastConstraintNegs.setDim(0);
+     }
+     if (!msg)
+         return null;
+ 
+     OutBuffer buf;
+ 
+     assert(td.parameters && td.lastConstraintTiargs);
+     if (td.parameters.length > 0)
+     {
+         formatParamsWithTiargs(*td.parameters, *td.lastConstraintTiargs, td.isVariadic() !is null, buf);
+         buf.writenl();
+     }
+     if (!full)
+     {
+         // choosing singular/plural
+         const s = (count == 1) ?
+             "  must satisfy the following constraint:" :
+             "  must satisfy one of the following constraints:";
+         buf.writestring(s);
+         buf.writenl();
+         // the constraints
+         buf.writeByte('`');
+         buf.writestring(msg);
+         buf.writeByte('`');
+     }
+     else
+     {
+         buf.writestring("  whose parameters have the following constraints:");
+         buf.writenl();
+         const sep = "  `~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~`";
+         buf.writestring(sep);
+         buf.writenl();
+         // the constraints
+         buf.writeByte('`');
+         buf.writestring(msg);
+         buf.writeByte('`');
+         buf.writestring(sep);
+         tip = "not satisfied constraints are marked with `>`";
+     }
+     return buf.extractChars();
+ }
+ 
+ /**********************************
+  * Find the TemplateDeclaration that matches this TemplateInstance best.
+  *
+  * Params:
+  *   ti    = TemplateInstance
+  *   sc    = the scope this TemplateInstance resides in
+  *   argumentList = function arguments in case of a template function
+  *
+  * Returns:
+  *   `true` if a match was found, `false` otherwise
+  */
+ bool findBestMatch(TemplateInstance ti, Scope* sc, ArgumentList argumentList)
+ {
+     if (ti.havetempdecl)
+     {
+         TemplateDeclaration tempdecl = ti.tempdecl.isTemplateDeclaration();
+         assert(tempdecl);
+         assert(tempdecl._scope);
+         // Deduce tdtypes
+         ti.tdtypes.setDim(tempdecl.parameters.length);
+         if (!matchWithInstance(sc, tempdecl, ti, ti.tdtypes, argumentList, 2))
+         {
+             .error(ti.loc, "%s `%s` incompatible arguments for template instantiation",
+                    ti.kind, ti.toPrettyChars);
+             return false;
+         }
+         // TODO: Normalizing tiargs for https://issues.dlang.org/show_bug.cgi?id=7469 is necessary?
+         return true;
+     }
+ 
+     static if (LOG)
+     {
+         printf("TemplateInstance.findBestMatch()\n");
+     }
+ 
+     const errs = global.errors;
+     TemplateDeclaration td_last = null;
+     Objects dedtypes;
+ 
+     /* Since there can be multiple TemplateDeclaration's with the same
+      * name, look for the best match.
+      */
+     auto tovers = ti.tempdecl.isOverloadSet();
+     foreach (size_t oi; 0 .. tovers ? tovers.a.length : 1)
+     {
+         TemplateDeclaration td_best;
+         TemplateDeclaration td_ambig;
+         MATCH m_best = MATCH.nomatch;
+ 
+         Dsymbol dstart = tovers ? tovers.a[oi] : ti.tempdecl;
+         overloadApply(dstart, (Dsymbol s)
+         {
+             auto td = s.isTemplateDeclaration();
+             if (!td)
+                 return 0;
+             if (td == td_best)   // skip duplicates
+                 return 0;
+ 
+             //printf("td = %s\n", td.toPrettyChars());
+             // If more arguments than parameters,
+             // then this is no match.
+             if (td.parameters.length < ti.tiargs.length)
+             {
+                 if (!td.isVariadic())
+                     return 0;
+             }
+ 
+             dedtypes.setDim(td.parameters.length);
+             dedtypes.zero();
+             assert(td.semanticRun != PASS.initial);
+ 
+             MATCH m = matchWithInstance(sc, td, ti, dedtypes, argumentList, 0);
+             //printf("matchWithInstance = %d\n", m);
+             if (m == MATCH.nomatch) // no match at all
+                 return 0;
+             if (m < m_best) goto Ltd_best;
+             if (m > m_best) goto Ltd;
+ 
+             // Disambiguate by picking the most specialized TemplateDeclaration
+             {
+             MATCH c1 = leastAsSpecialized(sc, td, td_best, argumentList);
+             MATCH c2 = leastAsSpecialized(sc, td_best, td, argumentList);
+             //printf("c1 = %d, c2 = %d\n", c1, c2);
+             if (c1 > c2) goto Ltd;
+             if (c1 < c2) goto Ltd_best;
+             }
+ 
+             td_ambig = td;
+             return 0;
+ 
+         Ltd_best:
+             // td_best is the best match so far
+             td_ambig = null;
+             return 0;
+ 
+         Ltd:
+             // td is the new best match
+             td_ambig = null;
+             td_best = td;
+             m_best = m;
+             ti.tdtypes.setDim(dedtypes.length);
+             memcpy(ti.tdtypes.tdata(), dedtypes.tdata(), ti.tdtypes.length * (void*).sizeof);
+             return 0;
+         });
+ 
+         if (td_ambig)
+         {
+             .error(ti.loc, "%s `%s.%s` matches more than one template declaration:",
+                 td_best.kind(), td_best.parent.toPrettyChars(), td_best.ident.toChars());
+             .errorSupplemental(td_best.loc, "`%s`\nand:", td_best.toChars());
+             .errorSupplemental(td_ambig.loc, "`%s`", td_ambig.toChars());
+             return false;
+         }
+         if (td_best)
+         {
+             if (!td_last)
+                 td_last = td_best;
+             else if (td_last != td_best)
+             {
+                 ScopeDsymbol.multiplyDefined(ti.loc, td_last, td_best);
+                 return false;
+             }
+         }
+     }
+ 
+     if (td_last)
+     {
+         /* https://issues.dlang.org/show_bug.cgi?id=7469
+          * Normalize tiargs by using corresponding deduced
+          * template value parameters and tuples for the correct mangling.
+          *
+          * By doing this before hasNestedArgs, CTFEable local variable will be
+          * accepted as a value parameter. For example:
+          *
+          *  void foo() {
+          *    struct S(int n) {}   // non-global template
+          *    const int num = 1;   // CTFEable local variable
+          *    S!num s;             // S!1 is instantiated, not S!num
+          *  }
+          */
+         size_t dim = td_last.parameters.length - (td_last.isVariadic() ? 1 : 0);
+         for (size_t i = 0; i < dim; i++)
+         {
+             if (ti.tiargs.length <= i)
+                 ti.tiargs.push(ti.tdtypes[i]);
+             assert(i < ti.tiargs.length);
+ 
+             auto tvp = (*td_last.parameters)[i].isTemplateValueParameter();
+             if (!tvp)
+                 continue;
+             assert(ti.tdtypes[i]);
+             // tdtypes[i] is already normalized to the required type in matchArg
+ 
+             (*ti.tiargs)[i] = ti.tdtypes[i];
+         }
+         if (td_last.isVariadic() && ti.tiargs.length == dim && ti.tdtypes[dim])
+         {
+             Tuple va = isTuple(ti.tdtypes[dim]);
+             assert(va);
+             ti.tiargs.pushSlice(va.objects[]);
+         }
+     }
+     else if (ti.errors && ti.inst)
+     {
+         // instantiation was failed with error reporting
+         assert(global.errors);
+         return false;
+     }
+     else
+     {
+         auto tdecl = ti.tempdecl.isTemplateDeclaration();
+ 
+         if (errs != global.errors)
+             errorSupplemental(ti.loc, "while looking for match for `%s`", ti.toChars());
+         else if (tdecl && !tdecl.overnext)
+         {
+             // Only one template, so we can give better error message
+             const(char)* msg = "does not match template declaration";
+             const(char)* tip;
+             OutBuffer buf;
+             HdrGenState hgs;
+             hgs.skipConstraints = true;
+             toCharsMaybeConstraints(tdecl, buf, hgs);
+             const tmsg = buf.peekChars();
+             const cmsg = tdecl.getConstraintEvalError(tip);
+             if (cmsg)
+             {
+                 .error(ti.loc, "%s `%s` %s `%s`\n%s", ti.kind, ti.toPrettyChars, msg, tmsg, cmsg);
+                 if (tip)
+                     .tip(tip);
+             }
+             else
+             {
+                 .error(ti.loc, "%s `%s` %s `%s`", ti.kind, ti.toPrettyChars, msg, tmsg);
+ 
+                 if (tdecl.parameters.length == ti.tiargs.length)
+                 {
+                     // https://issues.dlang.org/show_bug.cgi?id=7352
+                     // print additional information, e.g. `foo` is not a type
+                     foreach (i, param; *tdecl.parameters)
+                     {
+                         MATCH match = param.matchArg(ti.loc, sc, ti.tiargs, i, tdecl.parameters, dedtypes, null);
+                         auto arg = (*ti.tiargs)[i];
+                         auto sym = arg.isDsymbol;
+                         auto exp = arg.isExpression;
+ 
+                         if (exp)
+                             exp = exp.optimize(WANTvalue);
+ 
+                         if (match == MATCH.nomatch &&
+                             ((sym && sym.isFuncDeclaration) ||
+                              (exp && exp.isVarExp)))
+                         {
+                             if (param.isTemplateTypeParameter)
+                                 errorSupplemental(ti.loc, "`%s` is not a type", arg.toChars);
+                             else if (auto tvp = param.isTemplateValueParameter)
+                                 errorSupplemental(ti.loc, "`%s` is not of a value of type `%s`",
+                                                   arg.toChars, tvp.valType.toChars);
+ 
+                         }
+                     }
+                 }
+             }
+         }
+         else
+         {
+             .error(ti.loc, "%s `%s` does not match any template declaration", ti.kind(), ti.toPrettyChars());
+             bool found;
+             overloadApply(ti.tempdecl, (s){
+                 if (!found)
+                     errorSupplemental(ti.loc, "Candidates are:");
+                 found = true;
+                 errorSupplemental(s.loc, "%s", s.toChars());
+                 return 0;
+             });
+         }
+         return false;
+     }
+ 
+     /* The best match is td_last
+      */
+     ti.tempdecl = td_last;
+ 
+     static if (LOG)
+     {
+         printf("\tIt's a match with template declaration '%s'\n", tempdecl.toChars());
+     }
+     return (errs == global.errors);
+ }
+ 
  /*******************************************
   * Append to buf a textual representation of template parameters with their arguments.
   * Params:
*************** bool evaluateConstraint(TemplateDeclarat
*** 536,542 ****
   *  variadic = if it's a variadic argument list
   *  buf = where the text output goes
   */
! void formatParamsWithTiargs(ref TemplateParameters parameters, ref Objects tiargs, bool variadic, ref OutBuffer buf)
  {
      buf.writestring("  with `");
  
--- 1652,1658 ----
   *  variadic = if it's a variadic argument list
   *  buf = where the text output goes
   */
! private void formatParamsWithTiargs(ref TemplateParameters parameters, ref Objects tiargs, bool variadic, ref OutBuffer buf)
  {
      buf.writestring("  with `");
  
*************** L1:
*** 677,682 ****
--- 1793,1871 ----
      return MATCH.nomatch;
  }
  
+ RootObject defaultArg(TemplateParameter tp, Loc instLoc, Scope* sc)
+ {
+     if (tp.isTemplateTupleParameter())
+         return null;
+     if (auto tpp = tp.isTemplateTypeParameter())
+     {
+         Type t = tpp.defaultType;
+         if (t)
+         {
+             t = t.syntaxCopy();
+             t = t.typeSemantic(tpp.loc, sc); // use the parameter loc
+         }
+         return t;
+     }
+     if (auto tap = tp.isTemplateAliasParameter())
+     {
+         RootObject da = tap.defaultAlias;
+         if (auto ta = isType(tap.defaultAlias))
+         {
+             switch (ta.ty)
+             {
+             // If the default arg is a template, instantiate for each type
+             case Tinstance:
+             // same if the default arg is a mixin, traits, typeof
+             // since the content might rely on a previous parameter
+             // (https://issues.dlang.org/show_bug.cgi?id=23686)
+             case Tmixin, Ttypeof, Ttraits :
+                 da = ta.syntaxCopy();
+                 break;
+             default:
+             }
+         }
+ 
+         RootObject o = aliasParameterSemantic(tap.loc, sc, da, null); // use the parameter loc
+         return o;
+     }
+     if (auto tvp = tp.isTemplateValueParameter())
+     {
+         Expression e = tvp.defaultValue;
+         if (!e)
+             return null;
+ 
+         e = e.syntaxCopy();
+         Scope* sc2 = sc.push();
+         sc2.inDefaultArg = true;
+         e = e.expressionSemantic(sc2);
+         sc2.pop();
+         if (e is null)
+             return null;
+         if (auto te = e.isTemplateExp())
+         {
+             assert(sc && sc.tinst);
+             if (te.td == sc.tinst.tempdecl)
+             {
+                 // defaultValue is a reference to its template declaration
+                 // i.e: `template T(int arg = T)`
+                 // Raise error now before calling resolveProperties otherwise we'll
+                 // start looping on the expansion of the template instance.
+                 auto td = sc.tinst.tempdecl;
+                 .error(td.loc, "%s `%s` recursive template expansion", td.kind, td.toPrettyChars);
+                 return ErrorExp.get();
+             }
+         }
+         if ((e = resolveProperties(sc, e)) is null)
+             return null;
+         e = e.resolveLoc(instLoc, sc); // use the instantiated loc
+         e = e.optimize(WANTvalue);
+ 
+         return e;
+     }
+     assert(0);
+ }
+ 
  /*************************************************
   * Match function arguments against a specific template function.
   *
*************** extern (D) MATCHpair deduceFunctionTempl
*** 948,954 ****
          size_t nfargs2 = argumentList.length; // total number of arguments including applied defaultArgs
          uint inoutMatch = 0; // for debugging only
          Expression[] fargs = argumentList.arguments ? (*argumentList.arguments)[] : null;
!         Identifier[] fnames = argumentList.names ? (*argumentList.names)[] : null;
  
          for (size_t parami = 0; parami < nfparams; parami++)
          {
--- 2137,2143 ----
          size_t nfargs2 = argumentList.length; // total number of arguments including applied defaultArgs
          uint inoutMatch = 0; // for debugging only
          Expression[] fargs = argumentList.arguments ? (*argumentList.arguments)[] : null;
!         ArgumentLabel[] fnames = argumentList.names ? (*argumentList.names)[] : null;
  
          for (size_t parami = 0; parami < nfparams; parami++)
          {
*************** extern (D) MATCHpair deduceFunctionTempl
*** 958,973 ****
              Type prmtype = fparam.type.addStorageClass(fparam.storageClass);
  
              Expression farg;
!             Identifier fname = argi < fnames.length ? fnames[argi] : null;
              bool foundName = false;
              if (fparam.ident)
              {
                  foreach (i; 0 .. fnames.length)
                  {
!                     if (fparam.ident == fnames[i])
                      {
                          argi = i;
                          foundName = true;
                      }
                  }
              }
--- 2147,2163 ----
              Type prmtype = fparam.type.addStorageClass(fparam.storageClass);
  
              Expression farg;
!             Identifier fname = argi < fnames.length ? fnames[argi].name : null;
              bool foundName = false;
              if (fparam.ident)
              {
                  foreach (i; 0 .. fnames.length)
                  {
!                     if (fparam.ident == fnames[i].name)
                      {
                          argi = i;
                          foundName = true;
+                         break;  //Exits the loop after a match
                      }
                  }
              }
*************** extern (D) MATCHpair deduceFunctionTempl
*** 1002,1010 ****
                          {
                              break;
                          }
!                         foreach(name; fnames)
                          {
!                             if (p.ident == name)
                                  break;
                          }
                          if (!reliesOnTemplateParameters(p.type, (*td.parameters)[inferStart .. td.parameters.length]))
--- 2192,2200 ----
                          {
                              break;
                          }
!                         foreach(argLabel; fnames)
                          {
!                             if (p.ident == argLabel.name)
                                  break;
                          }
                          if (!reliesOnTemplateParameters(p.type, (*td.parameters)[inferStart .. td.parameters.length]))
*************** extern (D) RootObject declareParameter(T
*** 1872,1877 ****
--- 3062,3346 ----
      return o;
  }
  
+ /**********************************
+  * Run semantic of tiargs as arguments of template.
+  * Input:
+  *      loc
+  *      sc
+  *      tiargs  array of template arguments
+  *      flags   1: replace const variables with their initializers
+  *              2: don't devolve Parameter to Type
+  *      atd     tuple being optimized. If found, it's not expanded here
+  *              but in AliasAssign semantic.
+  * Returns:
+  *      false if one or more arguments have errors.
+  */
+ bool TemplateInstance_semanticTiargs(Loc loc, Scope* sc, Objects* tiargs, int flags, TupleDeclaration atd = null)
+ {
+     // Run semantic on each argument, place results in tiargs[]
+     //printf("+TemplateInstance.semanticTiargs()\n");
+     if (!tiargs)
+         return true;
+     bool err = false;
+ 
+     // The arguments are not treated as part of a default argument,
+     // because they are evaluated at compile time.
+     const inCondition = sc.condition;
+     sc = sc.push();
+     sc.inDefaultArg = false;
+ 
+     // https://issues.dlang.org/show_bug.cgi?id=24699
+     sc.condition = inCondition;
+ 
+     for (size_t j = 0; j < tiargs.length; j++)
+     {
+         RootObject o = (*tiargs)[j];
+         Type ta = isType(o);
+         Expression ea = isExpression(o);
+         Dsymbol sa = isDsymbol(o);
+ 
+         //printf("1: (*tiargs)[%d] = %p, s=%p, v=%p, ea=%p, ta=%p\n", j, o, isDsymbol(o), isTuple(o), ea, ta);
+         if (ta)
+         {
+             //printf("type %s\n", ta.toChars());
+ 
+             // It might really be an Expression or an Alias
+             ta.resolve(loc, sc, ea, ta, sa, (flags & 1) != 0);
+             if (ea)
+                 goto Lexpr;
+             if (sa)
+                 goto Ldsym;
+             if (ta is null)
+             {
+                 assert(global.errors);
+                 ta = Type.terror;
+             }
+ 
+         Ltype:
+             if (TypeTuple tt = ta.isTypeTuple())
+             {
+                 // Expand tuple
+                 size_t dim = tt.arguments.length;
+                 tiargs.remove(j);
+                 if (dim)
+                 {
+                     tiargs.reserve(dim);
+                     foreach (i, arg; *tt.arguments)
+                     {
+                         if (flags & 2 && (arg.storageClass & STC.parameter))
+                             tiargs.insert(j + i, arg);
+                         else
+                             tiargs.insert(j + i, arg.type);
+                     }
+                 }
+                 j--;
+                 continue;
+             }
+             if (ta.ty == Terror)
+             {
+                 err = true;
+                 continue;
+             }
+             (*tiargs)[j] = ta.merge2();
+         }
+         else if (ea)
+         {
+         Lexpr:
+             //printf("+[%d] ea = %s %s\n", j, EXPtoString(ea.op).ptr, ea.toChars());
+             if (flags & 1) // only used by __traits
+             {
+                 ea = ea.expressionSemantic(sc);
+ 
+                 // must not interpret the args, excepting template parameters
+                 if (!ea.isVarExp() || (ea.isVarExp().var.storage_class & STC.templateparameter))
+                 {
+                     ea = ea.optimize(WANTvalue);
+                 }
+             }
+             else
+             {
+                 sc = sc.startCTFE();
+                 ea = ea.expressionSemantic(sc);
+                 sc = sc.endCTFE();
+ 
+                 if (auto varExp = ea.isVarExp())
+                 {
+                     /* If the parameter is a function that is not called
+                      * explicitly, i.e. `foo!func` as opposed to `foo!func()`,
+                      * then it is a dsymbol, not the return value of `func()`
+                      */
+                     Declaration vd = varExp.var;
+                     if (auto fd = vd.isFuncDeclaration())
+                     {
+                         sa = fd;
+                         goto Ldsym;
+                     }
+                     /* Otherwise skip substituting a const var with
+                      * its initializer. The problem is the initializer won't
+                      * match with an 'alias' parameter. Instead, do the
+                      * const substitution in TemplateValueParameter.matchArg().
+                      */
+                 }
+                 else if (definitelyValueParameter(ea))
+                 {
+                     if (ea.checkValue()) // check void expression
+                         ea = ErrorExp.get();
+                     const olderrs = global.errors;
+                     ea = ea.ctfeInterpret();
+                     if (global.errors != olderrs)
+                         ea = ErrorExp.get();
+                 }
+             }
+             //printf("-[%d] ea = %s %s\n", j, EXPtoString(ea.op).ptr, ea.toChars());
+             if (TupleExp te = ea.isTupleExp())
+             {
+                 // Expand tuple
+                 size_t dim = te.exps.length;
+                 tiargs.remove(j);
+                 if (dim)
+                 {
+                     tiargs.reserve(dim);
+                     foreach (i, exp; *te.exps)
+                         tiargs.insert(j + i, exp);
+                 }
+                 j--;
+                 continue;
+             }
+             if (ea.op == EXP.error)
+             {
+                 err = true;
+                 continue;
+             }
+             (*tiargs)[j] = ea;
+ 
+             if (ea.op == EXP.type)
+             {
+                 ta = ea.type;
+                 goto Ltype;
+             }
+             if (ea.op == EXP.scope_)
+             {
+                 sa = ea.isScopeExp().sds;
+                 goto Ldsym;
+             }
+             if (FuncExp fe = ea.isFuncExp())
+             {
+                 /* A function literal, that is passed to template and
+                  * already semanticed as function pointer, never requires
+                  * outer frame. So convert it to global function is valid.
+                  */
+                 if (fe.fd.tok == TOK.reserved && fe.type.ty == Tpointer)
+                 {
+                     // change to non-nested
+                     fe.fd.tok = TOK.function_;
+                     fe.fd.vthis = null;
+                 }
+                 else if (fe.td)
+                 {
+                     /* If template argument is a template lambda,
+                      * get template declaration itself. */
+                     //sa = fe.td;
+                     //goto Ldsym;
+                 }
+             }
+             if (ea.op == EXP.dotVariable && !(flags & 1))
+             {
+                 // translate expression to dsymbol.
+                 sa = ea.isDotVarExp().var;
+                 goto Ldsym;
+             }
+             if (auto te = ea.isTemplateExp())
+             {
+                 sa = te.td;
+                 goto Ldsym;
+             }
+             if (ea.op == EXP.dotTemplateDeclaration && !(flags & 1))
+             {
+                 // translate expression to dsymbol.
+                 sa = ea.isDotTemplateExp().td;
+                 goto Ldsym;
+             }
+             if (auto de = ea.isDotExp())
+             {
+                 if (auto se = de.e2.isScopeExp())
+                 {
+                     sa = se.sds;
+                     goto Ldsym;
+                 }
+             }
+         }
+         else if (sa)
+         {
+         Ldsym:
+             //printf("dsym %s %s\n", sa.kind(), sa.toChars());
+             if (sa.errors)
+             {
+                 err = true;
+                 continue;
+             }
+ 
+             TupleDeclaration d = sa.toAlias().isTupleDeclaration();
+             if (d)
+             {
+                 if (d is atd)
+                 {
+                     (*tiargs)[j] = d;
+                     continue;
+                 }
+                 // Expand tuple
+                 tiargs.remove(j);
+                 tiargs.insert(j, d.objects);
+                 j--;
+                 continue;
+             }
+             if (FuncAliasDeclaration fa = sa.isFuncAliasDeclaration())
+             {
+                 FuncDeclaration f = fa.toAliasFunc();
+                 if (!fa.hasOverloads && f.isUnique())
+                 {
+                     // Strip FuncAlias only when the aliased function
+                     // does not have any overloads.
+                     sa = f;
+                 }
+             }
+             (*tiargs)[j] = sa;
+ 
+             TemplateDeclaration td = sa.isTemplateDeclaration();
+             if (td && td.semanticRun == PASS.initial && td.literal)
+             {
+                 td.dsymbolSemantic(sc);
+             }
+             FuncDeclaration fd = sa.isFuncDeclaration();
+             if (fd)
+                 functionSemantic(fd);
+         }
+         else if (isParameter(o))
+         {
+         }
+         else
+         {
+             assert(0);
+         }
+         //printf("1: (*tiargs)[%d] = %p\n", j, (*tiargs)[j]);
+     }
+     sc.pop();
+     version (none)
+     {
+         printf("-TemplateInstance.semanticTiargs()\n");
+         for (size_t j = 0; j < tiargs.length; j++)
+         {
+             RootObject o = (*tiargs)[j];
+             Type ta = isType(o);
+             Expression ea = isExpression(o);
+             Dsymbol sa = isDsymbol(o);
+             Tuple va = isTuple(o);
+             printf("\ttiargs[%d] = ta %p, ea %p, sa %p, va %p\n", j, ta, ea, sa, va);
+         }
+     }
+     return !err;
+ }
+ 
+ 
  /*************************************************
   * Given function arguments, figure out which template function
   * to expand, and return matching result.
*************** private extern(C++) class DummyArgVisito
*** 2500,2502 ****
--- 3969,5833 ----
          result = null;
      }
  }
+ 
+ /**
+  * Returns the common type of the 2 types.
+  */
+ private Type rawTypeMerge(Type t1, Type t2)
+ {
+     if (t1.equals(t2))
+         return t1;
+     if (t1.equivalent(t2))
+         return t1.castMod(MODmerge(t1.mod, t2.mod));
+ 
+     auto t1b = t1.toBasetype();
+     auto t2b = t2.toBasetype();
+     if (t1b.equals(t2b))
+         return t1b;
+     if (t1b.equivalent(t2b))
+         return t1b.castMod(MODmerge(t1b.mod, t2b.mod));
+ 
+     auto ty = implicitConvCommonTy(t1b.ty, t2b.ty);
+     if (ty != Terror)
+         return Type.basic[ty];
+ 
+     return null;
+ }
+ 
+ private auto X(T, U)(T m, U n)
+ {
+     return (m << 4) | n;
+ }
+ 
+ private ubyte deduceWildHelper(Type t, Type* at, Type tparam)
+ {
+     if ((tparam.mod & MODFlags.wild) == 0)
+         return 0;
+ 
+     *at = null;
+ 
+     switch (X(tparam.mod, t.mod))
+     {
+     case X(MODFlags.wild, 0):
+     case X(MODFlags.wild, MODFlags.const_):
+     case X(MODFlags.wild, MODFlags.shared_):
+     case X(MODFlags.wild, MODFlags.shared_ | MODFlags.const_):
+     case X(MODFlags.wild, MODFlags.immutable_):
+     case X(MODFlags.wildconst, 0):
+     case X(MODFlags.wildconst, MODFlags.const_):
+     case X(MODFlags.wildconst, MODFlags.shared_):
+     case X(MODFlags.wildconst, MODFlags.shared_ | MODFlags.const_):
+     case X(MODFlags.wildconst, MODFlags.immutable_):
+     case X(MODFlags.shared_ | MODFlags.wild, MODFlags.shared_):
+     case X(MODFlags.shared_ | MODFlags.wild, MODFlags.shared_ | MODFlags.const_):
+     case X(MODFlags.shared_ | MODFlags.wild, MODFlags.immutable_):
+     case X(MODFlags.shared_ | MODFlags.wildconst, MODFlags.shared_):
+     case X(MODFlags.shared_ | MODFlags.wildconst, MODFlags.shared_ | MODFlags.const_):
+     case X(MODFlags.shared_ | MODFlags.wildconst, MODFlags.immutable_):
+         {
+             ubyte wm = (t.mod & ~MODFlags.shared_);
+             if (wm == 0)
+                 wm = MODFlags.mutable;
+             ubyte m = (t.mod & (MODFlags.const_ | MODFlags.immutable_)) | (tparam.mod & t.mod & MODFlags.shared_);
+             *at = t.unqualify(m);
+             return wm;
+         }
+     case X(MODFlags.wild, MODFlags.wild):
+     case X(MODFlags.wild, MODFlags.wildconst):
+     case X(MODFlags.wild, MODFlags.shared_ | MODFlags.wild):
+     case X(MODFlags.wild, MODFlags.shared_ | MODFlags.wildconst):
+     case X(MODFlags.wildconst, MODFlags.wild):
+     case X(MODFlags.wildconst, MODFlags.wildconst):
+     case X(MODFlags.wildconst, MODFlags.shared_ | MODFlags.wild):
+     case X(MODFlags.wildconst, MODFlags.shared_ | MODFlags.wildconst):
+     case X(MODFlags.shared_ | MODFlags.wild, MODFlags.shared_ | MODFlags.wild):
+     case X(MODFlags.shared_ | MODFlags.wild, MODFlags.shared_ | MODFlags.wildconst):
+     case X(MODFlags.shared_ | MODFlags.wildconst, MODFlags.shared_ | MODFlags.wild):
+     case X(MODFlags.shared_ | MODFlags.wildconst, MODFlags.shared_ | MODFlags.wildconst):
+         {
+             *at = t.unqualify(tparam.mod & t.mod);
+             return MODFlags.wild;
+         }
+     default:
+         return 0;
+     }
+ }
+ 
+ private MATCH deduceTypeHelper(Type t, out Type at, Type tparam)
+ {
+     // 9*9 == 81 cases
+     switch (X(tparam.mod, t.mod))
+     {
+     case X(0, 0):
+     case X(0, MODFlags.const_):
+     case X(0, MODFlags.wild):
+     case X(0, MODFlags.wildconst):
+     case X(0, MODFlags.shared_):
+     case X(0, MODFlags.shared_ | MODFlags.const_):
+     case X(0, MODFlags.shared_ | MODFlags.wild):
+     case X(0, MODFlags.shared_ | MODFlags.wildconst):
+     case X(0, MODFlags.immutable_):
+         // foo(U)                       T                       => T
+         // foo(U)                       const(T)                => const(T)
+         // foo(U)                       inout(T)                => inout(T)
+         // foo(U)                       inout(const(T))         => inout(const(T))
+         // foo(U)                       shared(T)               => shared(T)
+         // foo(U)                       shared(const(T))        => shared(const(T))
+         // foo(U)                       shared(inout(T))        => shared(inout(T))
+         // foo(U)                       shared(inout(const(T))) => shared(inout(const(T)))
+         // foo(U)                       immutable(T)            => immutable(T)
+         {
+             at = t;
+             return MATCH.exact;
+         }
+     case X(MODFlags.const_, MODFlags.const_):
+     case X(MODFlags.wild, MODFlags.wild):
+     case X(MODFlags.wildconst, MODFlags.wildconst):
+     case X(MODFlags.shared_, MODFlags.shared_):
+     case X(MODFlags.shared_ | MODFlags.const_, MODFlags.shared_ | MODFlags.const_):
+     case X(MODFlags.shared_ | MODFlags.wild, MODFlags.shared_ | MODFlags.wild):
+     case X(MODFlags.shared_ | MODFlags.wildconst, MODFlags.shared_ | MODFlags.wildconst):
+     case X(MODFlags.immutable_, MODFlags.immutable_):
+         // foo(const(U))                const(T)                => T
+         // foo(inout(U))                inout(T)                => T
+         // foo(inout(const(U)))         inout(const(T))         => T
+         // foo(shared(U))               shared(T)               => T
+         // foo(shared(const(U)))        shared(const(T))        => T
+         // foo(shared(inout(U)))        shared(inout(T))        => T
+         // foo(shared(inout(const(U)))) shared(inout(const(T))) => T
+         // foo(immutable(U))            immutable(T)            => T
+         {
+             at = t.mutableOf().unSharedOf();
+             return MATCH.exact;
+         }
+     case X(MODFlags.const_, MODFlags.shared_ | MODFlags.const_):
+     case X(MODFlags.wild, MODFlags.shared_ | MODFlags.wild):
+     case X(MODFlags.wildconst, MODFlags.shared_ | MODFlags.wildconst):
+         // foo(const(U))                shared(const(T))        => shared(T)
+         // foo(inout(U))                shared(inout(T))        => shared(T)
+         // foo(inout(const(U)))         shared(inout(const(T))) => shared(T)
+         {
+             at = t.mutableOf();
+             return MATCH.exact;
+         }
+     case X(MODFlags.const_, 0):
+     case X(MODFlags.const_, MODFlags.wild):
+     case X(MODFlags.const_, MODFlags.wildconst):
+     case X(MODFlags.const_, MODFlags.shared_ | MODFlags.wild):
+     case X(MODFlags.const_, MODFlags.shared_ | MODFlags.wildconst):
+     case X(MODFlags.const_, MODFlags.immutable_):
+     case X(MODFlags.shared_ | MODFlags.const_, MODFlags.immutable_):
+         // foo(const(U))                T                       => T
+         // foo(const(U))                inout(T)                => T
+         // foo(const(U))                inout(const(T))         => T
+         // foo(const(U))                shared(inout(T))        => shared(T)
+         // foo(const(U))                shared(inout(const(T))) => shared(T)
+         // foo(const(U))                immutable(T)            => T
+         // foo(shared(const(U)))        immutable(T)            => T
+         {
+             at = t.mutableOf();
+             return MATCH.constant;
+         }
+     case X(MODFlags.const_, MODFlags.shared_):
+         // foo(const(U))                shared(T)               => shared(T)
+         {
+             at = t;
+             return MATCH.constant;
+         }
+     case X(MODFlags.shared_, MODFlags.shared_ | MODFlags.const_):
+     case X(MODFlags.shared_, MODFlags.shared_ | MODFlags.wild):
+     case X(MODFlags.shared_, MODFlags.shared_ | MODFlags.wildconst):
+         // foo(shared(U))               shared(const(T))        => const(T)
+         // foo(shared(U))               shared(inout(T))        => inout(T)
+         // foo(shared(U))               shared(inout(const(T))) => inout(const(T))
+         {
+             at = t.unSharedOf();
+             return MATCH.exact;
+         }
+     case X(MODFlags.shared_ | MODFlags.const_, MODFlags.shared_):
+         // foo(shared(const(U)))        shared(T)               => T
+         {
+             at = t.unSharedOf();
+             return MATCH.constant;
+         }
+     case X(MODFlags.wildconst, MODFlags.immutable_):
+     case X(MODFlags.shared_ | MODFlags.const_, MODFlags.shared_ | MODFlags.wildconst):
+     case X(MODFlags.shared_ | MODFlags.wildconst, MODFlags.immutable_):
+     case X(MODFlags.shared_ | MODFlags.wildconst, MODFlags.shared_ | MODFlags.wild):
+         // foo(inout(const(U)))         immutable(T)            => T
+         // foo(shared(const(U)))        shared(inout(const(T))) => T
+         // foo(shared(inout(const(U)))) immutable(T)            => T
+         // foo(shared(inout(const(U)))) shared(inout(T))        => T
+         {
+             at = t.unSharedOf().mutableOf();
+             return MATCH.constant;
+         }
+     case X(MODFlags.shared_ | MODFlags.const_, MODFlags.shared_ | MODFlags.wild):
+         // foo(shared(const(U)))        shared(inout(T))        => T
+         {
+             at = t.unSharedOf().mutableOf();
+             return MATCH.constant;
+         }
+     case X(MODFlags.wild, 0):
+     case X(MODFlags.wild, MODFlags.const_):
+     case X(MODFlags.wild, MODFlags.wildconst):
+     case X(MODFlags.wild, MODFlags.immutable_):
+     case X(MODFlags.wild, MODFlags.shared_):
+     case X(MODFlags.wild, MODFlags.shared_ | MODFlags.const_):
+     case X(MODFlags.wild, MODFlags.shared_ | MODFlags.wildconst):
+     case X(MODFlags.wildconst, 0):
+     case X(MODFlags.wildconst, MODFlags.const_):
+     case X(MODFlags.wildconst, MODFlags.wild):
+     case X(MODFlags.wildconst, MODFlags.shared_):
+     case X(MODFlags.wildconst, MODFlags.shared_ | MODFlags.const_):
+     case X(MODFlags.wildconst, MODFlags.shared_ | MODFlags.wild):
+     case X(MODFlags.shared_, 0):
+     case X(MODFlags.shared_, MODFlags.const_):
+     case X(MODFlags.shared_, MODFlags.wild):
+     case X(MODFlags.shared_, MODFlags.wildconst):
+     case X(MODFlags.shared_, MODFlags.immutable_):
+     case X(MODFlags.shared_ | MODFlags.const_, 0):
+     case X(MODFlags.shared_ | MODFlags.const_, MODFlags.const_):
+     case X(MODFlags.shared_ | MODFlags.const_, MODFlags.wild):
+     case X(MODFlags.shared_ | MODFlags.const_, MODFlags.wildconst):
+     case X(MODFlags.shared_ | MODFlags.wild, 0):
+     case X(MODFlags.shared_ | MODFlags.wild, MODFlags.const_):
+     case X(MODFlags.shared_ | MODFlags.wild, MODFlags.wild):
+     case X(MODFlags.shared_ | MODFlags.wild, MODFlags.wildconst):
+     case X(MODFlags.shared_ | MODFlags.wild, MODFlags.immutable_):
+     case X(MODFlags.shared_ | MODFlags.wild, MODFlags.shared_):
+     case X(MODFlags.shared_ | MODFlags.wild, MODFlags.shared_ | MODFlags.const_):
+     case X(MODFlags.shared_ | MODFlags.wild, MODFlags.shared_ | MODFlags.wildconst):
+     case X(MODFlags.shared_ | MODFlags.wildconst, 0):
+     case X(MODFlags.shared_ | MODFlags.wildconst, MODFlags.const_):
+     case X(MODFlags.shared_ | MODFlags.wildconst, MODFlags.wild):
+     case X(MODFlags.shared_ | MODFlags.wildconst, MODFlags.wildconst):
+     case X(MODFlags.shared_ | MODFlags.wildconst, MODFlags.shared_):
+     case X(MODFlags.shared_ | MODFlags.wildconst, MODFlags.shared_ | MODFlags.const_):
+     case X(MODFlags.immutable_, 0):
+     case X(MODFlags.immutable_, MODFlags.const_):
+     case X(MODFlags.immutable_, MODFlags.wild):
+     case X(MODFlags.immutable_, MODFlags.wildconst):
+     case X(MODFlags.immutable_, MODFlags.shared_):
+     case X(MODFlags.immutable_, MODFlags.shared_ | MODFlags.const_):
+     case X(MODFlags.immutable_, MODFlags.shared_ | MODFlags.wild):
+     case X(MODFlags.immutable_, MODFlags.shared_ | MODFlags.wildconst):
+         // foo(inout(U))                T                       => nomatch
+         // foo(inout(U))                const(T)                => nomatch
+         // foo(inout(U))                inout(const(T))         => nomatch
+         // foo(inout(U))                immutable(T)            => nomatch
+         // foo(inout(U))                shared(T)               => nomatch
+         // foo(inout(U))                shared(const(T))        => nomatch
+         // foo(inout(U))                shared(inout(const(T))) => nomatch
+         // foo(inout(const(U)))         T                       => nomatch
+         // foo(inout(const(U)))         const(T)                => nomatch
+         // foo(inout(const(U)))         inout(T)                => nomatch
+         // foo(inout(const(U)))         shared(T)               => nomatch
+         // foo(inout(const(U)))         shared(const(T))        => nomatch
+         // foo(inout(const(U)))         shared(inout(T))        => nomatch
+         // foo(shared(U))               T                       => nomatch
+         // foo(shared(U))               const(T)                => nomatch
+         // foo(shared(U))               inout(T)                => nomatch
+         // foo(shared(U))               inout(const(T))         => nomatch
+         // foo(shared(U))               immutable(T)            => nomatch
+         // foo(shared(const(U)))        T                       => nomatch
+         // foo(shared(const(U)))        const(T)                => nomatch
+         // foo(shared(const(U)))        inout(T)                => nomatch
+         // foo(shared(const(U)))        inout(const(T))         => nomatch
+         // foo(shared(inout(U)))        T                       => nomatch
+         // foo(shared(inout(U)))        const(T)                => nomatch
+         // foo(shared(inout(U)))        inout(T)                => nomatch
+         // foo(shared(inout(U)))        inout(const(T))         => nomatch
+         // foo(shared(inout(U)))        immutable(T)            => nomatch
+         // foo(shared(inout(U)))        shared(T)               => nomatch
+         // foo(shared(inout(U)))        shared(const(T))        => nomatch
+         // foo(shared(inout(U)))        shared(inout(const(T))) => nomatch
+         // foo(shared(inout(const(U)))) T                       => nomatch
+         // foo(shared(inout(const(U)))) const(T)                => nomatch
+         // foo(shared(inout(const(U)))) inout(T)                => nomatch
+         // foo(shared(inout(const(U)))) inout(const(T))         => nomatch
+         // foo(shared(inout(const(U)))) shared(T)               => nomatch
+         // foo(shared(inout(const(U)))) shared(const(T))        => nomatch
+         // foo(immutable(U))            T                       => nomatch
+         // foo(immutable(U))            const(T)                => nomatch
+         // foo(immutable(U))            inout(T)                => nomatch
+         // foo(immutable(U))            inout(const(T))         => nomatch
+         // foo(immutable(U))            shared(T)               => nomatch
+         // foo(immutable(U))            shared(const(T))        => nomatch
+         // foo(immutable(U))            shared(inout(T))        => nomatch
+         // foo(immutable(U))            shared(inout(const(T))) => nomatch
+         return MATCH.nomatch;
+ 
+     default:
+         assert(0);
+     }
+ }
+ 
+ __gshared Expression emptyArrayElement = null;
+ 
+ /*
+  * Returns `true` if `t` is a reference type, or an array of reference types.
+  */
+ private bool isTopRef(Type t)
+ {
+     auto tb = t.baseElemOf();
+     return tb.ty == Tclass ||
+            tb.ty == Taarray ||
+            tb.ty == Tstruct && tb.hasPointers();
+ }
+ 
+ /*
+  * Returns a valid `Loc` for semantic routines.
+  * Some paths require a location derived from the first
+  * template parameter when available.
+  */
+ private Loc semanticLoc(scope ref TemplateParameters parameters)
+ {
+     Loc loc;
+     if (parameters.length)
+         loc = parameters[0].loc;
+     return loc;
+ }
+ 
+ private MATCH deduceAliasThis(Type t, Scope* sc, Type tparam,
+     ref TemplateParameters parameters, ref Objects dedtypes, uint* wm)
+ {
+     if (auto tc = t.isTypeClass())
+     {
+         if (tc.sym.aliasthis && !(tc.att & AliasThisRec.tracingDT))
+         {
+             if (auto ato = t.aliasthisOf())
+             {
+                 tc.att = cast(AliasThisRec)(tc.att | AliasThisRec.tracingDT);
+                 auto m = deduceType(ato, sc, tparam, parameters, dedtypes, wm);
+                 tc.att = cast(AliasThisRec)(tc.att & ~AliasThisRec.tracingDT);
+                 return m;
+             }
+         }
+     }
+     else if (auto ts = t.isTypeStruct())
+     {
+         if (ts.sym.aliasthis && !(ts.att & AliasThisRec.tracingDT))
+         {
+             if (auto ato = t.aliasthisOf())
+             {
+                 ts.att = cast(AliasThisRec)(ts.att | AliasThisRec.tracingDT);
+                 auto m = deduceType(ato, sc, tparam, parameters, dedtypes, wm);
+                 ts.att = cast(AliasThisRec)(ts.att & ~AliasThisRec.tracingDT);
+                 return m;
+             }
+         }
+     }
+     return MATCH.nomatch;
+ }
+ 
+ private MATCH deduceParentInstance(Scope* sc, Dsymbol sym, TypeInstance tpi,
+     ref TemplateParameters parameters, ref Objects dedtypes, uint* wm)
+ {
+     if (tpi.idents.length)
+     {
+         RootObject id = tpi.idents[tpi.idents.length - 1];
+         if (id.dyncast() == DYNCAST.identifier && sym.ident.equals(cast(Identifier)id))
+         {
+             Type tparent = sym.parent.getType();
+             if (tparent)
+             {
+                 tpi.idents.length--;
+                 auto m = deduceType(tparent, sc, tpi, parameters, dedtypes, wm);
+                 tpi.idents.length++;
+                 return m;
+             }
+         }
+     }
+     return MATCH.nomatch;
+ }
+ 
+ private MATCH matchAll(TypeDeduced td, Type tt)
+ {
+     MATCH match = MATCH.exact;
+     foreach (j, e; td.argexps)
+     {
+         assert(e);
+         if (e == emptyArrayElement)
+             continue;
+ 
+         Type t = tt.addMod(td.tparams[j].mod).substWildTo(MODFlags.const_);
+ 
+         MATCH m = e.implicitConvTo(t);
+         if (match > m)
+             match = m;
+         if (match == MATCH.nomatch)
+             break;
+     }
+     return match;
+ }
+ /****
+  * Given an identifier, figure out which TemplateParameter it is.
+  * Return IDX_NOTFOUND if not found.
+  */
+ private size_t templateIdentifierLookup(Identifier id, TemplateParameters* parameters)
+ {
+     for (size_t i = 0; i < parameters.length; i++)
+     {
+         TemplateParameter tp = (*parameters)[i];
+         if (tp.ident.equals(id))
+             return i;
+     }
+     return IDX_NOTFOUND;
+ }
+ 
+ private size_t templateParameterLookup(Type tparam, TemplateParameters* parameters)
+ {
+     if (TypeIdentifier tident = tparam.isTypeIdentifier())
+     {
+         //printf("\ttident = '%s'\n", tident.toChars());
+         return templateIdentifierLookup(tident.ident, parameters);
+     }
+     return IDX_NOTFOUND;
+ }
+ /* These form the heart of template argument deduction.
+  * Given 'this' being the type argument to the template instance,
+  * it is matched against the template declaration parameter specialization
+  * 'tparam' to determine the type to be used for the parameter.
+  * Example:
+  *      template Foo(T:T*)      // template declaration
+  *      Foo!(int*)              // template instantiation
+  * Input:
+  *      this = int*
+  *      tparam = T*
+  *      parameters = [ T:T* ]   // Array of TemplateParameter's
+  * Output:
+  *      dedtypes = [ int ]      // Array of Expression/Type's
+  */
+ MATCH deduceType(scope RootObject o, scope Scope* sc, scope Type tparam,
+     scope ref TemplateParameters parameters, scope ref Objects dedtypes,
+     scope uint* wm = null, size_t inferStart = 0, bool ignoreAliasThis = false)
+ {
+     extern (C++) final class DeduceType : Visitor
+     {
+         alias visit = Visitor.visit;
+     public:
+         MATCH result;
+ 
+         extern (D) this() @safe
+         {
+             result = MATCH.nomatch;
+         }
+ 
+         override void visit(Type t)
+         {
+             if (!tparam)
+                 goto Lnomatch;
+ 
+             if (t == tparam)
+                 goto Lexact;
+ 
+             if (tparam.ty == Tident)
+             {
+                 // Determine which parameter tparam is
+                 size_t i = templateParameterLookup(tparam, &parameters);
+                 if (i == IDX_NOTFOUND)
+                 {
+                     if (!sc)
+                         goto Lnomatch;
+ 
+                     /* Need a loc to go with the semantic routine. */
+                     Loc loc = semanticLoc(parameters);
+ 
+                     /* BUG: what if tparam is a template instance, that
+                      * has as an argument another Tident?
+                      */
+                     tparam = tparam.typeSemantic(loc, sc);
+                     assert(tparam.ty != Tident);
+                     result = deduceType(t, sc, tparam, parameters, dedtypes, wm);
+                     return;
+                 }
+ 
+                 TemplateParameter tp = parameters[i];
+ 
+                 TypeIdentifier tident = tparam.isTypeIdentifier();
+                 if (tident.idents.length > 0)
+                 {
+                     //printf("matching %s to %s\n", tparam.toChars(), t.toChars());
+                     Dsymbol s = t.toDsymbol(sc);
+                     for (size_t j = tident.idents.length; j-- > 0;)
+                     {
+                         RootObject id = tident.idents[j];
+                         if (id.dyncast() == DYNCAST.identifier)
+                         {
+                             if (!s || !s.parent)
+                                 goto Lnomatch;
+                             Dsymbol s2 = s.parent.search(Loc.initial, cast(Identifier)id);
+                             if (!s2)
+                                 goto Lnomatch;
+                             s2 = s2.toAlias();
+                             //printf("[%d] s = %s %s, s2 = %s %s\n", j, s.kind(), s.toChars(), s2.kind(), s2.toChars());
+                             if (s != s2)
+                             {
+                                 if (Type tx = s2.getType())
+                                 {
+                                     if (s != tx.toDsymbol(sc))
+                                         goto Lnomatch;
+                                 }
+                                 else
+                                     goto Lnomatch;
+                             }
+                             s = s.parent;
+                         }
+                         else
+                             goto Lnomatch;
+                     }
+                     //printf("[e] s = %s\n", s?s.toChars():"(null)");
+                     if (tp.isTemplateTypeParameter())
+                     {
+                         Type tt = s.getType();
+                         if (!tt)
+                             goto Lnomatch;
+                         Type at = cast(Type)dedtypes[i];
+                         if (at && at.ty == Tnone)
+                             at = (cast(TypeDeduced)at).tded;
+                         if (!at || tt.equals(at))
+                         {
+                             dedtypes[i] = tt;
+                             goto Lexact;
+                         }
+                     }
+                     if (tp.isTemplateAliasParameter())
+                     {
+                         Dsymbol s2 = cast(Dsymbol)dedtypes[i];
+                         if (!s2 || s == s2)
+                         {
+                             dedtypes[i] = s;
+                             goto Lexact;
+                         }
+                     }
+                     goto Lnomatch;
+                 }
+ 
+                 // Found the corresponding parameter tp
+                 /+
+                     https://issues.dlang.org/show_bug.cgi?id=23578
+                     To pattern match:
+                     static if (is(S!int == S!av, alias av))
+ 
+                     We eventually need to deduce `int` (Tint32 [0]) and `av` (Tident).
+                     Previously this would not get pattern matched at all, but now we check if the
+                     template parameter `av` came from.
+ 
+                     This note has been left to serve as a hint for further explorers into
+                     how IsExp matching works.
+                 +/
+                 if (auto ta = tp.isTemplateAliasParameter())
+                 {
+                     dedtypes[i] = t;
+                     goto Lexact;
+                 }
+                 // (23578) - ensure previous behaviour for non-alias template params
+                 if (!tp.isTemplateTypeParameter())
+                 {
+                     goto Lnomatch;
+                 }
+ 
+                 Type at = cast(Type)dedtypes[i];
+                 Type tt;
+                 if (ubyte wx = wm ? deduceWildHelper(t, &tt, tparam) : 0)
+                 {
+                     // type vs (none)
+                     if (!at)
+                     {
+                         dedtypes[i] = tt;
+                         *wm |= wx;
+                         result = MATCH.constant;
+                         return;
+                     }
+ 
+                     // type vs expressions
+                     if (at.ty == Tnone)
+                     {
+                         auto xt = cast(TypeDeduced)at;
+                         result = xt.matchAll(tt);
+                         if (result > MATCH.nomatch)
+                         {
+                             dedtypes[i] = tt;
+                             if (result > MATCH.constant)
+                                 result = MATCH.constant; // limit level for inout matches
+                         }
+                         return;
+                     }
+ 
+                     // type vs type
+                     if (tt.equals(at))
+                     {
+                         dedtypes[i] = tt; // Prefer current type match
+                         goto Lconst;
+                     }
+                     if (tt.implicitConvTo(at.constOf()))
+                     {
+                         dedtypes[i] = at.constOf().mutableOf();
+                         *wm |= MODFlags.const_;
+                         goto Lconst;
+                     }
+                     if (at.implicitConvTo(tt.constOf()))
+                     {
+                         dedtypes[i] = tt.constOf().mutableOf();
+                         *wm |= MODFlags.const_;
+                         goto Lconst;
+                     }
+                     goto Lnomatch;
+                 }
+                 else if (MATCH m = deduceTypeHelper(t, tt, tparam))
+                 {
+                     // type vs (none)
+                     if (!at)
+                     {
+                         dedtypes[i] = tt;
+                         result = m;
+                         return;
+                     }
+ 
+                     // type vs expressions
+                     if (at.ty == Tnone)
+                     {
+                         auto xt = cast(TypeDeduced)at;
+                         result = xt.matchAll(tt);
+                         if (result > MATCH.nomatch)
+                         {
+                             dedtypes[i] = tt;
+                         }
+                         return;
+                     }
+ 
+                     // type vs type
+                     if (tt.equals(at))
+                     {
+                         goto Lexact;
+                     }
+                     if (tt.ty == Tclass && at.ty == Tclass)
+                     {
+                         result = tt.implicitConvTo(at);
+                         return;
+                     }
+                     if (tt.ty == Tsarray && at.ty == Tarray && tt.nextOf().implicitConvTo(at.nextOf()) >= MATCH.constant)
+                     {
+                         goto Lexact;
+                     }
+                 }
+                 goto Lnomatch;
+             }
+ 
+             if (tparam.ty == Ttypeof)
+             {
+                     /* Need a loc to go with the semantic routine. */
+                     Loc loc = semanticLoc(parameters);
+ 
+                 tparam = tparam.typeSemantic(loc, sc);
+             }
+             if (t.ty != tparam.ty)
+             {
+                 if (Dsymbol sym = t.toDsymbol(sc))
+                 {
+                     if (sym.isforwardRef() && !tparam.deco)
+                         goto Lnomatch;
+                 }
+ 
+                 MATCH m = t.implicitConvTo(tparam);
+                 if (m == MATCH.nomatch && !ignoreAliasThis)
+                 {
+                     m = deduceAliasThis(t, sc, tparam, parameters, dedtypes, wm);
+                 }
+                 result = m;
+                 return;
+             }
+ 
+             if (t.nextOf())
+             {
+                 if (tparam.deco && !tparam.hasWild())
+                 {
+                     result = t.implicitConvTo(tparam);
+                     return;
+                 }
+ 
+                 Type tpn = tparam.nextOf();
+                 if (wm && t.ty == Taarray && tparam.isWild())
+                 {
+                     // https://issues.dlang.org/show_bug.cgi?id=12403
+                     // In IFTI, stop inout matching on transitive part of AA types.
+                     tpn = tpn.substWildTo(MODFlags.mutable);
+                 }
+ 
+                 result = deduceType(t.nextOf(), sc, tpn, parameters, dedtypes, wm);
+                 return;
+             }
+ 
+         Lexact:
+             result = MATCH.exact;
+             return;
+ 
+         Lnomatch:
+             result = MATCH.nomatch;
+             return;
+ 
+         Lconst:
+             result = MATCH.constant;
+         }
+ 
+         override void visit(TypeVector t)
+         {
+             if (auto tp = tparam.isTypeVector())
+             {
+                 result = deduceType(t.basetype, sc, tp.basetype, parameters, dedtypes, wm);
+                 return;
+             }
+             visit(cast(Type)t);
+         }
+ 
+         override void visit(TypeDArray t)
+         {
+             visit(cast(Type)t);
+         }
+ 
+         override void visit(TypeSArray t)
+         {
+             // Extra check that array dimensions must match
+             if (!tparam)
+             {
+                 visit(cast(Type)t);
+                 return;
+             }
+ 
+             if (tparam.ty == Tarray)
+             {
+                 MATCH m = deduceType(t.next, sc, tparam.nextOf(), parameters, dedtypes, wm);
+                 result = (m >= MATCH.constant) ? MATCH.convert : MATCH.nomatch;
+                 return;
+             }
+ 
+             TemplateParameter tp = null;
+             Expression edim = null;
+             size_t i;
+             if (auto tsa = tparam.isTypeSArray())
+             {
+                 if (tsa.dim.isVarExp() && tsa.dim.isVarExp().var.storage_class & STC.templateparameter)
+                 {
+                     Identifier id = tsa.dim.isVarExp().var.ident;
+                     i = templateIdentifierLookup(id, &parameters);
+                     assert(i != IDX_NOTFOUND);
+                     tp = parameters[i];
+                 }
+                 else
+                     edim = tsa.dim;
+             }
+             else if (auto taa = tparam.isTypeAArray())
+             {
+                 i = templateParameterLookup(taa.index, &parameters);
+                 if (i != IDX_NOTFOUND)
+                     tp = parameters[i];
+                 else
+                 {
+                     Loc loc;
+                     // The "type" (it hasn't been resolved yet) of the function parameter
+                     // does not have a location but the parameter it is related to does,
+                     // so we use that for the resolution (better error message).
+                     if (inferStart < parameters.length)
+                     {
+                         TemplateParameter loctp = parameters[inferStart];
+                         loc = loctp.loc;
+                     }
+ 
+                     Expression e;
+                     Type tx;
+                     Dsymbol s;
+                     taa.index.resolve(loc, sc, e, tx, s);
+                     edim = s ? getValue(s) : getValue(e);
+                 }
+             }
+             if ((tp && tp.matchArg(sc, t.dim, i, &parameters, dedtypes, null)) ||
+                 (edim && edim.isIntegerExp() && edim.toInteger() == t.dim.toInteger())
+             )
+             {
+                 result = deduceType(t.next, sc, tparam.nextOf(), parameters, dedtypes, wm);
+                 return;
+             }
+ 
+             visit(cast(Type)t);
+         }
+ 
+         override void visit(TypeAArray t)
+         {
+             // Extra check that index type must match
+             if (tparam && tparam.ty == Taarray)
+             {
+                 TypeAArray tp = tparam.isTypeAArray();
+                 if (!deduceType(t.index, sc, tp.index, parameters, dedtypes))
+                 {
+                     result = MATCH.nomatch;
+                     return;
+                 }
+             }
+             visit(cast(Type)t);
+         }
+ 
+         override void visit(TypeFunction t)
+         {
+             // Extra check that function characteristics must match
+             if (!tparam)
+                 return visit(cast(Type)t);
+ 
+             auto tp = tparam.isTypeFunction();
+             if (!tp)
+             {
+                 visit(cast(Type)t);
+                 return;
+             }
+ 
+             if (t.parameterList.varargs != tp.parameterList.varargs || t.linkage != tp.linkage)
+             {
+                 result = MATCH.nomatch;
+                 return;
+             }
+ 
+             foreach (fparam; *tp.parameterList.parameters)
+             {
+                 // https://issues.dlang.org/show_bug.cgi?id=2579
+                 // Apply function parameter storage classes to parameter types
+                 fparam.type = fparam.type.addStorageClass(fparam.storageClass);
+                 fparam.storageClass &= ~STC.TYPECTOR;
+ 
+                 // https://issues.dlang.org/show_bug.cgi?id=15243
+                 // Resolve parameter type if it's not related with template parameters
+                 if (!reliesOnTemplateParameters(fparam.type, parameters[inferStart .. parameters.length]))
+                 {
+                     auto tx = fparam.type.typeSemantic(Loc.initial, sc);
+                     if (tx.ty == Terror)
+                     {
+                         result = MATCH.nomatch;
+                         return;
+                     }
+                     fparam.type = tx;
+                 }
+             }
+ 
+             const size_t nfargs = t.parameterList.length;
+             size_t nfparams = tp.parameterList.length;
+ 
+             if (!deduceFunctionTuple(t, tp, parameters, dedtypes, nfargs, nfparams))
+             {
+                 result = MATCH.nomatch;
+                 return;
+             }
+ 
+         L2:
+             assert(nfparams <= tp.parameterList.length);
+             foreach (i, ap; tp.parameterList)
+             {
+                 if (i == nfparams)
+                     break;
+ 
+                 Parameter a = t.parameterList[i];
+ 
+                 if (!a.isCovariant(t.isRef, ap) ||
+                     !deduceType(a.type, sc, ap.type, parameters, dedtypes))
+                 {
+                     result = MATCH.nomatch;
+                     return;
+                 }
+             }
+ 
+             visit(cast(Type)t);
+         }
+ 
+         override void visit(TypeIdentifier t)
+         {
+             // Extra check
+             if (tparam && tparam.ty == Tident)
+             {
+                 TypeIdentifier tp = tparam.isTypeIdentifier();
+                 for (size_t i = 0; i < t.idents.length; i++)
+                 {
+                     RootObject id1 = t.idents[i];
+                     RootObject id2 = tp.idents[i];
+                     if (!id1.equals(id2))
+                     {
+                         result = MATCH.nomatch;
+                         return;
+                     }
+                 }
+             }
+             visit(cast(Type)t);
+         }
+ 
+         override void visit(TypeInstance t)
+         {
+             // Extra check
+             if (!tparam || tparam.ty != Tinstance || !t.tempinst.tempdecl)
+             {
+                 visit(cast(Type)t);
+                 return;
+             }
+ 
+             TemplateDeclaration tempdecl = t.tempinst.tempdecl.isTemplateDeclaration();
+             assert(tempdecl);
+ 
+             TypeInstance tp = tparam.isTypeInstance();
+ 
+             //printf("tempinst.tempdecl = %p\n", tempdecl);
+             //printf("tp.tempinst.tempdecl = %p\n", tp.tempinst.tempdecl);
+             if (!tp.tempinst.tempdecl)
+             {
+                 //printf("tp.tempinst.name = '%s'\n", tp.tempinst.name.toChars());
+ 
+                 /* Handle case of:
+                  *  template Foo(T : sa!(T), alias sa)
+                  */
+                 size_t i = templateIdentifierLookup(tp.tempinst.name, &parameters);
+                 if (i == IDX_NOTFOUND)
+                 {
+                     /* Didn't find it as a parameter identifier. Try looking
+                      * it up and seeing if is an alias.
+                      * https://issues.dlang.org/show_bug.cgi?id=1454
+                      */
+                     auto tid = new TypeIdentifier(tp.loc, tp.tempinst.name);
+                     Type tx;
+                     Expression e;
+                     Dsymbol s;
+                     tid.resolve(tp.loc, sc, e, tx, s);
+                     if (tx)
+                     {
+                         s = tx.toDsymbol(sc);
+                         if (TemplateInstance ti = s ? s.parent.isTemplateInstance() : null)
+                         {
+                             // https://issues.dlang.org/show_bug.cgi?id=14290
+                             // Try to match with ti.tempecl,
+                             // only when ti is an enclosing instance.
+                             Dsymbol p = sc.parent;
+                             while (p && p != ti)
+                                 p = p.parent;
+                             if (p)
+                                 s = ti.tempdecl;
+                         }
+                     }
+                     if (s)
+                     {
+                         s = s.toAlias();
+                         TemplateDeclaration td = s.isTemplateDeclaration();
+                         if (td)
+                         {
+                             if (td.overroot)
+                                 td = td.overroot;
+                             for (; td; td = td.overnext)
+                             {
+                                 if (td == tempdecl)
+                                     goto L2;
+                             }
+                         }
+                     }
+                     goto Lnomatch;
+                 }
+ 
+                 TemplateParameter tpx = parameters[i];
+                 if (!tpx.matchArg(sc, tempdecl, i, &parameters, dedtypes, null))
+                     goto Lnomatch;
+             }
+             else if (tempdecl != tp.tempinst.tempdecl)
+                 goto Lnomatch;
+ 
+         L2:
+             if (!resolveTemplateInstantiation(sc, &parameters, t.tempinst.tiargs, &t.tempinst.tdtypes, tempdecl, tp, &dedtypes))
+                 goto Lnomatch;
+ 
+             visit(cast(Type)t);
+             return;
+ 
+         Lnomatch:
+             //printf("no match\n");
+             result = MATCH.nomatch;
+         }
+ 
+         override void visit(TypeStruct t)
+         {
+             /* If this struct is a template struct, and we're matching
+              * it against a template instance, convert the struct type
+              * to a template instance, too, and try again.
+              */
+             TemplateInstance ti = t.sym.parent.isTemplateInstance();
+ 
+             if (tparam && tparam.ty == Tinstance)
+             {
+                 if (ti && ti.toAlias() == t.sym)
+                 {
+                     auto tx = new TypeInstance(Loc.initial, ti);
+                     auto m = deduceType(tx, sc, tparam, parameters, dedtypes, wm);
+                     // if we have a no match we still need to check alias this
+                     if (m != MATCH.nomatch)
+                     {
+                         result = m;
+                         return;
+                     }
+                 }
+ 
+                 TypeInstance tpi = tparam.isTypeInstance();
+                 auto m = deduceParentInstance(sc, t.sym, tpi, parameters, dedtypes, wm);
+                 if (m != MATCH.nomatch)
+                 {
+                     result = m;
+                     return;
+                 }
+             }
+ 
+             // Extra check
+             if (tparam && tparam.ty == Tstruct)
+             {
+                 TypeStruct tp = tparam.isTypeStruct();
+ 
+                 //printf("\t%d\n", cast(MATCH) t.implicitConvTo(tp));
+                 if (wm && t.deduceWild(tparam, false))
+                 {
+                     result = MATCH.constant;
+                     return;
+                 }
+                 result = t.implicitConvTo(tp);
+                 return;
+             }
+             visit(cast(Type)t);
+         }
+ 
+         override void visit(TypeEnum t)
+         {
+             // Extra check
+             if (tparam && tparam.ty == Tenum)
+             {
+                 TypeEnum tp = tparam.isTypeEnum();
+                 if (t.sym == tp.sym)
+                     visit(cast(Type)t);
+                 else
+                     result = MATCH.nomatch;
+                 return;
+             }
+             Type tb = t.toBasetype();
+             if (tb.ty == tparam.ty || tb.ty == Tsarray && tparam.ty == Taarray)
+             {
+                 result = deduceType(tb, sc, tparam, parameters, dedtypes, wm);
+                 if (result == MATCH.exact)
+                     result = MATCH.convert;
+                 return;
+             }
+             visit(cast(Type)t);
+         }
+ 
+         override void visit(TypeClass t)
+         {
+             //printf("TypeClass.deduceType(this = %s)\n", t.toChars());
+ 
+             /* If this class is a template class, and we're matching
+              * it against a template instance, convert the class type
+              * to a template instance, too, and try again.
+              */
+             TemplateInstance ti = t.sym.parent.isTemplateInstance();
+ 
+             if (tparam && tparam.ty == Tinstance)
+             {
+                 if (ti && ti.toAlias() == t.sym)
+                 {
+                     auto tx = new TypeInstance(Loc.initial, ti);
+                     MATCH m = deduceType(tx, sc, tparam, parameters, dedtypes, wm);
+                     // Even if the match fails, there is still a chance it could match
+                     // a base class.
+                     if (m != MATCH.nomatch)
+                     {
+                         result = m;
+                         return;
+                     }
+                 }
+ 
+                 TypeInstance tpi = tparam.isTypeInstance();
+                 auto m = deduceParentInstance(sc, t.sym, tpi, parameters, dedtypes, wm);
+                 if (m != MATCH.nomatch)
+                 {
+                     result = m;
+                     return;
+                 }
+ 
+                 // If it matches exactly or via implicit conversion, we're done
+                 visit(cast(Type)t);
+                 if (result != MATCH.nomatch)
+                     return;
+ 
+                 /* There is still a chance to match via implicit conversion to
+                  * a base class or interface. Because there could be more than one such
+                  * match, we need to check them all.
+                  */
+ 
+                 int numBaseClassMatches = 0; // Have we found an interface match?
+ 
+                 // Our best guess at dedtypes
+                 auto best = new Objects(dedtypes.length);
+ 
+                 ClassDeclaration s = t.sym;
+                 while (s && s.baseclasses.length > 0)
+                 {
+                     // Test the base class
+                     deduceBaseClassParameters(*(*s.baseclasses)[0], sc, tparam, parameters, dedtypes, *best, numBaseClassMatches);
+ 
+                     // Test the interfaces inherited by the base class
+                     foreach (b; s.interfaces)
+                     {
+                         deduceBaseClassParameters(*b, sc, tparam, parameters, dedtypes, *best, numBaseClassMatches);
+                     }
+                     s = (*s.baseclasses)[0].sym;
+                 }
+ 
+                 if (numBaseClassMatches == 0)
+                 {
+                     result = MATCH.nomatch;
+                     return;
+                 }
+ 
+                 // If we got at least one match, copy the known types into dedtypes
+                 memcpy(dedtypes.tdata(), best.tdata(), best.length * (void*).sizeof);
+                 result = MATCH.convert;
+                 return;
+             }
+ 
+             // Extra check
+             if (tparam && tparam.ty == Tclass)
+             {
+                 TypeClass tp = tparam.isTypeClass();
+ 
+                 //printf("\t%d\n", cast(MATCH) t.implicitConvTo(tp));
+                 if (wm && t.deduceWild(tparam, false))
+                 {
+                     result = MATCH.constant;
+                     return;
+                 }
+                 result = t.implicitConvTo(tp);
+                 return;
+             }
+             visit(cast(Type)t);
+         }
+ 
+         override void visit(Expression e)
+         {
+             //printf("Expression.deduceType(e = %s)\n", e.toChars());
+             size_t i = templateParameterLookup(tparam, &parameters);
+             if (i == IDX_NOTFOUND || tparam.isTypeIdentifier().idents.length > 0)
+             {
+                 if (e == emptyArrayElement && tparam.ty == Tarray)
+                 {
+                     Type tn = (cast(TypeNext)tparam).next;
+                     result = deduceType(emptyArrayElement, sc, tn, parameters, dedtypes, wm);
+                     return;
+                 }
+                 e.type.accept(this);
+                 return;
+             }
+ 
+             TemplateTypeParameter tp = parameters[i].isTemplateTypeParameter();
+             if (!tp)
+                 return; // nomatch
+ 
+             if (e == emptyArrayElement)
+             {
+                 if (dedtypes[i])
+                 {
+                     result = MATCH.exact;
+                     return;
+                 }
+                 if (tp.defaultType)
+                 {
+                     tp.defaultType.accept(this);
+                     return;
+                 }
+             }
+ 
+             Type at = cast(Type)dedtypes[i];
+             Type tt;
+             if (ubyte wx = deduceWildHelper(e.type, &tt, tparam))
+             {
+                 *wm |= wx;
+                 result = MATCH.constant;
+             }
+             else if (MATCH m = deduceTypeHelper(e.type, tt, tparam))
+             {
+                 result = m;
+             }
+             else if (!isTopRef(e.type))
+             {
+                 /* https://issues.dlang.org/show_bug.cgi?id=15653
+                  * In IFTI, recognize top-qualifier conversions
+                  * through the value copy, e.g.
+                  *      int --> immutable(int)
+                  *      immutable(string[]) --> immutable(string)[]
+                  */
+                 tt = e.type.mutableOf();
+                 result = MATCH.convert;
+             }
+             else
+                 return; // nomatch
+ 
+             // expression vs (none)
+             if (!at)
+             {
+                 dedtypes[i] = new TypeDeduced(tt, e, tparam);
+                 return;
+             }
+ 
+             TypeDeduced xt = null;
+             if (at.ty == Tnone)
+             {
+                 xt = cast(TypeDeduced)at;
+                 at = xt.tded;
+             }
+ 
+             // From previous matched expressions to current deduced type
+             MATCH match1 = xt ? xt.matchAll(tt) : MATCH.nomatch;
+ 
+             // From current expressions to previous deduced type
+             Type pt = at.addMod(tparam.mod);
+             if (*wm)
+                 pt = pt.substWildTo(*wm);
+             MATCH match2 = e.implicitConvTo(pt);
+ 
+             if (match1 > MATCH.nomatch && match2 > MATCH.nomatch)
+             {
+                 if (at.implicitConvTo(tt) == MATCH.nomatch)
+                     match1 = MATCH.nomatch; // Prefer at
+                 else if (tt.implicitConvTo(at) == MATCH.nomatch)
+                     match2 = MATCH.nomatch; // Prefer tt
+                 else if (tt.isTypeBasic() && tt.ty == at.ty && tt.mod != at.mod)
+                 {
+                     if (!tt.isMutable() && !at.isMutable())
+                         tt = tt.mutableOf().addMod(MODmerge(tt.mod, at.mod));
+                     else if (tt.isMutable())
+                     {
+                         if (at.mod == 0) // Prefer unshared
+                             match1 = MATCH.nomatch;
+                         else
+                             match2 = MATCH.nomatch;
+                     }
+                     else if (at.isMutable())
+                     {
+                         if (tt.mod == 0) // Prefer unshared
+                             match2 = MATCH.nomatch;
+                         else
+                             match1 = MATCH.nomatch;
+                     }
+                     //printf("tt = %s, at = %s\n", tt.toChars(), at.toChars());
+                 }
+                 else
+                 {
+                     match1 = MATCH.nomatch;
+                     match2 = MATCH.nomatch;
+                 }
+             }
+             if (match1 > MATCH.nomatch)
+             {
+                 // Prefer current match: tt
+                 if (xt)
+                     xt.update(tt, e, tparam);
+                 else
+                     dedtypes[i] = tt;
+                 result = match1;
+                 return;
+             }
+             if (match2 > MATCH.nomatch)
+             {
+                 // Prefer previous match: (*dedtypes)[i]
+                 if (xt)
+                     xt.update(e, tparam);
+                 result = match2;
+                 return;
+             }
+ 
+             /* Deduce common type
+              */
+             if (Type t = rawTypeMerge(at, tt))
+             {
+                 if (xt)
+                     xt.update(t, e, tparam);
+                 else
+                     dedtypes[i] = t;
+ 
+                 pt = tt.addMod(tparam.mod);
+                 if (*wm)
+                     pt = pt.substWildTo(*wm);
+                 result = e.implicitConvTo(pt);
+                 return;
+             }
+ 
+             result = MATCH.nomatch;
+         }
+ 
+         private MATCH deduceEmptyArrayElement()
+         {
+             if (!emptyArrayElement)
+             {
+                 emptyArrayElement = new IdentifierExp(Loc.initial, Id.p); // dummy
+                 emptyArrayElement.type = Type.tvoid;
+             }
+             assert(tparam.ty == Tarray);
+ 
+             Type tn = (cast(TypeNext)tparam).next;
+             return deduceType(emptyArrayElement, sc, tn, parameters, dedtypes, wm);
+         }
+ 
+         override void visit(NullExp e)
+         {
+             if (tparam.ty == Tarray && e.type.ty == Tnull)
+             {
+                 // tparam:T[] <- e:null (void[])
+                 result = deduceEmptyArrayElement();
+                 return;
+             }
+             visit(cast(Expression)e);
+         }
+ 
+         override void visit(StringExp e)
+         {
+             Type taai;
+             if (e.type.ty == Tarray && (tparam.ty == Tsarray || tparam.ty == Taarray && (taai = (cast(TypeAArray)tparam).index).ty == Tident && (cast(TypeIdentifier)taai).idents.length == 0))
+             {
+                 // Consider compile-time known boundaries
+                 e.type.nextOf().sarrayOf(e.len).accept(this);
+                 return;
+             }
+             visit(cast(Expression)e);
+         }
+ 
+         override void visit(ArrayLiteralExp e)
+         {
+             // https://issues.dlang.org/show_bug.cgi?id=20092
+             if (e.elements && e.elements.length && e.type.toBasetype().nextOf().ty == Tvoid)
+             {
+                 result = deduceEmptyArrayElement();
+                 return;
+             }
+             if ((!e.elements || !e.elements.length) && e.type.toBasetype().nextOf().ty == Tvoid && tparam.ty == Tarray)
+             {
+                 // tparam:T[] <- e:[] (void[])
+                 result = deduceEmptyArrayElement();
+                 return;
+             }
+ 
+             if (tparam.ty == Tarray && e.elements && e.elements.length)
+             {
+                 Type tn = (cast(TypeDArray)tparam).next;
+                 result = MATCH.exact;
+                 if (e.basis)
+                 {
+                     MATCH m = deduceType(e.basis, sc, tn, parameters, dedtypes, wm);
+                     if (m < result)
+                         result = m;
+                 }
+                 foreach (el; *e.elements)
+                 {
+                     if (result == MATCH.nomatch)
+                         break;
+                     if (!el)
+                         continue;
+                     MATCH m = deduceType(el, sc, tn, parameters, dedtypes, wm);
+                     if (m < result)
+                         result = m;
+                 }
+                 return;
+             }
+ 
+             Type taai;
+             if (e.type.ty == Tarray && (tparam.ty == Tsarray || tparam.ty == Taarray && (taai = (cast(TypeAArray)tparam).index).ty == Tident && (cast(TypeIdentifier)taai).idents.length == 0))
+             {
+                 // Consider compile-time known boundaries
+                 e.type.nextOf().sarrayOf(e.elements.length).accept(this);
+                 return;
+             }
+             visit(cast(Expression)e);
+         }
+ 
+         override void visit(AssocArrayLiteralExp e)
+         {
+             if (tparam.ty == Taarray && e.keys && e.keys.length)
+             {
+                 TypeAArray taa = cast(TypeAArray)tparam;
+                 result = MATCH.exact;
+                 foreach (i, key; *e.keys)
+                 {
+                     MATCH m1 = deduceType(key, sc, taa.index, parameters, dedtypes, wm);
+                     if (m1 < result)
+                         result = m1;
+                     if (result == MATCH.nomatch)
+                         break;
+                     MATCH m2 = deduceType((*e.values)[i], sc, taa.next, parameters, dedtypes, wm);
+                     if (m2 < result)
+                         result = m2;
+                     if (result == MATCH.nomatch)
+                         break;
+                 }
+                 return;
+             }
+             visit(cast(Expression)e);
+         }
+ 
+         override void visit(FuncExp e)
+         {
+             //printf("e.type = %s, tparam = %s\n", e.type.toChars(), tparam.toChars());
+             if (e.td)
+             {
+                 Type to = tparam;
+                 if (!to.nextOf())
+                     return;
+                 auto tof = to.nextOf().isTypeFunction();
+                 if (!tof)
+                     return;
+ 
+                 // Parameter types inference from 'tof'
+                 assert(e.td._scope);
+                 TypeFunction tf = e.fd.type.isTypeFunction();
+                 //printf("\ttof = %s\n", tof.toChars());
+                 //printf("\ttf  = %s\n", tf.toChars());
+                 const dim = tf.parameterList.length;
+ 
+                 if (tof.parameterList.length != dim || tof.parameterList.varargs != tf.parameterList.varargs)
+                     return;
+ 
+                 auto tiargs = new Objects();
+                 tiargs.reserve(e.td.parameters.length);
+ 
+                 foreach (tp; *e.td.parameters)
+                 {
+                     size_t u = 0;
+                     foreach (i, p; tf.parameterList)
+                     {
+                         if (p.type.ty == Tident && (cast(TypeIdentifier)p.type).ident == tp.ident)
+                             break;
+                         ++u;
+                     }
+                     assert(u < dim);
+                     Parameter pto = tof.parameterList[u];
+                     if (!pto)
+                         break;
+                     Type t = pto.type.syntaxCopy(); // https://issues.dlang.org/show_bug.cgi?id=11774
+                     if (reliesOnTemplateParameters(t, parameters[inferStart .. parameters.length]))
+                         return;
+                     t = t.typeSemantic(e.loc, sc);
+                     if (t.ty == Terror)
+                         return;
+                     tiargs.push(t);
+                 }
+ 
+                 // Set target of return type inference
+                 if (!tf.next && tof.next)
+                     e.fd.treq = tparam;
+ 
+                 auto ti = new TemplateInstance(e.loc, e.td, tiargs);
+                 Expression ex = (new ScopeExp(e.loc, ti)).expressionSemantic(e.td._scope);
+ 
+                 // Reset inference target for the later re-semantic
+                 e.fd.treq = null;
+ 
+                 if (ex.op == EXP.error)
+                     return;
+                 if (ex.op != EXP.function_)
+                     return;
+                 visit(ex.type);
+                 return;
+             }
+ 
+             Type t = e.type;
+ 
+             if (t.ty == Tdelegate && tparam.ty == Tpointer)
+                 return;
+ 
+             // Allow conversion from implicit function pointer to delegate
+             if (e.tok == TOK.reserved && t.ty == Tpointer && tparam.ty == Tdelegate)
+             {
+                 TypeFunction tf = t.nextOf().isTypeFunction();
+                 t = (new TypeDelegate(tf)).merge();
+             }
+             //printf("tparam = %s <= e.type = %s, t = %s\n", tparam.toChars(), e.type.toChars(), t.toChars());
+             visit(t);
+         }
+ 
+         override void visit(SliceExp e)
+         {
+             Type taai;
+             if (e.type.ty == Tarray && (tparam.ty == Tsarray || tparam.ty == Taarray && (taai = (cast(TypeAArray)tparam).index).ty == Tident && (cast(TypeIdentifier)taai).idents.length == 0))
+             {
+                 // Consider compile-time known boundaries
+                 if (Type tsa = toStaticArrayType(e))
+                 {
+                     tsa.accept(this);
+                     if (result > MATCH.convert)
+                         result = MATCH.convert; // match with implicit conversion at most
+                     return;
+                 }
+             }
+             visit(cast(Expression)e);
+         }
+ 
+         override void visit(CommaExp e)
+         {
+             e.e2.accept(this);
+         }
+     }
+ 
+     scope DeduceType v = new DeduceType();
+     if (Type t = isType(o))
+         t.accept(v);
+     else if (Expression e = isExpression(o))
+     {
+         assert(wm);
+         e.accept(v);
+     }
+     else
+         assert(0);
+     return v.result;
+ }
+ 
+ 
+ /* Helper for TypeClass.deduceType().
+  * Classes can match with implicit conversion to a base class or interface.
+  * This is complicated, because there may be more than one base class which
+  * matches. In such cases, one or more parameters remain ambiguous.
+  * For example,
+  *
+  *   interface I(X, Y) {}
+  *   class C : I(uint, double), I(char, double) {}
+  *   C x;
+  *   foo(T, U)( I!(T, U) x)
+  *
+  *   deduces that U is double, but T remains ambiguous (could be char or uint).
+  *
+  * Given a baseclass b, and initial deduced types 'dedtypes', this function
+  * tries to match tparam with b, and also tries all base interfaces of b.
+  * If a match occurs, numBaseClassMatches is incremented, and the new deduced
+  * types are ANDed with the current 'best' estimate for dedtypes.
+  */
+ private void deduceBaseClassParameters(ref BaseClass b, Scope* sc, Type tparam, ref TemplateParameters parameters, ref Objects dedtypes, ref Objects best, ref int numBaseClassMatches)
+ {
+     if (TemplateInstance parti = b.sym ? b.sym.parent.isTemplateInstance() : null)
+     {
+         // Make a temporary copy of dedtypes so we don't destroy it
+         auto tmpdedtypes = new Objects(dedtypes.length);
+         memcpy(tmpdedtypes.tdata(), dedtypes.tdata(), dedtypes.length * (void*).sizeof);
+ 
+         auto t = new TypeInstance(Loc.initial, parti);
+         MATCH m = deduceType(t, sc, tparam, parameters, *tmpdedtypes);
+         if (m > MATCH.nomatch)
+         {
+             // If this is the first ever match, it becomes our best estimate
+             if (numBaseClassMatches == 0)
+                 memcpy(best.tdata(), tmpdedtypes.tdata(), tmpdedtypes.length * (void*).sizeof);
+             else
+                 for (size_t k = 0; k < tmpdedtypes.length; ++k)
+                 {
+                     // If we've found more than one possible type for a parameter,
+                     // mark it as unknown.
+                     if ((*tmpdedtypes)[k] != best[k])
+                         best[k] = dedtypes[k];
+                 }
+             ++numBaseClassMatches;
+         }
+     }
+ 
+     // Now recursively test the inherited interfaces
+     foreach (ref bi; b.baseInterfaces)
+     {
+         deduceBaseClassParameters(bi, sc, tparam, parameters, dedtypes, best, numBaseClassMatches);
+     }
+ }
+ 
+ /*
+  * Handle tuple matching for function parameters.
+  * If the last parameter of `tp` is a template tuple parameter,
+  * collect the corresponding argument types from `t`.
+  * Params:
+  *     t          = actual function type
+  *     tp         = template function type
+  *     parameters = template parameters
+  *     dedtypes   = deduced types array
+  *     nfargs     = number of arguments in `t`
+  *     nfparams   = number of parameters in `tp` (updated on success)
+  * Returns: `true` on success, `false` on mismatch.
+  */
+ private bool deduceFunctionTuple(TypeFunction t, TypeFunction tp,
+     ref TemplateParameters parameters, ref Objects dedtypes,
+     size_t nfargs, ref size_t nfparams)
+ {
+     if (nfparams > 0 && nfargs >= nfparams - 1)
+     {
+         Parameter fparam = tp.parameterList[nfparams - 1];
+         assert(fparam && fparam.type);
+         if (fparam.type.ty == Tident)
+         {
+             TypeIdentifier tid = fparam.type.isTypeIdentifier();
+             if (tid.idents.length == 0)
+             {
+                 size_t tupi = 0;
+                 for (; tupi < parameters.length; ++tupi)
+                 {
+                     TemplateParameter tx = parameters[tupi];
+                     TemplateTupleParameter tup = tx.isTemplateTupleParameter();
+                     if (tup && tup.ident.equals(tid.ident))
+                         break;
+                 }
+                 if (tupi == parameters.length)
+                     return nfargs == nfparams;
+ 
+                 size_t tuple_dim = nfargs - (nfparams - 1);
+ 
+                 RootObject o = dedtypes[tupi];
+                 if (o)
+                 {
+                     Tuple tup = isTuple(o);
+                     if (!tup || tup.objects.length != tuple_dim)
+                         return false;
+                     for (size_t i = 0; i < tuple_dim; ++i)
+                     {
+                         if (!t.parameterList[nfparams - 1 + i].type.equals(tup.objects[i]))
+                             return false;
+                     }
+                 }
+                 else
+                 {
+                     auto tup = new Tuple(tuple_dim);
+                     for (size_t i = 0; i < tuple_dim; ++i)
+                         tup.objects[i] = t.parameterList[nfparams - 1 + i].type;
+                     dedtypes[tupi] = tup;
+                 }
+                 --nfparams; // ignore tuple parameter for further deduction
+                 return true;
+             }
+         }
+     }
+     return nfargs == nfparams;
+ }
+ 
+ /********************
+  * Match template `parameters` to the target template instance.
+  * Example:
+  *    struct Temp(U, int Z) {}
+  *    void foo(T)(Temp!(T, 3));
+  *    foo(Temp!(int, 3)());
+  * Input:
+  *    sc               = context
+  *    parameters       = template params of foo -> [T]
+  *    tiargs           = <Temp!(int, 3)>.tiargs  -> [int, 3]
+  *    tdtypes          = <Temp!(int, 3)>.tdtypes -> [int, 3]
+  *    tempdecl         = <struct Temp!(T, int Z)> -> [T, Z]
+  *    tp               = <Temp!(T, 3)>
+  * Output:
+  *    dedtypes         = deduced params of `foo(Temp!(int, 3)())` -> [int]
+  */
+ private bool resolveTemplateInstantiation(Scope* sc, TemplateParameters* parameters, Objects* tiargs, Objects* tdtypes, TemplateDeclaration tempdecl, TypeInstance tp, Objects* dedtypes)
+ {
+     for (size_t i = 0; 1; i++)
+     {
+         //printf("\ttest: tempinst.tiargs[%zu]\n", i);
+         RootObject o1 = null;
+         if (i < tiargs.length)
+             o1 = (*tiargs)[i];
+         else if (i < tdtypes.length && i < tp.tempinst.tiargs.length)
+         {
+             // Pick up default arg
+             o1 = (*tdtypes)[i];
+         }
+         else if (i >= tp.tempinst.tiargs.length)
+             break;
+         //printf("\ttest: o1 = %s\n", o1.toChars());
+         if (i >= tp.tempinst.tiargs.length)
+         {
+             size_t dim = tempdecl.parameters.length - (tempdecl.isVariadic() ? 1 : 0);
+             while (i < dim && ((*tempdecl.parameters)[i].dependent || (*tempdecl.parameters)[i].hasDefaultArg()))
+             {
+                 i++;
+             }
+             if (i >= dim)
+                 break; // match if all remained parameters are dependent
+             return false;
+         }
+ 
+         RootObject o2 = (*tp.tempinst.tiargs)[i];
+         Type t2 = isType(o2);
+         //printf("\ttest: o2 = %s\n", o2.toChars());
+         size_t j = (t2 && t2.ty == Tident && i == tp.tempinst.tiargs.length - 1)
+             ? templateParameterLookup(t2, parameters) : IDX_NOTFOUND;
+         if (j != IDX_NOTFOUND && j == parameters.length - 1 &&
+             (*parameters)[j].isTemplateTupleParameter())
+         {
+             /* Given:
+                  *  struct A(B...) {}
+                  *  alias A!(int, float) X;
+                  *  static if (is(X Y == A!(Z), Z...)) {}
+                  * deduce that Z is a tuple(int, float)
+                  */
+ 
+             /* Create tuple from remaining args
+                  */
+             size_t vtdim = (tempdecl.isVariadic() ? tiargs.length : tdtypes.length) - i;
+             auto vt = new Tuple(vtdim);
+             for (size_t k = 0; k < vtdim; k++)
+             {
+                 RootObject o;
+                 if (k < tiargs.length)
+                     o = (*tiargs)[i + k];
+                 else // Pick up default arg
+                     o = (*tdtypes)[i + k];
+                 vt.objects[k] = o;
+             }
+ 
+             Tuple v = cast(Tuple)(*dedtypes)[j];
+             if (v)
+             {
+                 if (!match(v, vt))
+                     return false;
+             }
+             else
+                 (*dedtypes)[j] = vt;
+             break;
+         }
+         else if (!o1)
+             break;
+ 
+         Type t1 = isType(o1);
+         Dsymbol s1 = isDsymbol(o1);
+         Dsymbol s2 = isDsymbol(o2);
+         Expression e1 = s1 ? getValue(s1) : getValue(isExpression(o1));
+         Expression e2 = isExpression(o2);
+         version (none)
+         {
+             Tuple v1 = isTuple(o1);
+             Tuple v2 = isTuple(o2);
+             if (t1)
+                 printf("t1 = %s\n", t1.toChars());
+             if (t2)
+                 printf("t2 = %s\n", t2.toChars());
+             if (e1)
+                 printf("e1 = %s\n", e1.toChars());
+             if (e2)
+                 printf("e2 = %s\n", e2.toChars());
+             if (s1)
+                 printf("s1 = %s\n", s1.toChars());
+             if (s2)
+                 printf("s2 = %s\n", s2.toChars());
+             if (v1)
+                 printf("v1 = %s\n", v1.toChars());
+             if (v2)
+                 printf("v2 = %s\n", v2.toChars());
+         }
+ 
+         if (t1 && t2)
+         {
+             if (!deduceType(t1, sc, t2, *parameters, *dedtypes))
+                 return false;
+         }
+         else if (e1 && e2)
+         {
+         Le:
+             e1 = e1.ctfeInterpret();
+ 
+             /* If it is one of the template parameters for this template,
+                  * we should not attempt to interpret it. It already has a value.
+                  */
+             if (e2.op == EXP.variable && (e2.isVarExp().var.storage_class & STC.templateparameter))
+             {
+                 /*
+                      * (T:Number!(e2), int e2)
+                      */
+                 j = templateIdentifierLookup(e2.isVarExp().var.ident, parameters);
+                 if (j != IDX_NOTFOUND)
+                     goto L1;
+                 // The template parameter was not from this template
+                 // (it may be from a parent template, for example)
+             }
+ 
+             e2 = e2.expressionSemantic(sc); // https://issues.dlang.org/show_bug.cgi?id=13417
+             e2 = e2.ctfeInterpret();
+ 
+             //printf("e1 = %s, type = %s %d\n", e1.toChars(), e1.type.toChars(), e1.type.ty);
+             //printf("e2 = %s, type = %s %d\n", e2.toChars(), e2.type.toChars(), e2.type.ty);
+             if (!e1.equals(e2))
+             {
+                 if (!e2.implicitConvTo(e1.type))
+                     return false;
+ 
+                 e2 = e2.implicitCastTo(sc, e1.type);
+                 e2 = e2.ctfeInterpret();
+                 if (!e1.equals(e2))
+                     return false;
+             }
+         }
+         else if (e1 && t2 && t2.ty == Tident)
+         {
+             j = templateParameterLookup(t2, parameters);
+         L1:
+             if (j == IDX_NOTFOUND)
+             {
+                 t2.resolve((cast(TypeIdentifier)t2).loc, sc, e2, t2, s2);
+                 if (e2)
+                     goto Le;
+                 return false;
+             }
+             if (!(*parameters)[j].matchArg(sc, e1, j, parameters, *dedtypes, null))
+                 return false;
+         }
+         else if (s1 && s2)
+         {
+         Ls:
+             if (!s1.equals(s2))
+                 return false;
+         }
+         else if (s1 && t2 && t2.ty == Tident)
+         {
+             j = templateParameterLookup(t2, parameters);
+             if (j == IDX_NOTFOUND)
+             {
+                 t2.resolve((cast(TypeIdentifier)t2).loc, sc, e2, t2, s2);
+                 if (s2)
+                     goto Ls;
+                 return false;
+             }
+             if (!(*parameters)[j].matchArg(sc, s1, j, parameters, *dedtypes, null))
+                 return false;
+         }
+         else
+             return false;
+     }
+     return true;
+ }
+ 
+ private  Expression getValue(ref Dsymbol s)
+ {
+     if (s)
+     {
+         if (VarDeclaration v = s.isVarDeclaration())
+         {
+             if (v.storage_class & STC.manifest)
+                 return v.getConstInitializer();
+         }
+     }
+     return null;
+ }
+ 
+ /***********************
+  * Try to get value from manifest constant
+  */
+ private Expression getValue(Expression e)
+ {
+     if (!e)
+         return null;
+     if (auto ve = e.isVarExp())
+     {
+         if (auto v = ve.var.isVarDeclaration())
+         {
+             if (v.storage_class & STC.manifest)
+             {
+                 e = v.getConstInitializer();
+             }
+         }
+     }
+     return e;
+ }
+ 
+ Expression getExpression(RootObject o)
+ {
+     auto s = isDsymbol(o);
+     return s ? .getValue(s) : .getValue(isExpression(o));
+ }
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/tokens.d gcc-16-20260201/gcc/d/dmd/tokens.d
*** gcc-16-20260125/gcc/d/dmd/tokens.d	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/tokens.d	Sun Feb  1 22:32:07 2026
*************** void writeCharLiteral(ref OutBuffer buf,
*** 1180,1186 ****
              if (c <= 0xFF)
              {
                  if (isprint(c))
!                     buf.writeByte(c);
                  else
                      buf.printf("\\x%02x", c);
              }
--- 1180,1186 ----
              if (c <= 0xFF)
              {
                  if (isprint(c))
!                     buf.writeByte(cast(char)c);
                  else
                      buf.printf("\\x%02x", c);
              }
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/traits.d gcc-16-20260201/gcc/d/dmd/traits.d
*** gcc-16-20260125/gcc/d/dmd/traits.d	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/traits.d	Sun Feb  1 22:32:07 2026
*************** import dmd.root.array;
*** 51,56 ****
--- 51,57 ----
  import dmd.root.speller;
  import dmd.root.stringtable;
  import dmd.target;
+ import dmd.templatesem : TemplateInstance_semanticTiargs;
  import dmd.tokens;
  import dmd.typesem;
  import dmd.visitor;
*************** Expression semanticTraits(TraitsExp e, S
*** 340,346 ****
              sc.stc |= STC.deprecated_;
          Scope* sc2 = sc.startCTFE();
          scope(exit) { sc2.endCTFE(); }
!         if (!TemplateInstance.semanticTiargs(e.loc, sc2, e.args, 1))
          {
              sc.stc = save;
              return ErrorExp.get();
--- 341,347 ----
              sc.stc |= STC.deprecated_;
          Scope* sc2 = sc.startCTFE();
          scope(exit) { sc2.endCTFE(); }
!         if (!TemplateInstance_semanticTiargs(e.loc, sc2, e.args, 1))
          {
              sc.stc = save;
              return ErrorExp.get();
*************** Expression semanticTraits(TraitsExp e, S
*** 735,741 ****
           * a symbol should not be folded to a constant.
           * Bit 1 means don't convert Parameter to Type if Parameter has an identifier
           */
!         if (!TemplateInstance.semanticTiargs(e.loc, sc, e.args, 2))
              return ErrorExp.get();
          if (dim != 1)
              return dimError(1);
--- 736,742 ----
           * a symbol should not be folded to a constant.
           * Bit 1 means don't convert Parameter to Type if Parameter has an identifier
           */
!         if (!TemplateInstance_semanticTiargs(e.loc, sc, e.args, 2))
              return ErrorExp.get();
          if (dim != 1)
              return dimError(1);
*************** Expression semanticTraits(TraitsExp e, S
*** 774,780 ****
          sc2.copyFlagsFrom(sc);
          sc2.noAccessCheck = true;
          sc2.ignoresymbolvisibility = true;
!         bool ok = TemplateInstance.semanticTiargs(e.loc, sc2, e.args, 1);
          sc2.pop();
          if (!ok)
              return ErrorExp.get();
--- 775,781 ----
          sc2.copyFlagsFrom(sc);
          sc2.noAccessCheck = true;
          sc2.ignoresymbolvisibility = true;
!         bool ok = TemplateInstance_semanticTiargs(e.loc, sc2, e.args, 1);
          sc2.pop();
          if (!ok)
              return ErrorExp.get();
*************** Expression semanticTraits(TraitsExp e, S
*** 849,855 ****
          sc2.copyFlagsFrom(sc);
          sc2.noAccessCheck = true;
          sc2.ignoresymbolvisibility = true;
!         bool ok = TemplateInstance.semanticTiargs(e.loc, sc2, e.args, 1);
          sc2.pop();
          if (!ok)
              return ErrorExp.get();
--- 850,856 ----
          sc2.copyFlagsFrom(sc);
          sc2.noAccessCheck = true;
          sc2.ignoresymbolvisibility = true;
!         bool ok = TemplateInstance_semanticTiargs(e.loc, sc2, e.args, 1);
          sc2.pop();
          if (!ok)
              return ErrorExp.get();
*************** Expression semanticTraits(TraitsExp e, S
*** 1304,1310 ****
           * a symbol should not be folded to a constant.
           * Bit 1 means don't convert Parameter to Type if Parameter has an identifier
           */
!         if (!TemplateInstance.semanticTiargs(e.loc, sc, e.args, 3))
              return ErrorExp.get();
  
          if (dim != 1)
--- 1305,1311 ----
           * a symbol should not be folded to a constant.
           * Bit 1 means don't convert Parameter to Type if Parameter has an identifier
           */
!         if (!TemplateInstance_semanticTiargs(e.loc, sc, e.args, 3))
              return ErrorExp.get();
  
          if (dim != 1)
*************** Expression semanticTraits(TraitsExp e, S
*** 1847,1853 ****
                      const tf = sc2.func.type.isTypeFunction();
                      err |= tf.isNothrow && canThrow(ex, sc2.func, null);
                  }
!                 ex = checkGC(sc2, ex);
                  if (ex.op == EXP.error)
                      err = true;
              }
--- 1848,1854 ----
                      const tf = sc2.func.type.isTypeFunction();
                      err |= tf.isNothrow && canThrow(ex, sc2.func, null);
                  }
!                 ex = ex.checkGC(sc2);
                  if (ex.op == EXP.error)
                      err = true;
              }
*************** Expression semanticTraits(TraitsExp e, S
*** 1882,1890 ****
          ob1.push((*e.args)[0]);
          Objects ob2;
          ob2.push((*e.args)[1]);
!         if (!TemplateInstance.semanticTiargs(e.loc, sc, &ob1, 0))
              return ErrorExp.get();
!         if (!TemplateInstance.semanticTiargs(e.loc, sc, &ob2, 0))
              return ErrorExp.get();
          if (ob1.length != ob2.length)
              return False();
--- 1883,1891 ----
          ob1.push((*e.args)[0]);
          Objects ob2;
          ob2.push((*e.args)[1]);
!         if (!TemplateInstance_semanticTiargs(e.loc, sc, &ob1, 0))
              return ErrorExp.get();
!         if (!TemplateInstance_semanticTiargs(e.loc, sc, &ob2, 0))
              return ErrorExp.get();
          if (ob1.length != ob2.length)
              return False();
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/typesem.d gcc-16-20260201/gcc/d/dmd/typesem.d
*** gcc-16-20260125/gcc/d/dmd/typesem.d	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/typesem.d	Sun Feb  1 22:32:07 2026
*************** private void resolveHelper(TypeQualified
*** 169,185 ****
           */
          const p = mt.mutableOf().unSharedOf().toChars();
          auto id = Identifier.idPool(p[0 .. strlen(p)]);
!         if (const n = importHint(id.toString()))
!             error(loc, "`%s` is not defined, perhaps `import %.*s;` ?", p, cast(int)n.length, n.ptr);
!         else if (auto s2 = sc.search_correct(id))
!             error(loc, "undefined identifier `%s`, did you mean %s `%s`?", p, s2.kind(), s2.toChars());
!         else if (const q = Scope.search_correct_C(id))
!             error(loc, "undefined identifier `%s`, did you mean `%s`?", p, q);
!         else if ((id == Id.This   && sc.getStructClassScope()) ||
!                  (id == Id._super && sc.getClassScope()))
!             error(loc, "undefined identifier `%s`, did you mean `typeof(%s)`?", p, p);
!         else
!             error(loc, "undefined identifier `%s`", p);
  
          pt = Type.terror;
          return;
--- 169,196 ----
           */
          const p = mt.mutableOf().unSharedOf().toChars();
          auto id = Identifier.idPool(p[0 .. strlen(p)]);
!         if (!(sc && sc.inCfile))
!         {
!             if (const n = importHint(id.toString()))
!                 error(loc, "`%s` is not defined, perhaps `import %.*s;` ?", p, cast(int)n.length, n.ptr);
!             else if (auto s2 = sc.search_correct(id))
!                 error(loc, "undefined identifier `%s`, did you mean %s `%s`?", p, s2.kind(), s2.toChars());
!             else if (const q = Scope.search_correct_C(id))
!                 error(loc, "undefined identifier `%s`, did you mean `%s`?", p, q);
!             else if ((id == Id.This   && sc.getStructClassScope()) ||
!                      (id == Id._super && sc.getClassScope()))
!                 error(loc, "undefined identifier `%s`, did you mean `typeof(%s)`?", p, p);
!             else
!                 error(mt.loc, "undefined identifier `%s`", p);
!         }
!         else {
!             if (const n = cIncludeHint(id.toString()))
!                 error(loc, "`%s` is not defined, perhaps `#include %.*s` ?", p, cast(int)n.length, n.ptr);
!             else if (auto s2 = sc.search_correct(id))
!                 error(loc, "undefined identifier `%s`, did you mean %s `%s`?", p, s2.kind(), s2.toChars());
!             else
!                 error(loc, "undefined identifier `%s`", p);
!         }
  
          pt = Type.terror;
          return;
*************** bool isCopyable(Type t)
*** 456,463 ****
              assert(ctor);
              scope el = new IdentifierExp(Loc.initial, Id.p); // dummy lvalue
              el.type = cast() ts;
!             Expressions* args = new Expressions();
!             args.push(el);
              FuncDeclaration f = resolveFuncCall(Loc.initial, null, ctor, null, cast()ts, ArgumentList(args), FuncResolveFlag.quiet);
              if (!f || f.storage_class & STC.disable)
                  return false;
--- 467,473 ----
              assert(ctor);
              scope el = new IdentifierExp(Loc.initial, Id.p); // dummy lvalue
              el.type = cast() ts;
!             Expressions* args = new Expressions(el);
              FuncDeclaration f = resolveFuncCall(Loc.initial, null, ctor, null, cast()ts, ArgumentList(args), FuncResolveFlag.quiet);
              if (!f || f.storage_class & STC.disable)
                  return false;
*************** bool isCopyable(Type t)
*** 466,471 ****
--- 476,535 ----
      return true;
  }
  
+ /**************************
+  * When T is mutable,
+  * Given:
+  *      T a, b;
+  * Can we bitwise assign:
+  *      a = b;
+  * ?
+  */
+ bool isAssignable(Type t)
+ {
+     if (auto te = t.isTypeEnum())
+         t = te.memType();
+     TypeStruct ts = t.isTypeStruct();
+     if (!ts)
+         return true;
+ 
+     bool assignable = true;
+     uint offset = ~0; // dead-store initialize to prevent spurious warning
+ 
+     auto sym = ts.sym;
+     sym.determineSize(sym.loc);
+ 
+     /* If any of the fields are const or immutable,
+      * then one cannot assign this struct.
+      */
+     for (size_t i = 0; i < sym.fields.length; i++)
+     {
+         VarDeclaration v = sym.fields[i];
+         //printf("%s [%d] v = (%s) %s, v.offset = %d, v.parent = %s\n", sym.toChars(), i, v.kind(), v.toChars(), v.offset, v.parent.kind());
+         if (i == 0)
+         {
+         }
+         else if (v.offset == offset)
+         {
+             /* If any fields of anonymous union are assignable,
+              * then regard union as assignable.
+              * This is to support unsafe things like Rebindable templates.
+              */
+             if (assignable)
+                 continue;
+         }
+         else
+         {
+             if (!assignable)
+                 return false;
+         }
+         assignable = v.type.isMutable() && v.type.isAssignable();
+         offset = v.offset;
+         //printf(" -> assignable = %d\n", assignable);
+     }
+ 
+     return assignable;
+ }
+ 
  /************************************
   * Determine mutability of indirections in (ref) t.
   *
*************** extern (D) bool checkComplexTransition(T
*** 677,682 ****
--- 741,869 ----
      return false;
  }
  
+ /**
+  * Look for the index of parameter `ident` in the parameter list
+  *
+  * Params:
+  *   tf = function type
+  *   ident = identifier of parameter to search for
+  * Returns: index of parameter with name `ident` or -1 if not found
+  */
+ private extern(D) ptrdiff_t findParameterIndex(TypeFunction tf, Identifier ident)
+ {
+     foreach (i, p; tf.parameterList)
+     {
+         if (p.ident == ident)
+             return i;
+     }
+     return -1;
+ }
+ 
+ /*********************************
+  * Append error message to buf.
+  * Input:
+  *  buf = message sink
+  *  format = printf format
+  */
+ private extern(C) void getMatchError(ref OutBuffer buf, const(char)* format, ...)
+ {
+     if (global.gag && !global.params.v.showGaggedErrors)
+         return;
+     va_list ap;
+     va_start(ap, format);
+     buf.vprintf(format, ap);
+     va_end(ap);
+ }
+ 
+ /********************************
+  * Convert an `argumentList`, which may contain named arguments, into
+  * a list of arguments in the order of the parameter list.
+  *
+  * Params:
+  *   tf = function type
+  *      argumentList = array of function arguments
+  *      buf = if not null, append error message to it
+  * Returns: re-ordered argument list, or `null` on error
+  */
+ extern(D) Expressions* resolveNamedArgs(TypeFunction tf, ArgumentList argumentList, OutBuffer* buf)
+ {
+     Expression[] args = argumentList.arguments ? (*argumentList.arguments)[] : null;
+     ArgumentLabel[] names = argumentList.names ? (*argumentList.names)[] : null;
+     const nParams = tf.parameterList.length(); // cached because O(n)
+     auto newArgs = new Expressions(nParams);
+     newArgs.zero();
+     size_t ci = 0;
+     bool hasNamedArgs = false;
+     const bool isVariadic = tf.parameterList.varargs != VarArg.none;
+     foreach (i, arg; args)
+     {
+         if (!arg)
+         {
+             ci++;
+             continue;
+         }
+         auto name = i < names.length ? names[i].name : null;
+         if (name)
+         {
+             hasNamedArgs = true;
+             const pi = tf.findParameterIndex(name);
+             if (pi == -1)
+             {
+                 if (buf)
+                     getMatchError(*buf, "no parameter named `%s`", name.toChars());
+                 return null;
+             }
+             ci = pi;
+         }
+         if (ci >= newArgs.length)
+         {
+             if (!isVariadic)
+             {
+                 // Without named args, let the caller diagnose argument overflow
+                 if (hasNamedArgs && buf)
+                     getMatchError(*buf, "argument `%s` goes past end of parameter list", arg.toChars());
+                 return null;
+             }
+             while (ci >= newArgs.length)
+                 newArgs.push(null);
+         }
+ 
+         if ((*newArgs)[ci])
+         {
+             if (buf)
+                 getMatchError(*buf, "parameter `%s` assigned twice", tf.parameterList[ci].toChars());
+             return null;
+         }
+         (*newArgs)[ci++] = arg;
+     }
+     foreach (i, arg; (*newArgs)[])
+     {
+         if (arg || tf.parameterList[i].defaultArg)
+             continue;
+ 
+         if (isVariadic && i + 1 == newArgs.length)
+             continue;
+ 
+         // dtemplate sets `defaultArg=null` to avoid semantic on default arguments,
+         // don't complain about missing arguments in that case
+         if (tf.incomplete)
+             continue;
+ 
+         if (buf)
+             getMatchError(*buf, "missing argument for parameter #%d: `%s`",
+                           i + 1, parameterToChars(tf.parameterList[i], tf, false));
+         return null;
+     }
+     // strip trailing nulls from default arguments
+     size_t e = newArgs.length;
+     while (e > 0 && (*newArgs)[e - 1] is null)
+     {
+         --e;
+     }
+     newArgs.setDim(e);
+     return newArgs;
+ }
+ 
  /********************************
   * 'args' are being matched to function type 'tf'
   * Determine match level.
*************** extern (D) MATCH callMatch(FuncDeclarati
*** 857,864 ****
              if (errorHelper)
              {
                  if (u >= args.length)
!                     TypeFunction.getMatchError(buf, "missing argument for parameter #%d: `%s`",
!                         u + 1, parameterToChars(p, tf, false));
                  // If an error happened previously, `pMessage` was already filled
                  else if (buf.length == 0)
                      buf.writestring(tf.getParamError(args[u], p));
--- 1044,1051 ----
              if (errorHelper)
              {
                  if (u >= args.length)
!                     getMatchError(buf, "missing argument for parameter #%d: `%s`",
!                                   u + 1, parameterToChars(p, tf, false));
                  // If an error happened previously, `pMessage` was already filled
                  else if (buf.length == 0)
                      buf.writestring(tf.getParamError(args[u], p));
*************** extern (D) MATCH callMatch(FuncDeclarati
*** 875,881 ****
      {
          // all parameters had a match, but there are surplus args
          OutBuffer buf2;
!         TypeFunction.getMatchError(buf2, "expected %d argument(s), not %d", nparams, args.length);
          errorHelper(buf2.extractChars());
          return MATCH.nomatch;
      }
--- 1062,1068 ----
      {
          // all parameters had a match, but there are surplus args
          OutBuffer buf2;
!         getMatchError(buf2, "expected %d argument(s), not %d", nparams, args.length);
          errorHelper(buf2.extractChars());
          return MATCH.nomatch;
      }
*************** private extern(D) bool isCopyConstructor
*** 933,939 ****
      if (!f)
          return nocpctor();
  
!     if (f.isDisabled() && !f.isGenerated())
      {
          /* https://issues.dlang.org/show_bug.cgi?id=24301
           * Copy constructor is explicitly disabled
--- 1120,1126 ----
      if (!f)
          return nocpctor();
  
!     if (f.isDisabled() && !f.isGenerated)
      {
          /* https://issues.dlang.org/show_bug.cgi?id=24301
           * Copy constructor is explicitly disabled
*************** private extern(D) bool isCopyConstructor
*** 956,962 ****
              bsafe ? "@safe ".ptr : nullptr,
              bnogc ? "nogc"  .ptr : nullptr);
      }
!     else if (f.isGenerated() && f.isDisabled())
      {
          /* https://issues.dlang.org/show_bug.cgi?id=23097
           * Compiler generated copy constructor failed.
--- 1143,1149 ----
              bsafe ? "@safe ".ptr : nullptr,
              bnogc ? "nogc"  .ptr : nullptr);
      }
!     else if (f.isGenerated && f.isDisabled())
      {
          /* https://issues.dlang.org/show_bug.cgi?id=23097
           * Compiler generated copy constructor failed.
*************** private extern(D) MATCH argumentMatchPar
*** 1169,1174 ****
--- 1356,1367 ----
          return MATCH.nomatch;
      }
  
+     if (arg.isBitField())
+     {
+         if (pMessage) *pMessage = tf.getParamError(arg, p);
+         return MATCH.nomatch;
+     }
+ 
      return m;
  }
  
*************** private const(char)* getParamError(TypeF
*** 1182,1194 ****
      // when comparing the type with strcmp, we need to drop the qualifier
      bool qual = !arg.type.mutableOf().equals(par.type.mutableOf()) &&
          strcmp(arg.type.mutableOf().toChars(), par.type.mutableOf().toChars()) == 0;
-     auto at = qual ? arg.type.toPrettyChars(true) : arg.type.toChars();
      OutBuffer buf;
!     // only mention rvalue if it's relevant
!     const rv = !arg.isLvalue() && par.isReference();
!     buf.printf("cannot pass %sargument `%s` of type `%s` to parameter `%s`",
!         rv ? "rvalue ".ptr : "".ptr, arg.toErrMsg(), at,
!         parameterToChars(par, tf, qual));
      return buf.extractChars();
  }
  
--- 1375,1395 ----
      // when comparing the type with strcmp, we need to drop the qualifier
      bool qual = !arg.type.mutableOf().equals(par.type.mutableOf()) &&
          strcmp(arg.type.mutableOf().toChars(), par.type.mutableOf().toChars()) == 0;
      OutBuffer buf;
!     // only mention rvalue or bitfield if it's relevant
!     if (arg.isBitField())
!     {
!         buf.printf("cannot pass bitfield argument `%s` to parameter `%s`",
!                    arg.toErrMsg(), parameterToChars(par, tf, qual));
!     }
!     else
!     {
!         auto at = qual ? arg.type.toPrettyChars(true) : arg.type.toChars();
!         const rv = !arg.isLvalue() && par.isReference() && !(par.storageClass & STC.constscoperef);
!         buf.printf("cannot pass %sargument `%s` of type `%s` to parameter `%s`",
!             rv ? "rvalue ".ptr : "".ptr, arg.toErrMsg(), at,
!             parameterToChars(par, tf, qual));
!     }
      return buf.extractChars();
  }
  
*************** private extern(D) MATCH matchTypeSafeVar
*** 1221,1227 ****
              if (pMessage)
              {
                  OutBuffer buf;
!                 TypeFunction.getMatchError(buf, "expected %llu variadic argument(s), not %zu",
                      sz, trailingArgs.length);
                  *pMessage = buf.extractChars();
              }
--- 1422,1428 ----
              if (pMessage)
              {
                  OutBuffer buf;
!                 getMatchError(buf, "expected %llu variadic argument(s), not %zu",
                      sz, trailingArgs.length);
                  *pMessage = buf.extractChars();
              }
*************** private extern(D) MATCH matchTypeSafeVar
*** 1279,1284 ****
--- 1480,1514 ----
      }
  }
  
+ /// Compute cached type properties for `TypeStruct`
+ void determineTypeProperties(StructDeclaration sd)
+ {
+     import dmd.dsymbolsem : hasPointers;
+     if (sd.computedTypeProperties)
+         return;
+     foreach (vd; sd.fields)
+     {
+         if (vd.storage_class & STC.ref_ || vd.hasPointers())
+         {
+             sd.hasPointerField = true;
+             sd.hasUnsafeBitpatterns = true;
+         }
+ 
+         if (vd._init && vd._init.isVoidInitializer() && vd.hasPointers())
+             sd.hasVoidInitPointers = true;
+ 
+         if (vd.storage_class & STC.system || vd.type.hasUnsafeBitpatterns())
+             sd.hasUnsafeBitpatterns = true;
+ 
+         if (!vd._init && vd.type.hasVoidInitPointers())
+             sd.hasVoidInitPointers = true;
+ 
+         if (vd.type.hasInvariant())
+             sd.hasFieldWithInvariant = true;
+     }
+     sd.computedTypeProperties = true;
+ }
+ 
  /***************************************
   * Return !=0 if type has pointers that need to
   * be scanned by the GC during a collection cycle.
*************** Type typeSemantic(Type type, Loc loc, Sc
*** 1934,1940 ****
              Expression e;
              Type t;
              Dsymbol s;
!             mtype.index.resolve(loc, sc, e, t, s);
  
              // https://issues.dlang.org/show_bug.cgi?id=15478
              if (s)
--- 2164,2182 ----
              Expression e;
              Type t;
              Dsymbol s;
!             Loc indexLoc;
! 
!             switch (mtype.index.ty)
!             {
!                 case Tident:    indexLoc = mtype.index.isTypeIdentifier().loc;  break;
!                 case Tinstance: indexLoc = mtype.index.isTypeInstance().loc;    break;
!                 case Ttypeof:   indexLoc = mtype.index.isTypeTypeof().loc;      break;
!                 case Treturn:   indexLoc = mtype.index.isTypeReturn().loc;      break;
!                 case Tmixin:    indexLoc = mtype.index.isTypeMixin().loc;       break;
!                 default: indexLoc = mtype.loc;
!             }
! 
!             mtype.index.resolve(indexLoc, sc, e, t, s);
  
              // https://issues.dlang.org/show_bug.cgi?id=15478
              if (s)
*************** Type typeSemantic(Type type, Loc loc, Sc
*** 2004,2010 ****
              // duplicate a part of StructDeclaration::semanticTypeInfoMembers
              //printf("AA = %s, key: xeq = %p, xerreq = %p xhash = %p\n", toChars(), sd.xeq, sd.xerreq, sd.xhash);
  
!             if (sd.xeq && sd.xeq.isGenerated() && sd.xeq._scope && sd.xeq.semanticRun < PASS.semantic3done)
              {
                  uint errors = global.startGagging();
                  sd.xeq.semantic3(sd.xeq._scope);
--- 2246,2252 ----
              // duplicate a part of StructDeclaration::semanticTypeInfoMembers
              //printf("AA = %s, key: xeq = %p, xerreq = %p xhash = %p\n", toChars(), sd.xeq, sd.xerreq, sd.xhash);
  
!             if (sd.xeq && sd.xeq.isGenerated && sd.xeq._scope && sd.xeq.semanticRun < PASS.semantic3done)
              {
                  uint errors = global.startGagging();
                  sd.xeq.semantic3(sd.xeq._scope);
*************** Type typeSemantic(Type type, Loc loc, Sc
*** 2635,2641 ****
  
                      if (farg && (eparam.storageClass & STC.ref_))
                      {
!                         if (!farg.isLvalue())
                              eparam.storageClass &= ~STC.ref_; // value parameter
                          eparam.storageClass &= ~STC.auto_;    // https://issues.dlang.org/show_bug.cgi?id=14656
                          eparam.storageClass |= STC.autoref;
--- 2877,2883 ----
  
                      if (farg && (eparam.storageClass & STC.ref_))
                      {
!                         if (!farg.isLvalue() || farg.isBitField())
                              eparam.storageClass &= ~STC.ref_; // value parameter
                          eparam.storageClass &= ~STC.auto_;    // https://issues.dlang.org/show_bug.cgi?id=14656
                          eparam.storageClass |= STC.autoref;
*************** Type typeSemantic(Type type, Loc loc, Sc
*** 2737,2743 ****
          Expression e;
          Dsymbol s;
          //printf("TypeIdentifier::semantic(%s)\n", mtype.toChars());
!         mtype.resolve(loc, sc, e, t, s);
          if (t)
          {
              //printf("\tit's a type %d, %s, %s\n", t.ty, t.toChars(), t.deco);
--- 2979,2989 ----
          Expression e;
          Dsymbol s;
          //printf("TypeIdentifier::semantic(%s)\n", mtype.toChars());
!         if (mtype.loc != Loc.initial)
!             mtype.resolve(mtype.loc, sc, e, t, s);
!         else
!             mtype.resolve(loc, sc, e, t, s);
! 
          if (t)
          {
              //printf("\tit's a type %d, %s, %s\n", t.ty, t.toChars(), t.deco);
*************** Type merge(Type type)
*** 3288,3293 ****
--- 3534,3544 ----
                  return type;
              goto default;
  
+         case Tfunction:
+             if (!type.nextOf()) // don't merge if return type is unknown
+                 return type;
+             goto default;
+ 
          default:
              if (type.nextOf() && !type.nextOf().deco)
                  return type;
*************** Type merge2(Type type)
*** 3350,3355 ****
--- 3601,3695 ----
      return t;
  }
  
+ private enum LOGDEFAULTINIT = 0;
+ /***************************************
+  * Use when we prefer the default initializer to be a literal,
+  * rather than a global immutable variable.
+  */
+ Expression defaultInitLiteral(Type t, Loc loc)
+ {
+ 
+     if (t.isTypeError())
+         return ErrorExp.get();
+     if (auto ts = t.isTypeStruct())
+     {
+         static if (LOGDEFAULTINIT)
+         {
+             printf("TypeStruct::defaultInitLiteral() '%s'\n", toChars());
+         }
+         ts.sym.size(loc);
+         if (ts.sym.sizeok != Sizeok.done)
+             return ErrorExp.get();
+ 
+         auto structelems = new Expressions(ts.sym.nonHiddenFields());
+         uint offset = 0;
+         foreach (j; 0 .. structelems.length)
+         {
+             VarDeclaration vd = ts.sym.fields[j];
+             Expression e;
+             if (vd.inuse)
+             {
+                 error(loc, "circular reference to `%s`", vd.toPrettyChars());
+                 return ErrorExp.get();
+             }
+             if (vd.offset < offset || vd.type.size() == 0)
+                 e = null;
+             else if (vd._init)
+             {
+                 if (vd._init.isVoidInitializer())
+                     e = null;
+                 else
+                     e = vd.getConstInitializer(false);
+             }
+             else
+                 e = vd.type.defaultInitLiteral(loc);
+             if (e && e.op == EXP.error)
+                 return e;
+             if (e)
+                 offset = vd.offset + cast(uint)vd.type.size();
+             (*structelems)[j] = e;
+         }
+         auto structinit = new StructLiteralExp(loc, ts.sym, structelems);
+ 
+         /* Copy from the initializer symbol for larger symbols,
+          * otherwise the literals expressed as code get excessively large.
+          */
+         if (size(ts, loc) > target.ptrsize * 4 && !ts.needsNested())
+             structinit.useStaticInit = true;
+ 
+         structinit.type = ts;
+         return structinit;
+     }
+     if (auto tv = t.isTypeVector())
+     {
+         //printf("TypeVector::defaultInitLiteral()\n");
+         assert(tv.basetype.ty == Tsarray);
+         Expression e = tv.basetype.defaultInitLiteral(loc);
+         auto ve = new VectorExp(loc, e, tv);
+         ve.type = tv;
+         ve.dim = cast(int)(tv.basetype.size(loc) / tv.elementType().size(loc));
+         return ve;
+     }
+     if (auto tsa = t.isTypeSArray())
+     {
+         static if (LOGDEFAULTINIT)
+         {
+             printf("TypeSArray::defaultInitLiteral() '%s'\n", toChars());
+         }
+         size_t d = cast(size_t)tsa.dim.toInteger();
+         Expression elementinit;
+         if (tsa.next.ty == Tvoid)
+             elementinit = Type.tuns8.defaultInitLiteral(loc);
+         else
+             elementinit = tsa.next.defaultInitLiteral(loc);
+         auto elements = new Expressions(d);
+         foreach (ref e; *elements)
+             e = null;
+         auto ae = new ArrayLiteralExp(loc, tsa, elementinit, elements);
+         return ae;
+     }
+     return defaultInit(t, loc);
+ }
  /***************************************
   * Calculate built-in properties which just the type is necessary.
   *
*************** Expression getProperty(Type t, Scope* sc
*** 3428,3435 ****
          }
  
          Dsymbol s = null;
!         if (mt.ty == Tstruct || mt.ty == Tclass || mt.ty == Tenum)
!             s = mt.toDsymbol(null);
          if (s)
              s = s.search_correct(ident);
          if (s && !symbolIsVisible(scope_, s))
--- 3768,3777 ----
          }
  
          Dsymbol s = null;
!         auto derefType = mt.isTypePointer() ? mt.nextOf() : mt;
! 
!         if (derefType.isTypeStruct() || derefType.isTypeClass() || derefType.isTypeEnum())
!             s = derefType.toDsymbol(null);
          if (s)
              s = s.search_correct(ident);
          if (s && !symbolIsVisible(scope_, s))
*************** Expression getProperty(Type t, Scope* sc
*** 3439,3456 ****
              return ErrorExp.get();
  
          if (s)
!             error(loc, "no property `%s` for type `%s`, did you mean `%s`?", ident.toChars(), mt.toChars(), s.toPrettyChars());
          else if (ident == Id.opCall && mt.ty == Tclass)
!             error(loc, "no property `%s` for type `%s`, did you mean `new %s`?", ident.toChars(), mt.toChars(), mt.toPrettyChars());
  
          else if (const n = importHint(ident.toString()))
!                 error(loc, "no property `%s` for type `%s`, perhaps `import %.*s;` is needed?", ident.toChars(), mt.toChars(), cast(int)n.length, n.ptr);
          else
          {
              if (src)
              {
                  error(loc, "no property `%s` for `%s` of type `%s`",
!                     ident.toChars(), src.toChars(), mt.toPrettyChars(true));
                  auto s2 = scope_.search_correct(ident);
                  // UFCS
                  if (s2 && s2.isFuncDeclaration)
--- 3781,3801 ----
              return ErrorExp.get();
  
          if (s)
!         {
!             error(loc, "no property `%s` for type `%s`", ident.toErrMsg(), mt.toErrMsg());
!             errorSupplemental(s.loc, "did you mean `%s`?", ident == s.ident ? s.toPrettyChars() : s.toErrMsg());
!         }
          else if (ident == Id.opCall && mt.ty == Tclass)
!             error(loc, "no property `%s` for type `%s`, did you mean `new %s`?", ident.toErrMsg(), mt.toErrMsg(), mt.toPrettyChars());
  
          else if (const n = importHint(ident.toString()))
!                 error(loc, "no property `%s` for type `%s`, perhaps `import %.*s;` is needed?", ident.toErrMsg(), mt.toErrMsg(), cast(int)n.length, n.ptr);
          else
          {
              if (src)
              {
                  error(loc, "no property `%s` for `%s` of type `%s`",
!                     ident.toErrMsg(), src.toErrMsg(), mt.toPrettyChars(true));
                  auto s2 = scope_.search_correct(ident);
                  // UFCS
                  if (s2 && s2.isFuncDeclaration)
*************** Expression getProperty(Type t, Scope* sc
*** 3458,3487 ****
                      if (s2.ident == ident)
                      {
                          errorSupplemental(s2.loc, "cannot call %s `%s` with UFCS because it is not declared at module scope",
!                             s2.kind(), s2.toChars());
                      }
                      else
                          errorSupplemental(s2.loc, "did you mean %s `%s`?",
!                             s2.kind(), s2.toChars());
!                 }
!                 else if (src.type.ty == Tpointer)
!                 {
!                     // structPtr.field
!                     auto tn = (cast(TypeNext) src.type).nextOf();
!                     if (auto as = tn.isAggregate())
!                     {
!                         if (auto s3 = as.search_correct(ident))
!                         {
!                             errorSupplemental(s3.loc, "did you mean %s `%s`?",
!                                 s3.kind(), s3.toChars());
!                         }
!                     }
                  }
              }
              else
!                 error(loc, "no property `%s` for type `%s`", ident.toChars(), mt.toPrettyChars(true));
  
!             if (auto dsym = mt.toDsymbol(scope_))
              {
                  if (auto sym = dsym.isAggregateDeclaration())
                  {
--- 3803,3819 ----
                      if (s2.ident == ident)
                      {
                          errorSupplemental(s2.loc, "cannot call %s `%s` with UFCS because it is not declared at module scope",
!                             s2.kind(), s2.toErrMsg());
                      }
                      else
                          errorSupplemental(s2.loc, "did you mean %s `%s`?",
!                             s2.kind(), s2.toErrMsg());
                  }
              }
              else
!                 error(loc, "no property `%s` for type `%s`", ident.toErrMsg(), mt.toPrettyChars(true));
  
!             if (auto dsym = derefType.toDsymbol(scope_))
              {
                  if (auto sym = dsym.isAggregateDeclaration())
                  {
*************** Expression getProperty(Type t, Scope* sc
*** 3497,3504 ****
                          {
                              e = mt.defaultInitLiteral(loc);
                              auto se = new StringExp(e.loc, ident.toString());
!                             auto tiargs = new Objects();
!                             tiargs.push(se);
                              auto dti = new DotTemplateInstanceExp(e.loc, e, Id.opDispatch, tiargs);
                              dti.ti.tempdecl = td;
                              dti.dotTemplateSemanticProp(scope_, DotExpFlag.none);
--- 3829,3835 ----
                          {
                              e = mt.defaultInitLiteral(loc);
                              auto se = new StringExp(e.loc, ident.toString());
!                             auto tiargs = new Objects(se);
                              auto dti = new DotTemplateInstanceExp(e.loc, e, Id.opDispatch, tiargs);
                              dti.ti.tempdecl = td;
                              dti.dotTemplateSemanticProp(scope_, DotExpFlag.none);
*************** Expression getProperty(Type t, Scope* sc
*** 3507,3513 ****
                      }
                  }
                  errorSupplemental(dsym.loc, "%s `%s` defined here",
!                     dsym.kind, dsym.toChars());
              }
          }
  
--- 3838,3844 ----
                      }
                  }
                  errorSupplemental(dsym.loc, "%s `%s` defined here",
!                     dsym.kind, dsym.toErrMsg());
              }
          }
  
*************** Expression dotExp(Type mt, Scope* sc, Ex
*** 4869,4888 ****
          }
          if (ident == Id.length)
          {
!             __gshared FuncDeclaration fd_aaLen = null;
!             if (fd_aaLen is null)
!             {
!                 auto fparams = new Parameters();
!                 fparams.push(new Parameter(Loc.initial, STC.const_ | STC.scope_, mt, null, null, null));
!                 fd_aaLen = FuncDeclaration.genCfunc(fparams, Type.tsize_t, Id.aaLen);
!                 TypeFunction tf = fd_aaLen.type.toTypeFunction();
!                 tf.purity = PURE.const_;
!                 tf.isNothrow = true;
!                 tf.isNogc = false;
!             }
!             Expression ev = new VarExp(e.loc, fd_aaLen, false);
!             e = new CallExp(e.loc, ev, e);
!             e.type = fd_aaLen.type.toTypeFunction().next;
              return e;
          }
          else
--- 5200,5214 ----
          }
          if (ident == Id.length)
          {
!             auto loc = e.loc;
!             Expression hookFunc = new IdentifierExp(loc, Id.empty);
!             hookFunc = new DotIdExp(loc, hookFunc, Id.object);
!             auto keytype = mt.index.substWildTo(MODFlags.const_);
!             auto valtype = mt.nextOf().substWildTo(MODFlags.const_);
!             auto tiargs = new Objects(keytype, valtype);
!             hookFunc = new DotTemplateInstanceExp(loc, hookFunc, Id._d_aaLen, tiargs);
!             Expression e = new CallExp(loc, hookFunc, e);
!             e = e.expressionSemantic(sc);
              return e;
          }
          else
*************** Expression dotExp(Type mt, Scope* sc, Ex
*** 4994,5010 ****
                  /* Rewrite e.ident as:
                   *  e.opDispatch!("ident")
                   */
!                 TemplateDeclaration td = fd.isTemplateDeclaration();
!                 if (!td)
!                 {
!                     .error(fd.loc, "%s `%s` must be a template `opDispatch(string s)`, not a %s", fd.kind, fd.toPrettyChars, fd.kind());
!                     return returnExp(ErrorExp.get());
!                 }
                  auto se = new StringExp(e.loc, ident.toString());
!                 auto tiargs = new Objects();
!                 tiargs.push(se);
                  auto dti = new DotTemplateInstanceExp(e.loc, e, Id.opDispatch, tiargs);
!                 dti.ti.tempdecl = td;
                  /* opDispatch, which doesn't need IFTI,  may occur instantiate error.
                   * e.g.
                   *  template opDispatch(name) if (isValid!name) { ... }
--- 5320,5350 ----
                  /* Rewrite e.ident as:
                   *  e.opDispatch!("ident")
                   */
! 
                  auto se = new StringExp(e.loc, ident.toString());
!                 auto tiargs = new Objects(se);
                  auto dti = new DotTemplateInstanceExp(e.loc, e, Id.opDispatch, tiargs);
! 
!                 if (OverloadSet os = fd.isOverloadSet())
!                 {
!                     if (!findTempDecl(dti, sc))
!                     {
!                         .error(fd.loc, "Couldn't find template declaration for opDispatch");
!                         return returnExp(ErrorExp.get());
!                     }
!                 }
!                 else
!                 {
!                     TemplateDeclaration td = fd.isTemplateDeclaration();
!                     if (!td)
!                     {
!                         .error(fd.loc, "%s `%s` must be a template `opDispatch(string s)`, not a %s",
!                                fd.kind, fd.toPrettyChars, fd.kind());
!                         return returnExp(ErrorExp.get());
!                     }
!                     dti.ti.tempdecl = td;
!                 }
! 
                  /* opDispatch, which doesn't need IFTI,  may occur instantiate error.
                   * e.g.
                   *  template opDispatch(name) if (isValid!name) { ... }
*************** Expression dotExp(Type mt, Scope* sc, Ex
*** 5724,5730 ****
                      Expression e1;
                      Type t;
                      /* returns: true to continue, false to return */
!                     if (f.hasDualContext())
                      {
                          if (f.followInstantiationContext(ad))
                          {
--- 6064,6070 ----
                      Expression e1;
                      Type t;
                      /* returns: true to continue, false to return */
!                     if (f.hasDualContext)
                      {
                          if (f.followInstantiationContext(ad))
                          {
*************** Type getComplexLibraryType(Loc loc, Scop
*** 6326,6332 ****
          return *pt;
      *pt = Type.terror;
  
!     Module mConfig = Module.loadCoreStdcConfig();
      if (!mConfig)
      {
          error(loc, "`core.stdc.config` is required for complex numbers");
--- 6666,6672 ----
          return *pt;
      *pt = Type.terror;
  
!     Module mConfig = loadCoreStdcConfig();
      if (!mConfig)
      {
          error(loc, "`core.stdc.config` is required for complex numbers");
*************** Covariant covariant(Type src, Type t, ST
*** 6447,6455 ****
               */
              if (t1.linkage == LINK.cpp && cppCovariant)
              {
!                 notcovariant |= tp1.isNaked() != tp2.isNaked();
                  if (auto tpn1 = tp1.nextOf())
!                     notcovariant |= tpn1.isNaked() != tp2.nextOf().isNaked();
              }
          }
      }
--- 6787,6795 ----
               */
              if (t1.linkage == LINK.cpp && cppCovariant)
              {
!                 notcovariant |= tp1.isNaked != tp2.isNaked;
                  if (auto tpn1 = tp1.nextOf())
!                     notcovariant |= tpn1.isNaked != tp2.nextOf().isNaked;
              }
          }
      }
*************** Lcovariant:
*** 6555,6561 ****
      /* https://issues.dlang.org/show_bug.cgi?id=23135
       * extern(C++) mutable member functions are not covariant with const.
       */
!     if (t1.linkage == LINK.cpp && cppCovariant && t1.isNaked() != t2.isNaked())
          goto Lnotcovariant;
  
      /* Can convert mutable to const
--- 6895,6901 ----
      /* https://issues.dlang.org/show_bug.cgi?id=23135
       * extern(C++) mutable member functions are not covariant with const.
       */
!     if (t1.linkage == LINK.cpp && cppCovariant && t1.isNaked != t2.isNaked)
          goto Lnotcovariant;
  
      /* Can convert mutable to const
*************** STC parameterStorageClass(TypeFunction t
*** 6644,6650 ****
  
      /* If haven't inferred the return type yet, can't infer storage classes
       */
!     if (!tf.nextOf() || !tf.isNothrow())
          return stc;
  
      tf.purityLevel();
--- 6984,6990 ----
  
      /* If haven't inferred the return type yet, can't infer storage classes
       */
!     if (!tf.nextOf() || !tf.isNothrow)
          return stc;
  
      tf.purityLevel();
*************** STC parameterStorageClass(TypeFunction t
*** 6704,6709 ****
--- 7044,7050 ----
          // Check escaping through `this`
          if (tthis && tthis.isMutable())
          {
+             import dmd.dsymbolsem : hasPointers;
              foreach (VarDeclaration v; isAggregate(tthis).fields)
              {
                  if (v.hasPointers())
*************** STC parameterStorageClass(TypeFunction t
*** 6714,6719 ****
--- 7055,7061 ----
          // Check escaping through nested context
          if (outerVars && tf.isMutable())
          {
+             import dmd.dsymbolsem : hasPointers;
              foreach (VarDeclaration v; *outerVars)
              {
                  if (v.hasPointers())
*************** Type substWildTo(Type type, uint mod)
*** 7325,7331 ****
              t = t.addMod(MODFlags.shared_);
  
          //printf("-Type.substWildTo t = %s\n", t.toChars());
!         return t;
      }
  
      if (!tf.iswild && !(tf.mod & MODFlags.wild))
--- 7667,7673 ----
              t = t.addMod(MODFlags.shared_);
  
          //printf("-Type.substWildTo t = %s\n", t.toChars());
!         return t.merge();
      }
  
      if (!tf.iswild && !(tf.mod & MODFlags.wild))
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/typinf.d gcc-16-20260201/gcc/d/dmd/typinf.d
*** gcc-16-20260125/gcc/d/dmd/typinf.d	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/typinf.d	Sun Feb  1 22:32:07 2026
*************** import dmd.expression;
*** 22,27 ****
--- 22,28 ----
  import dmd.globals;
  import dmd.location;
  import dmd.mtype;
+ import dmd.templatesem;
  import dmd.typesem;
  import core.stdc.stdio;
  
*************** TypeInfoDeclaration getTypeInfoAssocArra
*** 165,191 ****
  
      auto ti = TypeInfoAssociativeArrayDeclaration.create(t);
      t.vtinfo = ti; // assign it early to avoid recursion in expressionSemantic
!     Loc loc = t.loc;
!     auto tiargs = new Objects();
!     tiargs.push(t.index); // always called with naked types
!     tiargs.push(t.next);
! 
!     Expression id = new IdentifierExp(loc, Id.empty);
!     id = new DotIdExp(loc, id, Id.object);
!     id = new DotIdExp(loc, id, Id.TypeInfo_AssociativeArray);
!     auto tempinst = new DotTemplateInstanceExp(loc, id, Id.Entry, tiargs);
!     auto e = expressionSemantic(tempinst, sc);
!     assert(e.type);
!     ti.entry = e.type;
!     if (auto ts = ti.entry.isTypeStruct())
!     {
!         ts.sym.requestTypeInfo = true;
!         if (auto tmpl = ts.sym.isInstantiated())
!             tmpl.minst = sc._module.importedFrom; // ensure it get's emitted
!     }
!     getTypeInfoType(loc, ti.entry, sc);
!     assert(ti.entry.vtinfo);
! 
      return ti;
  }
  
--- 166,174 ----
  
      auto ti = TypeInfoAssociativeArrayDeclaration.create(t);
      t.vtinfo = ti; // assign it early to avoid recursion in expressionSemantic
!     ti._scope = sc;
!     sc.setNoFree();
!     Module.addDeferredSemantic3(ti);
      return ti;
  }
  
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/visitor/foreachvar.d gcc-16-20260201/gcc/d/dmd/visitor/foreachvar.d
*** gcc-16-20260125/gcc/d/dmd/visitor/foreachvar.d	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/visitor/foreachvar.d	Sun Feb  1 22:32:07 2026
*************** import dmd.visitor.postorder;
*** 45,51 ****
   *      e = expression tree to visit
   *      dgVar = call when a variable is declared
   */
! void foreachVar(Expression e, void delegate(VarDeclaration) dgVar)
  {
      if (!e)
          return;
--- 45,51 ----
   *      e = expression tree to visit
   *      dgVar = call when a variable is declared
   */
! void foreachVar(Expression e, scope void delegate(VarDeclaration) dgVar)
  {
      if (!e)
          return;
*************** void foreachVar(Expression e, void deleg
*** 110,117 ****
   *      dgVar = delegate to pass found VarDeclarations to
   */
  void foreachExpAndVar(Statement s,
!         void delegate(Expression) dgExp,
!         void delegate(VarDeclaration) dgVar)
  {
      void visit(Statement s)
      {
--- 110,117 ----
   *      dgVar = delegate to pass found VarDeclarations to
   */
  void foreachExpAndVar(Statement s,
!         scope void delegate(Expression) dgExp,
!         scope void delegate(VarDeclaration) dgVar)
  {
      void visit(Statement s)
      {
diff -Nrcpad gcc-16-20260125/gcc/d/dmd/visitor/postorder.d gcc-16-20260201/gcc/d/dmd/visitor/postorder.d
*** gcc-16-20260125/gcc/d/dmd/visitor/postorder.d	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/dmd/visitor/postorder.d	Sun Feb  1 22:32:07 2026
*************** public:
*** 106,111 ****
--- 106,147 ----
          doCond(e.e1) || doCond(e.e2) || applyTo(e);
      }
  
+     override void visit(CatExp e)
+     {
+         if (auto lowering = e.lowering)
+         {
+             doCond(lowering) || applyTo(e);
+         }
+         else
+         {
+             visit(cast(BinExp)e);
+         }
+     }
+ 
+     override void visit(CatAssignExp e)
+     {
+         if (auto lowering = e.lowering)
+         {
+             doCond(lowering) || applyTo(e);
+         }
+         else
+         {
+             visit(cast(BinExp)e);
+         }
+     }
+ 
+     override void visit(EqualExp e)
+     {
+         if (auto lowering = e.lowering)
+         {
+             doCond(lowering) || applyTo(e);
+         }
+         else
+         {
+             visit(cast(BinExp)e);
+         }
+     }
+ 
      override void visit(AssertExp e)
      {
          //printf("CallExp::apply(apply_fp_t fp, void *param): %s\n", toChars());
diff -Nrcpad gcc-16-20260125/gcc/d/expr.cc gcc-16-20260201/gcc/d/expr.cc
*** gcc-16-20260125/gcc/d/expr.cc	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/expr.cc	Sun Feb  1 22:32:07 2026
*************** public:
*** 381,481 ****
  	/* For static and dynamic arrays, equality is defined as the lengths of
  	   the arrays matching, and all the elements are equal.  */
  	Type *t1elem = tb1->nextOf ()->toBasetype ();
- 	Type *t2elem = tb1->nextOf ()->toBasetype ();
  
! 	/* Check if comparisons of arrays can be optimized using memcmp.
  	   This will inline EQ expressions as:
  		e1.length == e2.length && memcmp(e1.ptr, e2.ptr, size) == 0;
  	    Or when generating a NE expression:
  		e1.length != e2.length || memcmp(e1.ptr, e2.ptr, size) != 0;  */
! 	if ((t1elem->isIntegral () || t1elem->ty == TY::Tvoid
! 	     || (t1elem->ty == TY::Tstruct
! 		 && !t1elem->isTypeStruct ()->sym->xeq))
! 	    && t1elem->ty == t2elem->ty)
! 	  {
! 	    tree t1 = d_array_convert (e->e1);
! 	    tree t2 = d_array_convert (e->e2);
! 	    tree result;
! 
! 	    /* Make temporaries to prevent multiple evaluations.  */
! 	    tree t1saved = d_save_expr (t1);
! 	    tree t2saved = d_save_expr (t2);
! 
! 	    /* Length of arrays, for comparisons done before calling memcmp.  */
! 	    tree t1len = d_array_length (t1saved);
! 	    tree t2len = d_array_length (t2saved);
! 
! 	    /* Reference to array data.  */
! 	    tree t1ptr = d_array_ptr (t1saved);
! 	    tree t2ptr = d_array_ptr (t2saved);
  
! 	    /* Compare arrays using memcmp if possible, otherwise for structs,
! 	       each field is compared inline.  */
! 	    if (t1elem->ty != TY::Tstruct
! 		|| identity_compare_p (t1elem->isTypeStruct ()->sym))
! 	      {
! 		tree size =
! 		  size_mult_expr (t1len, size_int (dmd::size (t1elem)));
  
! 		result = build_memcmp_call (t1ptr, t2ptr, size);
! 		result = build_boolop (code, result, integer_zero_node);
! 	      }
! 	    else
! 	      {
! 		StructDeclaration *sd = t1elem->isTypeStruct ()->sym;
  
! 		result = build_array_struct_comparison (code, sd, t1len,
! 							t1ptr, t2ptr);
! 	      }
  
! 	    /* Check array length first before passing to memcmp.
! 	       For equality expressions, this becomes:
! 		    (e1.length == 0 || memcmp);
! 	       Otherwise for inequality:
! 		    (e1.length != 0 && memcmp);  */
! 	    tree tsizecmp = build_boolop (code, t1len, size_zero_node);
! 	    if (e->op == EXP::equal)
! 	      result = build_boolop (TRUTH_ORIF_EXPR, tsizecmp, result);
! 	    else
! 	      result = build_boolop (TRUTH_ANDIF_EXPR, tsizecmp, result);
  
! 	    /* Finally, check if lengths of both arrays match if dynamic.
! 	       The frontend should have already guaranteed that static arrays
! 	       have same size.  */
! 	    if (tb1->ty == TY::Tsarray && tb2->ty == TY::Tsarray)
! 	      gcc_assert (dmd::size (tb1) == dmd::size (tb2));
! 	    else
! 	      {
! 		tree tlencmp = build_boolop (code, t1len, t2len);
! 		if (e->op == EXP::equal)
! 		  result = build_boolop (TRUTH_ANDIF_EXPR, tlencmp, result);
! 		else
! 		  result = build_boolop (TRUTH_ORIF_EXPR, tlencmp, result);
! 	      }
  
! 	    /* Ensure left-to-right order of evaluation.  */
! 	    if (TREE_SIDE_EFFECTS (t2))
! 	      result = compound_expr (t2saved, result);
  
! 	    if (TREE_SIDE_EFFECTS (t1))
! 	      result = compound_expr (t1saved, result);
  
! 	    this->result_ = result;
! 	  }
  	else
  	  {
! 	    /* Use _adEq2() to compare each element.  */
! 	    Type *t1array = dmd::arrayOf (t1elem);
! 	    tree result = build_libcall (LIBCALL_ADEQ2, e->type, 3,
! 					 d_array_convert (e->e1),
! 					 d_array_convert (e->e2),
! 					 build_typeinfo (e, t1array));
  
! 	    if (e->op == EXP::notEqual)
! 	      result = build1 (TRUTH_NOT_EXPR, build_ctype (e->type), result);
  
! 	    this->result_ = result;
! 	  }
        }
      else if (TypeStruct *ts = tb1->isTypeStruct ())
        {
--- 381,467 ----
  	/* For static and dynamic arrays, equality is defined as the lengths of
  	   the arrays matching, and all the elements are equal.  */
  	Type *t1elem = tb1->nextOf ()->toBasetype ();
  
! 	/* Use lowering if it has already been handled by the front-end.  */
! 	if (e->lowering != NULL)
! 	  {
! 	    this->result_ = build_expr (e->lowering);
! 	    return;
! 	  }
! 
! 	/* For all other arrays, comparisons can be optimized using memcmp.
  	   This will inline EQ expressions as:
  		e1.length == e2.length && memcmp(e1.ptr, e2.ptr, size) == 0;
  	    Or when generating a NE expression:
  		e1.length != e2.length || memcmp(e1.ptr, e2.ptr, size) != 0;  */
! 	tree t1 = d_array_convert (e->e1);
! 	tree t2 = d_array_convert (e->e2);
! 	tree result;
  
! 	/* Make temporaries to prevent multiple evaluations.  */
! 	tree t1saved = d_save_expr (t1);
! 	tree t2saved = d_save_expr (t2);
  
! 	/* Length of arrays, for comparisons done before calling memcmp.  */
! 	tree t1len = d_array_length (t1saved);
! 	tree t2len = d_array_length (t2saved);
  
! 	/* Reference to array data.  */
! 	tree t1ptr = d_array_ptr (t1saved);
! 	tree t2ptr = d_array_ptr (t2saved);
  
! 	/* Compare arrays using memcmp if possible, otherwise for structs,
! 	   each field is compared inline.  */
! 	if (t1elem->ty != TY::Tstruct
! 	    || identity_compare_p (t1elem->isTypeStruct ()->sym))
! 	  {
! 	    tree size =
! 	      size_mult_expr (t1len, size_int (dmd::size (t1elem)));
  
! 	    result = build_memcmp_call (t1ptr, t2ptr, size);
! 	    result = build_boolop (code, result, integer_zero_node);
! 	  }
! 	else
! 	  {
! 	    StructDeclaration *sd = t1elem->isTypeStruct ()->sym;
  
! 	    result = build_array_struct_comparison (code, sd, t1len,
! 						    t1ptr, t2ptr);
! 	  }
  
! 	/* Check array length first before passing to memcmp.
! 	   For equality expressions, this becomes:
! 	   (e1.length == 0 || memcmp);
! 	   Otherwise for inequality:
! 	   (e1.length != 0 && memcmp);  */
! 	tree tsizecmp = build_boolop (code, t1len, size_zero_node);
! 	if (e->op == EXP::equal)
! 	  result = build_boolop (TRUTH_ORIF_EXPR, tsizecmp, result);
! 	else
! 	  result = build_boolop (TRUTH_ANDIF_EXPR, tsizecmp, result);
  
! 	/* Finally, check if lengths of both arrays match if dynamic.
! 	   The frontend should have already guaranteed that static arrays
! 	   have same size.  */
! 	if (tb1->ty == TY::Tsarray && tb2->ty == TY::Tsarray)
! 	  gcc_assert (dmd::size (tb1) == dmd::size (tb2));
  	else
  	  {
! 	    tree tlencmp = build_boolop (code, t1len, t2len);
! 	    if (e->op == EXP::equal)
! 	      result = build_boolop (TRUTH_ANDIF_EXPR, tlencmp, result);
! 	    else
! 	      result = build_boolop (TRUTH_ORIF_EXPR, tlencmp, result);
! 	  }
  
! 	/* Ensure left-to-right order of evaluation.  */
! 	if (TREE_SIDE_EFFECTS (t2))
! 	  result = compound_expr (t2saved, result);
  
! 	if (TREE_SIDE_EFFECTS (t1))
! 	  result = compound_expr (t1saved, result);
! 
! 	this->result_ = result;
        }
      else if (TypeStruct *ts = tb1->isTypeStruct ())
        {
*************** public:
*** 490,505 ****
        }
      else if (tb1->ty == TY::Taarray && tb2->ty == TY::Taarray)
        {
! 	/* Use _aaEqual() for associative arrays.  */
! 	tree result = build_libcall (LIBCALL_AAEQUAL, e->type, 3,
! 				     build_typeinfo (e, tb1),
! 				     build_expr (e->e1),
! 				     build_expr (e->e2));
! 
! 	if (e->op == EXP::notEqual)
! 	  result = build1 (TRUTH_NOT_EXPR, build_ctype (e->type), result);
! 
! 	this->result_ = result;
        }
      else
        {
--- 476,484 ----
        }
      else if (tb1->ty == TY::Taarray && tb2->ty == TY::Taarray)
        {
! 	/* Call to `_d_aaEqual' for associative arrays has already been handled
! 	   by the front-end.  */
! 	gcc_unreachable ();
        }
      else
        {
*************** public:
*** 517,533 ****
       exists in an associative array.  The result is a pointer to the
       element, or null if false.  */
  
!   void visit (InExp *e) final override
    {
!     Type *tb2 = e->e2->type->toBasetype ();
!     Type *tkey = tb2->isTypeAArray ()->index->toBasetype ();
!     tree key = convert_expr (build_expr (e->e1), e->e1->type, tkey);
! 
!     /* Build a call to _aaInX().  */
!     this->result_ = build_libcall (LIBCALL_AAINX, e->type, 3,
! 				   build_expr (e->e2),
! 				   build_typeinfo (e, tkey),
! 				   build_address (key));
    }
  
    /* Build a relational expression.  The result type is bool.  */
--- 496,505 ----
       exists in an associative array.  The result is a pointer to the
       element, or null if false.  */
  
!   void visit (InExp *) final override
    {
!     /* Call to `_d_aaIn' has already been handled by the front-end.  */
!     gcc_unreachable ();
    }
  
    /* Build a relational expression.  The result type is bool.  */
*************** public:
*** 1152,1193 ****
  
      if (tb1->ty == TY::Taarray)
        {
! 	/* Get the key for the associative array.  */
! 	Type *tkey = tb1->isTypeAArray ()->index->toBasetype ();
! 	tree key = convert_expr (build_expr (e->e2), e->e2->type, tkey);
! 	libcall_fn libcall;
! 	tree tinfo, ptr;
! 
! 	if (e->modifiable)
! 	  {
! 	    libcall = LIBCALL_AAGETY;
! 	    ptr = build_address (build_expr (e->e1));
! 	    tinfo = build_typeinfo (e, dmd::mutableOf (dmd::unSharedOf (tb1)));
! 	  }
! 	else
! 	  {
! 	    libcall = LIBCALL_AAGETRVALUEX;
! 	    ptr = build_expr (e->e1);
! 	    tinfo = build_typeinfo (e, tkey);
! 	  }
! 
! 	/* Index the associative array.  */
! 	tree result = build_libcall (libcall, dmd::pointerTo (e->type), 4,
! 				     ptr, tinfo,
! 				     size_int (dmd::size (tb1->nextOf ())),
! 				     build_address (key));
! 
! 	if (!e->indexIsInBounds && array_bounds_check ())
! 	  {
! 	    tree tassert = build_array_bounds_call (e->loc);
! 
! 	    result = d_save_expr (result);
! 	    result = build_condition (TREE_TYPE (result),
! 				      d_truthvalue_conversion (result),
! 				      result, tassert);
! 	  }
! 
! 	this->result_ = indirect_ref (build_ctype (e->type), result);
        }
      else
        {
--- 1124,1131 ----
  
      if (tb1->ty == TY::Taarray)
        {
! 	/* Associative arrays have already been handled by the front-end.  */
! 	gcc_unreachable ();
        }
      else
        {
*************** public:
*** 1369,1378 ****
    {
      Type *ebtype = e->e1->type->toBasetype ();
      Type *tbtype = e->to->toBasetype ();
-     tree result = build_expr (e->e1, this->constp_, this->literalp_);
  
!     /* Just evaluate e1 if it has any side effects.  */
!     if (tbtype->ty == TY::Tvoid)
        this->result_ = build_nop (build_ctype (tbtype), result);
      else
        this->result_ = convert_for_rvalue (result, ebtype, tbtype);
--- 1307,1320 ----
    {
      Type *ebtype = e->e1->type->toBasetype ();
      Type *tbtype = e->to->toBasetype ();
  
!     /* Use lowering if it has already been handled by the front-end.  */
!     Expression *cast = (e->lowering != NULL) ? e->lowering : e->e1;
!     tree result = build_expr (cast, this->constp_, this->literalp_);
! 
!     /* When expression has been rewritten or is a cast to `void', just evaluate
!        the result if it has any side effects.  */
!     if (e->lowering != NULL || tbtype->ty == TY::Tvoid)
        this->result_ = build_nop (build_ctype (tbtype), result);
      else
        this->result_ = convert_for_rvalue (result, ebtype, tbtype);
*************** public:
*** 1415,1428 ****
      /* Check that the array is actually an associative array.  */
      if (e->e1->type->toBasetype ()->ty == TY::Taarray)
        {
! 	Type *tb = e->e1->type->toBasetype ();
! 	Type *tkey = tb->isTypeAArray ()->index->toBasetype ();
! 	tree index = convert_expr (build_expr (e->e2), e->e2->type, tkey);
! 
! 	this->result_ = build_libcall (LIBCALL_AADELX, Type::tbool, 3,
! 				       build_expr (e->e1),
! 				       build_typeinfo (e, tkey),
! 				       build_address (index));
        }
      else
        {
--- 1357,1364 ----
      /* Check that the array is actually an associative array.  */
      if (e->e1->type->toBasetype ()->ty == TY::Taarray)
        {
! 	/* Call to `_d_aaDel' has already been handled by the front-end.  */
! 	gcc_unreachable ();
        }
      else
        {
*************** public:
*** 1550,1557 ****
         Taking the address of a struct literal is otherwise illegal.  */
      if (e->e1->op == EXP::structLiteral)
        {
! 	StructLiteralExp *sle = e->e1->isStructLiteralExp ()->origin;
! 	gcc_assert (sle != NULL);
  
  	/* Build the reference symbol, the decl is built first as the
  	   initializer may have recursive references.  */
--- 1486,1497 ----
         Taking the address of a struct literal is otherwise illegal.  */
      if (e->e1->op == EXP::structLiteral)
        {
! 	StructLiteralExp *sle = e->e1->isStructLiteralExp ();
! 	if (!this->constp_)
! 	  {
! 	    gcc_assert (sle->origin != NULL);
! 	    sle = sle->origin;
! 	  }
  
  	/* Build the reference symbol, the decl is built first as the
  	   initializer may have recursive references.  */
*************** public:
*** 2156,2162 ****
  	      {
  		/* Generate a slice for non-zero initialized aggregates,
  		   otherwise create an empty array.  */
! 		gcc_assert (e->type->isConst ()
  			    && e->type->nextOf ()->ty == TY::Tvoid);
  
  		tree type = build_ctype (e->type);
--- 2096,2102 ----
  	      {
  		/* Generate a slice for non-zero initialized aggregates,
  		   otherwise create an empty array.  */
! 		gcc_assert (e->type->nextOf ()->isConst ()
  			    && e->type->nextOf ()->ty == TY::Tvoid);
  
  		tree type = build_ctype (e->type);
*************** public:
*** 2429,2445 ****
        }
      else if (tb->ty == TY::Taarray)
        {
! 	/* Allocating memory for a new associative array.  */
! 	tree arg = build_typeinfo (e, e->newtype);
! 	tree mem = build_libcall (LIBCALL_AANEW, Type::tvoidptr, 1, arg);
! 
! 	/* Return an associative array pointed to by MEM.  */
! 	tree aatype = build_ctype (tb);
! 	vec <constructor_elt, va_gc> *ce = NULL;
! 	CONSTRUCTOR_APPEND_ELT (ce, TYPE_FIELDS (aatype), mem);
! 
! 	result = build_nop (build_ctype (e->type),
! 			    build_padded_constructor (aatype, ce));
        }
      else
        gcc_unreachable ();
--- 2369,2378 ----
        }
      else if (tb->ty == TY::Taarray)
        {
! 	/* Allocating memory for a new associative array has already been
! 	   handled by the front-end.  */
! 	gcc_assert (e->lowering);
! 	result = build_expr (e->lowering);
        }
      else
        gcc_unreachable ();
*************** public:
*** 2582,2588 ****
  
      /* Implicitly convert void[n] to ubyte[n].  */
      if (tb->ty == TY::Tsarray && tb->nextOf ()->toBasetype ()->ty == TY::Tvoid)
!       tb = dmd::sarrayOf (Type::tuns8, tb->isTypeSArray ()->dim->toUInteger ());
  
      gcc_assert (tb->ty == TY::Tarray || tb->ty == TY::Tsarray
  		|| tb->ty == TY::Tpointer);
--- 2515,2524 ----
  
      /* Implicitly convert void[n] to ubyte[n].  */
      if (tb->ty == TY::Tsarray && tb->nextOf ()->toBasetype ()->ty == TY::Tvoid)
!       {
! 	dinteger_t ndim = tb->isTypeSArray ()->dim->toUInteger ();
! 	tb = dmd::sarrayOf (Type::tuns8, ndim);
!       }
  
      gcc_assert (tb->ty == TY::Tarray || tb->ty == TY::Tsarray
  		|| tb->ty == TY::Tpointer);
*************** public:
*** 2674,2689 ****
  	/* Array literal for a `scope' dynamic array.  */
  	gcc_assert (tb->ty == TY::Tarray);
  	ctor = force_target_expr (ctor);
! 	this->result_ = d_array_value (type, size_int (e->elements->length),
! 				       build_address (ctor));
        }
      else
        {
  	/* Allocate space on the memory managed heap.  */
! 	tree mem = build_libcall (LIBCALL_ARRAYLITERALTX,
! 				  dmd::pointerTo (etype), 2,
! 				  build_typeinfo (e, dmd::arrayOf (etype)),
! 				  size_int (e->elements->length));
  	mem = d_save_expr (mem);
  
  	/* Now copy the constructor into memory.  */
--- 2610,2625 ----
  	/* Array literal for a `scope' dynamic array.  */
  	gcc_assert (tb->ty == TY::Tarray);
  	ctor = force_target_expr (ctor);
! 	ctor = d_array_value (type, size_int (e->elements->length),
! 			      build_address (ctor));
! 	this->result_ = compound_expr (saved_elems, ctor);
        }
      else
        {
  	/* Allocate space on the memory managed heap.  */
! 	gcc_assert (e->lowering);
! 	tree mem = build_nop (build_pointer_type (satype),
! 			      build_expr (e->lowering));
  	mem = d_save_expr (mem);
  
  	/* Now copy the constructor into memory.  */
*************** public:
*** 2711,2765 ****
  
    void visit (AssocArrayLiteralExp *e) final override
    {
!     if (this->constp_ && e->lowering != NULL)
        {
  	/* When an associative array literal gets lowered, it's converted into a
  	   struct literal suitable for static initialization.  */
! 	this->result_ = build_expr (e->lowering, this->constp_, true);
! 	return ;
        }
  
-     /* Want the mutable type for typeinfo reference.  */
-     Type *tb = dmd::mutableOf (e->type->toBasetype ());
- 
      /* Handle empty assoc array literals.  */
-     TypeAArray *ta = tb->isTypeAArray ();
      if (e->keys->length == 0)
        {
! 	this->result_ = build_padded_constructor (build_ctype (ta), NULL);
  	return;
        }
  
-     /* Build an expression that assigns all expressions in KEYS
-        to a constructor.  */
-     Type *tkarray = dmd::sarrayOf (ta->index, e->keys->length);
-     tree akeys = build_array_from_exprs (tkarray, e->keys, this->constp_);
-     tree init = stabilize_expr (&akeys);
- 
-     /* Do the same with all expressions in VALUES.  */
-     Type *tvarray = dmd::sarrayOf (ta->next, e->values->length);
-     tree avals = build_array_from_exprs (tvarray, e->values, this->constp_);
-     init = compound_expr (init, stabilize_expr (&avals));
- 
      /* Generate: _d_assocarrayliteralTX (ti, keys, vals);  */
!     tree keys = d_array_value (build_ctype (dmd::arrayOf (ta->index)),
! 			       size_int (e->keys->length),
! 			       build_address (akeys));
!     tree vals = d_array_value (build_ctype (dmd::arrayOf (ta->next)),
! 			       size_int (e->values->length),
! 			       build_address (avals));
! 
!     tree mem = build_libcall (LIBCALL_ASSOCARRAYLITERALTX, Type::tvoidptr, 3,
! 			      build_typeinfo (e, ta), keys, vals);
! 
!     /* Return an associative array pointed to by MEM.  */
!     tree aatype = build_ctype (ta);
!     vec <constructor_elt, va_gc> *ce = NULL;
!     CONSTRUCTOR_APPEND_ELT (ce, TYPE_FIELDS (aatype), mem);
! 
!     tree result = build_nop (build_ctype (e->type),
! 			     build_padded_constructor (aatype, ce));
!     this->result_ = compound_expr (init, result);
    }
  
    /* Build a struct literal.  */
--- 2647,2670 ----
  
    void visit (AssocArrayLiteralExp *e) final override
    {
!     if (this->constp_ && e->loweringCtfe != NULL)
        {
  	/* When an associative array literal gets lowered, it's converted into a
  	   struct literal suitable for static initialization.  */
! 	this->result_ = build_expr (e->loweringCtfe, this->constp_, true);
! 	return;
        }
  
      /* Handle empty assoc array literals.  */
      if (e->keys->length == 0)
        {
! 	this->result_ = build_padded_constructor (build_ctype (e->type), NULL);
  	return;
        }
  
      /* Generate: _d_assocarrayliteralTX (ti, keys, vals);  */
!     gcc_assert (e->lowering);
!     this->result_ = build_expr (e->lowering);
    }
  
    /* Build a struct literal.  */
diff -Nrcpad gcc-16-20260125/gcc/d/imports.cc gcc-16-20260201/gcc/d/imports.cc
*** gcc-16-20260125/gcc/d/imports.cc	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/imports.cc	Sun Feb  1 22:32:07 2026
*************** public:
*** 144,150 ****
    /* Alias symbols aren't imported, but their targets are.  */
    void visit (AliasDeclaration *d) final override
    {
!     Dsymbol *dsym = d->toAlias ();
  
      if (dsym == d)
        {
--- 144,150 ----
    /* Alias symbols aren't imported, but their targets are.  */
    void visit (AliasDeclaration *d) final override
    {
!     Dsymbol *dsym = dmd::toAlias (d);
  
      if (dsym == d)
        {
diff -Nrcpad gcc-16-20260125/gcc/d/modules.cc gcc-16-20260201/gcc/d/modules.cc
*** gcc-16-20260125/gcc/d/modules.cc	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/modules.cc	Sun Feb  1 22:32:07 2026
*************** static tree stop_minfo_node;
*** 78,92 ****
--- 78,98 ----
  
  struct module_info
  {
+   tree ctor_decl;
    vec <tree, va_gc> *ctors;
+   tree dtor_decl;
    vec <tree, va_gc> *dtors;
    vec <tree, va_gc> *ctorgates;
  
+   tree sharedctor_decl;
    vec <tree, va_gc> *sharedctors;
+   tree shareddtor_decl;
    vec <tree, va_gc> *shareddtors;
    vec <tree, va_gc> *sharedctorgates;
+   tree standalonector_decl;
    vec <tree, va_gc> *standalonectors;
  
+   tree unittest_decl;
    vec <tree, va_gc> *unitTests;
  };
  
*************** layout_moduleinfo_field (tree type, tree
*** 487,517 ****
     basis, this is done to keep its size to a minimum.  */
  
  static tree
! layout_moduleinfo_fields (Module *decl, tree type)
  {
    HOST_WIDE_INT offset = int_size_in_bytes (type);
    type = copy_aggregate_type (type);
  
    /* First fields added are all the function pointers.  */
!   if (decl->sctor)
      layout_moduleinfo_field (ptr_type_node, type, offset);
  
!   if (decl->sdtor)
      layout_moduleinfo_field (ptr_type_node, type, offset);
  
!   if (decl->ssharedctor)
      layout_moduleinfo_field (ptr_type_node, type, offset);
  
!   if (decl->sshareddtor)
      layout_moduleinfo_field (ptr_type_node, type, offset);
  
    if (dmd::findGetMembers (decl))
      layout_moduleinfo_field (ptr_type_node, type, offset);
  
!   if (decl->sictor)
      layout_moduleinfo_field (ptr_type_node, type, offset);
  
!   if (decl->stest)
      layout_moduleinfo_field (ptr_type_node, type, offset);
  
    /* Array of module imports is laid out as a length field, followed by
--- 493,523 ----
     basis, this is done to keep its size to a minimum.  */
  
  static tree
! layout_moduleinfo_fields (Module *decl, module_info &mi, tree type)
  {
    HOST_WIDE_INT offset = int_size_in_bytes (type);
    type = copy_aggregate_type (type);
  
    /* First fields added are all the function pointers.  */
!   if (mi.ctor_decl)
      layout_moduleinfo_field (ptr_type_node, type, offset);
  
!   if (mi.dtor_decl)
      layout_moduleinfo_field (ptr_type_node, type, offset);
  
!   if (mi.sharedctor_decl)
      layout_moduleinfo_field (ptr_type_node, type, offset);
  
!   if (mi.shareddtor_decl)
      layout_moduleinfo_field (ptr_type_node, type, offset);
  
    if (dmd::findGetMembers (decl))
      layout_moduleinfo_field (ptr_type_node, type, offset);
  
!   if (mi.standalonector_decl)
      layout_moduleinfo_field (ptr_type_node, type, offset);
  
!   if (mi.unittest_decl)
      layout_moduleinfo_field (ptr_type_node, type, offset);
  
    /* Array of module imports is laid out as a length field, followed by
*************** layout_moduleinfo_fields (Module *decl,
*** 558,564 ****
  /* Output the ModuleInfo for module DECL and register it with druntime.  */
  
  static void
! layout_moduleinfo (Module *decl)
  {
    ClassDeclarations aclasses;
    FuncDeclaration *sgetmembers;
--- 564,570 ----
  /* Output the ModuleInfo for module DECL and register it with druntime.  */
  
  static void
! layout_moduleinfo (Module *decl, module_info &mi)
  {
    ClassDeclarations aclasses;
    FuncDeclaration *sgetmembers;
*************** layout_moduleinfo (Module *decl)
*** 576,594 ****
    sgetmembers = dmd::findGetMembers (decl);
  
    size_t flags = 0;
!   if (decl->sctor)
      flags |= MItlsctor;
!   if (decl->sdtor)
      flags |= MItlsdtor;
!   if (decl->ssharedctor)
      flags |= MIctor;
!   if (decl->sshareddtor)
      flags |= MIdtor;
    if (sgetmembers)
      flags |= MIxgetMembers;
!   if (decl->sictor)
      flags |= MIictor;
!   if (decl->stest)
      flags |= MIunitTest;
    if (aimports_dim)
      flags |= MIimportedModules;
--- 582,600 ----
    sgetmembers = dmd::findGetMembers (decl);
  
    size_t flags = 0;
!   if (mi.ctor_decl)
      flags |= MItlsctor;
!   if (mi.dtor_decl)
      flags |= MItlsdtor;
!   if (mi.sharedctor_decl)
      flags |= MIctor;
!   if (mi.shareddtor_decl)
      flags |= MIdtor;
    if (sgetmembers)
      flags |= MIxgetMembers;
!   if (mi.standalonector_decl)
      flags |= MIictor;
!   if (mi.unittest_decl)
      flags |= MIunitTest;
    if (aimports_dim)
      flags |= MIimportedModules;
*************** layout_moduleinfo (Module *decl)
*** 600,606 ****
    flags |= MIname;
  
    tree minfo = get_moduleinfo_decl (decl);
!   tree type = layout_moduleinfo_fields (decl, TREE_TYPE (minfo));
  
    /* Put out the two named fields in a ModuleInfo decl:
  	uint flags;
--- 606,612 ----
    flags |= MIname;
  
    tree minfo = get_moduleinfo_decl (decl);
!   tree type = layout_moduleinfo_fields (decl, mi, TREE_TYPE (minfo));
  
    /* Put out the two named fields in a ModuleInfo decl:
  	uint flags;
*************** layout_moduleinfo (Module *decl)
*** 626,653 ****
  	char[N] name;
     */
    if (flags & MItlsctor)
!     CONSTRUCTOR_APPEND_ELT (minit, NULL_TREE, build_address (decl->sctor));
  
    if (flags & MItlsdtor)
!     CONSTRUCTOR_APPEND_ELT (minit, NULL_TREE, build_address (decl->sdtor));
  
    if (flags & MIctor)
      CONSTRUCTOR_APPEND_ELT (minit, NULL_TREE,
! 			    build_address (decl->ssharedctor));
  
    if (flags & MIdtor)
      CONSTRUCTOR_APPEND_ELT (minit, NULL_TREE,
! 			    build_address (decl->sshareddtor));
  
    if (flags & MIxgetMembers)
      CONSTRUCTOR_APPEND_ELT (minit, NULL_TREE,
  			    build_address (get_symbol_decl (sgetmembers)));
  
    if (flags & MIictor)
!     CONSTRUCTOR_APPEND_ELT (minit, NULL_TREE, build_address (decl->sictor));
  
    if (flags & MIunitTest)
!     CONSTRUCTOR_APPEND_ELT (minit, NULL_TREE, build_address (decl->stest));
  
    if (flags & MIimportedModules)
      {
--- 632,660 ----
  	char[N] name;
     */
    if (flags & MItlsctor)
!     CONSTRUCTOR_APPEND_ELT (minit, NULL_TREE, build_address (mi.ctor_decl));
  
    if (flags & MItlsdtor)
!     CONSTRUCTOR_APPEND_ELT (minit, NULL_TREE, build_address (mi.dtor_decl));
  
    if (flags & MIctor)
      CONSTRUCTOR_APPEND_ELT (minit, NULL_TREE,
! 			    build_address (mi.sharedctor_decl));
  
    if (flags & MIdtor)
      CONSTRUCTOR_APPEND_ELT (minit, NULL_TREE,
! 			    build_address (mi.shareddtor_decl));
  
    if (flags & MIxgetMembers)
      CONSTRUCTOR_APPEND_ELT (minit, NULL_TREE,
  			    build_address (get_symbol_decl (sgetmembers)));
  
    if (flags & MIictor)
!     CONSTRUCTOR_APPEND_ELT (minit, NULL_TREE,
! 			    build_address (mi.standalonector_decl));
  
    if (flags & MIunitTest)
!     CONSTRUCTOR_APPEND_ELT (minit, NULL_TREE, build_address (mi.unittest_decl));
  
    if (flags & MIimportedModules)
      {
*************** build_module_tree (Module *decl)
*** 758,791 ****
        tm->aimports.push (decl);
  
        if (mitest.ctors || mitest.ctorgates)
! 	tm->sctor = build_funcs_gates_fn (get_identifier ("*__modtestctor"),
! 					  mitest.ctors, mitest.ctorgates);
  
        if (mitest.dtors)
! 	tm->sdtor = build_funcs_gates_fn (get_identifier ("*__modtestdtor"),
! 					  mitest.dtors, NULL);
  
        if (mi.standalonectors)
! 	tm->sictor
  	  = build_funcs_gates_fn (get_identifier ("*__modtestsharedictor"),
  				  mi.standalonectors, NULL);
  
        if (mitest.sharedctors || mitest.sharedctorgates)
! 	tm->ssharedctor
  	  = build_funcs_gates_fn (get_identifier ("*__modtestsharedctor"),
  				  mitest.sharedctors, mitest.sharedctorgates);
  
        if (mitest.shareddtors)
! 	tm->sshareddtor
  	  = build_funcs_gates_fn (get_identifier ("*__modtestshareddtor"),
  				  mitest.shareddtors, NULL);
  
        if (mi.unitTests)
! 	tm->stest = build_funcs_gates_fn (get_identifier ("*__modtest"),
! 					  mi.unitTests, NULL);
  
        mi.unitTests = NULL;
!       layout_moduleinfo (tm);
      }
  
    /* Default behavior is to always generate module info because of templates.
--- 765,801 ----
        tm->aimports.push (decl);
  
        if (mitest.ctors || mitest.ctorgates)
! 	mitest.ctor_decl
! 	  = build_funcs_gates_fn (get_identifier ("*__modtestctor"),
! 				  mitest.ctors, mitest.ctorgates);
  
        if (mitest.dtors)
! 	mitest.dtor_decl
! 	  = build_funcs_gates_fn (get_identifier ("*__modtestdtor"),
! 				  mitest.dtors, NULL);
  
        if (mi.standalonectors)
! 	mitest.standalonector_decl
  	  = build_funcs_gates_fn (get_identifier ("*__modtestsharedictor"),
  				  mi.standalonectors, NULL);
  
        if (mitest.sharedctors || mitest.sharedctorgates)
! 	mitest.sharedctor_decl
  	  = build_funcs_gates_fn (get_identifier ("*__modtestsharedctor"),
  				  mitest.sharedctors, mitest.sharedctorgates);
  
        if (mitest.shareddtors)
! 	mitest.shareddtor_decl
  	  = build_funcs_gates_fn (get_identifier ("*__modtestshareddtor"),
  				  mitest.shareddtors, NULL);
  
        if (mi.unitTests)
! 	mitest.unittest_decl
! 	  = build_funcs_gates_fn (get_identifier ("*__modtest"),
! 				  mi.unitTests, NULL);
  
        mi.unitTests = NULL;
!       layout_moduleinfo (tm, mitest);
      }
  
    /* Default behavior is to always generate module info because of templates.
*************** build_module_tree (Module *decl)
*** 793,825 ****
    if (global.params.useModuleInfo && Module::moduleinfo != NULL)
      {
        if (mi.ctors || mi.ctorgates)
! 	decl->sctor = build_funcs_gates_fn (get_identifier ("*__modctor"),
! 					    mi.ctors, mi.ctorgates);
  
        if (mi.dtors)
! 	decl->sdtor = build_funcs_gates_fn (get_identifier ("*__moddtor"),
! 					    mi.dtors, NULL);
  
        if (mi.standalonectors)
! 	decl->sictor
  	  = build_funcs_gates_fn (get_identifier ("*__modsharedictor"),
  				  mi.standalonectors, NULL);
  
        if (mi.sharedctors || mi.sharedctorgates)
! 	decl->ssharedctor
  	  = build_funcs_gates_fn (get_identifier ("*__modsharedctor"),
  				  mi.sharedctors, mi.sharedctorgates);
  
        if (mi.shareddtors)
! 	decl->sshareddtor
  	  = build_funcs_gates_fn (get_identifier ("*__modshareddtor"),
  				  mi.shareddtors, NULL);
  
        if (mi.unitTests)
! 	decl->stest = build_funcs_gates_fn (get_identifier ("*__modtest"),
! 					    mi.unitTests, NULL);
  
!       layout_moduleinfo (decl);
      }
  
    /* Process all deferred functions after finishing module.  */
--- 803,835 ----
    if (global.params.useModuleInfo && Module::moduleinfo != NULL)
      {
        if (mi.ctors || mi.ctorgates)
! 	mi.ctor_decl = build_funcs_gates_fn (get_identifier ("*__modctor"),
! 					     mi.ctors, mi.ctorgates);
  
        if (mi.dtors)
! 	mi.dtor_decl = build_funcs_gates_fn (get_identifier ("*__moddtor"),
! 					     mi.dtors, NULL);
  
        if (mi.standalonectors)
! 	mi.standalonector_decl
  	  = build_funcs_gates_fn (get_identifier ("*__modsharedictor"),
  				  mi.standalonectors, NULL);
  
        if (mi.sharedctors || mi.sharedctorgates)
! 	mi.sharedctor_decl
  	  = build_funcs_gates_fn (get_identifier ("*__modsharedctor"),
  				  mi.sharedctors, mi.sharedctorgates);
  
        if (mi.shareddtors)
! 	mi.shareddtor_decl
  	  = build_funcs_gates_fn (get_identifier ("*__modshareddtor"),
  				  mi.shareddtors, NULL);
  
        if (mi.unitTests)
! 	mi.unittest_decl = build_funcs_gates_fn (get_identifier ("*__modtest"),
! 						 mi.unitTests, NULL);
  
!       layout_moduleinfo (decl, mi);
      }
  
    /* Process all deferred functions after finishing module.  */
diff -Nrcpad gcc-16-20260125/gcc/d/runtime.def gcc-16-20260201/gcc/d/runtime.def
*** gcc-16-20260125/gcc/d/runtime.def	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/runtime.def	Sun Feb  1 22:32:07 2026
*************** DEF_D_RUNTIME (CALLFINALIZER, "_d_callfi
*** 64,84 ****
  DEF_D_RUNTIME (CALLINTERFACEFINALIZER, "_d_callinterfacefinalizer", RT(VOID),
  	       P1(VOIDPTR), 0)
  
- /* Used for casting to a class or interface.  */
- DEF_D_RUNTIME (DYNAMIC_CAST, "_d_dynamic_cast", RT(OBJECT),
- 	       P2(OBJECT, CLASSINFO), 0)
- DEF_D_RUNTIME (INTERFACE_CAST, "_d_interface_cast", RT(OBJECT),
- 	       P2(OBJECT, CLASSINFO), 0)
- 
- /* Used for allocating an array literal on the GC heap.  */
- DEF_D_RUNTIME (ARRAYLITERALTX, "_d_arrayliteralTX", RT(VOIDPTR),
- 	       P2(CONST_TYPEINFO, SIZE_T), 0)
- 
- /* Used for value equality (x == y) and comparisons (x < y) of non-trivial
-    arrays.  Such as an array of structs or classes.  */
- DEF_D_RUNTIME (ADEQ2, "_adEq2", RT(INT),
- 	       P3(ARRAY_VOID, ARRAY_VOID, CONST_TYPEINFO), 0)
- 
  /* Used for (array.length = n) expressions.  The `i' variant is for when the
     initializer is nonzero.  */
  DEF_D_RUNTIME (ARRAYSETLENGTHT, "_d_arraysetlengthT", RT(ARRAY_VOID),
--- 64,69 ----
*************** DEF_D_RUNTIME (ARRAYAPPENDCD, "_d_arraya
*** 106,136 ****
  DEF_D_RUNTIME (ARRAYAPPENDWD, "_d_arrayappendwd", RT(ARRAY_VOID),
  	       P2(ARRAYPTR_BYTE, DCHAR), 0)
  
- /* Used for allocating a new associative array.  */
- DEF_D_RUNTIME (ASSOCARRAYLITERALTX, "_d_assocarrayliteralTX", RT(VOIDPTR),
- 	       P3(CONST_TYPEINFO, ARRAY_VOID, ARRAY_VOID), 0)
- DEF_D_RUNTIME (AANEW, "_aaNew", RT(VOIDPTR), P1(CONST_TYPEINFO), 0)
- 
- /* Used for value equality of two associative arrays.  */
- DEF_D_RUNTIME (AAEQUAL, "_aaEqual", RT(INT),
- 	       P3(CONST_TYPEINFO, ASSOCARRAY, ASSOCARRAY), 0)
- 
- /* Used to determine is a key exists in an associative array.  */
- DEF_D_RUNTIME (AAINX, "_aaInX", RT(VOIDPTR),
- 	       P3(ASSOCARRAY, CONST_TYPEINFO, VOIDPTR), 0)
- 
- /* Used to retrieve a value from an associative array index by a key.  The
-    `Rvalue' variant returns null if the key is not found, where as aaGetY
-    will create new key entry for assignment.  */
- DEF_D_RUNTIME (AAGETY, "_aaGetY", RT(VOIDPTR),
- 	       P4(POINTER_ASSOCARRAY, CONST_TYPEINFO, SIZE_T, VOIDPTR), 0)
- DEF_D_RUNTIME (AAGETRVALUEX, "_aaGetRvalueX", RT(VOIDPTR),
- 	       P4(ASSOCARRAY, CONST_TYPEINFO, SIZE_T, VOIDPTR), 0)
- 
- /* Used when calling delete on a key entry in an associative array.  */
- DEF_D_RUNTIME (AADELX, "_aaDelX", RT(BOOL),
- 	       P3(ASSOCARRAY, CONST_TYPEINFO, VOIDPTR), 0)
- 
  /* Used for throw() expressions.  */
  DEF_D_RUNTIME (THROW, "_d_throw", RT(VOID), P1(OBJECT), ECF_NORETURN)
  DEF_D_RUNTIME (BEGIN_CATCH, "__gdc_begin_catch", RT(VOIDPTR), P1(VOIDPTR), 0)
--- 91,96 ----
diff -Nrcpad gcc-16-20260125/gcc/d/toir.cc gcc-16-20260201/gcc/d/toir.cc
*** gcc-16-20260125/gcc/d/toir.cc	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/toir.cc	Sun Feb  1 22:32:07 2026
*************** public:
*** 1022,1062 ****
  	/* Detect a call to a constructor function, or if returning a struct
  	   literal, write result directly into the return value.  */
  	StructLiteralExp *sle = NULL;
  	bool using_rvo_p = false;
  
  	if (DotVarExp *dve = (s->exp->isCallExp ()
  			      ? s->exp->isCallExp ()->e1->isDotVarExp ()
  			      : NULL))
  	  {
  	    if (dve->var->isCtorDeclaration ())
  	      {
  		if (CommaExp *ce = dve->e1->isCommaExp ())
  		  {
! 		    /* Temporary initialized inside a return expression, and
! 		       used as the return value.  Replace it with the hidden
! 			reference to allow RVO return.  */
! 		    DeclarationExp *de = ce->e1->isDeclarationExp ();
! 		    VarExp *ve = ce->e2->isVarExp ();
! 		    if (de != NULL && ve != NULL
! 			&& ve->var == de->declaration
! 			&& ve->var->storage_class & STCtemp)
! 		      {
! 			tree var = get_symbol_decl (ve->var);
! 			TREE_ADDRESSABLE (var) = 1;
! 			SET_DECL_VALUE_EXPR (var, decl);
! 			DECL_HAS_VALUE_EXPR_P (var) = 1;
! 			SET_DECL_LANG_NRVO (var, this->func_->shidden);
! 			using_rvo_p = true;
! 		      }
  		  }
  		else
  		  sle = dve->e1->isStructLiteralExp ();
  	      }
  	  }
  	else
  	  sle = s->exp->isStructLiteralExp ();
  
! 	if (sle != NULL)
  	  {
  	    sle->sym = build_address (this->func_->shidden);
  	    using_rvo_p = true;
--- 1022,1085 ----
  	/* Detect a call to a constructor function, or if returning a struct
  	   literal, write result directly into the return value.  */
  	StructLiteralExp *sle = NULL;
+ 	DeclarationExp *de = NULL;
+ 	VarExp *ve = NULL;
  	bool using_rvo_p = false;
  
  	if (DotVarExp *dve = (s->exp->isCallExp ()
  			      ? s->exp->isCallExp ()->e1->isDotVarExp ()
  			      : NULL))
  	  {
+ 	    /* Look for `var.__ctor(copytmp = {}, &copytmp)'  */
  	    if (dve->var->isCtorDeclaration ())
  	      {
  		if (CommaExp *ce = dve->e1->isCommaExp ())
  		  {
! 		    de = ce->e1->isDeclarationExp ();
! 		    ve = ce->e2->isVarExp ();
  		  }
  		else
  		  sle = dve->e1->isStructLiteralExp ();
  	      }
  	  }
+ 	else if (CommaExp *ce1 = s->exp->isCommaExp ())
+ 	  {
+ 	    /* Look for `copytmp = {}, copytmp.__ctor(), copytmp'  */
+ 	    if (CommaExp *ce2 = ce1->e2->isCommaExp ())
+ 	      {
+ 		DotVarExp *dve = ce2->e1->isCallExp ()
+ 		  ? ce2->e1->isCallExp ()->e1->isDotVarExp () : NULL;
+ 
+ 		if (dve && dve->var->isCtorDeclaration ())
+ 		  {
+ 		    de = ce1->e1->isDeclarationExp ();
+ 		    ve = ce2->e2->isVarExp ();
+ 		  }
+ 	      }
+ 	    else
+ 	      {
+ 		de = ce1->e1->isDeclarationExp ();
+ 		ve = ce1->e2->isVarExp ();
+ 	      }
+ 	  }
  	else
  	  sle = s->exp->isStructLiteralExp ();
  
! 	if (de != NULL && ve != NULL
! 	    && ve->var == de->declaration
! 	    && ve->var->storage_class & STCtemp)
! 	  {
! 	    /* Temporary initialized inside a return expression, and
! 	       used as the return value.  Replace it with the hidden
! 	       reference to allow RVO return.  */
! 	    tree var = get_symbol_decl (ve->var);
! 	    TREE_ADDRESSABLE (var) = 1;
! 	    SET_DECL_VALUE_EXPR (var, decl);
! 	    DECL_HAS_VALUE_EXPR_P (var) = 1;
! 	    SET_DECL_LANG_NRVO (var, this->func_->shidden);
! 	    using_rvo_p = true;
! 	  }
! 	else if (sle != NULL)
  	  {
  	    sle->sym = build_address (this->func_->shidden);
  	    using_rvo_p = true;
diff -Nrcpad gcc-16-20260125/gcc/d/typeinfo.cc gcc-16-20260201/gcc/d/typeinfo.cc
*** gcc-16-20260125/gcc/d/typeinfo.cc	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/typeinfo.cc	Sun Feb  1 22:32:07 2026
*************** public:
*** 730,736 ****
  	void *__monitor;
  	TypeInfo value;
  	TypeInfo key;
! 	TypeInfo entry;  */
  
    void visit (TypeInfoAssociativeArrayDeclaration *d) final override
    {
--- 730,738 ----
  	void *__monitor;
  	TypeInfo value;
  	TypeInfo key;
! 	TypeInfo entry;
! 	bool function(in void*, in void*) xopEquals;
! 	hash_t function(in void*) xtoHash;  */
  
    void visit (TypeInfoAssociativeArrayDeclaration *d) final override
    {
*************** public:
*** 750,755 ****
--- 752,767 ----
        this->layout_field (build_typeinfo (d->loc, d->entry));
      else
        this->layout_field (null_pointer_node);
+ 
+     /* bool function(in void*, in void*) xopEquals;  */
+     tree xeq = (d->xopEqual) ? build_address (get_symbol_decl (d->xopEqual))
+       : null_pointer_node;
+     this->layout_field (xeq);
+ 
+     /* hash_t function (in void*) xtoHash;  */
+     tree xhash = (d->xtoHash) ? build_address (get_symbol_decl (d->xtoHash))
+       : null_pointer_node;
+     this->layout_field (xhash);
    }
  
    /* Layout of TypeInfo_Vector is:
*************** public:
*** 908,914 ****
  	      }
  	  }
  
! 	if (cd->isAbstract ())
  	  flags |= ClassFlags::isAbstract;
  
  	for (ClassDeclaration *bcd = cd; bcd; bcd = bcd->baseClass)
--- 920,926 ----
  	      }
  	  }
  
! 	if (dmd::isAbstract (cd))
  	  flags |= ClassFlags::isAbstract;
  
  	for (ClassDeclaration *bcd = cd; bcd; bcd = bcd->baseClass)
*************** public:
*** 919,925 ****
  	    for (size_t i = 0; i < bcd->members->length; i++)
  	      {
  		Dsymbol *sm = (*bcd->members)[i];
! 		if (sm->hasPointers ())
  		  goto Lhaspointers;
  	      }
  	  }
--- 931,937 ----
  	    for (size_t i = 0; i < bcd->members->length; i++)
  	      {
  		Dsymbol *sm = (*bcd->members)[i];
! 		if (dmd::hasPointers (sm))
  		  goto Lhaspointers;
  	      }
  	  }
*************** check_typeinfo_type (const Loc &loc, Sco
*** 1442,1447 ****
--- 1454,1468 ----
  	    error_at (make_location_t (loc),
  		      "%<object.TypeInfo%> cannot be used with %<-fno-rtti%>");
  
+ 	  if (expr != NULL || !warned)
+ 	    {
+ 	      /* Print the location of where the error came from.  */
+ 	      if (sc && sc->tinst)
+ 		dmd::printInstantiationTrace (sc->tinst);
+ 
+ 	      global.errors++;
+ 	    }
+ 
  	  warned = 1;
  	}
      }
*************** layout_cpp_typeinfo (ClassDeclaration *c
*** 1521,1526 ****
--- 1542,1551 ----
    d_finish_decl (decl);
  }
  
+ /* Cached instance of class `__cpp_type_info_ptr`.  */
+ 
+ static hash_map<ClassDeclaration *, tree> *cpp_type_info_ptrs;
+ 
  /* Get the VAR_DECL of the __cpp_type_info_ptr for DECL.  If this does not yet
     exist, create it.  The __cpp_type_info_ptr decl is then initialized with a
     pointer to the C++ type_info for the given class.  */
*************** layout_cpp_typeinfo (ClassDeclaration *c
*** 1528,1537 ****
  tree
  get_cpp_typeinfo_decl (ClassDeclaration *decl)
  {
!   gcc_assert (decl->isCPPclass ());
  
!   if (decl->cpp_type_info_ptr_sym)
!     return decl->cpp_type_info_ptr_sym;
  
    if (!tinfo_types[TK_CPPTI_TYPE])
      make_internal_typeinfo (TK_CPPTI_TYPE,
--- 1553,1564 ----
  tree
  get_cpp_typeinfo_decl (ClassDeclaration *decl)
  {
!   hash_map_maybe_create<hm_ggc> (cpp_type_info_ptrs);
  
!   if (tree *tiptr = cpp_type_info_ptrs->get (decl))
!     return *tiptr;
! 
!   gcc_assert (decl->isCPPclass ());
  
    if (!tinfo_types[TK_CPPTI_TYPE])
      make_internal_typeinfo (TK_CPPTI_TYPE,
*************** get_cpp_typeinfo_decl (ClassDeclaration
*** 1541,1558 ****
    tree ident = mangle_internal_decl (decl, "_cpp_type_info_ptr", "");
    tree type = tinfo_types[TK_CPPTI_TYPE];
  
!   decl->cpp_type_info_ptr_sym = declare_extern_var (ident, type);
!   DECL_LANG_SPECIFIC (decl->cpp_type_info_ptr_sym) = build_lang_decl (NULL);
  
    /* Class is a reference, want the record type.  */
!   DECL_CONTEXT (decl->cpp_type_info_ptr_sym)
!     = TREE_TYPE (build_ctype (decl->type));
!   TREE_READONLY (decl->cpp_type_info_ptr_sym) = 1;
  
    /* Layout the initializer and emit the symbol.  */
    layout_cpp_typeinfo (decl);
  
!   return decl->cpp_type_info_ptr_sym;
  }
  
  /* Get the exact TypeInfo for TYPE, if it doesn't exist, create it.  */
--- 1568,1585 ----
    tree ident = mangle_internal_decl (decl, "_cpp_type_info_ptr", "");
    tree type = tinfo_types[TK_CPPTI_TYPE];
  
!   tree cpp_type_info = declare_extern_var (ident, type);
!   cpp_type_info_ptrs->put (decl, cpp_type_info);
!   DECL_LANG_SPECIFIC (cpp_type_info) = build_lang_decl (NULL);
  
    /* Class is a reference, want the record type.  */
!   DECL_CONTEXT (cpp_type_info) = TREE_TYPE (build_ctype (decl->type));
!   TREE_READONLY (cpp_type_info) = 1;
  
    /* Layout the initializer and emit the symbol.  */
    layout_cpp_typeinfo (decl);
  
!   return cpp_type_info;
  }
  
  /* Get the exact TypeInfo for TYPE, if it doesn't exist, create it.  */
*************** create_typeinfo (Type *type, Scope *sc)
*** 1647,1652 ****
--- 1674,1680 ----
  	    {
  	      ident = Identifier::idPool ("TypeInfo_AssociativeArray");
  	      make_internal_typeinfo (tk, ident, ptr_type_node, ptr_type_node,
+ 				      ptr_type_node, ptr_type_node,
  				      ptr_type_node, NULL);
  	    }
  	  t->vtinfo = sc && have_typeinfo_p (Type::typeinfoassociativearray)
diff -Nrcpad gcc-16-20260125/gcc/d/types.cc gcc-16-20260201/gcc/d/types.cc
*** gcc-16-20260125/gcc/d/types.cc	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/d/types.cc	Sun Feb  1 22:32:07 2026
*************** insert_aggregate_bitfield (tree type, tr
*** 324,329 ****
--- 324,333 ----
    DECL_BIT_FIELD (bitfield) = 1;
    DECL_BIT_FIELD_TYPE (bitfield) = TREE_TYPE (bitfield);
  
+   DECL_NONADDRESSABLE_P (bitfield) = 1;
+   if (DECL_NAME (bitfield) == NULL_TREE)
+     DECL_PADDING_P (bitfield) = 1;
+ 
    TYPE_FIELDS (type) = chainon (TYPE_FIELDS (type), bitfield);
  }
  
*************** finish_aggregate_type (unsigned structsi
*** 671,677 ****
  	  continue;
  	}
  
!       layout_decl (field, 0);
  
        /* Give bit-field its proper type after layout_decl.  */
        if (DECL_BIT_FIELD (field))
--- 675,685 ----
  	  continue;
  	}
  
!       /* Layout the field decl using its known alignment.  */
!       unsigned int known_align =
! 	least_bit_hwi (tree_to_uhwi (DECL_FIELD_BIT_OFFSET (field)));
! 
!       layout_decl (field, known_align);
  
        /* Give bit-field its proper type after layout_decl.  */
        if (DECL_BIT_FIELD (field))
*************** finish_aggregate_type (unsigned structsi
*** 699,704 ****
--- 707,713 ----
        if (t == type)
  	continue;
  
+       TYPE_NAME (t) = TYPE_NAME (type);
        TYPE_FIELDS (t) = TYPE_FIELDS (type);
        TYPE_LANG_SPECIFIC (t) = TYPE_LANG_SPECIFIC (type);
        TYPE_SIZE (t) = TYPE_SIZE (type);
*************** public:
*** 955,961 ****
  
  	/* Type `noreturn` is a terminator, as no other arguments can possibly
  	   be evaluated after it.  */
! 	if (type == noreturn_type_node)
  	  break;
  
  	fnparams = chainon (fnparams, build_tree_list (0, type));
--- 964,970 ----
  
  	/* Type `noreturn` is a terminator, as no other arguments can possibly
  	   be evaluated after it.  */
! 	if (TYPE_MAIN_VARIANT (type) == noreturn_type_node)
  	  break;
  
  	fnparams = chainon (fnparams, build_tree_list (0, type));
*************** public:
*** 981,987 ****
      d_keep (t->ctype);
  
      /* Qualify function types that have the type `noreturn` as volatile.  */
!     if (fntype == noreturn_type_node)
        t->ctype = build_qualified_type (t->ctype, TYPE_QUAL_VOLATILE);
  
      /* Handle any special support for calling conventions.  */
--- 990,996 ----
      d_keep (t->ctype);
  
      /* Qualify function types that have the type `noreturn` as volatile.  */
!     if (TYPE_MAIN_VARIANT (fntype) == noreturn_type_node)
        t->ctype = build_qualified_type (t->ctype, TYPE_QUAL_VOLATILE);
  
      /* Handle any special support for calling conventions.  */
*************** public:
*** 1145,1151 ****
  		  continue;
  
  		tree ident = get_identifier (member->ident->toChars ());
! 		tree value = build_integer_cst (member->value ()->toInteger (),
  						basetype);
  
  		/* Build an identifier for the enumeration constant.  */
--- 1154,1162 ----
  		  continue;
  
  		tree ident = get_identifier (member->ident->toChars ());
! 
! 		Expression *evalue = member->value ();
! 		tree value = build_integer_cst (evalue->toInteger (),
  						basetype);
  
  		/* Build an identifier for the enumeration constant.  */
*************** public:
*** 1248,1254 ****
      /* For structs with a user defined postblit, copy constructor, or a
         destructor, also set TREE_ADDRESSABLE on the type and all variants.
         This will make the struct be passed around by reference.  */
!     if (!t->sym->isPOD ())
        {
  	for (tree tv = t->ctype; tv != NULL_TREE; tv = TYPE_NEXT_VARIANT (tv))
  	  {
--- 1259,1265 ----
      /* For structs with a user defined postblit, copy constructor, or a
         destructor, also set TREE_ADDRESSABLE on the type and all variants.
         This will make the struct be passed around by reference.  */
!     if (!dmd::isPOD (t->sym))
        {
  	for (tree tv = t->ctype; tv != NULL_TREE; tv = TYPE_NEXT_VARIANT (tv))
  	  {
diff -Nrcpad gcc-16-20260125/gcc/diagnostics/sarif-sink.cc gcc-16-20260201/gcc/diagnostics/sarif-sink.cc
*** gcc-16-20260125/gcc/diagnostics/sarif-sink.cc	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/diagnostics/sarif-sink.cc	Sun Feb  1 22:32:07 2026
*************** You should have received a copy of the G
*** 18,23 ****
--- 18,25 ----
  along with GCC; see the file COPYING3.  If not see
  <http://www.gnu.org/licenses/>.  */
  
+ #include "config.h"
+ 
  #ifdef __MINGW32__
  #include <winsock2.h>
  #include <afunix.h>
*************** along with GCC; see the file COPYING3.
*** 26,32 ****
  #include <sys/socket.h>
  #endif
  
- #include "config.h"
  #define INCLUDE_LIST
  #define INCLUDE_MAP
  #define INCLUDE_STRING
--- 28,33 ----
diff -Nrcpad gcc-16-20260125/gcc/doc/extend.texi gcc-16-20260201/gcc/doc/extend.texi
*** gcc-16-20260125/gcc/doc/extend.texi	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/doc/extend.texi	Sun Feb  1 22:32:07 2026
*************** with extended @code{asm}.  See
*** 11507,11512 ****
--- 11507,11517 ----
  from basic asm to extended asm} for information about how to perform this
  conversion.
  
+ LTO typically requires rewriting top-level basic @code{asm} statements to
+ extended @code{asm}.  Otherwise you will likely encounter missing symbol
+ errors by linker.  Alternatively you may use
+ @option{-flto-toplevel-asm-heuristics}.
+ 
  The compiler copies the assembler instructions in a basic @code{asm} 
  verbatim to the assembly language output file, without 
  processing dialects or any of the @samp{%} operators that are available with
diff -Nrcpad gcc-16-20260125/gcc/doc/install.texi gcc-16-20260201/gcc/doc/install.texi
*** gcc-16-20260125/gcc/doc/install.texi	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/doc/install.texi	Sun Feb  1 22:32:07 2026
*************** AIX 7.1)}.
*** 3863,3869 ****
  @end itemize
  
  @item
! DOS---@uref{http://www.delorie.com/djgpp/,,DJGPP}.
  
  @item
  macOS:
--- 3863,3869 ----
  @end itemize
  
  @item
! DOS---@uref{https://www.delorie.com/djgpp/,,DJGPP}.
  
  @item
  macOS:
*************** that @code{gfx9-generic} does not includ
*** 4176,4185 ****
  that linking specific ISA code with generic code is currently not supported,
  and that only ROCm 6.4.0 or newer is able to execute generic code.
  
! Use Newlib (4.3.0 or newer; 4.4.0 contains some improvements and 4.5.0 fixes
! the device console output for GFX10 and GFX11 devices; post-4.5.0
! commits 2ef1a37e7 [Mar 25, 2025], f13e8e215 [Aug 8, 2025], and
! bd409f3c1 [Aug 27, 2025] fix SIMD math issues).
  
  To run the binaries, install the HSA Runtime from the
  @uref{https://rocm.docs.amd.com/,,ROCm Platform}, and use
--- 4176,4182 ----
  that linking specific ISA code with generic code is currently not supported,
  and that only ROCm 6.4.0 or newer is able to execute generic code.
  
! Use Newlib (4.6.0 or newer).
  
  To run the binaries, install the HSA Runtime from the
  @uref{https://rocm.docs.amd.com/,,ROCm Platform}, and use
diff -Nrcpad gcc-16-20260125/gcc/doc/invoke.texi gcc-16-20260201/gcc/doc/invoke.texi
*** gcc-16-20260125/gcc/doc/invoke.texi	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/doc/invoke.texi	Sun Feb  1 22:32:07 2026
*************** in the following sections.
*** 224,236 ****
  -fconcepts  -fconcepts-diagnostics-depth=@var{n}
  -fconstexpr-depth=@var{n}  -fconstexpr-cache-depth=@var{n}
  -fconstexpr-loop-limit=@var{n}  -fconstexpr-ops-limit=@var{n}
! -fcontracts  -fcontract-assumption-mode=@r{[}on@r{|}off@r{]}
! -fcontract-build-level=@r{[}off@r{|}default@r{|}audit@r{]}
! -fcontract-continuation-mode=@r{[}on@r{|}off@r{]}
! -fcontract-mode=@r{[}on@r{|}off@r{]}
! -fcontract-role=@var{name}:@var{default},@var{audit},@var{axiom}
! -fcontract-semantic=@r{[}default@r{|}audit@r{|}axiom@r{]}:@var{semantic}
! -fcontract-strict-declarations=@r{[}on@r{|}off@r{]}
  -fcoroutines  -fdiagnostics-all-candidates
  -fno-elide-constructors
  -fno-enforce-eh-specs
--- 224,235 ----
  -fconcepts  -fconcepts-diagnostics-depth=@var{n}
  -fconstexpr-depth=@var{n}  -fconstexpr-cache-depth=@var{n}
  -fconstexpr-loop-limit=@var{n}  -fconstexpr-ops-limit=@var{n}
! -fcontracts
! -fcontract-evaluation-semantic=@r{[}ignore@r{|}observe@r{|}enforce@r{|}quick_enforce@r{]}
! -fcontracts-conservative-ipa  -fcontract-checks-outlined
! -fcontract-disable-optimized-checks
! -fcontracts-client-check=@r{[}none@r{|}pre@r{|}all@r{]}
! -fcontracts-definition-check=@r{[}on@r{|}off@r{]}
  -fcoroutines  -fdiagnostics-all-candidates
  -fno-elide-constructors
  -fno-enforce-eh-specs
*************** Objective-C and Objective-C++ Dialects}.
*** 483,488 ****
--- 482,488 ----
  @item Static Analyzer Options
  @gccoptlist{
  -fanalyzer
+ -fanalyzer-assume-nothrow
  -fanalyzer-call-summaries
  -fanalyzer-checker=@var{name}
  -fno-analyzer-feasibility
*************** The default is 33554432 (1<<25).
*** 3320,3403 ****
  @opindex fcontracts
  @opindex fno-contracts
  @item -fcontracts
! Enable experimental support for the C++ Contracts feature, as briefly
! added to and then removed from the C++20 working paper (N4820).  The
! implementation also includes proposed enhancements from papers P1290,
! P1332, and P1429.  This functionality is intended mostly for those
! interested in experimentation towards refining the feature to get it
! into shape for a future C++ standard.
  
! On violation of a checked contract, the violation handler is called.
! Users can replace the violation handler by defining
  @smallexample
  void
! handle_contract_violation (const std::experimental::contract_violation&);
  @end smallexample
  
! There are different sets of additional flags that can be used together
! to specify which contracts will be checked and how, for N4820
! contracts, P1332 contracts, or P1429 contracts; these sets cannot be
! used together.
  
! @table @gcctabopt
! @opindex fcontract-mode
! @item -fcontract-mode=@r{[}on@r{|}off@r{]}
! Control whether any contracts have any semantics at all.  Defaults to on.
  
! @opindex fcontract-assumption-mode
! @item -fcontract-assumption-mode=@r{[}on@r{|}off@r{]}
! [N4820] Control whether contracts with level @samp{axiom}
! should have the assume semantic.  Defaults to on.
  
! @opindex fcontract-build-level
! @item -fcontract-build-level=@r{[}off@r{|}default@r{|}audit@r{]}
! [N4820] Specify which level of contracts to generate checks
! for.  Defaults to @samp{default}.
  
! @opindex fcontract-continuation-mode
! @item -fcontract-continuation-mode=@r{[}on@r{|}off@r{]}
! [N4820] Control whether to allow the program to continue executing
! after a contract violation.  That is, do checked contracts have the
! @samp{maybe} semantic described below rather than the @samp{never}
! semantic.  Defaults to off.
  
! @opindex fcontract-role
! @item -fcontract-role=@var{name}:@var{default},@var{audit},@var{axiom}
! [P1332] Specify the concrete semantics for each contract level
! of a particular contract role.
  
! @opindex fcontract-semantic
! @item -fcontract-semantic=@r{[}default@r{|}audit@r{|}axiom@r{]}:@var{semantic}
! [P1429] Specify the concrete semantic for a particular
! contract level.
  
! @opindex fcontract-strict-declarations
! @item -fcontract-strict-declarations=@r{[}on@r{|}off@r{]}
! Control whether to reject adding contracts to a function after its
! first declaration.  Defaults to off.
! @end table
  
! The possible concrete semantics for that can be specified with
! @samp{-fcontract-role} or @samp{-fcontract-semantic} are:
  
! @table @code
! @item ignore
! This contract has no effect.
  
! @item assume
! This contract is treated like C++23 @code{[[assume]]}.
  
! @item check_never_continue
! @itemx never
! @itemx abort
! This contract is checked.  If it fails, the violation handler is
! called.  If the handler returns, @code{std::terminate} is called.
  
! @item check_maybe_continue
! @itemx maybe
! This contract is checked.  If it fails, the violation handler is
! called.  If the handler returns, execution continues normally.
! @end table
  
  @opindex fcoroutines
  @opindex fno-coroutines
--- 3320,3405 ----
  @opindex fcontracts
  @opindex fno-contracts
  @item -fcontracts
! Enable support for the C++ Contracts feature, as specified in the C++26
! working draft (N5003).
  
! On violation of an enforced or observed contract (see @option{-fcontract-evaluation-semantic}
! below), a violation handler is called; the standard library provides a default
! handler that emits information about the contract that failed.
! 
! Users can replace the default violation handler by defining
  @smallexample
  void
! handle_contract_violation (const std::contracts::contract_violation&);
  @end smallexample
  
! @opindex fcontract-evaluation-semantic
! @item -fcontract-evaluation-semantic=@var{semantic}
! Set the semantic with which contracts will be evaluated to @var{semantic}.
  
! Available values for the evaluation mode are:
  
! '@code{ignored}' The contract checks will be elided, with no checking added at
! either compile or runtime.
  
! '@code{observed}' The contract checks are performed (at runtime) and, if one
! fails, a handler is called that allows actions such as logging or emitting
! run-time warnings. When the handler returns, the execution of the code will
! continue.  At compile-time the checks are performed for @code{constexpr}
! evaluations, in this case a diagnostic is emitted if the check fails.
  
! '@code{enforce}' The contract checks are performed and the handler is called if
! one fails.  When the handler returns the execution of the code is terminated
! preventing it from continuing past the failed case.  At compile-time the checks
! are applied to @code{constexpr} and, if one fails, the program is ill-formed;
! an error will be emitted.
  
! '@code{quick_enforce}' The contract checks are performed (at runtime) and, if one
! fails, the execution is terminated immediately (without calling any handler).
! At compile-time there is no difference in behaviour between this option and
! the @code{enforce} case, since no handler is invoked at compile time.
  
! @opindex fcontracts-conservative-ipa
! @opindex fno-contracts-conservative-ipa
! @item -fcontracts-conservative-ipa
! This prevents inter-procedural analysis from taking action when the body
! of an inline function is visible in a given TU.  This allows for the case
! that contract evaluation conditions are permitted to differ between TUs which
! means that such actions would be potentially incorrect.
  
! @opindex fcontract-checks-outlined
! @opindex fno-contract-checks-outlined
! @item -fcontract-checks-outlined
! By default, contract checks for @code{pre} and @code{post} condition checks are
! expanded in-line into function bodies.  This option causes a small function to
! be created instead (containing the checks) that is called in the relevant
! position.  This permits different criteria to be applied to the compilation of
! the checking and the remainder of the function body.
  
! @opindex fcontract-disable-optimized-checks
! @opindex fno-contract-disable-optimized-checks
! @item -fcontract-disable-optimized-checks
! When @code{pre} and @code{post} condition checks are outlined (using
! @option{-fcontract-checks-outlined}), this option disables the optimisation 
! steps for those functions which can avoid unwanted elision of checking steps.
  
! @opindex fcontracts-client-check
! @item -fcontracts-client-check=@var{mode}
! This option enables insertion of checks at call sites (caller-side checking).
  
! The value of @var{mode} determines which contract checks are made:
! '@code{none}' No caller/client side checking (default)
  
! '@code{pre}' Preconditions are checked at the caller/client side.
  
! '@code{all}' Both pre and post-conditions are checked at the caller/client side.
! 
! @opindex fcontracts-definition-check
! @item -fcontracts-definition-check=@var{mode}
! This option introduces the ability to disable callee/definition-side checks,
! which are otherwise enabled by default when the contracts feature is active.
! 
! The variable @var{mode} has the values '@code{on}' and '@code{off}'.
  
  @opindex fcoroutines
  @opindex fno-coroutines
*************** The following options control the analyz
*** 12501,12506 ****
--- 12503,12523 ----
  
  @table @gcctabopt
  
+ @opindex fanalyzer-assume-nothrow
+ @opindex fno-analyzer-assume-nothrow
+ @item -fanalyzer-assume-nothrow
+ By default, if @option{-fexceptions} is enabled, the analyzer will assume
+ that a call to any function without attribute @code{nothrow} could throw
+ an exception.  This can help detect execution paths that leak due to
+ exceptions bypassing clean-up code, but could lead to false positives when
+ using headers where the author has not added the @code{nothrow} attribute.
+ 
+ If @option{-fanalyzer-assume-nothrow} is enabled, then the analyzer will
+ assume that external functions do not throw exceptions.  This may be useful
+ for reducing ``noise'' from the analyzer when enabling
+ @option{-fexceptions} on C code, but could hide true issues if an
+ exception could be raised by something the C code calls.
+ 
  @opindex fanalyzer-call-summaries
  @opindex fno-analyzer-call-summaries
  @item -fanalyzer-call-summaries
*************** a default balanced compression setting i
*** 16071,16079 ****
  
  @opindex flto-toplevel-asm-heuristics
  @item -flto-toplevel-asm-heuristics
! Enable heuristics to recognize symbol identifiers in top-level basic asm
! (@pxref{Basic Asm}), and prevent them from being mangled or deleted during
! link-time optimization.
  
  @opindex fuse-linker-plugin
  @item -fuse-linker-plugin
--- 16088,16109 ----
  
  @opindex flto-toplevel-asm-heuristics
  @item -flto-toplevel-asm-heuristics
! Enables heuristics to find symbols used in top-level basic @code{asm}.
! This will restrict link-time optimizations that could cause renaming
! or deletion of such symbols which would result in missing symbol errors by
! linker.
! 
! This flag is intended for projects that have not converted to using top-level
! extended @code{asm} (@pxref{Extended Asm}), which specify the usage directly
! without any false positives.
! 
! The heuristics are simple and do not parse the assembly.
! The heuristics scan through top-level assembly for all possible identifiers;
! if an identifier is found among declared symbols, the symbol will be marked to
! restrict link-time optimizations.  Static symbols disable more optimizations.
! Identifiers followed by ':' disable more optimizations as well, because they
! might be a locally defined symbol in assembly, even when the declaration
! is marked 'extern'.
  
  @opindex fuse-linker-plugin
  @item -fuse-linker-plugin
*************** If non-zero and used together with @opti
*** 16826,16831 ****
--- 16856,16864 ----
  will be used to determine basic block profile.  If zero, then only function
  level profile will be read.
  
+ @item auto-profile-reorder-only
+ Enable only function reordering with auto-profile.
+ 
  @item phiopt-factor-max-stmts-live
  When factoring statements out of if/then/else, this is the max # of statements
  after the defining statement to be allow to extend the lifetime of a name
*************** Enable the Checked Pointer Arithmetic in
*** 23618,23624 ****
  @item sve-b16b16
  Enable the SVE non-widening brain floating-point (@code{bf16}) extension.
  This only has an effect when @code{sve2} or @code{sme2} are also enabled.
! 
  @end table
  
  Feature @option{crypto} implies @option{aes}, @option{sha2}, and @option{simd},
--- 23651,23658 ----
  @item sve-b16b16
  Enable the SVE non-widening brain floating-point (@code{bf16}) extension.
  This only has an effect when @code{sve2} or @code{sme2} are also enabled.
! @item sve-bfscale
! Enable the SVE_BFSCALE extension.
  @end table
  
  Feature @option{crypto} implies @option{aes}, @option{sha2}, and @option{simd},
diff -Nrcpad gcc-16-20260125/gcc/doc/options.texi gcc-16-20260201/gcc/doc/options.texi
*** gcc-16-20260125/gcc/doc/options.texi	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/doc/options.texi	Sun Feb  1 22:32:07 2026
***************
*** 10,15 ****
--- 10,17 ----
  Most GCC command-line options are described by special option
  definition files, the names of which conventionally end in
  @code{.opt}.  This chapter describes the format of these files.
+ For information about managing GCC options and the user experience,
+ @ref{Guidelines for Options}.
  
  @menu
  * Option file format::   The general layout of the files
diff -Nrcpad gcc-16-20260125/gcc/doc/ux.texi gcc-16-20260201/gcc/doc/ux.texi
*** gcc-16-20260125/gcc/doc/ux.texi	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/doc/ux.texi	Sun Feb  1 22:32:07 2026
*************** generated patches.
*** 748,751 ****
  @cindex options, guidelines for
  @cindex guidelines for options
  
! @c TODO
--- 748,852 ----
  @cindex options, guidelines for
  @cindex guidelines for options
  
! @xref{Options}, for information about how GCC command-line options are
! defined in @code{.opt} files.
! 
! @subsection Option Names
! 
! Please follow existing conventions for option naming.  Target-specific
! options should begin with @samp{-m}, general code generation and
! optimization options with @samp{-f}, options controlling diagnostic
! messages with @samp{-W}, and options controlling debug output with
! @samp{-g}.  In each of these four categories there is a corresponding
! negative form for each option beginning with @samp{-mno-},
! @samp{-fno-}, @samp{-Wno-}, or @samp{-gno-} (respectively), which
! allow users to override a positive form of the option earlier on the
! command line, or an option that is enabled by default.
! 
! For options that take an argument, the negative form often does not
! make sense; in this case, specify the @samp{RejectNegative} attribute
! on the definition in the @code{.opt} file.  If you want to add an
! option that @emph{only} has a negative form (perhaps to disable a
! positive-form multiple-choice option that takes an argument), list it
! in the @code{.opt} file in its @samp{no-} form and also add
! @samp{RejectNegative}.
! 
! When adding an option that is specific to a front end, please do not
! include the name of the language in the option name (e.g., as a
! prefix).  It is safe to assume users are aware of the compiler they
! are using.  Similar considerations apply to back end options.
! 
! @subsection Developer Options
! 
! If you need to add a feature intended for debugging GCC itself, please
! add an option to control it, rather than commenting it out, or guarding
! it with @code{#if 0}.  This not only keeps the code from getting bit-rotten,
! it also makes debugging options available at the user's site without
! needing to rebuild GCC, which historically has proven invaluable.
! Such options are documented in the Developer Options section of the manual
! (@pxref{Option Summary,,Option Summary,gcc,Using the GNU Compiler Collection}).
! 
! If an option is not intended to be user visible at all (for example,
! it's used only to support testing or to experiment with new features
! that are not ready or stable enough for general use), you should
! explicitly specify the @samp{Undocumented} property in the @code{.opt}
! file definition so it is clear to other maintainers that the lack of
! user-facing documentation is deliberate.
! 
! Parameters (@samp{--param=}) are special options that allow control
! over constants affecting GCC's internal behavior.  For example,
! traditionally parameters been used in GCC instead of hard-wired
! constants to control things like the maximum number of passes for
! iterative optimization algorithms.  Since these are also
! not intended to be user-visible, they need not be documented or explicitly
! marked as @samp{Undocumented}.
! 
! @subsection Documentation Requirements
! 
! When you add a new option that is intended to be visible to users,
! you should add documentation for it in the same commit.  C language
! family and language-independent options are documented in the main GCC
! manual (in @file{invoke.texi} or files included by it), while
! options specific to the front ends for other languages, like Fortran,
! are documented in the corresponding manual.
! 
! For options documented in the GCC manual, the required documentation is:
! 
! @itemize @bullet{}
! @item Add the option to the appropriate table in the Option Summary section
! (@pxref{Option Summary,,Option Summary,gcc,Using the GNU Compiler Collection}).
! Only add one of the positive or negative forms here.
! Use two spaces to separate options listed on the same line.
! @item Add detailed documentation to the corresponding subsection.  It is
! only necessary to document one of the positive or negative forms, but sometimes
! it's appropriate to list both.
! @item Add index entries for @emph{both} the positive and negative forms just
! before the detailed documentation.
! @end itemize
! 
! Sometimes options become obsolete.  There are several choices of what to do
! here.
! @itemize @bullet{}
! @item You can remove the entry entirely from the @code{.opt} file.  This
! typically causes a generic error if GCC is invoked with that option.
! @item You can add the @samp{WarnRemoved} attribute to the option definition.
! This results in a more specific error message and is usually a better
! choice than completely removing it.
! @item You can add the @samp{Warn} attribute to the option definition.  For
! example, you can use this if you want to warn that an option is deprecated,
! rather than remove it completely.
! @item You can add the @samp{Ignore} attribute to the option definition to
! silently ignore it and do nothing if it is passed.  This has the advantage
! that it won't break old makefiles, but is only appropriate if the default
! behavior without the option is consistent with the previous behavior with
! the option and doesn't conflict with user expectations.
! @end itemize
! 
! In all of these cases, you should remove the user documentation for an option
! at the same time you remove, disable, or deprecate it.
! 
! If you add, remove, or modify options documentation, you must also run
! @samp{make regenerate-opt-urls} in the @file{gcc} directory of your
! build tree, and check in the resulting changes.  This updates the
! database used to insert links to the online documentation for options
! that are mentioned in diagnostic messages.
diff -Nrcpad gcc-16-20260125/gcc/dwarf2out.cc gcc-16-20260201/gcc/dwarf2out.cc
*** gcc-16-20260125/gcc/dwarf2out.cc	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/dwarf2out.cc	Sun Feb  1 22:32:07 2026
*************** equate_type_number_to_die (tree type, dw
*** 5969,5975 ****
  static dw_die_ref maybe_create_die_with_external_ref (tree);
  struct GTY(()) sym_off_pair
  {
!   const char * GTY((skip)) sym;
    unsigned HOST_WIDE_INT off;
  };
  static GTY(()) hash_map<tree, sym_off_pair> *external_die_map;
--- 5969,5975 ----
  static dw_die_ref maybe_create_die_with_external_ref (tree);
  struct GTY(()) sym_off_pair
  {
!   const char *sym;
    unsigned HOST_WIDE_INT off;
  };
  static GTY(()) hash_map<tree, sym_off_pair> *external_die_map;
*************** generate_skeleton_bottom_up (skeleton_ch
*** 8545,8550 ****
--- 8545,8551 ----
  	       type unit.  Just move the DIE and its children back to
  	       the skeleton tree (in the main CU).  */
  	    remove_child_with_prev (c, prev);
+ 	    generate_skeleton_ancestor_tree (parent);
  	    add_child_die (parent->new_die, c);
  	    c = prev;
  	  }
*************** add_location_or_const_value_attribute (d
*** 21350,21356 ****
  static tree
  mangle_referenced_decls (tree *tp, int *walk_subtrees, void *)
  {
!   if (! EXPR_P (*tp) && ! CONSTANT_CLASS_P (*tp))
      *walk_subtrees = 0;
  
    if (VAR_OR_FUNCTION_DECL_P (*tp))
--- 21351,21359 ----
  static tree
  mangle_referenced_decls (tree *tp, int *walk_subtrees, void *)
  {
!   if (! EXPR_P (*tp)
!       && ! CONSTANT_CLASS_P (*tp)
!       && TREE_CODE (*tp) != CONSTRUCTOR)
      *walk_subtrees = 0;
  
    if (VAR_OR_FUNCTION_DECL_P (*tp))
*************** tree_add_const_value_attribute (dw_die_r
*** 21398,21410 ****
        /* For early_dwarf force mangling of all referenced symbols.  */
        tree initializer = init;
        STRIP_NOPS (initializer);
!       /* rtl_for_decl_init punts on other aggregates, and complex values.  */
!       if (AGGREGATE_TYPE_P (type)
! 	  || (TREE_CODE (initializer) == VIEW_CONVERT_EXPR
! 	      && AGGREGATE_TYPE_P (TREE_TYPE (TREE_OPERAND (initializer, 0))))
! 	  || TREE_CODE (type) == COMPLEX_TYPE)
! 	;
!       else if (initializer_constant_valid_p (initializer, type))
  	walk_tree (&initializer, mangle_referenced_decls, NULL, NULL);
      }
    /* If the host and target are sane, try harder.  */
--- 21401,21407 ----
        /* For early_dwarf force mangling of all referenced symbols.  */
        tree initializer = init;
        STRIP_NOPS (initializer);
!       if (initializer_constant_valid_p (initializer, type))
  	walk_tree (&initializer, mangle_referenced_decls, NULL, NULL);
      }
    /* If the host and target are sane, try harder.  */
diff -Nrcpad gcc-16-20260125/gcc/expr.cc gcc-16-20260201/gcc/expr.cc
*** gcc-16-20260125/gcc/expr.cc	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/expr.cc	Sun Feb  1 22:32:07 2026
*************** emit_group_load_1 (rtx *tmps, rtx dst, r
*** 3038,3043 ****
--- 3038,3044 ----
        src = orig_src;
        if (!MEM_P (orig_src)
  	  && (!REG_P (orig_src) || HARD_REGISTER_P (orig_src))
+ 	  && GET_CODE (orig_src) != CONCAT
  	  && !CONSTANT_P (orig_src))
  	{
  	  gcc_assert (GET_MODE (orig_src) != VOIDmode);
*************** expand_expr_real_1 (tree exp, rtx target
*** 12336,12348 ****
  	   and need be, put it there.  */
  	else if (CONSTANT_P (op0) || (!MEM_P (op0) && must_force_mem))
  	  {
  	    poly_int64 size;
  	    if (!poly_int_tree_p (TYPE_SIZE_UNIT (TREE_TYPE (tem)), &size))
  	      size = max_int_size_in_bytes (TREE_TYPE (tem));
! 	    memloc = assign_stack_local (TYPE_MODE (TREE_TYPE (tem)), size,
! 					 TREE_CODE (tem) == SSA_NAME
! 					 ? TYPE_ALIGN (TREE_TYPE (tem))
! 					 : get_object_alignment (tem));
  	    emit_move_insn (memloc, op0);
  	    op0 = memloc;
  	    clear_mem_expr = true;
--- 12337,12362 ----
  	   and need be, put it there.  */
  	else if (CONSTANT_P (op0) || (!MEM_P (op0) && must_force_mem))
  	  {
+ 	    machine_mode tem_mode = TYPE_MODE (TREE_TYPE (tem));
  	    poly_int64 size;
  	    if (!poly_int_tree_p (TYPE_SIZE_UNIT (TREE_TYPE (tem)), &size))
  	      size = max_int_size_in_bytes (TREE_TYPE (tem));
! 	    unsigned int align = TREE_CODE (tem) == SSA_NAME
! 				 ? TYPE_ALIGN (TREE_TYPE (tem))
! 				 : get_object_alignment (tem);
! 	    if (STRICT_ALIGNMENT)
! 	      {
! 		/* For STRICT_ALIGNMENT targets, when we force the operand to
! 		   memory, we may need to increase the alignment to meet the
! 		   expectation in later RTL lowering passes.  The increased
! 		   alignment is capped by MAX_SUPPORTED_STACK_ALIGNMENT.  */
! 		if (tem_mode != BLKmode)
! 		  align = MAX (align, GET_MODE_ALIGNMENT (tem_mode));
! 		else
! 		  align = MAX (align, TYPE_ALIGN (TREE_TYPE (tem)));
! 		align = MIN (align, (unsigned) MAX_SUPPORTED_STACK_ALIGNMENT);
! 	      }
! 	    memloc = assign_stack_local (tem_mode, size, align);
  	    emit_move_insn (memloc, op0);
  	    op0 = memloc;
  	    clear_mem_expr = true;
diff -Nrcpad gcc-16-20260125/gcc/final.cc gcc-16-20260201/gcc/final.cc
*** gcc-16-20260125/gcc/final.cc	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/final.cc	Sun Feb  1 22:32:07 2026
*************** output_asm_operand_names (rtx *operands,
*** 3295,3301 ****
    for (i = 0; i < nops; i++)
      {
        int addressp;
!       rtx op = operands[oporder[i]];
        tree expr = get_mem_expr_from_op (op, &addressp);
  
        fprintf (asm_out_file, "%c%s",
--- 3295,3305 ----
    for (i = 0; i < nops; i++)
      {
        int addressp;
!       int opnum = oporder[i];
!       /* Skip invalid ops. */
!       if (opnum == MAX_RECOG_OPERANDS)
! 	continue;
!       rtx op = operands[opnum];
        tree expr = get_mem_expr_from_op (op, &addressp);
  
        fprintf (asm_out_file, "%c%s",
*************** output_asm_insn (const char *templ, rtx
*** 3428,3435 ****
  #ifdef ASSEMBLER_DIALECT
    int dialect = 0;
  #endif
!   int oporder[MAX_RECOG_OPERANDS];
!   char opoutput[MAX_RECOG_OPERANDS];
    int ops = 0;
  
    /* An insn may return a null string template
--- 3432,3439 ----
  #ifdef ASSEMBLER_DIALECT
    int dialect = 0;
  #endif
!   int oporder[MAX_RECOG_OPERANDS+1];
!   char opoutput[MAX_RECOG_OPERANDS+1];
    int ops = 0;
  
    /* An insn may return a null string template
*************** output_asm_insn (const char *templ, rtx
*** 3517,3523 ****
  	      output_operand_lossage ("operand number missing "
  				      "after %%-letter");
  	    else if (this_is_asm_operands && opnum >= insn_noperands)
! 	      output_operand_lossage ("operand number out of range");
  	    else if (letter == 'l')
  	      output_asm_label (operands[opnum]);
  	    else if (letter == 'a')
--- 3521,3531 ----
  	      output_operand_lossage ("operand number missing "
  				      "after %%-letter");
  	    else if (this_is_asm_operands && opnum >= insn_noperands)
! 	      {
! 		/* Force the opnum in bounds to a bogus location. */
! 		opnum = MAX_RECOG_OPERANDS;
! 		output_operand_lossage ("operand number out of range");
! 	      }
  	    else if (letter == 'l')
  	      output_asm_label (operands[opnum]);
  	    else if (letter == 'a')
*************** output_asm_insn (const char *templ, rtx
*** 3558,3564 ****
  
  	    opnum = strtoul (p, &endptr, 10);
  	    if (this_is_asm_operands && opnum >= insn_noperands)
! 	      output_operand_lossage ("operand number out of range");
  	    else
  	      output_operand (operands[opnum], 0);
  
--- 3566,3576 ----
  
  	    opnum = strtoul (p, &endptr, 10);
  	    if (this_is_asm_operands && opnum >= insn_noperands)
! 	      {
! 		/* Force the opnum in bounds to a bogus location. */
! 		opnum = MAX_RECOG_OPERANDS;
! 		output_operand_lossage ("operand number out of range");
! 	      }
  	    else
  	      output_operand (operands[opnum], 0);
  
diff -Nrcpad gcc-16-20260125/gcc/fold-const.cc gcc-16-20260201/gcc/fold-const.cc
*** gcc-16-20260125/gcc/fold-const.cc	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/fold-const.cc	Sun Feb  1 22:32:07 2026
*************** fold_convert_const (enum tree_code code,
*** 2566,2571 ****
--- 2566,2573 ----
  	  return v.build ();
  	}
      }
+   else if (TREE_CODE (type) == NULLPTR_TYPE && integer_zerop (arg1))
+     return build_zero_cst (type);
    return NULL_TREE;
  }
  
*************** fold_convert_loc (location_t loc, tree t
*** 2788,2793 ****
--- 2790,2799 ----
        tem = fold_ignored_result (arg);
        return fold_build1_loc (loc, NOP_EXPR, type, tem);
  
+     case NULLPTR_TYPE:
+       if (integer_zerop (arg))
+ 	return build_zero_cst (type);
+       /* FALLTHRU */
      default:
        if (TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (orig))
  	return fold_build1_loc (loc, NOP_EXPR, type, arg);
diff -Nrcpad gcc-16-20260125/gcc/fortran/ChangeLog gcc-16-20260201/gcc/fortran/ChangeLog
*** gcc-16-20260125/gcc/fortran/ChangeLog	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/fortran/ChangeLog	Sun Feb  1 22:32:07 2026
***************
*** 1,3 ****
--- 1,45 ----
+ 2026-01-31  Paul Thomas  <pault@gcc.gnu.org>
+ 
+ 	* array.cc (resolve_array_list): Use macro IS_PDT.
+ 	* gfortran.h : Supply macros IS_PDT and IS_CLASS_PDT.
+ 	* match.cc (gfc_match_type_is): Use IS_PDT and IS_CLASS_PDT as
+ 	appropriate.
+ 	* resolve.cc (gfc_resolve_ref, build_init_assign,
+ 	resolve_component): Likewise.
+ 	* trans-array.cc (gfc_trans_array_constructor_value,
+ 	trans_array_constructor, structure_alloc_comps,
+ 	has_parameterized_comps): Likewise.
+ 	* trans-decl.cc (gfc_get_symbol_decl, gfc_init_default_dt,
+ 	gfc_trans_deferred_vars, gfc_generate_function_code): Likewise.
+ 	* trans-expr.cc (conv_dummy_value, gfc_conv_structure,
+ 	gfc_trans_assignment_1): Likewise.
+ 	* trans-stmt.cc (trans_associate_var, gfc_trans_allocate,
+ 	gfc_trans_deallocate): Likewise.
+ 
+ 2026-01-30  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
+ 
+ 	PR fortran/123868
+ 	* trans-array.cc (structure_alloc_comps): For COPY_ALLOC_COMP,
+ 	remove the add_when_allocated != NULL_TREE clause that PR121628
+ 	added.  This clause was redundant for scalars and caused double
+ 	allocation for arrays with nested allocatable components.
+ 
+ 2026-01-27  Tobias Burnus  <tburnus@baylibre.com>
+ 
+ 	* openmp.cc (resolve_omp_clauses): Reject groupprivate/device-local
+ 	variables in MAP clauses.
+ 
+ 2026-01-27  Wilco Dijkstra  <wilco.dijkstra@arm.com>
+ 
+ 	PR fortran/118955
+ 	* decl.cc (gfc_match_gcc_builtin): Add 'fastmath' option which
+ 	checks for fast-math before accepting a vector function.
+ 	* gfortran.texi (!GCC$ builtin): Update documentation.
+ 
+ 2026-01-25  Sandra Loosemore  <sloosemore@baylibre.com>
+ 
+ 	* lang.opt.urls: Regenerated.
+ 
  2026-01-24  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
  
  	PR fortran/123772
diff -Nrcpad gcc-16-20260125/gcc/fortran/array.cc gcc-16-20260201/gcc/fortran/array.cc
*** gcc-16-20260125/gcc/fortran/array.cc	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/fortran/array.cc	Sun Feb  1 22:32:07 2026
*************** resolve_array_list (gfc_constructor_base
*** 2279,2287 ****
  
        /* For valid expressions, check that the type specification parameters
  	 are the same.  */
!       if (t && !c->iterator && c->expr
! 	  && c->expr->ts.type == BT_DERIVED
! 	  && c->expr->ts.u.derived->attr.pdt_type)
  	{
  	  if (expr1 == NULL)
  	    expr1 = c->expr;
--- 2279,2285 ----
  
        /* For valid expressions, check that the type specification parameters
  	 are the same.  */
!       if (t && !c->iterator && c->expr && IS_PDT (c->expr))
  	{
  	  if (expr1 == NULL)
  	    expr1 = c->expr;
diff -Nrcpad gcc-16-20260125/gcc/fortran/decl.cc gcc-16-20260201/gcc/fortran/decl.cc
*** gcc-16-20260125/gcc/fortran/decl.cc	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/fortran/decl.cc	Sun Feb  1 22:32:07 2026
*************** along with GCC; see the file COPYING3.
*** 29,34 ****
--- 29,35 ----
  #include "parse.h"
  #include "constructor.h"
  #include "target.h"
+ #include "flags.h"
  
  /* Macros to access allocate memory for gfc_data_variable,
     gfc_data_value and gfc_data.  */
*************** gfc_match_gcc_builtin (void)
*** 12816,12824 ****
  
    if (gfc_match (" if ( '%n' ) ", target) == MATCH_YES)
      {
!       const char *abi = targetm.get_multilib_abi_name ();
!       if (abi == NULL || strcmp (abi, target) != 0)
! 	return MATCH_YES;
      }
  
    if (gfc_vectorized_builtins == NULL)
--- 12817,12833 ----
  
    if (gfc_match (" if ( '%n' ) ", target) == MATCH_YES)
      {
!       if (strcmp (target, "fastmath") == 0)
! 	{
! 	  if (!fast_math_flags_set_p (&global_options))
! 	    return MATCH_YES;
! 	}
!       else
! 	{
! 	  const char *abi = targetm.get_multilib_abi_name ();
! 	  if (abi == NULL || strcmp (abi, target) != 0)
! 	    return MATCH_YES;
! 	}
      }
  
    if (gfc_vectorized_builtins == NULL)
diff -Nrcpad gcc-16-20260125/gcc/fortran/gfortran.h gcc-16-20260201/gcc/fortran/gfortran.h
*** gcc-16-20260125/gcc/fortran/gfortran.h	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/fortran/gfortran.h	Sun Feb  1 22:32:07 2026
*************** bool gfc_may_be_finalized (gfc_typespec)
*** 4304,4309 ****
--- 4304,4318 ----
  	(expr && expr->expr_type == EXPR_VARIABLE \
  	 && expr->symtree->n.sym->assoc \
  	 && expr->symtree->n.sym->assoc->inferred_type)
+ #define IS_PDT(sym) \
+ 	(sym != NULL && sym->ts.type == BT_DERIVED \
+ 	 && sym->ts.u.derived \
+ 	 && sym->ts.u.derived->attr.pdt_type)
+ #define IS_CLASS_PDT(sym) \
+ 	(sym != NULL && sym->ts.type == BT_CLASS \
+ 	 && CLASS_DATA (sym) \
+ 	 && CLASS_DATA (sym)->ts.u.derived \
+ 	 && CLASS_DATA (sym)->ts.u.derived->attr.pdt_type)
  
  /* frontend-passes.cc */
  
diff -Nrcpad gcc-16-20260125/gcc/fortran/gfortran.texi gcc-16-20260201/gcc/fortran/gfortran.texi
*** gcc-16-20260125/gcc/fortran/gfortran.texi	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/fortran/gfortran.texi	Sun Feb  1 22:32:07 2026
*************** for the built-in that should be vectoriz
*** 3454,3459 ****
--- 3454,3466 ----
  !GCC$ builtin (sinf) attributes simd (notinbranch) if('x86_64')
  @end smallexample
  
+ The special target @code{'fastmath'} is used to specify the vector
+ implementation is only valid if fast-math is enabled:
+ 
+ @smallexample
+ !GCC$ builtin (exp) attributes simd (notinbranch) if('fastmath')
+ @end smallexample
+ 
  The purpose of the directive is to provide an API among the GCC compiler and
  the GNU C Library which would define vector implementations of math routines.
  
diff -Nrcpad gcc-16-20260125/gcc/fortran/match.cc gcc-16-20260201/gcc/fortran/match.cc
*** gcc-16-20260125/gcc/fortran/match.cc	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/fortran/match.cc	Sun Feb  1 22:32:07 2026
*************** gfc_match_type_is (void)
*** 7947,7956 ****
        return MATCH_ERROR;
      }
  
!   if (c->ts.type == BT_DERIVED
!       && c->ts.u.derived && c->ts.u.derived->attr.pdt_type
!       && gfc_spec_list_type (type_param_spec_list, c->ts.u.derived)
! 							!= SPEC_ASSUMED)
      {
        gfc_error ("All the LEN type parameters in the TYPE IS statement "
  		 "at %C must be ASSUMED");
--- 7947,7954 ----
        return MATCH_ERROR;
      }
  
!   if (IS_PDT (c) && gfc_spec_list_type (type_param_spec_list,
! 					c->ts.u.derived) != SPEC_ASSUMED)
      {
        gfc_error ("All the LEN type parameters in the TYPE IS statement "
  		 "at %C must be ASSUMED");
diff -Nrcpad gcc-16-20260125/gcc/fortran/openmp.cc gcc-16-20260201/gcc/fortran/openmp.cc
*** gcc-16-20260125/gcc/fortran/openmp.cc	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/fortran/openmp.cc	Sun Feb  1 22:32:07 2026
*************** resolve_omp_clauses (gfc_code *code, gfc
*** 9890,9895 ****
--- 9890,9901 ----
  				     &n->where);
  		      }
  		  }
+ 		if (list == OMP_LIST_MAP
+ 		    && (n->sym->attr.omp_groupprivate
+ 			|| n->sym->attr.omp_declare_target_local))
+ 		  gfc_error ("%qs argument to MAP clause at %L must not be a "
+ 			     "device-local variable, including GROUPPRIVATE",
+ 			     n->sym->name, &n->where);
  		if (openacc
  		    && list == OMP_LIST_MAP
  		    && (n->u.map.op == OMP_MAP_ATTACH
diff -Nrcpad gcc-16-20260125/gcc/fortran/resolve.cc gcc-16-20260201/gcc/fortran/resolve.cc
*** gcc-16-20260125/gcc/fortran/resolve.cc	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/fortran/resolve.cc	Sun Feb  1 22:32:07 2026
*************** gfc_resolve_ref (gfc_expr *expr)
*** 6080,6088 ****
    n_components = 0;
    array_ref = NULL;
  
!   if (expr->expr_type == EXPR_VARIABLE
!       && expr->symtree->n.sym->ts.type == BT_DERIVED
!       && expr->symtree->n.sym->ts.u.derived->attr.pdt_type)
      last_pdt = expr->symtree->n.sym->ts.u.derived;
  
    for (ref = expr->ref; ref; ref = ref->next)
--- 6080,6086 ----
    n_components = 0;
    array_ref = NULL;
  
!   if (expr->expr_type == EXPR_VARIABLE && IS_PDT (expr))
      last_pdt = expr->symtree->n.sym->ts.u.derived;
  
    for (ref = expr->ref; ref; ref = ref->next)
*************** build_init_assign (gfc_symbol *sym, gfc_
*** 14918,14925 ****
    gfc_code *init_st;
    gfc_namespace *ns = sym->ns;
  
!   if (sym->attr.function && sym->result == sym
!       && sym->ts.type == BT_DERIVED && sym->ts.u.derived->attr.pdt_type)
      {
        gfc_free_expr (init);
        return;
--- 14916,14922 ----
    gfc_code *init_st;
    gfc_namespace *ns = sym->ns;
  
!   if (sym->attr.function && sym->result == sym && IS_PDT (sym))
      {
        gfc_free_expr (init);
        return;
*************** resolve_component (gfc_component *c, gfc
*** 17061,17068 ****
        if (!sym->attr.pdt_type)
  	sym->attr.pdt_comp = 1;
      }
!   else if (c->ts.type == BT_DERIVED && c->ts.u.derived->attr.pdt_type
! 	   && !sym->attr.pdt_type)
      sym->attr.pdt_comp = 1;
  
    if (c->attr.proc_pointer && c->ts.interface)
--- 17058,17064 ----
        if (!sym->attr.pdt_type)
  	sym->attr.pdt_comp = 1;
      }
!   else if (IS_PDT (c) && !sym->attr.pdt_type)
      sym->attr.pdt_comp = 1;
  
    if (c->attr.proc_pointer && c->ts.interface)
diff -Nrcpad gcc-16-20260125/gcc/fortran/trans-array.cc gcc-16-20260201/gcc/fortran/trans-array.cc
*** gcc-16-20260125/gcc/fortran/trans-array.cc	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/fortran/trans-array.cc	Sun Feb  1 22:32:07 2026
*************** gfc_trans_array_constructor_value (stmtb
*** 2248,2256 ****
  	    {
  	      /* Scalar values.  */
  	      gfc_init_se (&se, NULL);
! 	      if (c->expr->ts.type == BT_DERIVED
! 		  && c->expr->ts.u.derived->attr.pdt_type
! 		  && c->expr->expr_type == EXPR_STRUCTURE)
  		c->expr->must_finalize = 1;
  
  	      gfc_trans_array_ctor_element (&body, desc, *poffset,
--- 2248,2254 ----
  	    {
  	      /* Scalar values.  */
  	      gfc_init_se (&se, NULL);
! 	      if (IS_PDT (c->expr) && c->expr->expr_type == EXPR_STRUCTURE)
  		c->expr->must_finalize = 1;
  
  	      gfc_trans_array_ctor_element (&body, desc, *poffset,
*************** trans_array_constructor (gfc_ss * ss, lo
*** 3094,3100 ****
    if (expr->ts.type == BT_DERIVED && expr->ts.u.derived->attr.alloc_comp)
      finalize_required = true;
  
!   if (expr->ts.type == BT_DERIVED && expr->ts.u.derived->attr.pdt_type)
     finalize_required = true;
  
    gfc_trans_array_constructor_value (&outer_loop->pre,
--- 3092,3098 ----
    if (expr->ts.type == BT_DERIVED && expr->ts.u.derived->attr.alloc_comp)
      finalize_required = true;
  
!   if (IS_PDT (expr))
     finalize_required = true;
  
    gfc_trans_array_constructor_value (&outer_loop->pre,
*************** structure_alloc_comps (gfc_symbol * der_
*** 10334,10341 ****
  	      && seen_derived_types.contains (CLASS_DATA (c)->ts.u.derived));
        bool inside_wrapper = generating_copy_helper;
  
!       bool is_pdt_type = c->ts.type == BT_DERIVED
! 			 && c->ts.u.derived->attr.pdt_type;
  
        cdecl = c->backend_decl;
        ctype = TREE_TYPE (cdecl);
--- 10332,10338 ----
  	      && seen_derived_types.contains (CLASS_DATA (c)->ts.u.derived));
        bool inside_wrapper = generating_copy_helper;
  
!       bool is_pdt_type = IS_PDT (c);
  
        cdecl = c->backend_decl;
        ctype = TREE_TYPE (cdecl);
*************** structure_alloc_comps (gfc_symbol * der_
*** 10873,10880 ****
  				  cdecl, NULL_TREE);
  	  dcmp = fold_convert (TREE_TYPE (comp), dcmp);
  
! 	  if (c->ts.type == BT_DERIVED && c->ts.u.derived->attr.pdt_type
! 	      && !c->attr.allocatable)
  	    {
  	      tmp = gfc_copy_alloc_comp (c->ts.u.derived, comp, dcmp,
  					 0, 0);
--- 10870,10876 ----
  				  cdecl, NULL_TREE);
  	  dcmp = fold_convert (TREE_TYPE (comp), dcmp);
  
! 	  if (IS_PDT (c) && !c->attr.allocatable)
  	    {
  	      tmp = gfc_copy_alloc_comp (c->ts.u.derived, comp, dcmp,
  					 0, 0);
*************** structure_alloc_comps (gfc_symbol * der_
*** 11063,11071 ****
  					  copy_wrapper);
  	      gfc_add_expr_to_block (&fnblock, call);
  	    }
  	  else if (c->attr.allocatable && !c->attr.proc_pointer
! 		   && (add_when_allocated != NULL_TREE
! 		       || !cmp_has_alloc_comps
  		       || !c->as
  		       || c->attr.codimension
  		       || caf_in_coarray (caf_mode)))
--- 11059,11072 ----
  					  copy_wrapper);
  	      gfc_add_expr_to_block (&fnblock, call);
  	    }
+ 	  /* For allocatable arrays with nested allocatable components,
+ 	     add_when_allocated already includes gfc_duplicate_allocatable
+ 	     (from the recursive structure_alloc_comps call at line 10290-10293),
+ 	     so we must not call it again here.  PR121628 added an
+ 	     add_when_allocated != NULL clause that was redundant for scalars
+ 	     (already handled by !c->as) and wrong for arrays (double alloc).  */
  	  else if (c->attr.allocatable && !c->attr.proc_pointer
! 		   && (!cmp_has_alloc_comps
  		       || !c->as
  		       || c->attr.codimension
  		       || caf_in_coarray (caf_mode)))
*************** structure_alloc_comps (gfc_symbol * der_
*** 11129,11136 ****
  		}
  	    }
  	  else if (c->initializer && !c->attr.pdt_string && !c->attr.pdt_array
! 		   && !c->as && !(c->ts.type == BT_DERIVED
! 				  && c->ts.u.derived->attr.pdt_type))   /* Take care of arrays.  */
  	    {
  	      gfc_se tse;
  	      gfc_expr *c_expr;
--- 11130,11136 ----
  		}
  	    }
  	  else if (c->initializer && !c->attr.pdt_string && !c->attr.pdt_array
! 		   && !c->as && !IS_PDT (c))   /* Take care of arrays.  */
  	    {
  	      gfc_se tse;
  	      gfc_expr *c_expr;
*************** structure_alloc_comps (gfc_symbol * der_
*** 11178,11185 ****
  
  	  /* Allocate parameterized arrays of parameterized derived types.  */
  	  if (!(c->attr.pdt_array && c->as && c->as->type == AS_EXPLICIT)
! 	      && !((c->ts.type == BT_DERIVED || c->ts.type == BT_CLASS)
! 		   && (c->ts.u.derived && c->ts.u.derived->attr.pdt_type)))
  	    continue;
  
  	  if (c->ts.type == BT_CLASS)
--- 11178,11184 ----
  
  	  /* Allocate parameterized arrays of parameterized derived types.  */
  	  if (!(c->attr.pdt_array && c->as && c->as->type == AS_EXPLICIT)
! 	      && !(IS_PDT (c) || IS_CLASS_PDT (c)))
  	    continue;
  
  	  if (c->ts.type == BT_CLASS)
*************** structure_alloc_comps (gfc_symbol * der_
*** 11278,11285 ****
  	    }
  
  	  /* Recurse in to PDT components.  */
! 	  if ((c->ts.type == BT_DERIVED || c->ts.type == BT_CLASS)
! 	      && c->ts.u.derived && c->ts.u.derived->attr.pdt_type
  	      && !(c->attr.pointer || c->attr.allocatable))
  	    {
  	      gfc_actual_arglist *tail = c->param_list;
--- 11277,11283 ----
  	    }
  
  	  /* Recurse in to PDT components.  */
! 	  if ((IS_PDT (c) || IS_CLASS_PDT (c))
  	      && !(c->attr.pointer || c->attr.allocatable))
  	    {
  	      gfc_actual_arglist *tail = c->param_list;
*************** structure_alloc_comps (gfc_symbol * der_
*** 11301,11308 ****
  	     of parameterized derived types.  */
  	  if (!(c->attr.pdt_array && c->as && c->as->type == AS_EXPLICIT)
  	      && !c->attr.pdt_string
! 	      && !((c->ts.type == BT_DERIVED || c->ts.type == BT_CLASS)
! 		   && (c->ts.u.derived && c->ts.u.derived->attr.pdt_type)))
  	    continue;
  
  	  comp = fold_build3_loc (input_location, COMPONENT_REF, ctype,
--- 11299,11305 ----
  	     of parameterized derived types.  */
  	  if (!(c->attr.pdt_array && c->as && c->as->type == AS_EXPLICIT)
  	      && !c->attr.pdt_string
! 	      && !(IS_PDT (c) || IS_CLASS_PDT (c)))
  	    continue;
  
  	  comp = fold_build3_loc (input_location, COMPONENT_REF, ctype,
*************** structure_alloc_comps (gfc_symbol * der_
*** 11311,11318 ****
  	    comp = gfc_class_data_get (comp);
  
  	  /* Recurse in to PDT components.  */
! 	  if ((c->ts.type == BT_DERIVED || c->ts.type == BT_CLASS)
! 	      && c->ts.u.derived && c->ts.u.derived->attr.pdt_type
  	      && (!c->attr.pointer && !c->attr.allocatable))
  	    {
  	      tmp = gfc_deallocate_pdt_comp (c->ts.u.derived, comp,
--- 11308,11314 ----
  	    comp = gfc_class_data_get (comp);
  
  	  /* Recurse in to PDT components.  */
! 	  if ((IS_PDT (c) || IS_CLASS_PDT (c))
  	      && (!c->attr.pointer && !c->attr.allocatable))
  	    {
  	      tmp = gfc_deallocate_pdt_comp (c->ts.u.derived, comp,
*************** has_parameterized_comps (gfc_symbol * de
*** 11591,11599 ****
    for (gfc_component *c = der_type->components; c; c = c->next)
      if (c->attr.pdt_array || c->attr.pdt_string)
        parameterized_comps = true;
!     else if (c->ts.type == BT_DERIVED
! 	     && c->ts.u.derived->attr.pdt_type
! 	     && strcmp (der_type->name, c->ts.u.derived->name))
        parameterized_comps = has_parameterized_comps (c->ts.u.derived);
    return parameterized_comps;
  }
--- 11587,11593 ----
    for (gfc_component *c = der_type->components; c; c = c->next)
      if (c->attr.pdt_array || c->attr.pdt_string)
        parameterized_comps = true;
!     else if (IS_PDT (c) && strcmp (der_type->name, c->ts.u.derived->name))
        parameterized_comps = has_parameterized_comps (c->ts.u.derived);
    return parameterized_comps;
  }
diff -Nrcpad gcc-16-20260125/gcc/fortran/trans-decl.cc gcc-16-20260201/gcc/fortran/trans-decl.cc
*** gcc-16-20260125/gcc/fortran/trans-decl.cc	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/fortran/trans-decl.cc	Sun Feb  1 22:32:07 2026
*************** gfc_get_symbol_decl (gfc_symbol * sym)
*** 2100,2108 ****
  	  || sym->attr.data || sym->ns->proc_name->attr.flavor == FL_MODULE)
        && (flag_coarray != GFC_FCOARRAY_LIB
  	  || !sym->attr.codimension || sym->attr.allocatable)
!       && !(sym->ts.type == BT_DERIVED && sym->ts.u.derived->attr.pdt_type)
!       && !(sym->ts.type == BT_CLASS
! 	   && CLASS_DATA (sym)->ts.u.derived->attr.pdt_type))
      {
        /* Add static initializer. For procedures, it is only needed if
  	 SAVE is specified otherwise they need to be reinitialized
--- 2100,2106 ----
  	  || sym->attr.data || sym->ns->proc_name->attr.flavor == FL_MODULE)
        && (flag_coarray != GFC_FCOARRAY_LIB
  	  || !sym->attr.codimension || sym->attr.allocatable)
!       && !(IS_PDT (sym) || IS_CLASS_PDT (sym)))
      {
        /* Add static initializer. For procedures, it is only needed if
  	 SAVE is specified otherwise they need to be reinitialized
*************** gfc_init_default_dt (gfc_symbol * sym, s
*** 4580,4587 ****
    gcc_assert (block);
  
    /* Initialization of PDTs is done elsewhere.  */
!   if (sym->ts.type == BT_DERIVED && sym->ts.u.derived->attr.pdt_type
!       && !pdt_ok)
      return;
  
    gcc_assert (!sym->attr.allocatable);
--- 4578,4584 ----
    gcc_assert (block);
  
    /* Initialization of PDTs is done elsewhere.  */
!   if (IS_PDT (sym) && !pdt_ok)
      return;
  
    gcc_assert (!sym->attr.allocatable);
*************** gfc_trans_deferred_vars (gfc_symbol * pr
*** 4924,4933 ****
  	 && proc_sym != proc_sym->result) ? proc_sym->result : NULL;
  
    if (sym && !sym->attr.allocatable && !sym->attr.pointer
!       && sym->ts.type == BT_DERIVED
!       && sym->ts.u.derived
!       && !gfc_has_default_initializer (sym->ts.u.derived)
!       && sym->ts.u.derived->attr.pdt_type)
      {
        gfc_init_block (&tmpblock);
        tmp = gfc_allocate_pdt_comp (sym->ts.u.derived,
--- 4921,4927 ----
  	 && proc_sym != proc_sym->result) ? proc_sym->result : NULL;
  
    if (sym && !sym->attr.allocatable && !sym->attr.pointer
!       && IS_PDT (sym) && !gfc_has_default_initializer (sym->ts.u.derived))
      {
        gfc_init_block (&tmpblock);
        tmp = gfc_allocate_pdt_comp (sym->ts.u.derived,
*************** gfc_trans_deferred_vars (gfc_symbol * pr
*** 5048,5056 ****
  	      gfc_add_init_cleanup (block, gfc_finish_block (&tmpblock), NULL);
  	    }
  	}
!       else if (sym->ts.type == BT_CLASS
! 	       && CLASS_DATA (sym)->ts.u.derived
! 	       && CLASS_DATA (sym)->ts.u.derived->attr.pdt_type)
  	{
  	  gfc_component *data = CLASS_DATA (sym);
  	  is_pdt_type = true;
--- 5042,5048 ----
  	      gfc_add_init_cleanup (block, gfc_finish_block (&tmpblock), NULL);
  	    }
  	}
!       else if (IS_CLASS_PDT (sym))
  	{
  	  gfc_component *data = CLASS_DATA (sym);
  	  is_pdt_type = true;
*************** gfc_generate_function_code (gfc_namespac
*** 8236,8243 ****
    /* This permits the return value to be correctly initialized, even when the
       function result was not referenced.  */
    if (sym->abr_modproc_decl
!       && sym->ts.type == BT_DERIVED
!       && sym->ts.u.derived->attr.pdt_type
        && !sym->attr.allocatable
        && sym->result == sym
        && get_proc_result (sym) == NULL_TREE)
--- 8228,8234 ----
    /* This permits the return value to be correctly initialized, even when the
       function result was not referenced.  */
    if (sym->abr_modproc_decl
!       && IS_PDT (sym)
        && !sym->attr.allocatable
        && sym->result == sym
        && get_proc_result (sym) == NULL_TREE)
diff -Nrcpad gcc-16-20260125/gcc/fortran/trans-expr.cc gcc-16-20260201/gcc/fortran/trans-expr.cc
*** gcc-16-20260125/gcc/fortran/trans-expr.cc	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/fortran/trans-expr.cc	Sun Feb  1 22:32:07 2026
*************** conv_dummy_value (gfc_se * parmse, gfc_e
*** 6595,6601 ****
  
    gcc_assert (fsym && fsym->attr.value && !fsym->attr.dimension);
  
!   if (e && e->ts.type == BT_DERIVED && e->ts.u.derived->attr.pdt_type)
      {
        tmp = gfc_create_var (TREE_TYPE (parmse->expr), "PDT");
        gfc_add_modify (&parmse->pre, tmp, parmse->expr);
--- 6595,6601 ----
  
    gcc_assert (fsym && fsym->attr.value && !fsym->attr.dimension);
  
!   if (IS_PDT (e))
      {
        tmp = gfc_create_var (TREE_TYPE (parmse->expr), "PDT");
        gfc_add_modify (&parmse->pre, tmp, parmse->expr);
*************** gfc_conv_structure (gfc_se * se, gfc_exp
*** 10393,10400 ****
  
    if (!init)
      {
!       if (expr->ts.type == BT_DERIVED && expr->ts.u.derived->attr.pdt_type
! 	  && expr->must_finalize)
  	final_block = &se->finalblock;
  
        /* Create a temporary variable and fill it in.  */
--- 10393,10399 ----
  
    if (!init)
      {
!       if (IS_PDT (expr) && expr->must_finalize)
  	final_block = &se->finalblock;
  
        /* Create a temporary variable and fill it in.  */
*************** gfc_trans_assignment_1 (gfc_expr * expr1
*** 13305,13316 ****
        if (dealloc
  	  && !expr1->symtree->n.sym->attr.associate_var
  	  && expr2->expr_type != EXPR_ARRAY
! 	  && ((expr1->ts.type == BT_DERIVED
! 	       && expr1->ts.u.derived
! 	       && expr1->ts.u.derived->attr.pdt_type)
! 	      || (expr1->ts.type == BT_CLASS
! 		   && CLASS_DATA (expr1)->ts.u.derived
! 		   && CLASS_DATA (expr1)->ts.u.derived->attr.pdt_type)))
  	{
  	  bool pdt_dep = gfc_check_dependency (expr1, expr2, true);
  
--- 13304,13310 ----
        if (dealloc
  	  && !expr1->symtree->n.sym->attr.associate_var
  	  && expr2->expr_type != EXPR_ARRAY
! 	  && (IS_PDT (expr1) || IS_CLASS_PDT (expr1)))
  	{
  	  bool pdt_dep = gfc_check_dependency (expr1, expr2, true);
  
*************** gfc_trans_assignment_1 (gfc_expr * expr1
*** 13567,13574 ****
    /* Since parameterized components cannot have default initializers,
       the default PDT constructor leaves them unallocated. Do the
       allocation now.  */
!   if (init_flag && expr1->ts.type == BT_DERIVED
!       && expr1->ts.u.derived->attr.pdt_type
        && !expr1->symtree->n.sym->attr.allocatable
        && !expr1->symtree->n.sym->attr.dummy)
      {
--- 13561,13567 ----
    /* Since parameterized components cannot have default initializers,
       the default PDT constructor leaves them unallocated. Do the
       allocation now.  */
!   if (init_flag && IS_PDT (expr1)
        && !expr1->symtree->n.sym->attr.allocatable
        && !expr1->symtree->n.sym->attr.dummy)
      {
diff -Nrcpad gcc-16-20260125/gcc/fortran/trans-stmt.cc gcc-16-20260201/gcc/fortran/trans-stmt.cc
*** gcc-16-20260125/gcc/fortran/trans-stmt.cc	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/fortran/trans-stmt.cc	Sun Feb  1 22:32:07 2026
*************** trans_associate_var (gfc_symbol *sym, gf
*** 2195,2204 ****
  					      dim, gfc_index_one_node);
  	}
  
!       if (e->expr_type == EXPR_FUNCTION
! 	  && sym->ts.type == BT_DERIVED
! 	  && sym->ts.u.derived
! 	  && sym->ts.u.derived->attr.pdt_type)
  	{
  	  tmp = gfc_deallocate_pdt_comp (sym->ts.u.derived, se.expr,
  					 sym->as->rank);
--- 2195,2201 ----
  					      dim, gfc_index_one_node);
  	}
  
!       if (e->expr_type == EXPR_FUNCTION && IS_PDT (e))
  	{
  	  tmp = gfc_deallocate_pdt_comp (sym->ts.u.derived, se.expr,
  					 sym->as->rank);
*************** trans_associate_var (gfc_symbol *sym, gf
*** 2516,2533 ****
  	}
  
        tmp = sym->backend_decl;
!       if (e->expr_type == EXPR_FUNCTION
! 	  && sym->ts.type == BT_DERIVED
! 	  && sym->ts.u.derived
! 	  && sym->ts.u.derived->attr.pdt_type)
  	{
  	  tmp = gfc_deallocate_pdt_comp (sym->ts.u.derived, tmp,
  					 0);
  	}
!       else if (e->expr_type == EXPR_FUNCTION
! 	       && sym->ts.type == BT_CLASS
! 	       && CLASS_DATA (sym)->ts.u.derived
! 	       && CLASS_DATA (sym)->ts.u.derived->attr.pdt_type)
  	{
  	  tmp = gfc_class_data_get (tmp);
  	  tmp = gfc_deallocate_pdt_comp (CLASS_DATA (sym)->ts.u.derived,
--- 2513,2524 ----
  	}
  
        tmp = sym->backend_decl;
!       if (e->expr_type == EXPR_FUNCTION && IS_PDT (sym))
  	{
  	  tmp = gfc_deallocate_pdt_comp (sym->ts.u.derived, tmp,
  					 0);
  	}
!       else if (e->expr_type == EXPR_FUNCTION && IS_CLASS_PDT (sym))
  	{
  	  tmp = gfc_class_data_get (tmp);
  	  tmp = gfc_deallocate_pdt_comp (CLASS_DATA (sym)->ts.u.derived,
*************** gfc_trans_allocate (gfc_code * code, gfc
*** 7687,7694 ****
  	}
        /* Set KIND and LEN PDT components and allocate those that are
           parameterized.  */
!       else if (expr->ts.type == BT_DERIVED
! 	       && expr->ts.u.derived->attr.pdt_type)
  	{
  	  if (code->expr3 && code->expr3->param_list)
  	    param_list = code->expr3->param_list;
--- 7678,7684 ----
  	}
        /* Set KIND and LEN PDT components and allocate those that are
           parameterized.  */
!       else if (IS_PDT (expr))
  	{
  	  if (code->expr3 && code->expr3->param_list)
  	    param_list = code->expr3->param_list;
*************** gfc_trans_allocate (gfc_code * code, gfc
*** 7701,7708 ****
  	  gfc_add_expr_to_block (&block, tmp);
  	}
        /* Ditto for CLASS expressions.  */
!       else if (expr->ts.type == BT_CLASS
! 	       && CLASS_DATA (expr)->ts.u.derived->attr.pdt_type)
  	{
  	  if (code->expr3 && code->expr3->param_list)
  	    param_list = code->expr3->param_list;
--- 7691,7697 ----
  	  gfc_add_expr_to_block (&block, tmp);
  	}
        /* Ditto for CLASS expressions.  */
!       else if (IS_CLASS_PDT (expr))
  	{
  	  if (code->expr3 && code->expr3->param_list)
  	    param_list = code->expr3->param_list;
*************** gfc_trans_deallocate (gfc_code *code)
*** 7961,7977 ****
  	param_list = expr->symtree->n.sym->param_list;
        for (ref = expr->ref; ref; ref = ref->next)
  	if (ref->type ==  REF_COMPONENT
! 	    && ref->u.c.component->ts.type == BT_DERIVED
! 	    && ref->u.c.component->ts.u.derived->attr.pdt_type
  	    && ref->u.c.component->param_list)
  	  param_list = ref->u.c.component->param_list;
        if (expr->ts.type == BT_DERIVED
  	  && ((expr->ts.u.derived->attr.pdt_type && param_list)
  	      || expr->ts.u.derived->attr.pdt_comp))
  	tmp = gfc_deallocate_pdt_comp (expr->ts.u.derived, se.expr, expr->rank);
!       else if (expr->ts.type == BT_CLASS
! 	       && CLASS_DATA (expr)->ts.u.derived->attr.pdt_type
! 	       && expr->symtree->n.sym->param_list)
  	tmp = gfc_deallocate_pdt_comp (CLASS_DATA (expr)->ts.u.derived,
  				       se.expr, expr->rank);
  
--- 7950,7963 ----
  	param_list = expr->symtree->n.sym->param_list;
        for (ref = expr->ref; ref; ref = ref->next)
  	if (ref->type ==  REF_COMPONENT
! 	    && IS_PDT (ref->u.c.component)
  	    && ref->u.c.component->param_list)
  	  param_list = ref->u.c.component->param_list;
        if (expr->ts.type == BT_DERIVED
  	  && ((expr->ts.u.derived->attr.pdt_type && param_list)
  	      || expr->ts.u.derived->attr.pdt_comp))
  	tmp = gfc_deallocate_pdt_comp (expr->ts.u.derived, se.expr, expr->rank);
!       else if (IS_CLASS_PDT (expr) && expr->symtree->n.sym->param_list)
  	tmp = gfc_deallocate_pdt_comp (CLASS_DATA (expr)->ts.u.derived,
  				       se.expr, expr->rank);
  
diff -Nrcpad gcc-16-20260125/gcc/gcc-urlifier.cc gcc-16-20260201/gcc/gcc-urlifier.cc
*** gcc-16-20260125/gcc/gcc-urlifier.cc	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/gcc-urlifier.cc	Sun Feb  1 22:32:07 2026
*************** test_gcc_urlifier ()
*** 262,273 ****
         doc_urls[idx].url_suffix);
  
    /* Check an option.  */
!   ASSERT_STREQ (u.get_url_suffix_for_quoted_text ("-fpack-struct").get (),
! 		"gcc/Code-Gen-Options.html#index-fpack-struct");
  
    /* Check a "-fno-" variant of an option.  */
!   ASSERT_STREQ (u.get_url_suffix_for_quoted_text ("-fno-inline").get (),
! 		"gcc/Optimize-Options.html#index-finline");
  }
  
  /* Run all of the selftests within this file.  */
--- 262,279 ----
         doc_urls[idx].url_suffix);
  
    /* Check an option.  */
!   const char *s1 = u.get_url_suffix_for_quoted_text ("-fpack-struct").get ();
!   ASSERT_TRUE (!strcmp (s1,
! 			"gcc/Code-Gen-Options.html#index-fno-pack-struct")
! 	       || !strcmp (s1,
! 			   "gcc/Code-Gen-Options.html#index-fpack-struct"));
  
    /* Check a "-fno-" variant of an option.  */
!   const char *s2 = u.get_url_suffix_for_quoted_text ("-fno-inline").get ();
!   ASSERT_TRUE (!strcmp (s2,
! 			"gcc/Optimize-Options.html#index-fno-inline")
! 	       || !strcmp (s2,
! 			   "gcc/Optimize-Options.html#index-finline"));
  }
  
  /* Run all of the selftests within this file.  */
diff -Nrcpad gcc-16-20260125/gcc/gcov-dump.cc gcc-16-20260201/gcc/gcov-dump.cc
*** gcc-16-20260125/gcc/gcov-dump.cc	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/gcov-dump.cc	Sun Feb  1 22:32:07 2026
*************** static void tag_function (const char *,
*** 39,44 ****
--- 39,45 ----
  static void tag_blocks (const char *, unsigned, int, unsigned);
  static void tag_arcs (const char *, unsigned, int, unsigned);
  static void tag_conditions (const char *, unsigned, int, unsigned);
+ static void tag_paths (const char *, unsigned, int, unsigned);
  static void tag_lines (const char *, unsigned, int, unsigned);
  static void tag_counters (const char *, unsigned, int, unsigned);
  static void tag_summary (const char *, unsigned, int, unsigned);
*************** static const tag_format_t tag_table[] =
*** 79,84 ****
--- 80,86 ----
    {GCOV_TAG_BLOCKS, "BLOCKS", tag_blocks},
    {GCOV_TAG_ARCS, "ARCS", tag_arcs},
    {GCOV_TAG_CONDS, "CONDITIONS", tag_conditions},
+   {GCOV_TAG_PATHS, "PATHS", tag_paths},
    {GCOV_TAG_LINES, "LINES", tag_lines},
    {GCOV_TAG_OBJECT_SUMMARY, "OBJECT_SUMMARY", tag_summary},
    {0, NULL, NULL}
*************** tag_conditions (const char *filename, un
*** 406,421 ****
      {
        for (unsigned ix = 0; ix != n_conditions; ix++)
  	{
  	  const unsigned blockno = gcov_read_unsigned ();
  	  const unsigned nterms = gcov_read_unsigned ();
  
  	  printf ("\n");
! 	  print_prefix (filename, depth, gcov_position ());
  	  printf (VALUE_PADDING_PREFIX "block %u:", blockno);
  	  printf (" %u", nterms);
  	}
      }
  }
  static void
  tag_lines (const char *filename ATTRIBUTE_UNUSED,
  	   unsigned tag ATTRIBUTE_UNUSED, int length ATTRIBUTE_UNUSED,
--- 408,433 ----
      {
        for (unsigned ix = 0; ix != n_conditions; ix++)
  	{
+ 	  const gcov_position_t position = gcov_position ();
  	  const unsigned blockno = gcov_read_unsigned ();
  	  const unsigned nterms = gcov_read_unsigned ();
  
  	  printf ("\n");
! 	  print_prefix (filename, depth, position);
  	  printf (VALUE_PADDING_PREFIX "block %u:", blockno);
  	  printf (" %u", nterms);
  	}
      }
  }
+ 
+ static void
+ tag_paths (const char *filename ATTRIBUTE_UNUSED,
+ 	   unsigned tag ATTRIBUTE_UNUSED, int length ATTRIBUTE_UNUSED,
+ 	   unsigned depth ATTRIBUTE_UNUSED)
+ {
+   printf (" %u paths", gcov_read_unsigned ());
+ }
+ 
  static void
  tag_lines (const char *filename ATTRIBUTE_UNUSED,
  	   unsigned tag ATTRIBUTE_UNUSED, int length ATTRIBUTE_UNUSED,
diff -Nrcpad gcc-16-20260125/gcc/gimple-ssa-pta-constraints.cc gcc-16-20260201/gcc/gimple-ssa-pta-constraints.cc
*** gcc-16-20260125/gcc/gimple-ssa-pta-constraints.cc	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/gimple-ssa-pta-constraints.cc	Sun Feb  1 22:32:07 2026
*************** make_param_constraints (varinfo_t vi)
*** 3600,3607 ****
      }
  }
  
! /* Create varinfo structures for all of the variables in the
!    function for intraprocedural mode.  */
  
  static void
  intra_create_variable_infos (struct function *fn)
--- 3600,3607 ----
      }
  }
  
! /* Create varinfo structures for parameters, return value and the static
!    chain of FN.  Intended for intraprocedural mode.  */
  
  static void
  intra_create_variable_infos (struct function *fn)
diff -Nrcpad gcc-16-20260125/gcc/gimple-ssa-strength-reduction.cc gcc-16-20260201/gcc/gimple-ssa-strength-reduction.cc
*** gcc-16-20260125/gcc/gimple-ssa-strength-reduction.cc	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/gimple-ssa-strength-reduction.cc	Sun Feb  1 22:32:07 2026
*************** create_add_on_incoming_edge (slsr_cand_t
*** 2356,2365 ****
  	}
        else {
  	tree stride;
  
! 	if (!types_compatible_p (TREE_TYPE (c->stride), c->stride_type))
  	  {
! 	    tree cast_stride = make_temp_ssa_name (c->stride_type, NULL,
  						   "slsr");
  	    cast_stmt = gimple_build_assign (cast_stride, NOP_EXPR,
  					     c->stride);
--- 2356,2366 ----
  	}
        else {
  	tree stride;
+ 	tree wanted_type = POINTER_TYPE_P (basis_type) ? c->stride_type : basis_type;
  
! 	if (!types_compatible_p (TREE_TYPE (c->stride), wanted_type))
  	  {
! 	    tree cast_stride = make_temp_ssa_name (wanted_type, NULL,
  						   "slsr");
  	    cast_stmt = gimple_build_assign (cast_stride, NOP_EXPR,
  					     c->stride);
diff -Nrcpad gcc-16-20260125/gcc/gimple-ssa-warn-access.cc gcc-16-20260201/gcc/gimple-ssa-warn-access.cc
*** gcc-16-20260125/gcc/gimple-ssa-warn-access.cc	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/gimple-ssa-warn-access.cc	Sun Feb  1 22:32:07 2026
*************** new_delete_mismatch_p (const demangle_co
*** 1701,1706 ****
--- 1701,1707 ----
        return new_delete_mismatch_p (*newc.u.s_dtor.name,
  				    *delc.u.s_dtor.name);
  
+     case DEMANGLE_COMPONENT_EXTENDED_BUILTIN_TYPE:
      case DEMANGLE_COMPONENT_BUILTIN_TYPE:
        {
  	/* The demangler API provides no better way to compare built-in
diff -Nrcpad gcc-16-20260125/gcc/ifcvt.cc gcc-16-20260201/gcc/ifcvt.cc
*** gcc-16-20260125/gcc/ifcvt.cc	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/ifcvt.cc	Sun Feb  1 22:32:08 2026
*************** noce_can_force_operand (rtx x)
*** 919,931 ****
        switch (GET_CODE (x))
  	{
  	case MULT:
- 	case DIV:
  	case MOD:
  	case UDIV:
  	case UMOD:
  	  return true;
  	default:
! 	  return code_to_optab (GET_CODE (x));
  	}
      }
    if (UNARY_P (x))
--- 919,937 ----
        switch (GET_CODE (x))
  	{
  	case MULT:
  	case MOD:
  	case UDIV:
  	case UMOD:
  	  return true;
+ 	case DIV:
+ 	  if (INTEGRAL_MODE_P (GET_MODE (x)))
+ 	    return true;
+ 	  /* FALLTHRU */
  	default:
! 	  auto optab = code_to_optab (GET_CODE (x));
! 	  if (!optab)
! 	    return false;
! 	  return optab_handler (optab, GET_MODE (x));
  	}
      }
    if (UNARY_P (x))
*************** noce_can_force_operand (rtx x)
*** 945,951 ****
  	case UNSIGNED_FLOAT:
  	  return true;
  	default:
! 	  return code_to_optab (GET_CODE (x));
  	}
      }
    return false;
--- 951,960 ----
  	case UNSIGNED_FLOAT:
  	  return true;
  	default:
! 	  auto optab = code_to_optab (GET_CODE (x));
! 	  if (!optab)
! 	    return false;
! 	  return optab_handler (optab, GET_MODE (x));
  	}
      }
    return false;
diff -Nrcpad gcc-16-20260125/gcc/ipa-free-lang-data.cc gcc-16-20260201/gcc/ipa-free-lang-data.cc
*** gcc-16-20260125/gcc/ipa-free-lang-data.cc	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/ipa-free-lang-data.cc	Sun Feb  1 22:32:08 2026
*************** find_decls_types_r (tree *tp, int *ws, v
*** 730,735 ****
--- 730,739 ----
        if (TREE_CODE (t) != TYPE_DECL)
  	fld_worklist_push (DECL_INITIAL (t), fld);
  
+       /* Remove C++ annotations, those aren't needed for LTO and contain
+ 	 trees we sometimes can't stream.  */
+       DECL_ATTRIBUTES (t)
+ 	= remove_attribute ("annotation ", DECL_ATTRIBUTES (t));
        fld_worklist_push (DECL_ATTRIBUTES (t), fld);
        fld_worklist_push (DECL_ABSTRACT_ORIGIN (t), fld);
  
*************** find_decls_types_r (tree *tp, int *ws, v
*** 763,768 ****
--- 767,776 ----
  	fld_worklist_push (TYPE_CACHED_VALUES (t), fld);
        fld_worklist_push (TYPE_SIZE (t), fld);
        fld_worklist_push (TYPE_SIZE_UNIT (t), fld);
+       /* Remove C++ annotations, those aren't needed for LTO and contain
+ 	 trees we sometimes can't stream.  */
+       TYPE_ATTRIBUTES (t)
+ 	= remove_attribute ("annotation ", TYPE_ATTRIBUTES (t));
        fld_worklist_push (TYPE_ATTRIBUTES (t), fld);
        fld_worklist_push (TYPE_POINTER_TO (t), fld);
        fld_worklist_push (TYPE_REFERENCE_TO (t), fld);
diff -Nrcpad gcc-16-20260125/gcc/ipa-modref-tree.cc gcc-16-20260201/gcc/ipa-modref-tree.cc
*** gcc-16-20260125/gcc/ipa-modref-tree.cc	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/ipa-modref-tree.cc	Sun Feb  1 22:32:08 2026
*************** modref_access_node::operator == (const m
*** 59,65 ****
  bool
  modref_access_node::contains (const modref_access_node &a) const
  {
!   poly_int64 aoffset_adj = 0;
    if (parm_index != MODREF_UNKNOWN_PARM)
      {
        if (parm_index != a.parm_index)
--- 59,65 ----
  bool
  modref_access_node::contains (const modref_access_node &a) const
  {
!   poly_offset_int aoffset_adj = 0;
    if (parm_index != MODREF_UNKNOWN_PARM)
      {
        if (parm_index != a.parm_index)
*************** modref_access_node::contains (const modr
*** 80,86 ****
  	      a.offset may result in non-negative offset again.
  	      Ubsan fails on val << LOG_BITS_PER_UNIT where val
  	      is negative.  */
! 	   aoffset_adj = (a.parm_offset - parm_offset)
  			 * BITS_PER_UNIT;
  	}
      }
--- 80,87 ----
  	      a.offset may result in non-negative offset again.
  	      Ubsan fails on val << LOG_BITS_PER_UNIT where val
  	      is negative.  */
! 	   aoffset_adj = (poly_offset_int::from (a.parm_offset, SIGNED)
! 			  - poly_offset_int::from (parm_offset, SIGNED))
  			 * BITS_PER_UNIT;
  	}
      }
*************** modref_access_node::contains (const modr
*** 96,105 ****
  	      || !known_le (size, a.size)))
  	return false;
        if (known_size_p (max_size))
! 	return known_subrange_p (a.offset + aoffset_adj,
! 				 a.max_size, offset, max_size);
        else
! 	return known_le (offset, a.offset + aoffset_adj);
      }
    return true;
  }
--- 97,110 ----
  	      || !known_le (size, a.size)))
  	return false;
        if (known_size_p (max_size))
! 	return known_subrange_p (poly_offset_int::from (a.offset, SIGNED)
! 				 + aoffset_adj, a.max_size,
! 				 poly_offset_int::from (offset, SIGNED),
! 				 max_size);
        else
! 	return known_le (poly_offset_int::from (offset, SIGNED),
! 			 poly_offset_int::from (a.offset, SIGNED)
! 			 + aoffset_adj);
      }
    return true;
  }
diff -Nrcpad gcc-16-20260125/gcc/ipa-polymorphic-call.cc gcc-16-20260201/gcc/ipa-polymorphic-call.cc
*** gcc-16-20260125/gcc/ipa-polymorphic-call.cc	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/ipa-polymorphic-call.cc	Sun Feb  1 22:32:08 2026
*************** ipa_polymorphic_call_context::possible_d
*** 2363,2369 ****
  							    tree otr_type)
  {
    if (dynamic)
!     make_speculative (otr_type);
    else if (in_poly_cdtor)
      maybe_in_construction = true;
  }
--- 2363,2380 ----
  							    tree otr_type)
  {
    if (dynamic)
!     {
!       /* See if existing speculation was inconsistent before type change.
! 	 If so drop it first, so we do not lose track about it being
! 	 impossible.  */
!       if (speculative_outer_type
! 	  && !speculation_consistent_p (speculative_outer_type,
! 					speculative_offset,
! 					speculative_maybe_derived_type,
! 					otr_type))
! 	clear_speculation ();
!       make_speculative (otr_type);
!     }
    else if (in_poly_cdtor)
      maybe_in_construction = true;
  }
diff -Nrcpad gcc-16-20260125/gcc/langhooks-def.h gcc-16-20260201/gcc/langhooks-def.h
*** gcc-16-20260125/gcc/langhooks-def.h	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/langhooks-def.h	Sun Feb  1 22:32:08 2026
*************** extern tree lhd_type_for_size (unsigned
*** 63,68 ****
--- 63,69 ----
  extern void lhd_incomplete_type_error (location_t, const_tree, const_tree);
  extern tree lhd_type_promotes_to (tree);
  extern void lhd_register_builtin_type (tree, const char *);
+ extern tree lhd_build_lang_qualified_type (tree, tree, int);
  extern bool lhd_decl_ok_for_sibcall (const_tree);
  extern size_t lhd_tree_size (enum tree_code);
  extern HOST_WIDE_INT lhd_to_target_charset (HOST_WIDE_INT);
*************** extern tree lhd_unit_size_without_reusab
*** 212,218 ****
  #define LANG_HOOKS_OMP_FIRSTPRIVATIZE_TYPE_SIZES \
    lhd_omp_firstprivatize_type_sizes
  #define LANG_HOOKS_TYPE_HASH_EQ		NULL
! #define LANG_HOOKS_COPY_LANG_QUALIFIERS NULL
  #define LANG_HOOKS_GET_ARRAY_DESCR_INFO	NULL
  #define LANG_HOOKS_GET_SUBRANGE_BOUNDS	NULL
  #define LANG_HOOKS_GET_TYPE_BIAS	NULL
--- 213,219 ----
  #define LANG_HOOKS_OMP_FIRSTPRIVATIZE_TYPE_SIZES \
    lhd_omp_firstprivatize_type_sizes
  #define LANG_HOOKS_TYPE_HASH_EQ		NULL
! #define LANG_HOOKS_BUILD_LANG_QUALIFIED_TYPE	lhd_build_lang_qualified_type
  #define LANG_HOOKS_GET_ARRAY_DESCR_INFO	NULL
  #define LANG_HOOKS_GET_SUBRANGE_BOUNDS	NULL
  #define LANG_HOOKS_GET_TYPE_BIAS	NULL
*************** extern tree lhd_unit_size_without_reusab
*** 240,246 ****
    LANG_HOOKS_TYPE_MAX_SIZE, \
    LANG_HOOKS_OMP_FIRSTPRIVATIZE_TYPE_SIZES, \
    LANG_HOOKS_TYPE_HASH_EQ, \
!   LANG_HOOKS_COPY_LANG_QUALIFIERS, \
    LANG_HOOKS_GET_ARRAY_DESCR_INFO, \
    LANG_HOOKS_GET_SUBRANGE_BOUNDS, \
    LANG_HOOKS_GET_TYPE_BIAS, \
--- 241,247 ----
    LANG_HOOKS_TYPE_MAX_SIZE, \
    LANG_HOOKS_OMP_FIRSTPRIVATIZE_TYPE_SIZES, \
    LANG_HOOKS_TYPE_HASH_EQ, \
!   LANG_HOOKS_BUILD_LANG_QUALIFIED_TYPE, \
    LANG_HOOKS_GET_ARRAY_DESCR_INFO, \
    LANG_HOOKS_GET_SUBRANGE_BOUNDS, \
    LANG_HOOKS_GET_TYPE_BIAS, \
diff -Nrcpad gcc-16-20260125/gcc/langhooks.cc gcc-16-20260201/gcc/langhooks.cc
*** gcc-16-20260125/gcc/langhooks.cc	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/langhooks.cc	Sun Feb  1 22:32:08 2026
*************** lhd_register_builtin_type (tree ARG_UNUS
*** 202,207 ****
--- 202,217 ----
  {
  }
  
+ /* Return a version of the TYPE, qualified as indicated by the
+    TYPE_QUALS, if one exists.  If no qualified version exists yet,
+    creates it and returns it.  */
+ tree
+ lhd_build_lang_qualified_type (tree type, tree ARG_UNUSED (otype),
+ 			       int type_quals)
+ {
+   return build_qualified_type (type, type_quals);
+ }
+ 
  /* Invalid use of an incomplete type.  */
  void
  lhd_incomplete_type_error (location_t ARG_UNUSED (loc),
diff -Nrcpad gcc-16-20260125/gcc/langhooks.h gcc-16-20260201/gcc/langhooks.h
*** gcc-16-20260125/gcc/langhooks.h	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/langhooks.h	Sun Feb  1 22:32:08 2026
*************** struct lang_hooks_for_types
*** 134,142 ****
       FUNCTION_TYPE or METHOD_TYPE.  */
    bool (*type_hash_eq) (const_tree, const_tree);
  
!   /* If non-NULL, return TYPE1 with any language-specific modifiers copied from
!      TYPE2.  */
!   tree (*copy_lang_qualifiers) (const_tree, const_tree);
  
    /* Return TRUE if TYPE uses a hidden descriptor and fills in information
       for the debugger about the array bounds, strides, etc.  */
--- 134,143 ----
       FUNCTION_TYPE or METHOD_TYPE.  */
    bool (*type_hash_eq) (const_tree, const_tree);
  
!   /* Return a version of the TYPE, qualified as indicated by the
!      TYPE_QUALS in a language-specific way, if one exists, otherwise create it.
!      If OTYPE is non-NULL, copy extra language modifiers from it too.  */
!   tree (*build_lang_qualified_type) (tree, tree, int);
  
    /* Return TRUE if TYPE uses a hidden descriptor and fills in information
       for the debugger about the array bounds, strides, etc.  */
diff -Nrcpad gcc-16-20260125/gcc/lra-constraints.cc gcc-16-20260201/gcc/lra-constraints.cc
*** gcc-16-20260125/gcc/lra-constraints.cc	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/lra-constraints.cc	Sun Feb  1 22:32:08 2026
*************** process_alt_operands (int only_alternati
*** 2232,2237 ****
--- 2232,2239 ----
    if (only_alternative >= 0)
      preferred &= ALTERNATIVE_BIT (only_alternative);
  
+   bool prefer_memory_p = false;
+  repeat:
    for (nalt = 0; nalt < n_alternatives; nalt++)
      {
        /* Loop over operands for one constraint alternative.  */
*************** process_alt_operands (int only_alternati
*** 2564,2569 ****
--- 2566,2576 ----
  		      || general_constant_p (op)
  		      || spilled_pseudo_p (op))
  		    win = true;
+ 		  if (REG_P (op) && prefer_memory_p)
+ 		    {
+ 		      badop = false;
+ 		      offmemok = true;
+ 		    }
  		  cl = GENERAL_REGS;
  		  cl_filter = nullptr;
  		  goto reg;
*************** process_alt_operands (int only_alternati
*** 2694,2700 ****
  				   (this_alternative_exclude_start_hard_regs,
  				    hard_regno[nop]))))
  			win = true;
! 		      else if (hard_regno[nop] < 0)
  			{
  			  if (in_class_p (op, this_alternative, NULL))
  			    win = true;
--- 2701,2707 ----
  				   (this_alternative_exclude_start_hard_regs,
  				    hard_regno[nop]))))
  			win = true;
! 		      else if (hard_regno[nop] < 0 && !prefer_memory_p)
  			{
  			  if (in_class_p (op, this_alternative, NULL))
  			    win = true;
*************** process_alt_operands (int only_alternati
*** 2796,2801 ****
--- 2803,2814 ----
  	    this_alternative_match_win = true;
  	  else
  	    {
+ 	      if (prefer_memory_p && offmemok)
+ 		{
+ 		  winreg = false;
+ 		  this_alternative = NO_REGS;
+ 		}
+ 
  	      int const_to_mem = 0;
  	      bool no_regs_p;
  
*************** process_alt_operands (int only_alternati
*** 3331,3336 ****
--- 3344,3360 ----
  	       ira_class_hard_regs_num[all_this_alternative],
  	       all_used_nregs, all_reload_nregs);
  	  overall += LRA_MAX_REJECT;
+ 	  if (!prefer_memory_p && INSN_CODE (curr_insn) < 0)
+ 	    {
+ 	      /* asm can permit memory and reg and can be not enough regs for
+ 		 asm -- try now memory: */
+ 	      prefer_memory_p = true;
+ 	      if (lra_dump_file != NULL)
+ 		fprintf
+ 		  (lra_dump_file,
+ 		   "            Trying now memory for operands\n");
+ 	      goto repeat;
+ 	    }
  	}
        ok_p = true;
        curr_alt_dont_inherit_ops_num = 0;
diff -Nrcpad gcc-16-20260125/gcc/m2/ChangeLog gcc-16-20260201/gcc/m2/ChangeLog
*** gcc-16-20260125/gcc/m2/ChangeLog	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/m2/ChangeLog	Sun Feb  1 22:32:08 2026
***************
*** 1,3 ****
--- 1,7 ----
+ 2026-01-25  Sandra Loosemore  <sloosemore@baylibre.com>
+ 
+ 	* lang.opt.urls: Regenerated.
+ 
  2026-01-21  Gaius Mulley  <gaiusmod2@gmail.com>
  
  	PR modula2/123739
diff -Nrcpad gcc-16-20260125/gcc/match.pd gcc-16-20260201/gcc/match.pd
*** gcc-16-20260125/gcc/match.pd	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/match.pd	Sun Feb  1 22:32:08 2026
*************** DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
*** 214,220 ****
  (simplify (abs (convert @0))
   (if (ANY_INTEGRAL_TYPE_P (TREE_TYPE (@0))
        && !TYPE_UNSIGNED (TREE_TYPE (@0))
!       && element_precision (type) > element_precision (TREE_TYPE (@0)))
    (with { tree utype = unsigned_type_for (TREE_TYPE (@0)); }
     (convert (absu:utype @0)))))
  
--- 214,222 ----
  (simplify (abs (convert @0))
   (if (ANY_INTEGRAL_TYPE_P (TREE_TYPE (@0))
        && !TYPE_UNSIGNED (TREE_TYPE (@0))
!       && element_precision (type) > element_precision (TREE_TYPE (@0))
!       && (!VECTOR_TYPE_P (type)
! 	  || target_supports_op_p (TREE_TYPE (@0), ABSU_EXPR, optab_vector)))
    (with { tree utype = unsigned_type_for (TREE_TYPE (@0)); }
     (convert (absu:utype @0)))))
  
*************** DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
*** 5176,5182 ****
          (op:c @2 @1))
    (if (INTEGRAL_TYPE_P (type)
         && TYPE_PRECISION (type) > 1
!        && (INTEGRAL_TYPE_P (TREE_TYPE (@0))))
         (op (mult (convert:type @0) @2) @1))))
  
  /* (zero_one != 0) ? z <op> y : y -> ((typeof(y))zero_one * z) <op> y */
--- 5178,5185 ----
          (op:c @2 @1))
    (if (INTEGRAL_TYPE_P (type)
         && TYPE_PRECISION (type) > 1
!        && INTEGRAL_TYPE_P (TREE_TYPE (@0))
!        && expr_no_side_effects_p (@2))
         (op (mult (convert:type @0) @2) @1))))
  
  /* (zero_one != 0) ? z <op> y : y -> ((typeof(y))zero_one * z) <op> y */
*************** DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
*** 5188,5194 ****
          @1)
    (if (INTEGRAL_TYPE_P (type)
         && TYPE_PRECISION (type) > 1
!        && (INTEGRAL_TYPE_P (TREE_TYPE (@0))))
         (op (mult (convert:type @0) @2) @1))))
  
  /* ?: Value replacement. */
--- 5191,5198 ----
          @1)
    (if (INTEGRAL_TYPE_P (type)
         && TYPE_PRECISION (type) > 1
!        && INTEGRAL_TYPE_P (TREE_TYPE (@0))
!        && expr_no_side_effects_p (@2))
         (op (mult (convert:type @0) @2) @1))))
  
  /* ?: Value replacement. */
*************** DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
*** 6466,6472 ****
     (eqne (cnd @0 @1 @2) (cnd @3 @1 @2))
      (if (!HONOR_NANS (@1)
  	 && types_match (TREE_TYPE (@0), TREE_TYPE (@3))
!          && types_match (type, TREE_TYPE (@0)))
       (cnd (bit_and (bit_xor @0 @3) (ne:type @1 @2))
        { constant_boolean_node (eqne == NE_EXPR, type); }
        { constant_boolean_node (eqne != NE_EXPR, type); })))
--- 6470,6478 ----
     (eqne (cnd @0 @1 @2) (cnd @3 @1 @2))
      (if (!HONOR_NANS (@1)
  	 && types_match (TREE_TYPE (@0), TREE_TYPE (@3))
!          && types_match (type, TREE_TYPE (@0))
! 	 && expr_no_side_effects_p (@1)
! 	 && expr_no_side_effects_p (@2))
       (cnd (bit_and (bit_xor @0 @3) (ne:type @1 @2))
        { constant_boolean_node (eqne == NE_EXPR, type); }
        { constant_boolean_node (eqne != NE_EXPR, type); })))
*************** DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
*** 6474,6480 ****
     (eqne (cnd @0 @1 @2) (cnd @3 @2 @1))
      (if (!HONOR_NANS (@1)
  	 && types_match (TREE_TYPE (@0), TREE_TYPE (@3))
!          && types_match (type, TREE_TYPE (@0)))
       (cnd (bit_ior (bit_xor @0 @3) (eq:type @1 @2))
        { constant_boolean_node (eqne != NE_EXPR, type); }
        { constant_boolean_node (eqne == NE_EXPR, type); })))))
--- 6480,6488 ----
     (eqne (cnd @0 @1 @2) (cnd @3 @2 @1))
      (if (!HONOR_NANS (@1)
  	 && types_match (TREE_TYPE (@0), TREE_TYPE (@3))
!          && types_match (type, TREE_TYPE (@0))
! 	 && expr_no_side_effects_p (@1)
! 	 && expr_no_side_effects_p (@2))
       (cnd (bit_ior (bit_xor @0 @3) (eq:type @1 @2))
        { constant_boolean_node (eqne != NE_EXPR, type); }
        { constant_boolean_node (eqne == NE_EXPR, type); })))))
*************** DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
*** 8796,8802 ****
     (if (TYPE_UNSIGNED (TREE_TYPE (@0)))
      (convert (gt @0 (trunc_div! { TYPE_MAX_VALUE (TREE_TYPE (@0)); } @1)))
      (if (TYPE_MIN_VALUE (TREE_TYPE (@0)))
!      (if (integer_minus_onep (@1))
        (convert (eq @0 { TYPE_MIN_VALUE (TREE_TYPE (@0)); }))
        (with
         {
--- 8804,8810 ----
     (if (TYPE_UNSIGNED (TREE_TYPE (@0)))
      (convert (gt @0 (trunc_div! { TYPE_MAX_VALUE (TREE_TYPE (@0)); } @1)))
      (if (TYPE_MIN_VALUE (TREE_TYPE (@0)))
!      (if (!TYPE_UNSIGNED (TREE_TYPE (@1)) && integer_minus_onep (@1))
        (convert (eq @0 { TYPE_MIN_VALUE (TREE_TYPE (@0)); }))
        (with
         {
*************** and,
*** 11415,11424 ****
  	    unsigned int elt_bits = tree_to_uhwi (TYPE_SIZE (elt_type));
  	    tree size = bitsize_int (elt_bits);
  	    tree pos = bitsize_int (elt_bits * i); }
!      (view_convert
!       (bit_and:elt_type
!        (BIT_FIELD_REF:elt_type @0 { size; } { pos; })
!        { elt; })))))))
  
  /* Fold reduction of a single nonzero element constructor.  */
  (for reduc (IFN_REDUC_PLUS IFN_REDUC_IOR IFN_REDUC_XOR)
--- 11423,11433 ----
  	    unsigned int elt_bits = tree_to_uhwi (TYPE_SIZE (elt_type));
  	    tree size = bitsize_int (elt_bits);
  	    tree pos = bitsize_int (elt_bits * i); }
!      (if (compare_tree_int (TYPE_SIZE (type), elt_bits) == 0)
!       (view_convert
!        (bit_and:elt_type
!         (BIT_FIELD_REF:elt_type @0 { size; } { pos; })
!         { elt; }))))))))
  
  /* Fold reduction of a single nonzero element constructor.  */
  (for reduc (IFN_REDUC_PLUS IFN_REDUC_IOR IFN_REDUC_XOR)
*************** and,
*** 12235,12237 ****
--- 12244,12251 ----
     long as the requested element is within range.  */
  (simplify (IFN_VEC_EXTRACT (vec_duplicate @0) INTEGER_CST@1)
   @0)
+ 
+ /* Strip nop-conversions __builtin_constant_p arguments.  */
+ (simplify
+  (BUILT_IN_CONSTANT_P (nop_convert@1 @0))
+  (BUILT_IN_CONSTANT_P @0))
diff -Nrcpad gcc-16-20260125/gcc/omp-expand.cc gcc-16-20260201/gcc/omp-expand.cc
*** gcc-16-20260125/gcc/omp-expand.cc	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/omp-expand.cc	Sun Feb  1 22:32:08 2026
*************** expand_omp_for_static_chunk (struct omp_
*** 6245,6253 ****
  	    t = fold_build_pointer_plus (vmain, step);
  	  else
  	    t = fold_build2 (PLUS_EXPR, type, vmain, step);
! 	  if (DECL_P (vback) && TREE_ADDRESSABLE (vback))
! 	    t = force_gimple_operand_gsi (&gsi, t, true, NULL_TREE,
! 					  true, GSI_SAME_STMT);
  	  assign_stmt = gimple_build_assign (vback, t);
  	  gsi_insert_before (&gsi, assign_stmt, GSI_SAME_STMT);
  
--- 6245,6254 ----
  	    t = fold_build_pointer_plus (vmain, step);
  	  else
  	    t = fold_build2 (PLUS_EXPR, type, vmain, step);
! 	  t = force_gimple_operand_gsi (&gsi, t,
! 					DECL_P (vback)
! 					 && TREE_ADDRESSABLE (vback), NULL_TREE,
! 					true, GSI_SAME_STMT);
  	  assign_stmt = gimple_build_assign (vback, t);
  	  gsi_insert_before (&gsi, assign_stmt, GSI_SAME_STMT);
  
diff -Nrcpad gcc-16-20260125/gcc/omp-low.cc gcc-16-20260201/gcc/omp-low.cc
*** gcc-16-20260125/gcc/omp-low.cc	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/omp-low.cc	Sun Feb  1 22:32:08 2026
*************** diagnose_sb_2 (gimple_stmt_iterator *gsi
*** 15480,15485 ****
--- 15480,15498 ----
        }
        break;
  
+     case GIMPLE_ASM:
+       {
+ 	gasm *asm_stmt = as_a <gasm *> (stmt);
+ 	for (unsigned i = 0; i < gimple_asm_nlabels (asm_stmt); ++i)
+ 	  {
+ 	    tree lab = TREE_VALUE (gimple_asm_label_op (asm_stmt, i));
+ 	    n = splay_tree_lookup (all_labels, (splay_tree_key) lab);
+ 	    if (n && diagnose_sb_0 (gsi_p, context, (gimple *) n->value))
+ 	      break;
+ 	  }
+       }
+       break;
+ 
      case GIMPLE_RETURN:
        diagnose_sb_0 (gsi_p, context, NULL);
        break;
diff -Nrcpad gcc-16-20260125/gcc/optabs.cc gcc-16-20260201/gcc/optabs.cc
*** gcc-16-20260125/gcc/optabs.cc	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/optabs.cc	Sun Feb  1 22:32:08 2026
*************** expand_unop (machine_mode mode, optab un
*** 3376,3381 ****
--- 3376,3414 ----
        goto try_libcall;
      }
  
+   /* Neg should be tried via expand_absneg_bit before widening.  */
+   if (optab_to_code (unoptab) == NEG)
+     {
+       /* Try negating floating point values by flipping the sign bit.  */
+       if (is_a <scalar_float_mode> (GET_MODE_INNER (mode), &float_mode))
+ 	{
+ 	  temp = expand_absneg_bit (NEG, mode, float_mode, op0, target);
+ 	  if (temp)
+ 	    return temp;
+ 	}
+ 
+       /* If there is no negation pattern, and we have no negative zero,
+ 	 try subtracting from zero.  */
+       if (!HONOR_SIGNED_ZEROS (mode))
+ 	{
+ 	  temp = expand_binop (mode, (unoptab == negv_optab
+ 				      ? subv_optab : sub_optab),
+ 			       CONST0_RTX (mode), op0, target,
+ 			       unsignedp, OPTAB_DIRECT);
+ 	  if (temp)
+ 	    return temp;
+ 	}
+     }
+ 
+   /* ABS also needs to be handled similarly.  */
+   if (optab_to_code (unoptab) == ABS
+       && is_a <scalar_float_mode> (GET_MODE_INNER (mode), &float_mode))
+     {
+       temp = expand_absneg_bit (ABS, mode, float_mode, op0, target);
+       if (temp)
+ 	return temp;
+     }
+ 
    if (CLASS_HAS_WIDER_MODES_P (mclass))
      FOR_EACH_WIDER_MODE (wider_mode, mode)
        {
*************** expand_unop (machine_mode mode, optab un
*** 3460,3488 ****
  	return temp;
      }
  
-   if (optab_to_code (unoptab) == NEG)
-     {
-       /* Try negating floating point values by flipping the sign bit.  */
-       if (is_a <scalar_float_mode> (GET_MODE_INNER (mode), &float_mode))
- 	{
- 	  temp = expand_absneg_bit (NEG, mode, float_mode, op0, target);
- 	  if (temp)
- 	    return temp;
- 	}
- 
-       /* If there is no negation pattern, and we have no negative zero,
- 	 try subtracting from zero.  */
-       if (!HONOR_SIGNED_ZEROS (mode))
- 	{
- 	  temp = expand_binop (mode, (unoptab == negv_optab
- 				      ? subv_optab : sub_optab),
- 			       CONST0_RTX (mode), op0, target,
- 			       unsignedp, OPTAB_DIRECT);
- 	  if (temp)
- 	    return temp;
- 	}
-     }
- 
    /* Try calculating parity (x) as popcount (x) % 2.  */
    if (unoptab == parity_optab && is_a <scalar_int_mode> (mode, &int_mode))
      {
--- 3493,3498 ----
*************** expand_abs_nojump (machine_mode mode, rt
*** 3680,3694 ****
    if (temp != 0)
      return temp;
  
-   /* For floating point modes, try clearing the sign bit.  */
-   scalar_float_mode float_mode;
-   if (is_a <scalar_float_mode> (GET_MODE_INNER (mode), &float_mode))
-     {
-       temp = expand_absneg_bit (ABS, mode, float_mode, op0, target);
-       if (temp)
- 	return temp;
-     }
- 
    /* If we have a MAX insn, we can do this as MAX (x, -x).  */
    if (optab_handler (smax_optab, mode) != CODE_FOR_nothing
        && !HONOR_SIGNED_ZEROS (mode))
--- 3690,3695 ----
diff -Nrcpad gcc-16-20260125/gcc/params.opt gcc-16-20260201/gcc/params.opt
*** gcc-16-20260125/gcc/params.opt	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/params.opt	Sun Feb  1 22:32:08 2026
*************** Build basic block profile using auto pro
*** 72,78 ****
  
  -param=auto-profile-reorder-only=
  Common Joined UInteger Var(param_auto_profile_reorder_only) Init(0) IntegerRange(0, 1) Param Optimization
! Eanble only function reordering with auto-profile.
  
  -param=cycle-accurate-model=
  Common Joined UInteger Var(param_cycle_accurate_model) Init(1) IntegerRange(0, 1) Param Optimization
--- 72,78 ----
  
  -param=auto-profile-reorder-only=
  Common Joined UInteger Var(param_auto_profile_reorder_only) Init(0) IntegerRange(0, 1) Param Optimization
! Enable only function reordering with auto-profile.
  
  -param=cycle-accurate-model=
  Common Joined UInteger Var(param_cycle_accurate_model) Init(1) IntegerRange(0, 1) Param Optimization
diff -Nrcpad gcc-16-20260125/gcc/path-coverage.cc gcc-16-20260201/gcc/path-coverage.cc
*** gcc-16-20260125/gcc/path-coverage.cc	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/path-coverage.cc	Sun Feb  1 22:32:08 2026
*************** void
*** 379,386 ****
  flush_on_edges (basic_block bb, size_t bucket, tree local, tree mask,
  		tree atomic_ior, tree gcov_type_node)
  {
!   gimple *def = SSA_NAME_DEF_STMT (local);
!   gphi *phi = dyn_cast <gphi *> (def);
  
    tree relaxed = nullptr;
    if (atomic_ior)
--- 379,386 ----
  flush_on_edges (basic_block bb, size_t bucket, tree local, tree mask,
  		tree atomic_ior, tree gcov_type_node)
  {
!   gimple *def = !constant_p (local) ? SSA_NAME_DEF_STMT (local) : NULL;
!   gphi *phi = safe_dyn_cast <gphi *> (def);
  
    tree relaxed = nullptr;
    if (atomic_ior)
diff -Nrcpad gcc-16-20260125/gcc/po/ChangeLog gcc-16-20260201/gcc/po/ChangeLog
*** gcc-16-20260125/gcc/po/ChangeLog	Sun Jan 25 22:32:07 2026
--- gcc-16-20260201/gcc/po/ChangeLog	Sun Feb  1 22:32:08 2026
***************
*** 1,3 ****
--- 1,7 ----
+ 2026-01-27  Joseph Myers  <josmyers@redhat.com>
+ 
+ 	* sv.po: Update.
+ 
  2026-01-19  Joseph Myers  <josmyers@redhat.com>
  
  	* es.po: Update.
diff -Nrcpad gcc-16-20260125/gcc/po/sv.po gcc-16-20260201/gcc/po/sv.po
*** gcc-16-20260125/gcc/po/sv.po	Sun Jan 25 22:32:08 2026
--- gcc-16-20260201/gcc/po/sv.po	Sun Feb  1 22:32:08 2026
***************
*** 1,8 ****
  # Swedish messages for gcc.
! # Copyright © 2000, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025 Free Software Foundation, Inc.
  # This file is distributed under the same license as the gcc package.
  # Dennis Björklund <db@zigo.dhs.org>, 2000, 2001, 2002.
! # Göran Uddeborg <goeran@uddeborg.se>, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025.
  #
  # Reminder to translator: GCC team does not want RCS keywords in the header!
  #
--- 1,8 ----
  # Swedish messages for gcc.
! # Copyright © 2000, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025, 2026 Free Software Foundation, Inc.
  # This file is distributed under the same license as the gcc package.
  # Dennis Björklund <db@zigo.dhs.org>, 2000, 2001, 2002.
! # Göran Uddeborg <goeran@uddeborg.se>, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025, 2026.
  #
  # Reminder to translator: GCC team does not want RCS keywords in the header!
  #
*************** msgstr ""
*** 32,38 ****
  "Project-Id-Version: gcc 15.2.0\n"
  "Report-Msgid-Bugs-To: https://gcc.gnu.org/bugs/\n"
  "POT-Creation-Date: 2025-08-01 17:58+0000\n"
! "PO-Revision-Date: 2025-08-09 22:08+0200\n"
  "Last-Translator: Göran Uddeborg <goeran@uddeborg.se>\n"
  "Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n"
  "Language: sv\n"
--- 32,38 ----
  "Project-Id-Version: gcc 15.2.0\n"
  "Report-Msgid-Bugs-To: https://gcc.gnu.org/bugs/\n"
  "POT-Creation-Date: 2025-08-01 17:58+0000\n"
! "PO-Revision-Date: 2026-01-27 21:14+0100\n"
  "Last-Translator: Göran Uddeborg <goeran@uddeborg.se>\n"
  "Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n"
  "Language: sv\n"
*************** msgid "-mfuse-move=<0,23>\tOptimization.
*** 8916,8925 ****
  msgstr "-mfuse-move=<0,23>\tOptimering. Kör ett efterladdningspass som justerar flyttinstruktioner."
  
  #: config/avr/avr.opt:169
! #, fuzzy, no-c-format
! #| msgid "Optimization. Allow to use nonzero_bits() in some insn conditions."
  msgid "Optimization. Fuse some move insns after insn combine."
! msgstr "Optimering. Tillåt användning av nonzero_bits() i några instruktionsvillkor."
  
  #: config/avr/avr.opt:173
  #, no-c-format
--- 8916,8924 ----
  msgstr "-mfuse-move=<0,23>\tOptimering. Kör ett efterladdningspass som justerar flyttinstruktioner."
  
  #: config/avr/avr.opt:169
! #, no-c-format
  msgid "Optimization. Fuse some move insns after insn combine."
! msgstr "Optimering. Slå samman några flyttinstruktioner efter instruktionskombination."
  
  #: config/avr/avr.opt:173
  #, no-c-format
*************** msgstr "Maximalt antal predikat med ”o
*** 17444,17450 ****
  #: params.opt:1194
  #, no-c-format
  msgid "Maximum amount of work done to prune paths where the variable is always initialized."
! msgstr ""
  
  #: params.opt:1198
  #, no-c-format
--- 17443,17449 ----
  #: params.opt:1194
  #, no-c-format
  msgid "Maximum amount of work done to prune paths where the variable is always initialized."
! msgstr "Maximal mäng arbete som görs för att ansa vägar där variabeln alltid är initierad."
  
  #: params.opt:1198
  #, no-c-format
*************** msgid "expected label"
*** 21429,21438 ****
  msgstr "etikett förväntades"
  
  #: cobol/gcobolspec.cc:554
! #, fuzzy, c-format
! #| msgid "Driving:"
  msgid "Driving: ("
! msgstr "Driver:"
  
  #: cp/call.cc:4225
  #, c-format
--- 21428,21436 ----
  msgstr "etikett förväntades"
  
  #: cobol/gcobolspec.cc:554
! #, c-format
  msgid "Driving: ("
! msgstr "Driver: ("
  
  #: cp/call.cc:4225
  #, c-format
*************** msgid "%<-mrelax%> is only supported for
*** 23065,23074 ****
  msgstr "%<-mrelax%> stödjs endast för RTP PIC"
  
  #: cobol/exceptg.h:80
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "exception '%s'"
  msgid "CDF: exception '%s'"
! msgstr "undantaget ”%s”"
  
  #: cobol/parse_ante.h:1592
  #, gcc-internal-format, gfc-internal-format
--- 23063,23071 ----
  msgstr "%<-mrelax%> stödjs endast för RTP PIC"
  
  #: cobol/exceptg.h:80
! #, gcc-internal-format, gfc-internal-format
  msgid "CDF: exception '%s'"
! msgstr "CDF: undantaget ”%s”"
  
  #: cobol/parse_ante.h:1592
  #, gcc-internal-format, gfc-internal-format
*************** msgstr "Global deklarativ %s för %s"
*** 23077,23092 ****
  
  #: cobol/parse_ante.h:2385 cobol/symbols.h:134 cobol/genapi.cc:6470
  #: cobol/util.cc:288 cobol/util.cc:337 cobol/util.cc:637
! #, fuzzy, gcc-internal-format
! #| msgid "%s:%d: invalid symbol_type_t %d"
  msgid "%s:%d: invalid %<symbol_type_t%> %d"
! msgstr "%s:%d: felaktig symbol_type_t %d"
  
  #: cobol/parse_util.h:360
! #, fuzzy, gcc-internal-format
! #| msgid "%s: intrinsic function  %s not found"
  msgid "%s: intrinsic function %qs not found"
! msgstr "%s: den inbyggda funktionen %s finns inte"
  
  #: cobol/parse_util.h:392
  #, gcc-internal-format, gfc-internal-format
--- 23074,23087 ----
  
  #: cobol/parse_ante.h:2385 cobol/symbols.h:134 cobol/genapi.cc:6470
  #: cobol/util.cc:288 cobol/util.cc:337 cobol/util.cc:637
! #, gcc-internal-format
  msgid "%s:%d: invalid %<symbol_type_t%> %d"
! msgstr "%s:%d: felaktig %<symbol_type_t%> %d"
  
  #: cobol/parse_util.h:360
! #, gcc-internal-format
  msgid "%s: intrinsic function %qs not found"
! msgstr "%s: den inbyggda funktionen %qs finns inte"
  
  #: cobol/parse_util.h:392
  #, gcc-internal-format, gfc-internal-format
*************** msgid "illegal argument 0 to %qs"
*** 23906,23915 ****
  msgstr "otillåtet argument 0 till %qs"
  
  #: builtins.cc:7806 internal-fn.cc:4030
! #, fuzzy, gcc-internal-format
! #| msgid "third argument to %<__builtin_prefetch%> must be a constant"
  msgid "third argument to %<crc%> builtins must be a constant"
! msgstr "tredje argumentet till %<__builtin_prefetch%> måste vara en konstant"
  
  #. All valid uses of __builtin_va_arg_pack () are removed during
  #. inlining.
--- 23901,23909 ----
  msgstr "otillåtet argument 0 till %qs"
  
  #: builtins.cc:7806 internal-fn.cc:4030
! #, gcc-internal-format
  msgid "third argument to %<crc%> builtins must be a constant"
! msgstr "tredje argumentet till inbyggd %<crc%> måste vara en konstant"
  
  #. All valid uses of __builtin_va_arg_pack () are removed during
  #. inlining.
*************** msgid "%<-fabi-compat-version=1%> is not
*** 36380,36389 ****
  msgstr "%<-fabi-compat-version=1%> stödjs inte, använder =2"
  
  #: c-family/c-opts.cc:1094
! #, fuzzy, gcc-internal-format
! #| msgid "%<-fabi-compat-version=1%> is not supported, using =2"
  msgid "%<-fabi-version=%d%> is not supported, using =%d"
! msgstr "%<-fabi-compat-version=1%> stödjs inte, använder =2"
  
  #: c-family/c-opts.cc:1200
  #, gcc-internal-format
--- 36374,36382 ----
  msgstr "%<-fabi-compat-version=1%> stödjs inte, använder =2"
  
  #: c-family/c-opts.cc:1094
! #, gcc-internal-format
  msgid "%<-fabi-version=%d%> is not supported, using =%d"
! msgstr "%<-fabi-version=%d%> stödjs inte, använder =%d"
  
  #: c-family/c-opts.cc:1200
  #, gcc-internal-format
*************** msgid "We should never see a non-equal d
*** 52331,52340 ****
  msgstr "Vi borde aldrig se en olik dash-main i cobol1.c"
  
  #: cobol/except.cc:54
! #, fuzzy, gcc-internal-format
! #| msgid "no such exception: 0x%04x"
  msgid "no such exception: 0x%x"
! msgstr "inget sådant undantag: 0x%04x"
  
  #: cobol/genapi.cc:354
  #, gcc-internal-format
--- 52324,52332 ----
  msgstr "Vi borde aldrig se en olik dash-main i cobol1.c"
  
  #: cobol/except.cc:54
! #, gcc-internal-format
  msgid "no such exception: 0x%x"
! msgstr "inget sådant undantag: 0x%x"
  
  #: cobol/genapi.cc:354
  #, gcc-internal-format
*************** msgid "Probable cause: it was referenced
*** 52342,52440 ****
  msgstr "Trolig orsak: den refererades utan att vara definerad."
  
  #: cobol/genapi.cc:600
! #, fuzzy, gcc-internal-format
! #| msgid "Nice try, but you can't fire me. I quit!"
  msgid "Nice try, but you cannot fire me."
! msgstr "Bra försök, men du kan inte avskeda mig. Jag slutar!"
  
  #: cobol/genapi.cc:1214
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "%qD shall not be const"
  msgid "%s should not be null"
! msgstr "%qD skall inte vara const"
  
  #: cobol/genapi.cc:1792
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "%s(): Knows not the variable type %s for %s"
  msgid "%s: Knows not the variable type %s for %s"
! msgstr "%s(): Känner inte till variabeltypen %s för %s"
  
  #: cobol/genapi.cc:2481
! #, fuzzy, gcc-internal-format
! #| msgid "I don't know how to MOVE an alphabetical string to %s(%s) \n"
  msgid "I don%'t know how to MOVE an alphabetical string to %s(%s)"
! msgstr "Jag vet inte hur man kan göra MOVE av en alfabetisk sträng till %s(%s) \n"
  
  #: cobol/genapi.cc:2549
! #, fuzzy, gcc-internal-format
! #| msgid "%s(): field->type %s must be literal or alphanumeric"
  msgid "%s: %<field->type%> %s must be literal or alphanumeric"
! msgstr "%s(): fält->typ %s måste vara literal eller alfanumerisk"
  
  #: cobol/genapi.cc:4460
! #, fuzzy, gcc-internal-format
! #| msgid "Invalid form of PROGRAM statement at %C"
  msgid "Not valid for ACCEPT statement."
! msgstr "Ogiltig form på PROGRAM-sats vid %C"
  
  #: cobol/genapi.cc:5488
  #, gcc-internal-format
  msgid "Attempting to send to an input device."
! msgstr ""
  
  #: cobol/genapi.cc:5511
! #, fuzzy, gcc-internal-format
! #| msgid "Invalid form of PROGRAM statement at %C"
  msgid "Not valid for DISPLAY statement."
! msgstr "Ogiltig form på PROGRAM-sats vid %C"
  
  #: cobol/genapi.cc:6412
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "%s(): Invalid field type %s:"
  msgid "%s: Invalid field type %s:"
! msgstr "%s(): Ogiltig fälttyp %s:"
  
  #: cobol/genapi.cc:7622 cobol/genapi.cc:7628 cobol/genapi.cc:7634
! #, fuzzy, gcc-internal-format
! #| msgid "parser_logop() was called with variable %s on line %d, which is not a FldConditional\n"
  msgid "%<parser_logop()%> was called with variable %s on line %d, which is not a FldConditional"
! msgstr "parser_logop() anropades med variabeln %s på rad %d, vilket inte är en FldConditional\n"
  
  #: cobol/genapi.cc:7741
! #, fuzzy, gcc-internal-format
! #| msgid "parser_relop() was called with variable %s, which is not a FldConditional\n"
  msgid "%<parser_relop%> was called with variable %qs, which is not a FldConditional"
! msgstr "parser_relop() anropades med variabeln %s, vilket inte är en FldConditional\n"
  
  #: cobol/genapi.cc:7805
! #, fuzzy, gcc-internal-format
! #| msgid "parser_relop() was called with variable %s, which is not a FldConditional\n"
  msgid "%<parser_relop()%> was called with variable %s, which is not a FldConditional"
! msgstr "parser_relop() anropades med variabeln %s, vilket inte är en FldConditional\n"
  
  #: cobol/genapi.cc:7851
! #, fuzzy, gcc-internal-format
! #| msgid "parser_if() was called with variable %s, which is not a FldConditional\n"
  msgid "%<parser_if()%> was called with variable %s, which is not a FldConditional"
! msgstr "parser_if() anropades med variabeln %s, vilket inte är en FldConditional\n"
  
  #: cobol/genapi.cc:8116
! #, fuzzy, gcc-internal-format
! #| msgid "###### candidate %s has unimplemented CVT_type %d(%s)\n"
  msgid "candidate %s has unimplemented %<CVT_type%> %d(%s)"
! msgstr "###### kandidaten %s har oimplementerad CVT_type %d(%s)\n"
  
  #: cobol/genapi.cc:8127
! #, fuzzy, gcc-internal-format
! #| msgid "###### unknown setop_t code %d\n"
  msgid "unknown %<setop_t%> code %d"
! msgstr "###### okänd setop_t-kod %d\n"
  
  #: cobol/genapi.cc:8315
! #, fuzzy, gcc-internal-format
! #| msgid "%s:%d: %zu exceeds MAXIMUM_UNTILS of %d, line %d"
  msgid "%s:%d: %u exceeds %<MAXIMUM_UNTILS%> of %d, line %d"
! msgstr "%s:%d: %zu överskrider MAXIMUM_UNTILS på %d, rad %d"
  
  #: cobol/genapi.cc:9324
  #, gcc-internal-format, gfc-internal-format
--- 52334,52417 ----
  msgstr "Trolig orsak: den refererades utan att vara definerad."
  
  #: cobol/genapi.cc:600
! #, gcc-internal-format
  msgid "Nice try, but you cannot fire me."
! msgstr "Bra försök, men du kan inte avskeda mig."
  
  #: cobol/genapi.cc:1214
! #, gcc-internal-format, gfc-internal-format
  msgid "%s should not be null"
! msgstr "%s skall inte vara null"
  
  #: cobol/genapi.cc:1792
! #, gcc-internal-format, gfc-internal-format
  msgid "%s: Knows not the variable type %s for %s"
! msgstr "%s: Känner inte till variabeltypen %s för %s"
  
  #: cobol/genapi.cc:2481
! #, gcc-internal-format
  msgid "I don%'t know how to MOVE an alphabetical string to %s(%s)"
! msgstr "Jag vet inte hur man kan göra MOVE av en alfabetisk sträng till %s(%s)"
  
  #: cobol/genapi.cc:2549
! #, gcc-internal-format
  msgid "%s: %<field->type%> %s must be literal or alphanumeric"
! msgstr "%s: %<field->type%> %s måste vara literal eller alfanumerisk"
  
  #: cobol/genapi.cc:4460
! #, gcc-internal-format
  msgid "Not valid for ACCEPT statement."
! msgstr "Inte giltigt för en ACCEPT-sats."
  
  #: cobol/genapi.cc:5488
  #, gcc-internal-format
  msgid "Attempting to send to an input device."
! msgstr "Försöker skicka till en inmatningsenhet."
  
  #: cobol/genapi.cc:5511
! #, gcc-internal-format
  msgid "Not valid for DISPLAY statement."
! msgstr "Inte giltigt för en DISPLAY-sats."
  
  #: cobol/genapi.cc:6412
! #, gcc-internal-format, gfc-internal-format
  msgid "%s: Invalid field type %s:"
! msgstr "%s: Ogiltig fälttyp %s:"
  
  #: cobol/genapi.cc:7622 cobol/genapi.cc:7628 cobol/genapi.cc:7634
! #, gcc-internal-format
  msgid "%<parser_logop()%> was called with variable %s on line %d, which is not a FldConditional"
! msgstr "%<parser_logop()%> anropades med variabeln %s på rad %d, vilket inte är en FldConditional"
  
  #: cobol/genapi.cc:7741
! #, gcc-internal-format
  msgid "%<parser_relop%> was called with variable %qs, which is not a FldConditional"
! msgstr "%<parser_relop()%> anropades med variabeln %qs, vilket inte är en FldConditional"
  
  #: cobol/genapi.cc:7805
! #, gcc-internal-format
  msgid "%<parser_relop()%> was called with variable %s, which is not a FldConditional"
! msgstr "%<parser_relop()%> anropades med variabeln %s, vilket inte är en FldConditional"
  
  #: cobol/genapi.cc:7851
! #, gcc-internal-format
  msgid "%<parser_if()%> was called with variable %s, which is not a FldConditional"
! msgstr "%<parser_if()%> anropades med variabeln %s, vilket inte är en FldConditional"
  
  #: cobol/genapi.cc:8116
! #, gcc-internal-format
  msgid "candidate %s has unimplemented %<CVT_type%> %d(%s)"
! msgstr "kandidaten %s har oimplementerad %<CVT_type%> %d(%s)"
  
  #: cobol/genapi.cc:8127
! #, gcc-internal-format
  msgid "unknown %<setop_t%> code %d"
! msgstr "okänd %<setop_t%>-kod %d"
  
  #: cobol/genapi.cc:8315
! #, gcc-internal-format
  msgid "%s:%d: %u exceeds %<MAXIMUM_UNTILS%> of %d, line %d"
! msgstr "%s:%d: %u överskrider %<MAXIMUM_UNTILS%> på %d, rad %d"
  
  #: cobol/genapi.cc:9324
  #, gcc-internal-format, gfc-internal-format
*************** msgid "%s:%d: ignoring subscripts"
*** 52442,52469 ****
  msgstr "%s:%d: ignorerar indexvärden"
  
  #: cobol/genapi.cc:9538 cobol/genapi.cc:10006
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "%s(): called with NULL *file"
  msgid "%s: called with NULL *file"
! msgstr "%s(): anropad med NULL *fil"
  
  #: cobol/genapi.cc:9663
! #, fuzzy, gcc-internal-format
! #| msgid "%s:%d file %s access mode is 'file_inaccessible_e' in %s"
  msgid "%s:%d file %s access mode is %<file_inaccessible_e%> in %s"
! msgstr "%s:%d filen %s åtkomstläge är ”file_inaccessible_e” i %s"
  
  #: cobol/genapi.cc:9737
! #, fuzzy, gcc-internal-format
! #| msgid "parser_file_open called with NULL *file"
  msgid "%<parser_file_open%> called with NULL *file"
! msgstr "parser_file_open anropad med NULL *fil"
  
  #: cobol/genapi.cc:9742
! #, fuzzy, gcc-internal-format
! #| msgid "parser_file_open for %s called with NULL var_decl_node"
  msgid "%<parser_file_open%> for %s called with NULL %<var_decl_node%>"
! msgstr "parser_file_open för %s anropad med NULL var_decl_node"
  
  #: cobol/genapi.cc:9748
  #, gcc-internal-format, gfc-internal-format
--- 52419,52442 ----
  msgstr "%s:%d: ignorerar indexvärden"
  
  #: cobol/genapi.cc:9538 cobol/genapi.cc:10006
! #, gcc-internal-format, gfc-internal-format
  msgid "%s: called with NULL *file"
! msgstr "%s: anropad med NULL *fil"
  
  #: cobol/genapi.cc:9663
! #, gcc-internal-format
  msgid "%s:%d file %s access mode is %<file_inaccessible_e%> in %s"
! msgstr "%s:%d filen %s åtkomstläge är %<file_inaccessible_e%> i %s"
  
  #: cobol/genapi.cc:9737
! #, gcc-internal-format
  msgid "%<parser_file_open%> called with NULL *file"
! msgstr "%<parser_file_open%> anropad med NULL *fil"
  
  #: cobol/genapi.cc:9742
! #, gcc-internal-format
  msgid "%<parser_file_open%> for %s called with NULL %<var_decl_node%>"
! msgstr "%<parser_file_open%> för %s anropad med NULL %<var_decl_node%>"
  
  #: cobol/genapi.cc:9748
  #, gcc-internal-format, gfc-internal-format
*************** msgid "EXTEND can only be used where %s
*** 52471,52486 ****
  msgstr "EXTEND kan endast användas där %s är ACCESS MODE SEQUENTIAL"
  
  #: cobol/genapi.cc:9817
! #, fuzzy, gcc-internal-format
! #| msgid "parser_file_close called with NULL *file"
  msgid "%<parser_file_close%> called with NULL *file"
! msgstr "parser_file_close anropad med NULL *fil"
  
  #: cobol/genapi.cc:9822
! #, fuzzy, gcc-internal-format
! #| msgid "parser_file_close for %s called with NULL file->var_decl_node"
  msgid "%<parser_file_close%> for %s called with NULL %<file->var_decl_node%>"
! msgstr "parser_file_close för %s anropad med NULL file->var_decl_node"
  
  #: cobol/genapi.cc:9877
  #, gcc-internal-format, gfc-internal-format
--- 52444,52457 ----
  msgstr "EXTEND kan endast användas där %s är ACCESS MODE SEQUENTIAL"
  
  #: cobol/genapi.cc:9817
! #, gcc-internal-format
  msgid "%<parser_file_close%> called with NULL *file"
! msgstr "%<parser_file_close%> anropad med NULL *fil"
  
  #: cobol/genapi.cc:9822
! #, gcc-internal-format
  msgid "%<parser_file_close%> for %s called with NULL %<file->var_decl_node%>"
! msgstr "%<parser_file_close%> för %s anropad med NULL %<file->var_decl_node%>"
  
  #: cobol/genapi.cc:9877
  #, gcc-internal-format, gfc-internal-format
*************** msgid "%s:%d file %s 'where' is zero in
*** 52488,52527 ****
  msgstr "%s:%d fil %s ”where” är noll i %s"
  
  #: cobol/genapi.cc:9887
! #, fuzzy, gcc-internal-format
! #| msgid "parser_file_read called with NULL *file"
  msgid "%<parser_file_read%> called with NULL *file"
! msgstr "parser_file_read anropad med NULL *fil"
  
  #: cobol/genapi.cc:9892
! #, fuzzy, gcc-internal-format
! #| msgid "parser_file_read for %s called with NULL file->var_decl_node"
  msgid "%<parser_file_read%> for %s called with NULL %<file->var_decl_node%>"
! msgstr "parser_file_read för %s anropad med NULL file->var_decl_node"
  
  #: cobol/genapi.cc:9898
! #, fuzzy, gcc-internal-format
! #| msgid "parser_file_read called with NULL *field"
  msgid "%<parser_file_read%> called with NULL *field"
! msgstr "parser_file_read anropad med NULL *fält"
  
  #: cobol/genapi.cc:9903
! #, fuzzy, gcc-internal-format
! #| msgid "parser_file_read for %s called with NULL field->var_decl_node"
  msgid "%<parser_file_read%> for %s called with NULL %<field->var_decl_node%>"
! msgstr "parser_file_read för %s anropad med NULL field->var_decl_node"
  
  #: cobol/genapi.cc:9909
! #, fuzzy, gcc-internal-format
! #| msgid "%s:%d file %s is RELATIVE/SEQUENTIAL, but 'where' >= 0"
  msgid "%s:%d file %s is RELATIVE/SEQUENTIAL, but %<where >= 0%>"
! msgstr "%s:%d filen %s är RELATIVE/SEQUENTIAL, men ”where” ≥ 0"
  
  #: cobol/genapi.cc:9918
! #, fuzzy, gcc-internal-format
! #| msgid "%s:%d file %s is RELATIVE/RANDOM, but 'where' < 0"
  msgid "%s:%d file %s is RELATIVE/RANDOM, but %<where < 0%>"
! msgstr "%s:%d filen %s är RELATIVE/RANDOM, men ”where” < 0"
  
  #: cobol/genapi.cc:9962
  #, gcc-internal-format, gfc-internal-format
--- 52459,52492 ----
  msgstr "%s:%d fil %s ”where” är noll i %s"
  
  #: cobol/genapi.cc:9887
! #, gcc-internal-format
  msgid "%<parser_file_read%> called with NULL *file"
! msgstr "%<parser_file_read%> anropad med NULL *fil"
  
  #: cobol/genapi.cc:9892
! #, gcc-internal-format
  msgid "%<parser_file_read%> for %s called with NULL %<file->var_decl_node%>"
! msgstr "%<parser_file_read%> för %s anropad med NULL %<file->var_decl_node%>"
  
  #: cobol/genapi.cc:9898
! #, gcc-internal-format
  msgid "%<parser_file_read%> called with NULL *field"
! msgstr "%<parser_file_read%> anropad med NULL *fält"
  
  #: cobol/genapi.cc:9903
! #, gcc-internal-format
  msgid "%<parser_file_read%> for %s called with NULL %<field->var_decl_node%>"
! msgstr "%<parser_file_read%> för %s anropad med NULL %<field->var_decl_node%>"
  
  #: cobol/genapi.cc:9909
! #, gcc-internal-format
  msgid "%s:%d file %s is RELATIVE/SEQUENTIAL, but %<where >= 0%>"
! msgstr "%s:%d filen %s är RELATIVE/SEQUENTIAL, men %<where ≥ 0%>"
  
  #: cobol/genapi.cc:9918
! #, gcc-internal-format
  msgid "%s:%d file %s is RELATIVE/RANDOM, but %<where < 0%>"
! msgstr "%s:%d filen %s är RELATIVE/RANDOM, men %<where < 0%>"
  
  #: cobol/genapi.cc:9962
  #, gcc-internal-format, gfc-internal-format
*************** msgid "%s:%d file %s 'sequentially' is %
*** 52529,52555 ****
  msgstr "%s:%d filen %s ”sequentially” är %d i %s"
  
  #: cobol/genapi.cc:10011
! #, fuzzy, gcc-internal-format
! #| msgid "%s(): for %s called with NULL file->var_decl_node"
  msgid "%s: for %s called with NULL %<file->var_decl_node%>"
! msgstr "%s(): för %s anropad med NULL file->var_decl_node"
  
  #: cobol/genapi.cc:10017
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "%s(): called with NULL *field"
  msgid "%s: called with NULL *field"
! msgstr "%s(): anropad med NULL *field"
  
  #: cobol/genapi.cc:10022
! #, fuzzy, gcc-internal-format
! #| msgid "%s(): for %s called with NULL field->var_decl_node"
  msgid "%s: for %s called with NULL %<field->var_decl_node%>"
! msgstr "%s(): för %s anropad med NULL field->var_decl_node"
  
  #: cobol/genapi.cc:10107
  #, gcc-internal-format
  msgid "The file pointer should not be null"
! msgstr ""
  
  #: cobol/genapi.cc:10161
  #, gcc-internal-format, gfc-internal-format
--- 52494,52517 ----
  msgstr "%s:%d filen %s ”sequentially” är %d i %s"
  
  #: cobol/genapi.cc:10011
! #, gcc-internal-format
  msgid "%s: for %s called with NULL %<file->var_decl_node%>"
! msgstr "%s: för %s anropad med NULL %<file->var_decl_node%>"
  
  #: cobol/genapi.cc:10017
! #, gcc-internal-format, gfc-internal-format
  msgid "%s: called with NULL *field"
! msgstr "%s: anropad med NULL *field"
  
  #: cobol/genapi.cc:10022
! #, gcc-internal-format
  msgid "%s: for %s called with NULL %<field->var_decl_node%>"
! msgstr "%s: för %s anropad med NULL %<field->var_decl_node%>"
  
  #: cobol/genapi.cc:10107
  #, gcc-internal-format
  msgid "The file pointer should not be null"
! msgstr "Filpekaren skall inte vara null"
  
  #: cobol/genapi.cc:10161
  #, gcc-internal-format, gfc-internal-format
*************** msgid "%s:%d file %s is INDEXED/SEQUENTI
*** 52557,52585 ****
  msgstr "%s:%d filen %s är INDEXED/SEQUENTIAL, men ”sequentially” är falskt"
  
  #: cobol/genapi.cc:11881
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "%s(): asked to sort %s, but it's not a table"
  msgid "%s: asked to sort %s, which is not a table"
! msgstr "%s(): anropad för att sortera %s, med det är inte en tabell"
  
  #. Having both or neither violates SORT syntax
  #: cobol/genapi.cc:12013
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "%s(): syntax error -- both (or neither) USING and input-proc are specified"
  msgid "%s: syntax error: both (or neither) USING and input-proc are specified"
! msgstr "%s(): syntaxfel — både (eller ingendera av) USING och input-proc är specificerade"
  
  #: cobol/genapi.cc:12147
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "%s(): syntax error -- both (or neither) GIVING and output-proc are specified"
  msgid "%s: syntax error: both (or neither) GIVING and output-proc are specified"
! msgstr "%s(): syntaxfel — både (eller ingendera av) GIVING och output-proc är specificerade"
  
  #: cobol/genapi.cc:12569
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "%s(): syntax error -- both (or neither) files and output-proc are specified"
  msgid "%s: syntax error: both (or neither) files and output-proc are specified"
! msgstr "%s(): syntaxfel — både (eller ingendera av) filer och output-proc är specificerade"
  
  #: cobol/genapi.cc:12973
  #, gcc-internal-format
--- 52519,52543 ----
  msgstr "%s:%d filen %s är INDEXED/SEQUENTIAL, men ”sequentially” är falskt"
  
  #: cobol/genapi.cc:11881
! #, gcc-internal-format, gfc-internal-format
  msgid "%s: asked to sort %s, which is not a table"
! msgstr "%s: anropad för att sortera %s, som inte är en tabell"
  
  #. Having both or neither violates SORT syntax
  #: cobol/genapi.cc:12013
! #, gcc-internal-format, gfc-internal-format
  msgid "%s: syntax error: both (or neither) USING and input-proc are specified"
! msgstr "%s: syntaxfel: både (eller ingendera av) USING och input-proc är specificerade"
  
  #: cobol/genapi.cc:12147
! #, gcc-internal-format, gfc-internal-format
  msgid "%s: syntax error: both (or neither) GIVING and output-proc are specified"
! msgstr "%s: syntaxfel: både (eller ingendera av) GIVING och output-proc är specificerade"
  
  #: cobol/genapi.cc:12569
! #, gcc-internal-format, gfc-internal-format
  msgid "%s: syntax error: both (or neither) files and output-proc are specified"
! msgstr "%s: syntaxfel: både (eller ingendera av) filer och output-proc är specificerade"
  
  #: cobol/genapi.cc:12973
  #, gcc-internal-format
*************** msgid "CALL USING BY CONTENT <temporary>
*** 52587,52608 ****
  msgstr "CALL USING BY CONTENT <temporär> skulle kräva REPOSITORY PROTOTYPES."
  
  #: cobol/genapi.cc:13264
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "%s(): What in the name of Nero's fiddle are we doing here?"
  msgid "%s: What in the name of Nero are we doing here?"
! msgstr "%s(): Vad i Neros fiols namn gör vi här?"
  
  #: cobol/genapi.cc:14560
! #, fuzzy, gcc-internal-format
! #| msgid "In parser_move(%s to %s), the move of FldLiteralN to %s hasn't been implemented"
  msgid "In %<parser_move(%s to %s)%>, the move of FldLiteralN to %s is unimplemented"
! msgstr "I parser_move(%s till %s), har inte förflyttningen av FldLiteralN till %s implementerats"
  
  #: cobol/genapi.cc:14796
! #, fuzzy, gcc-internal-format
! #| msgid "In mh_dest_is_float(%s to %s), the move of %s to %s hasn't been implemented"
  msgid "In %<mh_dest_is_float%>(%s to %s), the move of %s to %s is unimplemented"
! msgstr "I mh_dest_is_float(%s till %s), har inte förflyttningen av %s till %s implementerats"
  
  #: cobol/genapi.cc:16918
  #, gcc-internal-format, gfc-internal-format
--- 52545,52563 ----
  msgstr "CALL USING BY CONTENT <temporär> skulle kräva REPOSITORY PROTOTYPES."
  
  #: cobol/genapi.cc:13264
! #, gcc-internal-format, gfc-internal-format
  msgid "%s: What in the name of Nero are we doing here?"
! msgstr "%s: Vad i Neros namn gör vi här?"
  
  #: cobol/genapi.cc:14560
! #, gcc-internal-format
  msgid "In %<parser_move(%s to %s)%>, the move of FldLiteralN to %s is unimplemented"
! msgstr "I %<parser_move(%s till %s)%>, förflyttningen av FldLiteralN till %s är inte implementerat"
  
  #: cobol/genapi.cc:14796
! #, gcc-internal-format
  msgid "In %<mh_dest_is_float%>(%s to %s), the move of %s to %s is unimplemented"
! msgstr "I %<mh_dest_is_float(%s till %s)%>, förflyttningen av %s till %s är inte implementerat"
  
  #: cobol/genapi.cc:16918
  #, gcc-internal-format, gfc-internal-format
*************** msgid "LEVEL 01 (%s) OCCURS has insuffic
*** 52610,52665 ****
  msgstr "LEVEL 01 (%s) OCCURS har otilräcklig data.memsize"
  
  #: cobol/genapi.cc:16990
! #, fuzzy, gcc-internal-format
! #| msgid "parser_symbol_add() was called with a NULL new_var\n"
  msgid "%<parser_symbol_add()%> was called with a NULL %<new_var%>"
! msgstr "parser_symbol_add() anropades med en NULL new_var\n"
  
  #: cobol/genapi.cc:17020
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "%s(): %2.2d %s is a table, but it improperly has a capacity of zero"
  msgid "%s: %d %s is a table, but it improperly has a capacity of zero"
! msgstr "%s(): %2.2d %s är en tabell, med den har oriktigt en kapacetet på noll"
  
  #: cobol/genapi.cc:17060
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "parser_symbol_add(): %s is its own ancestor"
  msgid "%s: %s is its own ancestor"
! msgstr "parser_symbol_add(): %s är sin egen anfader"
  
  #: cobol/genapi.cc:17065
  #, gcc-internal-format
  msgid "%s: %d %qs has NULL ancestor"
! msgstr ""
  
  #: cobol/genapi.cc:17072
! #, fuzzy, gcc-internal-format
! #| msgid "parser_symbol_add( %s ) improperly has a non-null var_decl_node\n"
  msgid "%s(%s) improperly has a non-null %<var_decl_node%>"
! msgstr "parser_symbol_add( %s ) har oriktigt en null-skild var_decl_node\n"
  
  #: cobol/genapi.cc:17267
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "%s(): %2.2d %s<%s> improperly has a data.capacity of zero"
  msgid "%s: %d %s<%s> improperly has a data.capacity of zero"
! msgstr "%s(): %2.2d %s<%s> har oriktigt en data.capacity på noll"
  
  #: cobol/genapi.cc:17334
  #, gcc-internal-format
  msgid "%<bytes_to_allocate%> is zero for %s (symbol number "
! msgstr ""
  
  #: cobol/gengen.cc:360
! #, fuzzy, gcc-internal-format
! #| msgid "The given type is not NULL, and that's just not fair"
  msgid "The given type is NULL, and that is just not fair"
! msgstr "Den givna typen är inte NULL, och det är bara inte rättvist"
  
  #: cobol/gengen.cc:369
! #, fuzzy, gcc-internal-format
! #| msgid "The given type is not a DECL or a TYPE"
  msgid "The given type is not a declaration or a TYPE"
! msgstr "Den givna typen är inte en DECL eller en TYPE"
  
  #: cobol/gengen.cc:413
  #, gcc-internal-format, gfc-internal-format
--- 52565,52613 ----
  msgstr "LEVEL 01 (%s) OCCURS har otilräcklig data.memsize"
  
  #: cobol/genapi.cc:16990
! #, gcc-internal-format
  msgid "%<parser_symbol_add()%> was called with a NULL %<new_var%>"
! msgstr "%<parser_symbol_add()%> anropades med en NULL %<new_var%>"
  
  #: cobol/genapi.cc:17020
! #, gcc-internal-format, gfc-internal-format
  msgid "%s: %d %s is a table, but it improperly has a capacity of zero"
! msgstr "%s: %d %s är en tabell, med den har oriktigt en kapacetet på noll"
  
  #: cobol/genapi.cc:17060
! #, gcc-internal-format, gfc-internal-format
  msgid "%s: %s is its own ancestor"
! msgstr "%s: %s är sin egen anfader"
  
  #: cobol/genapi.cc:17065
  #, gcc-internal-format
  msgid "%s: %d %qs has NULL ancestor"
! msgstr "%s: %d %qs har en NULL-anfader"
  
  #: cobol/genapi.cc:17072
! #, gcc-internal-format
  msgid "%s(%s) improperly has a non-null %<var_decl_node%>"
! msgstr "%s(%s) har oriktigt en null-skild %<var_decl_node%>"
  
  #: cobol/genapi.cc:17267
! #, gcc-internal-format, gfc-internal-format
  msgid "%s: %d %s<%s> improperly has a data.capacity of zero"
! msgstr "%s: %d %s<%s> har oriktigt en data.capacity på noll"
  
  #: cobol/genapi.cc:17334
  #, gcc-internal-format
  msgid "%<bytes_to_allocate%> is zero for %s (symbol number "
! msgstr "%<bytes_to_allocate%> är noll för %s (symbolnummer "
  
  #: cobol/gengen.cc:360
! #, gcc-internal-format
  msgid "The given type is NULL, and that is just not fair"
! msgstr "Den givna typen är NULL, och det är bara inte rättvist"
  
  #: cobol/gengen.cc:369
! #, gcc-internal-format
  msgid "The given type is not a declaration or a TYPE"
! msgstr "Den givna typen är inte en deklaration eller en TYPE"
  
  #: cobol/gengen.cc:413
  #, gcc-internal-format, gfc-internal-format
*************** msgstr "Okänd typ %d"
*** 52669,52687 ****
  #: cobol/gengen.cc:482
  #, gcc-internal-format
  msgid "Attempting an assignment of differing types."
! msgstr ""
  
  #: cobol/gengen.cc:2893
! #, fuzzy, gcc-internal-format
! #| msgid "Residual context count!"
  msgid "Residual context count"
! msgstr "Återstående kontextantal!"
  
  #: cobol/genmath.cc:1385
! #, fuzzy, gcc-internal-format
! #| msgid "parser_op() doesn't know how to evaluate \"%s = %s %c %s\"\n"
  msgid "%<parser_op()%> doesn%'t know how to evaluate %<%s = %s %c %s%>"
! msgstr "parser_op() vet inte hur den skall evaluera ”%s = %s %c %s”\n"
  
  #: cobol/genutil.cc:596
  #, gcc-internal-format
--- 52617,52633 ----
  #: cobol/gengen.cc:482
  #, gcc-internal-format
  msgid "Attempting an assignment of differing types."
! msgstr "Försök med tilldelning av olika typer."
  
  #: cobol/gengen.cc:2893
! #, gcc-internal-format
  msgid "Residual context count"
! msgstr "Återstående kontextantal"
  
  #: cobol/genmath.cc:1385
! #, gcc-internal-format
  msgid "%<parser_op()%> doesn%'t know how to evaluate %<%s = %s %c %s%>"
! msgstr "%<parser_op()%> vet inte hur den skall evaluera %<%s = %s %c %s%>"
  
  #: cobol/genutil.cc:596
  #, gcc-internal-format
*************** msgid "Too many subscripts"
*** 52689,52704 ****
  msgstr "För många index"
  
  #: cobol/genutil.cc:761
! #, fuzzy, gcc-internal-format
! #| msgid "cannot read string table from %s"
  msgid "cannot get %<float%> value from %s"
! msgstr "det går inte att läsa strängtabellen från %s"
  
  #: cobol/lexio.cc:1581
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "%s pid %d terminated by %s"
  msgid "%s pid %ld terminated by %s"
! msgstr "%s pid %d avslutade med %s"
  
  #: cobol/lexio.cc:1586
  #, gcc-internal-format, gfc-internal-format
--- 52635,52648 ----
  msgstr "För många index"
  
  #: cobol/genutil.cc:761
! #, gcc-internal-format
  msgid "cannot get %<float%> value from %s"
! msgstr "det går inte att hämta ett %<float%>-värde från %s"
  
  #: cobol/lexio.cc:1581
! #, gcc-internal-format, gfc-internal-format
  msgid "%s pid %ld terminated by %s"
! msgstr "%s pid %ld avslutade med %s"
  
  #: cobol/lexio.cc:1586
  #, gcc-internal-format, gfc-internal-format
*************** msgid "offset of %qT base class for %<-s
*** 54034,54043 ****
  msgstr "avståndet till %qT basklass för %<-std=c++14%> och uppåt ändras i %<-fabi-version=17%> (GCC 12)"
  
  #: cp/class.cc:6858
! #, fuzzy, gcc-internal-format
! #| msgid "offset of %qT base class for %<-std=c++14%> and up changes in %<-fabi-version=17%> (GCC 12)"
  msgid "offset of %qT base class for %<-std=c++20%> and up changes in %<-fabi-version=21%> (GCC 16)"
! msgstr "avståndet till %qT basklass för %<-std=c++14%> och uppåt ändras i %<-fabi-version=17%> (GCC 12)"
  
  #: cp/class.cc:6866
  #, gcc-internal-format
--- 53978,53986 ----
  msgstr "avståndet till %qT basklass för %<-std=c++14%> och uppåt ändras i %<-fabi-version=17%> (GCC 12)"
  
  #: cp/class.cc:6858
! #, gcc-internal-format
  msgid "offset of %qT base class for %<-std=c++20%> and up changes in %<-fabi-version=21%> (GCC 16)"
! msgstr "avståndet till %qT basklass för %<-std=c++20%> och uppåt ändras i %<-fabi-version=21%> (GCC 16)"
  
  #: cp/class.cc:6866
  #, gcc-internal-format
*************** msgid "offset of %qD for %<-std=c++14%>
*** 54045,54054 ****
  msgstr "avståndet till %qD för %<-std=c++14%> och uppåt ändras i %<-fabi-version=17%> (GCC 12)"
  
  #: cp/class.cc:6871
! #, fuzzy, gcc-internal-format
! #| msgid "offset of %qD for %<-std=c++14%> and up changes in %<-fabi-version=17%> (GCC 12)"
  msgid "offset of %qD for %<-std=c++20%> and up changes in %<-fabi-version=21%> (GCC 16)"
! msgstr "avståndet till %qD för %<-std=c++14%> och uppåt ändras i %<-fabi-version=17%> (GCC 12)"
  
  #: cp/class.cc:6912
  #, gcc-internal-format
--- 53988,53996 ----
  msgstr "avståndet till %qD för %<-std=c++14%> och uppåt ändras i %<-fabi-version=17%> (GCC 12)"
  
  #: cp/class.cc:6871
! #, gcc-internal-format
  msgid "offset of %qD for %<-std=c++20%> and up changes in %<-fabi-version=21%> (GCC 16)"
! msgstr "avståndet till %qD för %<-std=c++20%> och uppåt ändras i %<-fabi-version=21%> (GCC 16)"
  
  #: cp/class.cc:6912
  #, gcc-internal-format
*************** msgid "must be declared with %<noexcept(
*** 55694,55703 ****
  msgstr "måste deklareras med %<noexcept(true)%>"
  
  #: cp/coroutines.cc:1361 cp/coroutines.cc:1364
! #, fuzzy, gcc-internal-format
! #| msgid "awaitable type %qT is not a structure"
  msgid "%qs awaitable type %qT is not a structure"
! msgstr "den väntbara typen %qT är inte en post"
  
  #: cp/coroutines.cc:1367
  #, gcc-internal-format
--- 55636,55644 ----
  msgstr "måste deklareras med %<noexcept(true)%>"
  
  #: cp/coroutines.cc:1361 cp/coroutines.cc:1364
! #, gcc-internal-format
  msgid "%qs awaitable type %qT is not a structure"
! msgstr "%qs den väntbara typen %qT är inte en post"
  
  #: cp/coroutines.cc:1367
  #, gcc-internal-format
*************** msgid "%<await_suspend%> must return %<v
*** 55710,55719 ****
  msgstr "%<await_suspend%> måste returnera %<void%>, %<bool%> eller ett korutinhandtag"
  
  #: cp/coroutines.cc:1552 cp/coroutines.cc:1638
! #, fuzzy, gcc-internal-format
! #| msgid "%qs cannot be used in a varargs function"
  msgid "%qs cannot be used in an unevaluated context"
! msgstr "%qs kan inte användas i en varargs-funktion"
  
  #: cp/coroutines.cc:1821
  #, gcc-internal-format
--- 55651,55659 ----
  msgstr "%<await_suspend%> måste returnera %<void%>, %<bool%> eller ett korutinhandtag"
  
  #: cp/coroutines.cc:1552 cp/coroutines.cc:1638
! #, gcc-internal-format
  msgid "%qs cannot be used in an unevaluated context"
! msgstr "%qs kan inte användas i en oevaluerad kontext"
  
  #: cp/coroutines.cc:1821
  #, gcc-internal-format
*************** msgstr "dubblerad information för %qE"
*** 55743,55749 ****
  #: cp/coroutines.cc:3618
  #, gcc-internal-format
  msgid "assumption ignored because it contains an await-expression"
! msgstr ""
  
  #: cp/coroutines.cc:4125
  #, gcc-internal-format
--- 55683,55689 ----
  #: cp/coroutines.cc:3618
  #, gcc-internal-format
  msgid "assumption ignored because it contains an await-expression"
! msgstr "antagandet ignorerat för att det innehåller ett await-uttryck"
  
  #: cp/coroutines.cc:4125
  #, gcc-internal-format
*************** msgid "unable to represent further impor
*** 60990,61005 ****
  msgstr "kan inte representera ytterligare importerade källplatser"
  
  #: cp/module.cc:6549
! #, fuzzy, gcc-internal-format
! #| msgid "%<target%> attribute is not supported on this machine"
  msgid "%<target%> attribute currently unsupported in modules"
! msgstr "attributet %<target%> stödjs inte på denna maskin"
  
  #: cp/module.cc:6552
! #, fuzzy, gcc-internal-format
! #| msgid "%qE attribute only supported in C"
  msgid "%<optimize%> attribute currently unsupported in modules"
! msgstr "attributet %qE stödjs endast i C"
  
  #: cp/module.cc:12100
  #, gcc-internal-format
--- 60930,60943 ----
  msgstr "kan inte representera ytterligare importerade källplatser"
  
  #: cp/module.cc:6549
! #, gcc-internal-format
  msgid "%<target%> attribute currently unsupported in modules"
! msgstr "attributet %<target%> stödjs för närvarande inte i moduler"
  
  #: cp/module.cc:6552
! #, gcc-internal-format
  msgid "%<optimize%> attribute currently unsupported in modules"
! msgstr "attributet %<optimize%> stödjs för närvarande inte i moduler"
  
  #: cp/module.cc:12100
  #, gcc-internal-format
*************** msgid "%qD is declared %<constexpr%> and
*** 61182,61191 ****
  msgstr "%qD är deklarerad %<constexpr%> och är initierad till ett TU-lokal värde"
  
  #: cp/module.cc:15111
! #, fuzzy, gcc-internal-format
! #| msgid "%qD is declared %<constexpr%> and is initialized to a TU-local value"
  msgid "%qD is a reference declared %<inline%> and is constant-initialized to a TU-local value"
! msgstr "%qD är deklarerad %<constexpr%> och är initierad till ett TU-lokal värde"
  
  #: cp/module.cc:15150
  #, gcc-internal-format
--- 61120,61128 ----
  msgstr "%qD är deklarerad %<constexpr%> och är initierad till ett TU-lokal värde"
  
  #: cp/module.cc:15111
! #, gcc-internal-format
  msgid "%qD is a reference declared %<inline%> and is constant-initialized to a TU-local value"
! msgstr "%qD är en referens deklarerad %<inline%> och är konstantinitierad till ett TU-lokalt värde"
  
  #: cp/module.cc:15150
  #, gcc-internal-format
*************** msgid "Argument C_PTR_1 at %L to C_ASSOC
*** 70660,70669 ****
  msgstr "Argumentet C_PTR_1 vid %L till C_ASSOCIATED skall ha typen TYPE(C_PTR) eller TYPE(C_FUNPTR)"
  
  #: fortran/check.cc:6003
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "Argument C_PTR_2 at %L to C_ASSOCIATED shall have the same type as C_PTR_1: %s instead of %s"
  msgid "Argument C_PTR_2 at %L to C_ASSOCIATED shall have the same type as C_PTR_1, found %s instead of %s"
! msgstr "Argumentet C_PTR_2 vid %L till C_ASSOCIATED skall ha samma typ som C_PTR_1: %s istället för %s"
  
  #: fortran/check.cc:6036
  #, gcc-internal-format, gfc-internal-format
--- 70597,70605 ----
  msgstr "Argumentet C_PTR_1 vid %L till C_ASSOCIATED skall ha typen TYPE(C_PTR) eller TYPE(C_FUNPTR)"
  
  #: fortran/check.cc:6003
! #, gcc-internal-format, gfc-internal-format
  msgid "Argument C_PTR_2 at %L to C_ASSOCIATED shall have the same type as C_PTR_1, found %s instead of %s"
! msgstr "Argumentet C_PTR_2 vid %L till C_ASSOCIATED skall ha samma typ som C_PTR_1, hittade %s istället för %s"
  
  #: fortran/check.cc:6036
  #, gcc-internal-format, gfc-internal-format
*************** msgid "The H format specifier at %L is a
*** 75115,75124 ****
  msgstr "Formatspecificeraren H vid %L är en funktion borttagen i Fortran 95"
  
  #: fortran/io.cc:1232 fortran/io.cc:1295
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "Missing item in format string at %L"
  msgid "Missing comma in FORMAT string at %L"
! msgstr "Saknad post i formatsträngen vid %L"
  
  #: fortran/io.cc:1351
  #, gcc-internal-format, gfc-internal-format
--- 75051,75059 ----
  msgstr "Formatspecificeraren H vid %L är en funktion borttagen i Fortran 95"
  
  #: fortran/io.cc:1232 fortran/io.cc:1295
! #, gcc-internal-format, gfc-internal-format
  msgid "Missing comma in FORMAT string at %L"
! msgstr "Saknat komma i FORMAT-strängen vid %L"
  
  #: fortran/io.cc:1351
  #, gcc-internal-format, gfc-internal-format
*************** msgid "Coindexed allocatable object at %
*** 81761,81770 ****
  msgstr "Co-indexerat allokerbart objekt vid %L"
  
  #: fortran/resolve.cc:8727
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "Allocate-object at %L also appears at %L"
  msgid "Allocate-object at %L has rank %d but MOLD= expression at %L has rank %d"
! msgstr "Allokeringsobjekt vid %L förekommer också vid %L"
  
  #: fortran/resolve.cc:8738
  #, gcc-internal-format, gfc-internal-format
--- 81696,81704 ----
  msgstr "Co-indexerat allokerbart objekt vid %L"
  
  #: fortran/resolve.cc:8727
! #, gcc-internal-format, gfc-internal-format
  msgid "Allocate-object at %L has rank %d but MOLD= expression at %L has rank %d"
! msgstr "Allokeringsobjekt vid %L har ordningen %d men uttrycket MOLD= vid %L har ordningen %d"
  
  #: fortran/resolve.cc:8738
  #, gcc-internal-format, gfc-internal-format
*************** msgid "The base procedure at %L must hav
*** 84713,84722 ****
  msgstr "Basproceduren vid %L måste ha ett explicit gränssnitt"
  
  #: fortran/trans-openmp.cc:9710
! #, fuzzy, gcc-internal-format
! #| msgid "Cannot find symbol %qs"
  msgid "Cannot find symbol %qs at %L"
! msgstr "Kan inte hitta symbolen %qs"
  
  #: fortran/trans-openmp.cc:9723
  #, gcc-internal-format
--- 84647,84655 ----
  msgstr "Basproceduren vid %L måste ha ett explicit gränssnitt"
  
  #: fortran/trans-openmp.cc:9710
! #, gcc-internal-format
  msgid "Cannot find symbol %qs at %L"
! msgstr "Kan inte hitta symbolen %qs vid %L"
  
  #: fortran/trans-openmp.cc:9723
  #, gcc-internal-format
*************** msgstr "oanvänt namn %qE"
*** 86527,86568 ****
  #, gcc-internal-format, gfc-internal-format
  msgid "are you trying to break %s? how dare you?"
  msgstr "försöker du göra sönder %s? hur vågar du?"
- 
- #, c-format
- #~ msgid "Driving: (%ld)\n"
- #~ msgstr "Driver: (%ld)\n"
- 
- #, gcc-internal-format, gfc-internal-format
- #~ msgid "%s:%d: no symbol '%s' found"
- #~ msgstr "%s:%d: finns ingen symbol ”%s”"
- 
- #, gcc-internal-format
- #~ msgid "%<-Wabi%> won%'t warn about anything"
- #~ msgstr "%<-Wabi%> kommer inte att varna om något"
- 
- #, gcc-internal-format
- #~ msgid "%<-Wabi%> warns about differences from the most up-to-date ABI, which is also used by default"
- #~ msgstr "%<-Wabi%> varnar om skillnader mot den mest aktuella ABI:et, vilket även används som standard"
- 
- #, gcc-internal-format
- #~ msgid "use e.g. %<-Wabi=11%> to warn about changes from GCC 7"
- #~ msgstr "använd t.ex. %<-Wabi=11%> för att varna om ändringar sedan GCC 7"
- 
- #~ msgid "parser_symbol_add(): %2.2d %s has null ancestor"
- #~ msgstr "parser_symbol_add(): %2.2d %s har tom anfader"
- 
- #, gcc-internal-format
- #~ msgid "cannot specify %<override%> for a class"
- #~ msgstr "det går inte att ange %<override%> för en klass"
- 
- #, gcc-internal-format, gfc-internal-format
- #~ msgid "Missing comma at %L"
- #~ msgstr "Saknat komma vid %L"
- 
- #, gcc-internal-format
- #~ msgid "extend_ref(): Bad tail"
- #~ msgstr "extend_ref(): Felaktig svans"
- 
- #, gcc-internal-format, gfc-internal-format
- #~ msgid "Inconsistent coranks for operator at %L and %L"
- #~ msgstr "Inkonsistenta co-ordningar för operator vid %L och %L"
--- 86460,86462 ----
diff -Nrcpad gcc-16-20260125/gcc/pointer-query.cc gcc-16-20260201/gcc/pointer-query.cc
*** gcc-16-20260125/gcc/pointer-query.cc	Sun Jan 25 22:32:08 2026
--- gcc-16-20260201/gcc/pointer-query.cc	Sun Feb  1 22:32:08 2026
*************** get_offset_range (tree x, gimple *stmt,
*** 74,80 ****
      x = TREE_OPERAND (x, 0);
  
    tree type = TREE_TYPE (x);
!   if (!INTEGRAL_TYPE_P (type) && !POINTER_TYPE_P (type))
      return false;
  
     if (TREE_CODE (x) != INTEGER_CST
--- 74,85 ----
      x = TREE_OPERAND (x, 0);
  
    tree type = TREE_TYPE (x);
!   if ((!INTEGRAL_TYPE_P (type)
!        /* ???  We get along without caring about overflow by using
! 	  offset_int, but that falls apart when indexes are bigger
! 	  than pointer differences.  */
!        || TYPE_PRECISION (type) > TYPE_PRECISION (ptrdiff_type_node))
!       && !POINTER_TYPE_P (type))
      return false;
  
     if (TREE_CODE (x) != INTEGER_CST
diff -Nrcpad gcc-16-20260125/gcc/profile.cc gcc-16-20260201/gcc/profile.cc
*** gcc-16-20260125/gcc/profile.cc	Sun Jan 25 22:32:08 2026
--- gcc-16-20260201/gcc/profile.cc	Sun Feb  1 22:32:08 2026
*************** branch_prob (bool thunk)
*** 1554,1560 ****
  	      location_t loc = DECL_SOURCE_LOCATION (current_function_decl);
  	      if (!RESERVED_LOCATION_P (loc))
  		{
! 		  seen_locations.add (loc);
  		  expanded_location curr_location = expand_location (loc);
  		  output_location (&streamed_locations, curr_location.file,
  				   MAX (1, curr_location.line), &offset, bb);
--- 1554,1560 ----
  	      location_t loc = DECL_SOURCE_LOCATION (current_function_decl);
  	      if (!RESERVED_LOCATION_P (loc))
  		{
! 		  seen_locations.add (get_pure_location (loc));
  		  expanded_location curr_location = expand_location (loc);
  		  output_location (&streamed_locations, curr_location.file,
  				   MAX (1, curr_location.line), &offset, bb);
*************** branch_prob (bool thunk)
*** 1567,1573 ****
  	      location_t loc = gimple_location (stmt);
  	      if (!RESERVED_LOCATION_P (loc))
  		{
! 		  seen_locations.add (loc);
  		  output_location (&streamed_locations, gimple_filename (stmt),
  				   MAX (1, gimple_lineno (stmt)), &offset, bb);
  		}
--- 1567,1573 ----
  	      location_t loc = gimple_location (stmt);
  	      if (!RESERVED_LOCATION_P (loc))
  		{
! 		  seen_locations.add (get_pure_location (loc));
  		  output_location (&streamed_locations, gimple_filename (stmt),
  				   MAX (1, gimple_lineno (stmt)), &offset, bb);
  		}
*************** branch_prob (bool thunk)
*** 1580,1586 ****
  	  if (single_succ_p (bb)
  	      && (loc = single_succ_edge (bb)->goto_locus)
  	      && !RESERVED_LOCATION_P (loc)
! 	      && !seen_locations.contains (loc))
  	    {
  	      expanded_location curr_location = expand_location (loc);
  	      output_location (&streamed_locations, curr_location.file,
--- 1580,1586 ----
  	  if (single_succ_p (bb)
  	      && (loc = single_succ_edge (bb)->goto_locus)
  	      && !RESERVED_LOCATION_P (loc)
! 	      && !seen_locations.contains (get_pure_location (loc)))
  	    {
  	      expanded_location curr_location = expand_location (loc);
  	      output_location (&streamed_locations, curr_location.file,
diff -Nrcpad gcc-16-20260125/gcc/testsuite/ChangeLog gcc-16-20260201/gcc/testsuite/ChangeLog
*** gcc-16-20260125/gcc/testsuite/ChangeLog	Sun Jan 25 22:32:08 2026
--- gcc-16-20260201/gcc/testsuite/ChangeLog	Sun Feb  1 22:32:08 2026
***************
*** 1,3 ****
--- 1,973 ----
+ 2026-01-31  Jose E. Marchesi  <jemarch@gnu.org>
+ 
+ 	* algol68/execute/bits-test-1.a68: New test.
+ 
+ 2026-01-31  Jose E. Marchesi  <jemarch@gnu.org>
+ 
+ 	* algol68/execute/bits-clear-1.a68: New test.
+ 	* algol68/execute/bits-set-1.a68: Likewise.
+ 
+ 2026-01-31  Richard Biener  <rguenther@suse.de>
+ 
+ 	PR middle-end/123887
+ 	* gcc.dg/torture/pr123887-2.c: New testcase.
+ 
+ 2026-01-31  Nathaniel Shead  <nathanieloshead@gmail.com>
+ 
+ 	PR c++/123557
+ 	PR c++/123738
+ 	* g++.dg/cpp0x/constexpr-ice22.C: New test.
+ 	* g++.dg/cpp2a/constexpr-ref2.C: New test.
+ 
+ 2026-01-31  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR c++/123825
+ 	* g++.dg/reflect/has_identifier3.C: New test.
+ 	* g++.dg/reflect/identifier_of3.C: New test.
+ 	* g++.dg/cpp26/attr-indeterminate5.C: New test.
+ 
+ 2026-01-31  Iain Buclaw  <ibuclaw@gdcproject.org>
+ 
+ 	* gdc.dg/asm1.d: Adjust test.
+ 	* gdc.dg/asm5.d: Likewise.
+ 	* gdc.dg/pr100967.d: Likewise.
+ 	* gdc.dg/rtti1.d: Likewise.
+ 	* gdc.dg/rtti2.d: New test.
+ 
+ 2026-01-31  Alexandre Oliva  <oliva@adacore.com>
+ 
+ 	* gcc.target/arm/crypto-vsha1cq_u32.c: Accept d regs in
+ 	vdup.32.  Drop extraneous + after ] in vmov.32 pattern.
+ 	* gcc.target/arm/crypto-vsha1h_u32.c: Likewise.
+ 	* gcc.target/arm/crypto-vsha1mq_u32.c: Likewise.
+ 	* gcc.target/arm/crypto-vsha1pq_u32.c: Likewise.
+ 
+ 2026-01-31  Alexandre Oliva  <oliva@adacore.com>
+ 
+ 	* gcc.target/arm/bfloat16_simd_1_2.c: Add -mcpu=unset.
+ 	* gcc.target/arm/bfloat16_simd_2_2.c: Likewise.
+ 	* gcc.target/arm/bfloat16_simd_3_2.c: Likewise.
+ 	* gcc.dg/torture/pr120347.c: Likewise.  Add +fp to -march.
+ 
+ 2026-01-31  Alexandre Oliva  <oliva@adacore.com>
+ 
+ 	* gcc.dg/vect/complex/fast-math-complex-mls-half-float.c:
+ 	Don't expect COMPLEX_ADD_ROT270.
+ 
+ 2026-01-31  David Malcolm  <dmalcolm@redhat.com>
+ 
+ 	PR analyzer/123880
+ 	* g++.dg/analyzer/exception-rethrow-3.C: New test.
+ 
+ 2026-01-31  Jason Merrill  <jason@redhat.com>
+ 	    Nathaniel Shead  <nathanieloshead@gmail.com>
+ 
+ 	PR c++/122785
+ 	* g++.dg/modules/reflect-1_a.H: New test.
+ 	* g++.dg/modules/reflect-1_b.C: New test.
+ 
+ 2026-01-30  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
+ 
+ 	PR fortran/123868
+ 	* gfortran.dg/array_memcpy_2.f90: Update expected memcpy count
+ 	from 4 to 3, as the double allocation bug is now fixed.
+ 	* gfortran.dg/pr123868.f90: New test.
+ 	Signed-off-by: Christopher Albert <albert@alumni.tugraz.at>
+ 
+ 2026-01-30  Patrick Palka  <ppalka@redhat.com>
+ 
+ 	PR c++/123845
+ 	PR libstdc++/114865
+ 	* g++.dg/cpp0x/constexpr-ex3.C: Adjust C++11 non-empty
+ 	constexpr constructor dg-error to a dg-warning.  Expect
+ 	a follow-up missing member initializer diagnostic in C++11 mode.
+ 	* g++.dg/cpp2a/constexpr-try1.C: Expect a follow-up
+ 	compound-statement in constexpr function diagnostic in C++11
+ 	mode.
+ 	* g++.dg/cpp2a/constexpr-try2.C: Likewise.  Adjust C++11
+ 	non-empty constexpr constructor dg-error to a dg-warning.
+ 	* g++.dg/cpp2a/constexpr-try3.C:  Adjust C++11 non-empty
+ 	constexpr constructor dg-error to a dg-warning.
+ 	* g++.dg/cpp0x/constexpr-ctor23.C: New test.
+ 
+ 2026-01-30  Richard Biener  <rguenther@suse.de>
+ 
+ 	PR middle-end/123887
+ 	* gcc.dg/torture/pr123887.c: New testcase.
+ 
+ 2026-01-30  Marek Polacek  <polacek@redhat.com>
+ 
+ 	* g++.dg/reflect/define_aggregate3.C: Adjust expected diagnostic.
+ 	* g++.dg/reflect/p2996-21.C: Likewise.
+ 
+ 2026-01-30  Marek Polacek  <polacek@redhat.com>
+ 
+ 	* g++.dg/reflect/substitute3.C: New test.
+ 
+ 2026-01-30  Eric Botcazou  <ebotcazou@adacore.com>
+ 
+ 	* gnat.dg/specs/limited_with3.ads: New test.
+ 	* gnat.dg/specs/limited_with3-child.ads: New helper.
+ 	* gnat.dg/specs/limited_with3-child-grandchild.ads: Likewise.
+ 	* gnat.dg/specs/limited_with3-child-grandchild-grandgrandchild.ads:
+ 	Likewise.
+ 
+ 2026-01-30  Richard Biener  <rguenther@suse.de>
+ 
+ 	PR debug/110885
+ 	* g++.dg/debug/dwarf2/pr110885.C: New testcase.
+ 
+ 2026-01-30  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR tree-optimization/123864
+ 	* gcc.c-torture/execute/pr123864.c: New test.
+ 	* gcc.dg/torture/pr123864.c: New test.
+ 
+ 2026-01-30  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR c++/123790
+ 	* g++.dg/cpp0x/nullptr47.C: New test.
+ 
+ 2026-01-30  Iain Buclaw  <ibuclaw@gdcproject.org>
+ 
+ 	* gdc.dg/asm1.d: Adjust test.
+ 
+ 2026-01-30  Jørgen Kvalsvik  <j@lambda.is>
+ 
+ 	PR gcov-profile/123855
+ 	* gcc.misc-tests/gcov-pr123855.c: New test.
+ 
+ 2026-01-30  Jørgen Kvalsvik  <j@lambda.is>
+ 
+ 	* g++.dg/gcov/gcov-18.C: Remove --coverage.
+ 	* g++.dg/gcov/gcov-22.C: Likewise.
+ 	* gcc.misc-tests/gcov-19.c: Remove -ftest-coverage.
+ 	* gcc.misc-tests/gcov-29.c: Likewise.
+ 
+ 2026-01-30  Jørgen Kvalsvik  <j@lambda.is>
+ 
+ 	* gcc.misc-tests/gcov-29.c: Expect 6 prime paths in test.
+ 	* gcc.misc-tests/gcov-30.c: Likewise.
+ 
+ 2026-01-30  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR middle-end/123876
+ 	* gcc.dg/gomp/pr123876.c: New test.
+ 
+ 2026-01-30  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR preprocessor/123273
+ 	* c-c++-common/cpp/dir-only-10.c: New test.
+ 	* c-c++-common/cpp/dir-only-11.c: New test.
+ 
+ 2026-01-30  Alex Coplan  <alex.coplan@arm.com>
+ 
+ 	PR target/123206
+ 	* gcc.target/aarch64/pr123206.c: New test.
+ 
+ 2026-01-30  Iain Buclaw  <ibuclaw@gdcproject.org>
+ 
+ 	PR d/123263
+ 	* gdc.dg/debug/pr123263.d: New test.
+ 
+ 2026-01-30  Richard Biener  <rguenther@suse.de>
+ 
+ 	PR tree-optimization/109410
+ 	* gcc.dg/pr109410-2.c: New testcase.
+ 
+ 2026-01-30  Iain Buclaw  <ibuclaw@gdcproject.org>
+ 
+ 	PR d/123264
+ 	* gdc.dg/pr123264.d: New test.
+ 
+ 2026-01-30  Lulu Cheng  <chenglulu@loongson.cn>
+ 
+ 	PR target/123766
+ 	* gcc.target/loongarch/vector/lasx/pr123766.c: New test.
+ 	* gcc.target/loongarch/vector/lsx/pr123766.c: New test.
+ 
+ 2026-01-30  Lulu Cheng  <chenglulu@loongson.cn>
+ 
+ 	PR target/123807
+ 	* gcc.target/loongarch/vector/lsx/pr123807.c: New test.
+ 
+ 2026-01-30  mengqinggang  <mengqinggang@loongson.cn>
+ 
+ 	* gcc.target/loongarch/la64/movsf.c: New test.
+ 
+ 2026-01-29  Andrew Pinski  <andrew.pinski@oss.qualcomm.com>
+ 
+ 	* gcc.target/i386/pr116353.c: Move to...
+ 	* gcc.dg/torture/pr116353.c: ...here.
+ 
+ 2026-01-29  Eric Botcazou  <ebotcazou@adacore.com>
+ 
+ 	* gnat.dg/specs/aggr11.ads: New test.
+ 
+ 2026-01-29  Richard Earnshaw  <rearnsha@arm.com>
+ 	    Artemiy Volkov  <artemiy.volkov@arm.com>
+ 
+ 	* lib/target-supports.exp:
+ 	(check_effective_target_arm_v8_3a_complex_neon_ok_nocache):
+ 	Split and fill in arm and aarch64 compile options.  Remove the
+ 	cpu_unset variable.
+ 	(check_effective_target_arm_v8_2a_fp16_neon_ok_nocache): Likewise.
+ 	(check_effective_target_arm_v8_3a_fp16_complex_neon_ok_nocache):
+ 	Likewise.
+ 	(check_effective_target_arm_neon_ok_nocache): Rework to use
+ 	-mfpu=auto.
+ 	(check_effective_target_arm_neon_fp16_ok_nocache): Likewise.
+ 
+ 2026-01-29  Artemiy Volkov  <artemiy.volkov@arm.com>
+ 
+ 	* gcc.dg/vect/complex/fast-math-bb-slp-complex-add-half-float.c:
+ 	Adjust testcase.
+ 	* gcc.dg/vect/complex/fast-math-bb-slp-complex-add-pattern-half-float.c:
+ 	Likewise.
+ 	* gcc.dg/vect/complex/fast-math-bb-slp-complex-mla-half-float.c:
+ 	Likewise.
+ 	* gcc.dg/vect/complex/fast-math-bb-slp-complex-mls-half-float.c:
+ 	Likewise.
+ 	* gcc.dg/vect/complex/fast-math-bb-slp-complex-mul-half-float.c:
+ 	Likewise.
+ 	* gcc.dg/vect/complex/fast-math-complex-add-half-float.c: Likewise.
+ 	* gcc.dg/vect/complex/fast-math-complex-add-pattern-half-float.c:
+ 	Likewise.
+ 	* gcc.dg/vect/complex/fast-math-complex-mla-half-float.c:
+ 	Likewise.
+ 	* gcc.dg/vect/complex/fast-math-complex-mls-half-float.c:
+ 	Likewise.
+ 	* gcc.dg/vect/complex/fast-math-complex-mul-half-float.c:
+ 	Likewise.
+ 	* gcc.target/aarch64/advsimd-intrinsics/vector-complex_f16.c:
+ 	Likewise.
+ 
+ 2026-01-29  Christopher Bazley  <chris.bazley@arm.com>
+ 
+ 	* gcc.target/arm/stack-protector-7.c: Fix dgdirectives.
+ 
+ 2026-01-29  Robin Dapp  <rdapp@oss.qualcomm.com>
+ 
+ 	PR target/123806
+ 	* g++.target/riscv/rvv/base/pr123806.C: New test.
+ 	* g++.target/riscv/rvv/base/pr123808.C: New test.
+ 	* g++.target/riscv/rvv/base/pr123808-2.C: New test.
+ 
+ 2026-01-29  Robin Dapp  <rdapp@oss.qualcomm.com>
+ 
+ 	* lib/target-supports.exp: Add rvv_zvl_ge_256b_ok.
+ 	* gcc.target/riscv/rvv/base/pr123626.c: Use new target check.
+ 
+ 2026-01-29  Iain Buclaw  <ibuclaw@gdcproject.org>
+ 
+ 	PR d/123407
+ 	* gdc.dg/pr123407a.d: New test.
+ 	* gdc.dg/pr123407b.d: New test.
+ 
+ 2026-01-29  Marek Polacek  <polacek@redhat.com>
+ 
+ 	PR c++/123871
+ 	* g++.dg/reflect/error11.C: New test.
+ 
+ 2026-01-29  Iain Buclaw  <ibuclaw@gdcproject.org>
+ 
+ 	PR d/123046
+ 	* gdc.dg/pr123046.d: New test.
+ 
+ 2026-01-29  Richard Biener  <rguenther@suse.de>
+ 
+ 	PR tree-optimization/122537
+ 	* gcc.dg/torture/pr122537.c: New testcase.
+ 
+ 2026-01-29  Iain Buclaw  <ibuclaw@gdcproject.org>
+ 
+ 	PR d/123349
+ 	* gdc.dg/driver_debuglib.d: New test.
+ 	* gdc.dg/driver_defaultlib.d: New test.
+ 
+ 2026-01-29  Richard Biener  <rguenther@suse.de>
+ 
+ 	PR tree-optimization/123596
+ 	* g++.dg/torture/pr123596.C: New testcase.
+ 
+ 2026-01-29  Richard Biener  <rguenther@suse.de>
+ 
+ 	PR tree-optimization/116747
+ 	* gcc.dg/tree-ssa/cselim-4.c: New testcase.
+ 
+ 2026-01-29  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR c++/123866
+ 	* g++.dg/reflect/annotations10.C: New test.
+ 
+ 2026-01-29  Jose E. Marchesi  <jemarch@gnu.org>
+ 
+ 	* algol68/compile/error-selector-1.a68: New test.
+ 	* algol68/execute/selection-2.a68: Update test.
+ 	* algol68/execute/selection-5.a68: Likewise.
+ 
+ 2026-01-29  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	* g++.dg/cpp26/expansion-stmt1.C (N::begin, N::end, O::begin,
+ 	O::end): Change argument type from B & to const B & or from
+ 	D & to const D &.
+ 	* g++.dg/cpp26/expansion-stmt2.C (N::begin, N::end, O::begin,
+ 	O::end): Likewise.
+ 	* g++.dg/cpp26/expansion-stmt3.C (N::begin, N::end, O::begin,
+ 	O::end): Likewise.
+ 	* g++.dg/cpp26/expansion-stmt16.C: Expect different diagnostics
+ 	for C++11.
+ 	* g++.dg/cpp26/expansion-stmt18.C (N::begin, N::end): Change
+ 	argument type from B & to const B &.
+ 	* g++.dg/cpp26/expansion-stmt25.C (N::begin, N::end): Likewise.
+ 	* g++.dg/cpp26/expansion-stmt26.C: New test.
+ 	* g++.dg/reflect/p3491-2.C (baz): Move workaround to a new
+ 	function garply, use the previously #if 0 guarded implementation.
+ 	(garply): New function.
+ 
+ 2026-01-29  Jose E. Marchesi  <jemarch@gnu.org>
+ 
+ 	* algol68/compile/error-nest-1.a68: New test.
+ 	* algol68/compile/nest-c-1.a68: Likewise.
+ 	* algol68/compile/error-nest-5.a68: Likewise.
+ 	* algol68/compile/error-nest-4.a68: Likewise.
+ 	* algol68/compile/error-nest-3.a68: Likewise.
+ 	* algol68/compile/error-nest-2.a68: Likewise.
+ 
+ 2026-01-28  Eric Botcazou  <ebotcazou@adacore.com>
+ 
+ 	* gnat.dg/unchecked_union4.adb: New test.
+ 
+ 2026-01-28  Eric Botcazou  <ebotcazou@adacore.com>
+ 
+ 	* gnat.dg/put_image2.adb: New test.
+ 
+ 2026-01-28  Iain Buclaw  <ibuclaw@gdcproject.org>
+ 
+ 	PR d/123419
+ 	* gdc.dg/pr123419.d: New test.
+ 
+ 2026-01-28  Iain Buclaw  <ibuclaw@gdcproject.org>
+ 
+ 	PR d/123798
+ 	* gdc.dg/pr123798.d: New test.
+ 
+ 2026-01-28  Uros Bizjak  <ubizjak@gmail.com>
+ 
+ 	PR target/36503
+ 	* gcc.target/i386/pr36503-5.c: New test.
+ 	* gcc.target/i386/pr36503-6.c: New test.
+ 
+ 2026-01-28  Robin Dapp  <rdapp@oss.qualcomm.com>
+ 
+ 	PR target/123824
+ 	* gcc.target/riscv/abi/vls-gpr-1.c: New test.
+ 	* gcc.target/riscv/abi/vls-gpr-10.c: New test.
+ 	* gcc.target/riscv/abi/vls-gpr-11.c: New test.
+ 	* gcc.target/riscv/abi/vls-gpr-12.c: New test.
+ 	* gcc.target/riscv/abi/vls-gpr-13.c: New test.
+ 	* gcc.target/riscv/abi/vls-gpr-14.c: New test.
+ 	* gcc.target/riscv/abi/vls-gpr-2.c: New test.
+ 	* gcc.target/riscv/abi/vls-gpr-3.c: New test.
+ 	* gcc.target/riscv/abi/vls-gpr-4.c: New test.
+ 	* gcc.target/riscv/abi/vls-gpr-5.c: New test.
+ 	* gcc.target/riscv/abi/vls-gpr-6.c: New test.
+ 	* gcc.target/riscv/abi/vls-gpr-7.c: New test.
+ 	* gcc.target/riscv/abi/vls-gpr-8.c: New test.
+ 	* gcc.target/riscv/abi/vls-gpr-9.c: New test.
+ 
+ 2026-01-28  Andrew Pinski  <andrew.pinski@oss.qualcomm.com>
+ 
+ 	PR c++/102846
+ 	PR c/102846
+ 	* c-c++-common/function-like-macro-1.c: New test.
+ 	* c-c++-common/function-like-macro-2.c: New test.
+ 
+ 2026-01-28  Iain Buclaw  <ibuclaw@gdcproject.org>
+ 
+ 	PR d/121477
+ 	* gdc.dg/pr121477.d: New test.
+ 
+ 2026-01-28  Vladimir N. Makarov  <vmakarov@redhat.com>
+ 
+ 	PR target/121571
+ 	* gcc.target/i386/pr121571.c: New.
+ 
+ 2026-01-28  Iain Buclaw  <ibuclaw@gdcproject.org>
+ 
+ 	PR d/123422
+ 	* gdc.dg/torture/pr123422.d: New test.
+ 
+ 2026-01-28  Senthil Kumar Selvaraj  <saaadhu@gcc.gnu.org>
+ 
+ 	PR c/123583
+ 	* gcc.target/avr/pr123583.c: New test.
+ 	* gcc.target/i386/pr123583.c: New test.
+ 
+ 2026-01-28  Richard Biener  <rguenther@suse.de>
+ 
+ 	PR middle-end/123575
+ 	* g++.dg/pr123575.C: New testcase.
+ 
+ 2026-01-28  Richard Biener  <rguenther@suse.de>
+ 
+ 	PR ipa/111036
+ 	* gcc.dg/torture/pr111036.c: New testcase.
+ 
+ 2026-01-28  Richard Biener  <rguenther@suse.de>
+ 
+ 	PR tree-optimization/123537
+ 	* gcc.dg/pr123537.c: New testcase.
+ 
+ 2026-01-28  Karl Meakin  <karl.meakin@arm.com>
+ 
+ 	* lib/target-supports.exp: Add `sve-bfscale` to `sve_exts`.
+ 	* gcc.target/aarch64/pragma_cpp_predefs_4.c: Add test for `__ARM_SVE_FEATURE_BFSCALE`.
+ 	* gcc.target/aarch64/sme2/acle-asm/mul_bf16_x2.c: New test.
+ 	* gcc.target/aarch64/sme2/acle-asm/mul_bf16_x4.c: New test.
+ 	* gcc.target/aarch64/sme2/acle-asm/scale_bf16_x2.c: New test.
+ 	* gcc.target/aarch64/sme2/acle-asm/scale_bf16_x4.c: New test.
+ 	* gcc.target/aarch64/sve/acle/asm/scale_bf16.c: New test.
+ 	* gcc.target/aarch64/sve/acle/general-c/bfscale.c: New test.
+ 
+ 2026-01-28  Pengfei Li  <Pengfei.Li2@arm.com>
+ 
+ 	PR middle-end/123447
+ 	* gcc.dg/pr123447.c: New test.
+ 
+ 2026-01-28  Andre Vieira  <andre.simoesdiasvieira@arm.com>
+ 
+ 	* gfortran.dg/vect/pr123016.f90: New test.
+ 
+ 2026-01-28  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR c++/102613
+ 	* g++.dg/cpp1z/constexpr-asm-6.C: New test.
+ 	* g++.dg/cpp23/charset2.C: New test.
+ 	* g++.dg/cpp23/charset3.C: New test.
+ 	* g++.dg/cpp23/charset4.C: New test.
+ 	* g++.dg/cpp23/charset5.C: New test.
+ 
+ 2026-01-28  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	* g++.dg/cpp26/expansion-stmt1.C (A::operator -, C::operator -): New.
+ 	* g++.dg/cpp26/expansion-stmt2.C (A::operator -, C::operator -): New.
+ 	* g++.dg/cpp26/expansion-stmt3.C (A::operator -, C::operator -): New.
+ 	* g++.dg/cpp26/expansion-stmt18.C  (A::operator -): New.
+ 	* g++.dg/cpp26/expansion-stmt25.C: New test.
+ 
+ 2026-01-28  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR c/101312
+ 	* c-c++-common/pr101312-1.c: New test.
+ 	* c-c++-common/pr101312-2.c: New test.
+ 
+ 2026-01-28  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR c++/123837
+ 	* g++.dg/reflect/annotations9.C: New test.
+ 
+ 2026-01-28  Andrew Pinski  <andrew.pinski@oss.qualcomm.com>
+ 
+ 	PR tree-optimization/123849
+ 	* g++.dg/warn/Wmismatched-new-delete-11.C: New test.
+ 
+ 2026-01-28  Richard Biener  <rguenther@suse.de>
+ 
+ 	PR tree-optimization/110043
+ 	* gcc.dg/torture/pr110043.c: New testcase.
+ 
+ 2026-01-28  Hongyu Wang  <hongyu.wang@intel.com>
+ 
+ 	PR target/123779
+ 	* g++.target/i386/pr123779.C: New test.
+ 
+ 2026-01-28  Alex Yesmanchyk  <aliaksandr.yesmanchyk@gmail.com>
+ 	    Jason Merrill  <jason@redhat.com>
+ 
+ 	PR c++/38612
+ 	* g++.dg/diagnostic/ptrtomem4.C: New test.
+ 
+ 2026-01-28  vspefs  <vspefs@protonmail.com>
+ 
+ 	* g++.dg/modules/splice-scope-tree_a.C: New test.
+ 	* g++.dg/modules/splice-scope-tree_b.C: New test.
+ 
+ 2026-01-28  Lucas Chollet  <lucas.chollet@free.fr>
+ 	    Jason Merrill  <jason@redhat.com>
+ 
+ 	PR c++/114450
+ 	* g++.dg/warn/Wunused-var-42.C: New test.
+ 
+ 2026-01-28  Johannes Altmanninger  <aclopte@gmail.com>
+ 	    Jason Merrill  <jason@redhat.com>
+ 
+ 	* g++.dg/warn/Wunused-value-2.C: New test.
+ 
+ 2026-01-28  Nina Ranns  <dinka.ranns@gmail.com>
+ 	    Iain Sandoe  <iain@sandoe.co.uk>
+ 	    Ville Voutilainen  <ville.voutilainen@gmail.com>
+ 
+ 	* g++.dg/contracts/cpp26/callerside-checks/callerside-checks-all.C: New test.
+ 	* g++.dg/contracts/cpp26/callerside-checks/callerside-checks-non-trivial.C: New test.
+ 	* g++.dg/contracts/cpp26/callerside-checks/callerside-checks-none.C: New test.
+ 	* g++.dg/contracts/cpp26/callerside-checks/callerside-checks-pre.C: New test.
+ 	* g++.dg/contracts/cpp26/callerside-checks/ctor.C: New test.
+ 	* g++.dg/contracts/cpp26/callerside-checks/freefunc-noexcept-post.C: New test.
+ 	* g++.dg/contracts/cpp26/callerside-checks/freefunc-noexcept-pre.C: New test.
+ 	* g++.dg/contracts/cpp26/definition-checks/contract-assert-no-def-check.C: New test.
+ 	* g++.dg/contracts/cpp26/non-trivial-ice.C: New test.
+ 
+ 2026-01-28  Nina Ranns  <dinka.ranns@gmail.com>
+ 	    Iain Sandoe  <iain@sandoe.co.uk>
+ 	    Ville Voutilainen  <ville.voutilainen@gmail.com>
+ 
+ 	* g++.dg/contracts/cpp26/outline-checks/freefunc-noexcept-post.C: New test.
+ 	* g++.dg/contracts/cpp26/outline-checks/freefunc-noexcept-pre.C: New test.
+ 	* g++.dg/contracts/cpp26/outline-checks/func-noexcept-assert.C: New test.
+ 	* g++.dg/contracts/cpp26/outline-checks/memberfunc-noexcept-post.C: New test.
+ 	* g++.dg/contracts/cpp26/outline-checks/memberfunc-noexcept-pre.C: New test.
+ 	* g++.dg/contracts/cpp26/empty-nt-param.C: Test with outlined checks.
+ 	* g++.dg/contracts/cpp26/expr.prim.id.unqual.p7-3.C: New file.
+ 	* g++.dg/contracts/cpp26/expr.prim.id.unqual.p7-4.C: New file.
+ 
+ 2026-01-28  Iain Sandoe  <iain@sandoe.co.uk>
+ 	    Nina Ranns  <dinka.ranns@gmail.com>
+ 	    Ville Voutilainen  <ville.voutilainen@gmail.com>
+ 
+ 	PR c++/113968
+ 	PR c++/110871
+ 	PR c++/110872
+ 	* g++.dg/contracts/cpp26/BZ121936-workaround-noipa.C: New test.
+ 	* g++.dg/contracts/cpp26/assertion-statement-errors.C: New test.
+ 	* g++.dg/contracts/cpp26/assertion-statement.C: New test.
+ 	* g++.dg/contracts/cpp26/basic.contract.eval.p11-observe.C: New test.
+ 	* g++.dg/contracts/cpp26/basic.contract.eval.p14.C: New test.
+ 	* g++.dg/contracts/cpp26/basic.contract.eval.p17-2.C: New test.
+ 	* g++.dg/contracts/cpp26/basic.contract.eval.p17-3.C: New test.
+ 	* g++.dg/contracts/cpp26/basic.contract.eval.p17-4.C: New test.
+ 	* g++.dg/contracts/cpp26/basic.contract.eval.p17-5.C: New test.
+ 	* g++.dg/contracts/cpp26/basic.contract.eval.p17-SMF-post.C: New test.
+ 	* g++.dg/contracts/cpp26/basic.contract.eval.p17-SMF-pre.C: New test.
+ 	* g++.dg/contracts/cpp26/basic.contract.eval.p17-SMF2.C: New test.
+ 	* g++.dg/contracts/cpp26/basic.contract.eval.p17-SMF3.C: New test.
+ 	* g++.dg/contracts/cpp26/basic.contract.eval.p17-SMF4.C: New test.
+ 	* g++.dg/contracts/cpp26/basic.contract.eval.p17.C: New test.
+ 	* g++.dg/contracts/cpp26/basic.contract.eval.p4-error.C: New test.
+ 	* g++.dg/contracts/cpp26/basic.contract.eval.p4.C: New test.
+ 	* g++.dg/contracts/cpp26/basic.contract.eval.p6.C: New test.
+ 	* g++.dg/contracts/cpp26/basic.contract.eval.p6.observe.C: New test.
+ 	* g++.dg/contracts/cpp26/basic.scope.contract.p1.C: New test.
+ 	* g++.dg/contracts/cpp26/basic.scope.contract.p2.1.C: New test.
+ 	* g++.dg/contracts/cpp26/contract-assert-run.C: New test.
+ 	* g++.dg/contracts/cpp26/contract-assert-warn-attributes.C: New test.
+ 	* g++.dg/contracts/cpp26/contract-violation-noexcept.C: New test.
+ 	* g++.dg/contracts/cpp26/contract-violation-noexcept2.C: New test.
+ 	* g++.dg/contracts/cpp26/contract_genericize.C: New test.
+ 	* g++.dg/contracts/cpp26/contracts-friend1.C: New test.
+ 	* g++.dg/contracts/cpp26/contracts-nested-class1.C: New test.
+ 	* g++.dg/contracts/cpp26/contracts-nested-class2.C: New test.
+ 	* g++.dg/contracts/cpp26/contracts-tmpl-spec2.C: New test.
+ 	* g++.dg/contracts/cpp26/dcl.contract.func.p4.C: New test.
+ 	* g++.dg/contracts/cpp26/dcl.contract.func.p6.C: New test.
+ 	* g++.dg/contracts/cpp26/dcl.contract.res.p1-NT.C: New test.
+ 	* g++.dg/contracts/cpp26/dcl.contract.res.p1.C: New test.
+ 	* g++.dg/contracts/cpp26/dcl.contract.res.p2.C: New test.
+ 	* g++.dg/contracts/cpp26/debug-and-opt.C: New test.
+ 	* g++.dg/contracts/cpp26/deferred1.C: New test.
+ 	* g++.dg/contracts/cpp26/dependent_contract.C: New test.
+ 	* g++.dg/contracts/cpp26/empty-nt-param.C: New test.
+ 	* g++.dg/contracts/cpp26/function-contract-specifier-seq-error.C: New test.
+ 	* g++.dg/contracts/cpp26/function-contract-specifier-seq.C: New test.
+ 	* g++.dg/contracts/cpp26/lambda.C: New test.
+ 	* g++.dg/contracts/cpp26/name_mangling.C: New test.
+ 	* g++.dg/contracts/cpp26/over.call.func.p3.1.C: New test.
+ 	* g++.dg/contracts/cpp26/pr113968.C: New test.
+ 	* g++.dg/contracts/cpp26/src-loc-0.C: New test.
+ 	* g++.dg/contracts/cpp26/src-loc-1.C: New test.
+ 	* g++.dg/contracts/cpp26/src-loc-2.C: New test.
+ 	* g++.dg/contracts/cpp26/throwing-violation-handler.cc: New test.
+ 	* g++.dg/contracts/cpp26/unused_warning.C: New test.
+ 	* g++.dg/contracts/cpp26/vaargs.C: New test.
+ 	* g++.dg/contracts/cpp2a/check-err.C: New test.
+ 	* g++.dg/coroutines/pr110871.C: New test.
+ 	* g++.dg/coroutines/pr110872.C: New test.
+ 	* g++.dg/contracts/cpp26/basic.contract.eval.p8.C: New test.
+ 	* g++.dg/contracts/cpp26/dcl.contract.func.p7.C: New test.
+ 	* g++.dg/contracts/cpp26/dcl.contract.res.p1-2.C: New test.
+ 	* g++.dg/contracts/cpp26/expr.prim.id.unqual.p7-2.C: New test.
+ 	* g++.dg/contracts/cpp26/expr.prim.id.unqual.p7.C: New test.
+ 	* g++.dg/contracts/cpp26/basic.contract.eval.p7.3.C: New test.
+ 	* g++.dg/contracts/cpp26/intro.compliance.general.p2.3.4.C: New test.
+ 	* g++.dg/contracts/cpp26/dcl.contract.func.p7-t1.C: New file.
+ 	* g++.dg/contracts/cpp26/dcl.contract.func.p7-t2.C: New file.
+ 
+ 2026-01-28  Iain Sandoe  <iain@sandoe.co.uk>
+ 	    Nina Ranns  <dinka.ranns@gmail.com>
+ 	    Ville Voutilainen  <ville.voutilainen@gmail.com>
+ 
+ 	* g++.dg/warn/Wkeyword-macro-1.C: Update for contract_assert.
+ 	* g++.dg/warn/Wkeyword-macro-2.C: Likewise.
+ 	* g++.dg/warn/Wkeyword-macro-4.C: Likewise.
+ 	* g++.dg/warn/Wkeyword-macro-5.C: Likewise.
+ 	* g++.dg/warn/Wkeyword-macro-7.C: Likewise.
+ 	* g++.dg/warn/Wkeyword-macro-8.C: Likewise.
+ 	* g++.dg/contracts/cpp26/basic.contract.eval.p8-2.C: New file.
+ 
+ 2026-01-28  Iain Sandoe  <iain@sandoe.co.uk>
+ 	    Nina Ranns  <dinka.ranns@gmail.com>
+ 
+ 	* g++.dg/contracts/contracts-access1.C: Removed.
+ 	* g++.dg/contracts/contracts-assume1.C: Removed.
+ 	* g++.dg/contracts/contracts-assume2.C: Removed.
+ 	* g++.dg/contracts/contracts-assume3.C: Removed.
+ 	* g++.dg/contracts/contracts-assume4.C: Removed.
+ 	* g++.dg/contracts/contracts-assume5.C: Removed.
+ 	* g++.dg/contracts/contracts-assume6.C: Removed.
+ 	* g++.dg/contracts/contracts-comdat1.C: Removed.
+ 	* g++.dg/contracts/contracts-config1.C: Removed.
+ 	* g++.dg/contracts/contracts-constexpr1.C: Removed.
+ 	* g++.dg/contracts/contracts-constexpr2.C: Removed.
+ 	* g++.dg/contracts/contracts-constexpr3.C: Removed.
+ 	* g++.dg/contracts/contracts-conversion1.C: Removed.
+ 	* g++.dg/contracts/contracts-ctor-dtor1.C: Removed.
+ 	* g++.dg/contracts/contracts-ctor-dtor2.C: Removed.
+ 	* g++.dg/contracts/contracts-cv1.C: Removed.
+ 	* g++.dg/contracts/contracts-deduced1.C: Removed.
+ 	* g++.dg/contracts/contracts-deduced2.C: Removed.
+ 	* g++.dg/contracts/contracts-err1.C: Removed.
+ 	* g++.dg/contracts/contracts-externC.C: Removed.
+ 	* g++.dg/contracts/contracts-friend1.C: Removed.
+ 	* g++.dg/contracts/contracts-ft1.C: Removed.
+ 	* g++.dg/contracts/contracts-ignore1.C: Removed.
+ 	* g++.dg/contracts/contracts-ignore2.C: Removed.
+ 	* g++.dg/contracts/contracts-large-return.C: Removed.
+ 	* g++.dg/contracts/contracts-multiline1.C: Removed.
+ 	* g++.dg/contracts/contracts-multiple-inheritance1.C: Removed.
+ 	* g++.dg/contracts/contracts-multiple-inheritance2.C: Removed.
+ 	* g++.dg/contracts/contracts-nested-class1.C: Removed.
+ 	* g++.dg/contracts/contracts-nested-class2.C: Removed.
+ 	* g++.dg/contracts/contracts-nocopy1.C: Removed.
+ 	* g++.dg/contracts/contracts-override.C: Removed.
+ 	* g++.dg/contracts/contracts-post1.C: Removed.
+ 	* g++.dg/contracts/contracts-post2.C: Removed.
+ 	* g++.dg/contracts/contracts-post3.C: Removed.
+ 	* g++.dg/contracts/contracts-post4.C: Removed.
+ 	* g++.dg/contracts/contracts-post5.C: Removed.
+ 	* g++.dg/contracts/contracts-post6.C: Removed.
+ 	* g++.dg/contracts/contracts-post7.C: Removed.
+ 	* g++.dg/contracts/contracts-pre1.C: Removed.
+ 	* g++.dg/contracts/contracts-pre10.C: Removed.
+ 	* g++.dg/contracts/contracts-pre2.C: Removed.
+ 	* g++.dg/contracts/contracts-pre2a1.C: Removed.
+ 	* g++.dg/contracts/contracts-pre2a2.C: Removed.
+ 	* g++.dg/contracts/contracts-pre3.C: Removed.
+ 	* g++.dg/contracts/contracts-pre4.C: Removed.
+ 	* g++.dg/contracts/contracts-pre5.C: Removed.
+ 	* g++.dg/contracts/contracts-pre6.C: Removed.
+ 	* g++.dg/contracts/contracts-pre7.C: Removed.
+ 	* g++.dg/contracts/contracts-pre9.C: Removed.
+ 	* g++.dg/contracts/contracts-redecl1.C: Removed.
+ 	* g++.dg/contracts/contracts-redecl2.C: Removed.
+ 	* g++.dg/contracts/contracts-redecl3.C: Removed.
+ 	* g++.dg/contracts/contracts-redecl4.C: Removed.
+ 	* g++.dg/contracts/contracts-redecl5.C: Removed.
+ 	* g++.dg/contracts/contracts-redecl6.C: Removed.
+ 	* g++.dg/contracts/contracts-redecl7.C: Removed.
+ 	* g++.dg/contracts/contracts-redecl8.C: Removed.
+ 	* g++.dg/contracts/contracts-tmpl-attr1.C: Removed.
+ 	* g++.dg/contracts/contracts-tmpl-spec1.C: Removed.
+ 	* g++.dg/contracts/contracts-tmpl-spec2.C: Removed.
+ 	* g++.dg/contracts/contracts-tmpl-spec3.C: Removed.
+ 	* g++.dg/contracts/contracts1.C: Removed.
+ 	* g++.dg/contracts/contracts10.C: Removed.
+ 	* g++.dg/contracts/contracts11.C: Removed.
+ 	* g++.dg/contracts/contracts12.C: Removed.
+ 	* g++.dg/contracts/contracts13.C: Removed.
+ 	* g++.dg/contracts/contracts14.C: Removed.
+ 	* g++.dg/contracts/contracts15.C: Removed.
+ 	* g++.dg/contracts/contracts16.C: Removed.
+ 	* g++.dg/contracts/contracts17.C: Removed.
+ 	* g++.dg/contracts/contracts18.C: Removed.
+ 	* g++.dg/contracts/contracts19.C: Removed.
+ 	* g++.dg/contracts/contracts2.C: Removed.
+ 	* g++.dg/contracts/contracts20.C: Removed.
+ 	* g++.dg/contracts/contracts22.C: Removed.
+ 	* g++.dg/contracts/contracts24.C: Removed.
+ 	* g++.dg/contracts/contracts25.C: Removed.
+ 	* g++.dg/contracts/contracts3.C: Removed.
+ 	* g++.dg/contracts/contracts35.C: Removed.
+ 	* g++.dg/contracts/contracts4.C: Removed.
+ 	* g++.dg/contracts/contracts5.C: Removed.
+ 	* g++.dg/contracts/contracts6.C: Removed.
+ 	* g++.dg/contracts/contracts7.C: Removed.
+ 	* g++.dg/contracts/pr110159.C: Removed.
+ 	* g++.dg/contracts/pr113968.C: Removed.
+ 	* g++.dg/contracts/pr115434.C: Removed.
+ 	* g++.dg/contracts/pr116490.C: Removed.
+ 	* g++.dg/contracts/pr116607.C: Removed.
+ 	* g++.dg/contracts/pr117579.C: Removed.
+ 	* g++.dg/contracts/noexcept_preload_handler/Makefile: Removed.
+ 	* g++.dg/contracts/noexcept_preload_handler/README: Removed.
+ 	* g++.dg/contracts/noexcept_preload_handler/assert_fail.cpp: Removed.
+ 	* g++.dg/contracts/noexcept_preload_handler/handle_contract_violation.cpp: Removed.
+ 	* g++.dg/contracts/preload_handler/Makefile: Removed.
+ 	* g++.dg/contracts/preload_handler/README: Removed.
+ 	* g++.dg/contracts/preload_handler/assert_fail.cpp: Removed.
+ 	* g++.dg/contracts/preload_handler/handle_contract_violation.cpp: Removed.
+ 	* g++.dg/contracts/preload_nocontinue_handler/Makefile: Removed.
+ 	* g++.dg/contracts/preload_nocontinue_handler/README: Removed.
+ 	* g++.dg/contracts/preload_nocontinue_handler/assert_fail.cpp: Removed.
+ 	* g++.dg/contracts/preload_nocontinue_handler/handle_contract_violation.cpp: Removed.
+ 	* g++.dg/contracts/preload_nocontinue_handler/nocontinue.cpp: Removed.
+ 	* g++.dg/contracts/backtrace_handler/Makefile: Removed.
+ 	* g++.dg/contracts/backtrace_handler/README: Removed.
+ 	* g++.dg/contracts/backtrace_handler/assert_fail.cpp: Removed.
+ 	* g++.dg/contracts/backtrace_handler/example_out.txt: Removed.
+ 	* g++.dg/contracts/backtrace_handler/example_pretty.txt: Removed.
+ 	* g++.dg/contracts/backtrace_handler/handle_contract_violation.cpp: Removed.
+ 	* g++.dg/contracts/backtrace_handler/prettytrace.sh: Removed.
+ 	* g++.dg/coroutines/pr110871.C: Removed.
+ 	* g++.dg/coroutines/pr110872.C: Removed.
+ 	* g++.dg/modules/contracts-1_a.C: Removed.
+ 	* g++.dg/modules/contracts-1_b.C: Removed.
+ 	* g++.dg/modules/contracts-2_a.C: Removed.
+ 	* g++.dg/modules/contracts-2_b.C: Removed.
+ 	* g++.dg/modules/contracts-2_c.C: Removed.
+ 	* g++.dg/modules/contracts-3_a.C: Removed.
+ 	* g++.dg/modules/contracts-3_b.C: Removed.
+ 	* g++.dg/modules/contracts-4_a.C: Removed.
+ 	* g++.dg/modules/contracts-4_b.C: Removed.
+ 	* g++.dg/modules/contracts-4_c.C: Removed.
+ 	* g++.dg/modules/contracts-4_d.C: Removed.
+ 	* g++.dg/modules/contracts-5_a.C: Removed.
+ 	* g++.dg/modules/contracts-5_b.C: Removed.
+ 	* g++.dg/modules/contracts-tpl-friend-1_a.C: Removed.
+ 	* g++.dg/modules/contracts-tpl-friend-1_b.C: Removed.
+ 	* g++.dg/contracts/contracts8.C: Removed.
+ 	* g++.dg/contracts/contracts9.C: Removed.
+ 	* g++.dg/contracts/except_preload_handler/Makefile: Removed.
+ 	* g++.dg/contracts/except_preload_handler/README: Removed.
+ 	* g++.dg/contracts/except_preload_handler/assert_fail.cpp: Removed.
+ 	* g++.dg/contracts/except_preload_handler/handle_contract_violation.cpp: Removed.
+ 
+ 2026-01-27  Iain Buclaw  <ibuclaw@gdcproject.org>
+ 
+ 	PR d/120096
+ 	* gdc.dg/torture/pr120096.d: New test.
+ 
+ 2026-01-27  David Malcolm  <dmalcolm@redhat.com>
+ 
+ 	PR analyzer/122623
+ 	* gcc.dg/analyzer/fexceptions-1.c: New test.
+ 	* gcc.dg/analyzer/fexceptions-2.c: New test.
+ 
+ 2026-01-27  Andrew Pinski  <andrew.pinski@oss.qualcomm.com>
+ 
+ 	PR middle-end/97898
+ 	* c-c++-common/gomp/pr97898-1.c: New test.
+ 
+ 2026-01-27  Qing Zhao  <qing.zhao@oracle.com>
+ 
+ 	PR c/123500
+ 	* gcc.dg/pointer-counted-by-pr123500.c: New test.
+ 
+ 2026-01-27  Iain Buclaw  <ibuclaw@gdcproject.org>
+ 
+ 	PR d/122817
+ 	* gdc.dg/pr122817.d: New test.
+ 
+ 2026-01-27  Richard Biener  <rguenther@suse.de>
+ 
+ 	PR ipa/116296
+ 	* gcc.dg/torture/pr116296.c: New testcase.
+ 
+ 2026-01-27  Richard Biener  <rguenther@suse.de>
+ 
+ 	PR debug/123376
+ 	* g++.dg/lto/pr123376_0.C: New testcase.
+ 
+ 2026-01-27  Christophe Lyon  <christophe.lyon@arm.com>
+ 
+ 	* gcc.target/arm/mve/intrinsics/vdupq_n_f32.c: Update expected
+ 	code.
+ 
+ 2026-01-27  Robin Dapp  <rdapp@oss.qualcomm.com>
+ 
+ 	PR tree-optimization/123799
+ 	* gcc.dg/torture/pr123799.c: New test.
+ 
+ 2026-01-27  Tobias Burnus  <tburnus@baylibre.com>
+ 
+ 	* gfortran.dg/gomp/groupprivate-7.f90: New test.
+ 
+ 2026-01-27  Wilco Dijkstra  <wilco.dijkstra@arm.com>
+ 
+ 	PR fortran/118955
+ 	* gfortran.dg/simd-builtins-9.f90: Add new test.
+ 	* gfortran.dg/simd-builtins-9.h: Likewise.
+ 
+ 2026-01-27  Wilco Dijkstra  <wilco.dijkstra@arm.com>
+ 
+ 	PR target/123791
+ 	* gcc.target/aarch64/pr123791.c: New test.
+ 
+ 2026-01-27  Wilco Dijkstra  <wilco.dijkstra@arm.com>
+ 
+ 	PR target/123792
+ 	* gcc.target/aarch64/pr123792.c: New test.
+ 
+ 2026-01-27  Nathaniel Shead  <nathanieloshead@gmail.com>
+ 
+ 	PR c++/122609
+ 	PR c++/101140
+ 	* g++.dg/modules/adl-12_b.C: Remove XFAIL.
+ 	* g++.dg/modules/inst-8_a.C: New test.
+ 	* g++.dg/modules/inst-8_b.C: New test.
+ 	* g++.dg/modules/inst-8_c.C: New test.
+ 	* g++.dg/modules/inst-9_a.C: New test.
+ 	* g++.dg/modules/inst-9_b.C: New test.
+ 	* g++.dg/modules/inst-10_a.C: New test.
+ 	* g++.dg/modules/inst-10_b.C: New test.
+ 	* g++.dg/modules/inst-10_c.C: New test.
+ 
+ 2026-01-27  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	* g++.dg/reflect/cwg3153.C: New test.
+ 
+ 2026-01-27  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR c++/123404
+ 	* g++.dg/reflect/pr123404.C: New test.
+ 
+ 2026-01-27  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR c++/123578
+ 	* g++.dg/cpp2a/pr123578.C: New test.
+ 
+ 2026-01-27  Frank Scheiner  <frank.scheiner@web.de>
+ 
+ 	* gcc.dg/guality/guality.exp: Only test with LTO if supported.
+ 	* g++.dg/guality/guality.exp: Likewise.
+ 
+ 2026-01-27  Tamar Christina  <tamar.christina@arm.com>
+ 
+ 	PR tree-optimization/122749
+ 	* gcc.target/aarch64/pr122749_1.c: New test.
+ 	* gcc.target/aarch64/pr122749_2.c: New test.
+ 	* gcc.target/aarch64/pr122749_3.c: New test.
+ 	* gcc.target/aarch64/pr122749_4.c: New test.
+ 	* gcc.target/aarch64/pr122749_5.c: New test.
+ 	* gcc.target/aarch64/pr122749_6.c: New test.
+ 	* gcc.target/aarch64/pr122749_8.c: New test.
+ 	* gcc.target/aarch64/pr122749_9.c: New test.
+ 	* gcc.target/aarch64/sve/pr122749_1.c: New test.
+ 	* gcc.target/aarch64/sve/pr122749_11.c: New test.
+ 	* gcc.target/aarch64/sve/pr122749_12.c: New test.
+ 	* gcc.target/aarch64/sve/pr122749_13.c: New test.
+ 	* gcc.target/aarch64/sve/pr122749_14.c: New test.
+ 	* gcc.target/aarch64/sve/pr122749_2.c: New test.
+ 	* gcc.target/aarch64/sve/pr122749_3.c: New test.
+ 	* gcc.target/aarch64/sve/pr122749_4.c: New test.
+ 	* gcc.target/aarch64/sve/pr122749_5.c: New test.
+ 	* gcc.target/aarch64/sve/pr122749_6.c: New test.
+ 	* gcc.target/aarch64/sve/pr122749_8.c: New test.
+ 	* gcc.target/aarch64/sve/pr122749_9.c: New test.
+ 
+ 2026-01-27  Patrick Palka  <ppalka@redhat.com>
+ 
+ 	PR c++/123676
+ 	* g++.dg/cpp2a/concepts-decltype5.C: New test.
+ 
+ 2026-01-27  Patrick Palka  <ppalka@redhat.com>
+ 
+ 	PR c++/122494
+ 	PR c++/123814
+ 	* g++.dg/cpp2a/concepts-pr122494.C: New test.
+ 	* g++.dg/cpp2a/concepts-pr123814.C: New test.
+ 
+ 2026-01-26  Andrew Pinski  <andrew.pinski@oss.qualcomm.com>
+ 
+ 	PR tree-optimization/123820
+ 	* g++.dg/torture/pr123820-1.C: New test.
+ 
+ 2026-01-26  Andrew Pinski  <andrew.pinski@oss.qualcomm.com>
+ 
+ 	PR middle-end/123709
+ 	* c-c++-common/asm-invalid-operand-1.c: New test.
+ 
+ 2026-01-26  Joseph Myers  <josmyers@redhat.com>
+ 
+ 	* lib/profopt.exp (profopt-execute): Also copy profile data from
+ 	target for additional sources.  Call cleanup-after-saved-dg-test
+ 	before normal return.
+ 
+ 2026-01-26  Karl Meakin  <karl.meakin@arm.com>
+ 
+ 	* gcc.target/aarch64/sve/pcs/asm_1.c
+ 	* gcc.target/aarch64/sve/pcs/asm_3.c: Fix tests.
+ 
+ 2026-01-26  Karl Meakin  <karl.meakin@arm.com>
+ 
+ 	* g++.target/aarch64/sve/acle/general-c++/mangle_5.C: Fix test.
+ 
+ 2026-01-26  Karl Meakin  <karl.meakin@arm.com>
+ 
+ 	* gcc.target/aarch64/rotate_xar_1.c
+ 	* gcc.target/aarch64/sha3_1.c
+ 	* gcc.target/aarch64/sha3_2.c
+ 	* gcc.target/aarch64/sha3_3.c
+ 	* gcc.target/aarch64/xar_v2di_nonsve.c: Fix tests.
+ 
+ 2026-01-26  Marek Polacek  <polacek@redhat.com>
+ 
+ 	* g++.dg/reflect/expr15.C: New test.
+ 
+ 2026-01-26  Marek Polacek  <polacek@redhat.com>
+ 
+ 	PR c++/123620
+ 	* g++.dg/reflect/extract1.C: Test removing noexcept.
+ 	* g++.dg/reflect/extract2.C: Adjust static_assert.
+ 
+ 2026-01-26  Richard Biener  <rguenther@suse.de>
+ 
+ 	PR tree-optimization/122474
+ 	* gcc.target/aarch64/sve2/pr123053.c: New testcase.
+ 	* gcc.target/riscv/rvv/pr122474.c: Likewise.
+ 
+ 2026-01-26  Victor Do Nascimento  <victor.donascimento@arm.com>
+ 
+ 	* gcc.dg/vect/vect-uncounted-run_4.c (main): New.
+ 
+ 2026-01-26  Richard Biener  <rguenther@suse.de>
+ 
+ 	PR tree-optimization/123794
+ 	* gcc.dg/vect/vect-simd-clone-pr123794.c: New testcase.
+ 
+ 2026-01-26  Richard Biener  <rguenther@suse.de>
+ 
+ 	* gcc.dg/vect/costmodel/x86_64/costmodel-vect-epil-1.c: Use
+ 	-mprefer-vector-width=512.
+ 
+ 2026-01-26  Tamar Christina  <tamar.christina@arm.com>
+ 
+ 	PR tree-optimization/122103
+ 	PR tree-optimization/123628
+ 	* gfortran.target/aarch64/pr123628.f90: New test.
+ 
+ 2026-01-26  Nathaniel Shead  <nathanieloshead@gmail.com>
+ 
+ 	PR c++/123663
+ 	PR c++/123354
+ 	* g++.dg/cpp2a/concepts-pr123663.C: New test.
+ 	* g++.dg/template/pr123354.C
+ 
+ 2026-01-25  Roger Sayle  <roger@nextmovesoftware.com>
+ 
+ 	PR middle-end/122348
+ 	* g++.dg/pr122348.C: New C++ testcase.
+ 	* gcc.dg/pr122348.c: New C testcase.
+ 
  2026-01-24  Andrew Pinski  <andrew.pinski@oss.qualcomm.com>
  
  	PR tree-optimization/123803
diff -Nrcpad gcc-16-20260125/gcc/testsuite/algol68/compile/error-nest-1.a68 gcc-16-20260201/gcc/testsuite/algol68/compile/error-nest-1.a68
*** gcc-16-20260125/gcc/testsuite/algol68/compile/error-nest-1.a68	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/algol68/compile/error-nest-1.a68	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,5 ----
+ begin int foo =
+          nest XYZ { dg-error "valid language" }
+          "foo";
+       skip
+ end
diff -Nrcpad gcc-16-20260125/gcc/testsuite/algol68/compile/error-nest-2.a68 gcc-16-20260201/gcc/testsuite/algol68/compile/error-nest-2.a68
*** gcc-16-20260125/gcc/testsuite/algol68/compile/error-nest-2.a68	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/algol68/compile/error-nest-2.a68	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,8 ----
+ begin int foo =
+          nest C
+               200; { dg-error "denotation" }
+       int bar =
+          nest
+               3.14; { dg-error "denotation" }
+       skip
+ end
diff -Nrcpad gcc-16-20260125/gcc/testsuite/algol68/compile/error-nest-3.a68 gcc-16-20260201/gcc/testsuite/algol68/compile/error-nest-3.a68
*** gcc-16-20260125/gcc/testsuite/algol68/compile/error-nest-3.a68	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/algol68/compile/error-nest-3.a68	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,4 ----
+ begin int foo = 10 + (nest C "foo"); { dg-error "strong context" }
+       int bar = 20 + (nest "bar");   { dg-error "strong context" }
+       assert (foo = 10)
+ end
diff -Nrcpad gcc-16-20260125/gcc/testsuite/algol68/compile/error-nest-4.a68 gcc-16-20260201/gcc/testsuite/algol68/compile/error-nest-4.a68
*** gcc-16-20260125/gcc/testsuite/algol68/compile/error-nest-4.a68	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/algol68/compile/error-nest-4.a68	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,8 ----
+ begin string s =
+          nest C "lala"; { dg-error "" }
+       union(int,real) x =
+          nest C "x"; { dg-error "" }
+       proc(string)bool y =
+          nest C "y"; { dg-error "" }
+       skip
+ end
diff -Nrcpad gcc-16-20260125/gcc/testsuite/algol68/compile/error-nest-5.a68 gcc-16-20260201/gcc/testsuite/algol68/compile/error-nest-5.a68
*** gcc-16-20260125/gcc/testsuite/algol68/compile/error-nest-5.a68	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/algol68/compile/error-nest-5.a68	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,3 ----
+ begin int lala = nest C "&lala"; { dg-error "name" }
+       skip
+ end
diff -Nrcpad gcc-16-20260125/gcc/testsuite/algol68/compile/error-selector-1.a68 gcc-16-20260201/gcc/testsuite/algol68/compile/error-selector-1.a68
*** gcc-16-20260125/gcc/testsuite/algol68/compile/error-selector-1.a68	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/algol68/compile/error-selector-1.a68	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,6 ----
+ { dg-options "-std=algol68" }
+ 
+ begin mode Foo = struct (int a,b);
+       a'b; { dg-error "unworthy" }
+       skip
+ end
diff -Nrcpad gcc-16-20260125/gcc/testsuite/algol68/compile/nest-c-1.a68 gcc-16-20260201/gcc/testsuite/algol68/compile/nest-c-1.a68
*** gcc-16-20260125/gcc/testsuite/algol68/compile/nest-c-1.a68	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/algol68/compile/nest-c-1.a68	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,4 ----
+ begin proc real myrandom = nest C "_libga68_random";
+       real r = myrandom;
+       assert (r >= 0.0 AND r <= 1.0)
+ end
diff -Nrcpad gcc-16-20260125/gcc/testsuite/algol68/execute/bits-clear-1.a68 gcc-16-20260201/gcc/testsuite/algol68/execute/bits-clear-1.a68
*** gcc-16-20260125/gcc/testsuite/algol68/execute/bits-clear-1.a68	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/algol68/execute/bits-clear-1.a68	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,30 ----
+ begin (short short bits a = short short 16rf;
+        assert (a CLEAR (short_short_bits_width + 1) = a);
+        assert (a CLEAR -1 = a);
+        assert (a CLEAR short_short_bits_width = short short 16rf);
+        assert (a CLEAR 1 CLEAR 2 = BIN short short 12));
+ 
+       (short bits a = short 16rf;
+        assert (a CLEAR (short_bits_width + 1) = a);
+        assert (a CLEAR -1 = a);
+        assert (a CLEAR short_bits_width = short 16rf);
+        assert (a CLEAR 1 CLEAR 2 = BIN short 12));
+ 
+       (bits a = 16rf;
+        assert (a CLEAR (bits_width + 1) = a);
+        assert (a CLEAR -1 = a);
+        assert (a CLEAR bits_width = 16rf);
+        assert (a CLEAR 1 CLEAR 2 = BIN 12));
+ 
+       (long bits a = long 16rf;
+        assert (a CLEAR (long_bits_width + 1) = a);
+        assert (a CLEAR -1 = a);
+        assert (a CLEAR long_bits_width = long 16rf);
+        assert (a CLEAR 1 CLEAR 2 = BIN long 12));
+ 
+       (long long bits a = long long 16rf;
+        assert (a CLEAR (long_long_bits_width + 1) = a);
+        assert (a CLEAR -1 = a);
+        assert (a CLEAR long_long_bits_width = long long 16rf);
+        assert (a CLEAR 1 CLEAR 2 = BIN long long 12))
+ end
diff -Nrcpad gcc-16-20260125/gcc/testsuite/algol68/execute/bits-set-1.a68 gcc-16-20260201/gcc/testsuite/algol68/execute/bits-set-1.a68
*** gcc-16-20260125/gcc/testsuite/algol68/execute/bits-set-1.a68	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/algol68/execute/bits-set-1.a68	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,30 ----
+ begin (short short bits a = short short 16r0;
+        assert (a SET (short_short_bits_width + 1) = a);
+        assert (a SET -1 = a);
+        assert (a SET short_short_bits_width = short short 16r1 SHL (short_short_bits_width-1));
+        assert (a SET 1 SET 2 = BIN short short 3));
+ 
+       (short bits a = short 16r0;
+        assert (a SET (short_bits_width + 1) = a);
+        assert (a SET -1 = a);
+        assert (a SET short_bits_width = short 16r1 SHL (short_bits_width-1));
+        assert (a SET 1 SET 2 = BIN short 3));
+ 
+       (bits a = 16r0;
+        assert (a SET (bits_width + 1) = a);
+        assert (a SET -1 = a);
+        assert (a SET bits_width = 16r1 SHL (bits_width-1));
+        assert (a SET 1 SET 2 = BIN 3));
+ 
+       (long bits a = long 16r0;
+        assert (a SET (long_bits_width + 1) = a);
+        assert (a SET -1 = a);
+        assert (a SET long_bits_width = long 16r1 SHL (long_bits_width-1));
+        assert (a SET 1 SET 2 = BIN long 3));
+ 
+       (long long bits a = long long 16r0;
+        assert (a SET (long_long_bits_width + 1) = a);
+        assert (a SET -1 = a);
+        assert (a SET long_long_bits_width = long long 16r1 SHL (long_long_bits_width-1));
+        assert (a SET 1 SET 2 = BIN long long 3))
+ end
diff -Nrcpad gcc-16-20260125/gcc/testsuite/algol68/execute/bits-test-1.a68 gcc-16-20260201/gcc/testsuite/algol68/execute/bits-test-1.a68
*** gcc-16-20260125/gcc/testsuite/algol68/execute/bits-test-1.a68	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/algol68/execute/bits-test-1.a68	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,5 ----
+ begin assert (NOT (16rff TEST 9));
+       assert (NOT (16rff TEST 0));
+       assert (NOT (16rff TEST -1));
+       assert (2r100 TEST 3)
+ end
diff -Nrcpad gcc-16-20260125/gcc/testsuite/algol68/execute/selection-2.a68 gcc-16-20260201/gcc/testsuite/algol68/execute/selection-2.a68
*** gcc-16-20260125/gcc/testsuite/algol68/execute/selection-2.a68	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/algol68/execute/selection-2.a68	Sun Feb  1 22:32:09 2026
***************
*** 2,9 ****
  # Selecting a struct name results in sub-names.  #
  BEGIN MODE PERSON = STRUCT (INT age, REAL income, INT num children);
        PERSON person;
!       age OF person := 44;
!       income OF person := 999.99;
        num children OF person := 0;
        ASSERT (age OF person = 44);
        ASSERT (num children OF person = 0);
--- 2,9 ----
  # Selecting a struct name results in sub-names.  #
  BEGIN MODE PERSON = STRUCT (INT age, REAL income, INT num children);
        PERSON person;
!       age'person := 44;
!       income'person := 999.99;
        num children OF person := 0;
        ASSERT (age OF person = 44);
        ASSERT (num children OF person = 0);
diff -Nrcpad gcc-16-20260125/gcc/testsuite/algol68/execute/selection-5.a68 gcc-16-20260201/gcc/testsuite/algol68/execute/selection-5.a68
*** gcc-16-20260125/gcc/testsuite/algol68/execute/selection-5.a68	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/algol68/execute/selection-5.a68	Sun Feb  1 22:32:09 2026
***************
*** 1,6 ****
! # { dg-options "-fstropping=upper" }  #
! # pr UPPER pr  #
! BEGIN MODE JORL = STRUCT (INT i, REAL r);
!       REF JORL jorl = LOC JORL := (10, 3.14);
!       ASSERT (i OF jorl = 10)
! END
--- 1,4 ----
! begin mode Jorl = struct (int i, real r);
!       ref Jorl jorl = loc Jorl := (10, 3.14);
!       assert (i'jorl = 10)
! end
diff -Nrcpad gcc-16-20260125/gcc/testsuite/c-c++-common/asm-invalid-operand-1.c gcc-16-20260201/gcc/testsuite/c-c++-common/asm-invalid-operand-1.c
*** gcc-16-20260125/gcc/testsuite/c-c++-common/asm-invalid-operand-1.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/c-c++-common/asm-invalid-operand-1.c	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,11 ----
+ /* { dg-do compile } */
+ /* { dg-options "" } */
+ /* PR middle-end/123709 */
+ 
+ int test1(int a) {
+     asm volatile("%i\n" /* { dg-error "operand number out of range" } */
+                  "505x"
+                  :
+                  : "r"(a));
+     return a;
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/c-c++-common/cpp/dir-only-10.c gcc-16-20260201/gcc/testsuite/c-c++-common/cpp/dir-only-10.c
*** gcc-16-20260125/gcc/testsuite/c-c++-common/cpp/dir-only-10.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/c-c++-common/cpp/dir-only-10.c	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,5 ----
+ /* PR preprocessor/123273 */
+ /* { dg-do preprocess } */
+ /* { dg-options -fdirectives-only } */
+ 
+ /* *\/""" */
diff -Nrcpad gcc-16-20260125/gcc/testsuite/c-c++-common/cpp/dir-only-11.c gcc-16-20260201/gcc/testsuite/c-c++-common/cpp/dir-only-11.c
*** gcc-16-20260125/gcc/testsuite/c-c++-common/cpp/dir-only-11.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/c-c++-common/cpp/dir-only-11.c	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,6 ----
+ /* PR preprocessor/123273 */
+ /* { dg-do preprocess } */
+ /* { dg-options -fdirectives-only } */
+ 
+ /* *\\
+ /""" */
diff -Nrcpad gcc-16-20260125/gcc/testsuite/c-c++-common/function-like-macro-1.c gcc-16-20260201/gcc/testsuite/c-c++-common/function-like-macro-1.c
*** gcc-16-20260125/gcc/testsuite/c-c++-common/function-like-macro-1.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/c-c++-common/function-like-macro-1.c	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,10 ----
+ /* { dg-do compile } */
+ /* PR c/102846 */
+ 
+ #define f(a) ((void)0)
+ 
+ void g(int a)
+ {
+   (f)(a); /* { dg-error "was not declared|undeclared" "undeclared" } */
+   /* { dg-message "is a function-like macro and might be used incorrectly" "" { target *-*-* } .-1 } */
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/c-c++-common/function-like-macro-2.c gcc-16-20260201/gcc/testsuite/c-c++-common/function-like-macro-2.c
*** gcc-16-20260125/gcc/testsuite/c-c++-common/function-like-macro-2.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/c-c++-common/function-like-macro-2.c	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,11 ----
+ /* { dg-do compile } */
+ /* PR c/102846 */
+ 
+ #include <assert.h>
+ 
+ void g(int a)
+ {
+   (assert)(a); /* { dg-error "was not declared|undeclared" "undeclared" } */
+   /* { dg-message "is a function-like macro and might be used incorrectly" "macro" { target *-*-* } .-1 } */
+   /* { dg-bogus "is defined in header" "header" { target *-*-* } .-2  }*/
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/c-c++-common/gomp/pr97898-1.c gcc-16-20260201/gcc/testsuite/c-c++-common/gomp/pr97898-1.c
*** gcc-16-20260125/gcc/testsuite/c-c++-common/gomp/pr97898-1.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/c-c++-common/gomp/pr97898-1.c	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,12 ----
+ /* { dg-do compile } */
+ /* { dg-options "-fopenmp" } */
+ 
+ /* PR middle-end/97898 */
+ 
+ void f (int n, int *s, int *e)
+ {
+   int *i;
+ #pragma omp for schedule(static, 2)
+   for (i = s; i < e; i += n);
+ }
+ 
diff -Nrcpad gcc-16-20260125/gcc/testsuite/c-c++-common/pr101312-1.c gcc-16-20260201/gcc/testsuite/c-c++-common/pr101312-1.c
*** gcc-16-20260125/gcc/testsuite/c-c++-common/pr101312-1.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/c-c++-common/pr101312-1.c	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,4 ----
+ /* PR c/101312 */
+ /* { dg-do compile } */
+ 
+ volatile int a[1] __attribute__((may_alias));
diff -Nrcpad gcc-16-20260125/gcc/testsuite/c-c++-common/pr101312-2.c gcc-16-20260201/gcc/testsuite/c-c++-common/pr101312-2.c
*** gcc-16-20260125/gcc/testsuite/c-c++-common/pr101312-2.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/c-c++-common/pr101312-2.c	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,5 ----
+ /* PR c/101312 */
+ /* { dg-do compile } */
+ /* { dg-options "-g" } */
+ 
+ volatile int a[1] __attribute__((may_alias));
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/analyzer/exception-rethrow-3.C gcc-16-20260201/gcc/testsuite/g++.dg/analyzer/exception-rethrow-3.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/analyzer/exception-rethrow-3.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/analyzer/exception-rethrow-3.C	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,46 ----
+ #include "../../gcc.dg/analyzer/analyzer-decls.h"
+ 
+ /* Top-level rethrow (PR analyzer/123880).  */
+ 
+ void test_1 ()
+ {
+     throw;
+ }
+ 
+ /* Intraprocedural leak involving a rethrow.  */
+ 
+ void test_2 ()
+ {
+   void *p = __builtin_malloc (1024);
+   throw; // { dg-warning "leak of 'p'" }
+   // { dg-message "rethrowing exception here\.\.\." "rethrow event" { target *-*-* } .-1 }
+ }
+ 
+ /* Interprocedural leak involving a rethrow.  */
+ 
+ static void called_by_test_3 ()
+ {
+   throw; // { dg-warning "leak of 'p'" }
+   // { dg-message "rethrowing exception here\.\.\." "rethrow event" { target *-*-* } .-1 }
+ }
+ 
+ void test_3 ()
+ {
+   void *p = __builtin_malloc (1024); // { dg-message "allocated here" }
+   called_by_test_3 ();
+ }
+ 
+ /* Rethrow of a rethrow.  */
+ 
+ void test_4 ()
+ {
+   try
+     {
+       throw;
+     }
+   catch (...)
+     {
+       __analyzer_dump_path (); // { dg-message "path" "" { xfail *-*-* } }
+       throw;
+     }
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/concepts/pr121832.C gcc-16-20260201/gcc/testsuite/g++.dg/concepts/pr121832.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/concepts/pr121832.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/concepts/pr121832.C	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,10 ----
+ // { dg-do compile }
+ // { dg-additional-options "-fconcepts -fno-modules" }
+ 
+ export template<> a{};  // { dg-error "explicit spec" }
+ // { dg-warning "'export' not implemented" "" { target c++98_only } .-1 }
+ // { dg-warning "'export' is deprecated" "" { target { c++11 && c++17_down } } .-2 }
+ // { dg-warning "'export' is enabled with '-fmodules'" "" { target c++20 } .-3 }
+ 
+ // { dg-prune-output "'a' does not name a type" }
+ // { dg-prune-output "extra ';' outside of a function" }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/backtrace_handler/Makefile gcc-16-20260201/gcc/testsuite/g++.dg/contracts/backtrace_handler/Makefile
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/backtrace_handler/Makefile	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/backtrace_handler/Makefile	Thu Jan  1 00:00:00 1970
***************
*** 1,13 ****
- CXXFLAGS=--std=c++17 -g
- 
- default: assert_fail libhandle_contract_violation.so
- 
- run: default
- 	LD_PRELOAD=./libhandle_contract_violation.so ./assert_fail
- 
- ./libhandle_contract_violation.so: ./handle_contract_violation.cpp
- 	${CXX} ${CXXFLAGS} -shared -fPIC -o $@ $<
- 
- clean:
- 	rm -fr ./libhandle_contract_violation.so ./assert_fail
- 
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/backtrace_handler/README gcc-16-20260201/gcc/testsuite/g++.dg/contracts/backtrace_handler/README
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/backtrace_handler/README	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/backtrace_handler/README	Thu Jan  1 00:00:00 1970
***************
*** 1,12 ****
- build and install gcc to $prefix, then to see the raw backtrace info run:
- LD_LIBRARY_PATH=$prefix/lib64 CXX=$prefix/bin/g++ make run
- 
- for a filtered view using addr2line, see ./prettytrace.sh:
- LD_LIBRARY_PATH=$prefix/lib64 CXX=$prefix/bin/g++ make run |& ./prettytrace.sh
- 
- prettytrace.sh relies on addr2line and c++filt to lookup and demangle names,
- and misc coreutils
- 
- example_out.txt has an example of the raw output while example_pretty.txt
- shows the corresponding prettified output
- 
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/backtrace_handler/assert_fail.cpp gcc-16-20260201/gcc/testsuite/g++.dg/contracts/backtrace_handler/assert_fail.cpp
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/backtrace_handler/assert_fail.cpp	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/backtrace_handler/assert_fail.cpp	Thu Jan  1 00:00:00 1970
***************
*** 1,23 ****
- void fun1() {
-   int x = 0;
-   [[ assert: x < 0 ]];
- }
- namespace tns {
-   void fun2() {
-     fun1();
-   }
- }
- template<typename T>
- void fun3(T a) {
-   tns::fun2();
- }
- void fun4() {
-   fun3(5);
- }
- int main(int, char**) {
-   void (*fp)() = nullptr;
-   fp = fun4;
-   fp();
-   return 0;
- }
- 
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/backtrace_handler/example_out.txt gcc-16-20260201/gcc/testsuite/g++.dg/contracts/backtrace_handler/example_out.txt
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/backtrace_handler/example_out.txt	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/backtrace_handler/example_out.txt	Thu Jan  1 00:00:00 1970
***************
*** 1,12 ****
- LD_PRELOAD=./libhandle_contract_violation.so ./assert_fail
- contract violation: assert_fail.cpp:3: fun1::x < 0 is false [with contract level=default]
- violation occurs here:
- ./assert_fail[0x4011ad]
- ./assert_fail[0x4011e0]
- ./assert_fail[0x401230]
- ./assert_fail[0x4011f1]
- ./assert_fail[0x401219]
- /usr/lib/libc.so.6(__libc_start_main+0xf3)[0x7f26e4fa9223]
- ./assert_fail[0x4010be]
- [0x0]
- end of violation
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/backtrace_handler/example_pretty.txt gcc-16-20260201/gcc/testsuite/g++.dg/contracts/backtrace_handler/example_pretty.txt
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/backtrace_handler/example_pretty.txt	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/backtrace_handler/example_pretty.txt	Thu Jan  1 00:00:00 1970
***************
*** 1,8 ****
- LD_PRELOAD=./libhandle_contract_violation.so ./assert_fail
- contract violation: assert_fail.cpp:3: fun1::x < 0 is false [with contract level=default]
- violation occurs here:
-     assert_fail.cpp:fun1():4
-     assert_fail.cpp:tns::fun2():8
-     assert_fail.cpp:void fun3<int>(int):13
-     assert_fail.cpp:fun4():16
-     assert_fail.cpp:main:21
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/backtrace_handler/handle_contract_violation.cpp gcc-16-20260201/gcc/testsuite/g++.dg/contracts/backtrace_handler/handle_contract_violation.cpp
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/backtrace_handler/handle_contract_violation.cpp	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/backtrace_handler/handle_contract_violation.cpp	Thu Jan  1 00:00:00 1970
***************
*** 1,26 ****
- #include <iostream>
- #include <contract>
- #include <execinfo.h>
- #include <unistd.h>
- 
- static constexpr int MAX_BACKTRACE_DEPTH = 128;
- 
- void handle_contract_violation(const std::contract_violation &violation) {
-   size_t _backtraceSize{0};
-   void *_backtrace[MAX_BACKTRACE_DEPTH]{};
- 
-   _backtraceSize = backtrace(_backtrace, MAX_BACKTRACE_DEPTH);
-   if(_backtraceSize == MAX_BACKTRACE_DEPTH)
-     std::cerr << "warning: backtrace may have been truncated" << std::endl;
- 
-   std::cerr << "contract violation: " << violation.file_name()
-     << ":" << violation.line_number()
-     << ": " << violation.comment() << " is false"
-     << " [with contract level=" << violation.assertion_level() << "]" << std::endl
-     << "violation occurs here:" << std::endl;
-   // skip the stack frame of handle_contract_violation and
-   // on_contract_violation to get to wherever the assert was
-   backtrace_symbols_fd(_backtrace + 2, _backtraceSize - 1, STDERR_FILENO);
-   std::cerr << "end of violation" << std::endl;
- }
- 
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/backtrace_handler/prettytrace.sh gcc-16-20260201/gcc/testsuite/g++.dg/contracts/backtrace_handler/prettytrace.sh
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/backtrace_handler/prettytrace.sh	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/backtrace_handler/prettytrace.sh	Thu Jan  1 00:00:00 1970
***************
*** 1,30 ****
- #!/bin/bash
- 
- inViolation="false"
- sed 's/^/:/' /dev/stdin | while read -r line; do
-   line="$(echo "$line" | sed 's/^://')"
- 
-   if [[ "${inViolation}" == "false" ]]; then
-     echo "$line"
-     if [[ -n "$(echo "$line" | grep 'violation occurs here:')" ]]; then
-       inViolation="true"
-     fi
-     continue
-   fi
- 
-   if [[ -n "$(echo "$line" | grep 'end of violation')" ]]; then
-     inViolation="false"
-     continue
-   fi
- 
-   addr="$(echo "$line" | sed -r 's/.*\[0x([a-f0-9]+)\]$/\1/')"
-   bin="$(echo "$line" | sed -r 's/^([^([]*).*/\1/')"
-   [[ -n "${bin}" ]] || continue
-   t="$(addr2line -e "$bin" "$addr" -f)"
-   file="$(echo "$t" | tail -1 | tr ':' '\n' | head -1)"
-   file="$(echo "$file" | sed -r "s:^$(pwd)/?::")"
-   line="$(echo "$t" | tail -1 | tr ':' '\n' | tail -1 | cut -d' ' -f1)"
-   func="$(echo "$t" | head -1 | c++filt)"
-   [[ $file != "??" ]] && echo "    $file:$func:$line"
- done
- 
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-access1.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-access1.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-access1.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-access1.C	Thu Jan  1 00:00:00 1970
***************
*** 1,129 ****
- // ensure that that preconditions can access public, protected, and private
- // members of the current and base classes
- // { dg-do run }
- // { dg-options "-std=c++2a -fcontracts -fcontract-continuation-mode=on" }
- 
- struct Base
- {
-   int pub{-1};
- 
-   virtual int b()
-     [[ pre: pub > 0 ]]
-     [[ pre: pro > 0 ]]
-     [[ pre: pri > 0 ]]
-   {
-     return pub * pro * pri;
-   }
- 
-   protected:
-     int pro{-1};
-     int pri{-1};
- };
- 
- struct Child : Base
- {
-   int fun()
-     [[ pre: pub > 0 ]]
-     [[ pre: pro > 0 ]]
-     [[ pre: pri > 0 ]]
-   {
-     return pub * pro;
-   }
- };
- 
- struct VChild : Base
- {
-   int b()
-     [[ pre: pub > 0 ]]
-     [[ pre: pro > 0 ]]
-     [[ pre: pri > 0 ]]
-   {
-     return pub * pro;
-   }
- };
- 
- template<typename B>
- struct TChild : B
- {
-   int fun()
-     [[ pre: B::pub > 0 ]]
-     [[ pre: B::pro > 0 ]]
-     [[ pre: B::pri > 0 ]]
-   {
-     return B::pub * B::pro;
-   }
- };
- 
- struct PubBase
- {
-   int pub{-1};
-   int pro{-1};
-   int pri{-1};
- };
- 
- struct PubChild : PubBase
- {
-   int fun()
-     [[ pre: pub > 0 ]]
-     [[ pre: pro > 0 ]]
-     [[ pre: pri > 0 ]]
-   {
-     return pub * pro;
-   }
- };
- 
- template<typename B>
- struct TPubChild : B
- {
-   int fun()
-     [[ pre: B::pub > 0 ]]
-     [[ pre: B::pro > 0 ]]
-     [[ pre: B::pri > 0 ]]
-   {
-     return B::pub * B::pro;
-   }
- };
- 
- int main()
- {
-   Base base{};
-   base.b();
- 
-   Child child{};
-   child.fun();
- 
-   VChild vchild{};
-   vchild.b();
- 
-   TChild<Base> tchild{};
-   tchild.fun();
- 
-   PubChild pubchild{};
-   pubchild.fun();
- 
-   TPubChild<PubBase> tpubchild;
-   tpubchild.fun();
- 
-   return 0;
- }
- 
- // { dg-skip-if "requires hosted libstdc++ for stdc++exp" { ! hostedlib } }
- // { dg-output "contract violation in function Base::b at .*.C:11: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function Base::b at .*.C:12: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function Base::b at .*.C:13: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function Child::fun at .*.C:26: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function Child::fun at .*.C:27: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function Child::fun at .*.C:28: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function VChild::b at .*.C:37: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function VChild::b at .*.C:38: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function VChild::b at .*.C:39: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function TChild<Base>::fun at .*.C:49: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function TChild<Base>::fun at .*.C:50: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function TChild<Base>::fun at .*.C:51: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function PubChild::fun at .*.C:67: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function PubChild::fun at .*.C:68: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function PubChild::fun at .*.C:69: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function TPubChild<PubBase>::fun at .*.C:79: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function TPubChild<PubBase>::fun at .*.C:80: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function TPubChild<PubBase>::fun at .*.C:81: .*(\n|\r\n|\r)" }
- 
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-assume1.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-assume1.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-assume1.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-assume1.C	Thu Jan  1 00:00:00 1970
***************
*** 1,30 ****
- // test that assumed contracts do instatiate templates
- // { dg-do compile }
- // { dg-options "-std=c++2a -fcontracts" }
- 
- template<typename T>
- int f(T t)
- {
-   return -t;
- }
- 
- int dummy()
- {
-   [[ assert assume: f(1.0) > 0 ]];
-   return -1;
- }
- 
- template<>
- int f(double t) // { dg-error "specialization of.*after instantiation" }
- {
-   return -1.0;
- }
- 
- int main()
- {
-   dummy();
-   f(1);
-   f(1.0);
-   return 0;
- }
- 
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-assume2.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-assume2.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-assume2.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-assume2.C	Thu Jan  1 00:00:00 1970
***************
*** 1,35 ****
- // ensure that assert contracts can be turned into compile time assumptions
- // and that they can be used for optimization.
- //
- // Even though x == -1, the assert contract tells the compiler that it is
- // safe to assume the x <= 0 branch is never taken fun can be transformed into
- // just
- //   printf("%d: test x>0\n", x);
- //   return 0;
- // we ensure this by matching on the output and expecting a 0 return code from
- // main -- unlike contracts-ignore2 which expects a failing return code
- // { dg-do run }
- // { dg-options "-std=c++2a -fcontracts -fcontract-role=default:never,assume,ignore -O1" }
- // { dg-skip-if "requires hosted libstdc++ for cstdio" { ! hostedlib } }
- #include <cstdio>
- 
- int fun(int x) {
-   [[assert audit: x > 0]];
-   if(x <= 0)
-   {
-     printf("%d: test x<=0 opt out\n", x);
-     return -1;
-   }
-   else
-   {
-     printf("%d: test x>0\n", x);
-     return 0;
-   }
- }
- 
- int main(int, char**) {
-   volatile int x = -1;
-   return fun(x);
- }
- 
- // { dg-output "-1: test x>0(\n|\r\n|\r)" }
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-assume3.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-assume3.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-assume3.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-assume3.C	Thu Jan  1 00:00:00 1970
***************
*** 1,20 ****
- // test that assumed contracts that reference undefined entities do not cause
- // a link failure
- // { dg-do run }
- // { dg-options "-std=c++2a -fcontracts" }
- // { dg-skip-if "requires hosted libstdc++ for stdc++exp" { ! hostedlib } }
- 
- int f(int t);
- 
- int dummy()
- {
-   [[ assert assume: f(1) > 0 ]];
-   return -1;
- }
- 
- int main()
- {
-   dummy();
-   return 0;
- }
- 
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-assume4.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-assume4.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-assume4.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-assume4.C	Thu Jan  1 00:00:00 1970
***************
*** 1,20 ****
- // test that assumed constexpr contracts that reference undefined entities do
- // not cause constexpr eval failure
- // { dg-do run }
- // { dg-options "-std=c++2a -fcontracts" }
- // { dg-skip-if "requires hosted libstdc++ for stdc++exp" { ! hostedlib } }
- 
- constexpr int f(int t); // { dg-warning "used but never defined" }
- 
- constexpr int dummy()
- {
-   [[ assert assume: f(1) > 0 ]];
-   return -1;
- }
- 
- int main()
- {
-   constexpr int n = dummy();
-   return 0;
- }
- 
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-assume5.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-assume5.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-assume5.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-assume5.C	Thu Jan  1 00:00:00 1970
***************
*** 1,34 ****
- // test that assumed constexpr contracts that reference defined entities, or
- // undefined entities in unevaluated context, cause constexpr eval failure when
- // the predicate is constexpr false
- // { dg-do compile }
- // { dg-options "-std=c++2a -fcontracts" }
- 
- constexpr int f(int t)
- {
-   return -1;
- }
- 
- constexpr int dummy()
- {
-   [[ assert assume: f(1) > 0 ]];
-   return -1;
- }
- 
- constexpr int undef(int t);
- 
- constexpr int dummy2()
- {
-   [[ assert assume: sizeof(decltype(undef(1))) < 0 ]];
-   return -1;
- }
- 
- int main()
- {
-   constexpr int n = dummy(); // { dg-message "in .constexpr. expansion" }
-   // { dg-error "contract predicate" "" { target *-*-* } 14 }
-   constexpr int m = dummy2(); // { dg-message "in .constexpr. expansion" }
-   // { dg-error "contract predicate" "" { target *-*-* } 22 }
-   return 0;
- }
- 
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-assume6.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-assume6.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-assume6.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-assume6.C	Thu Jan  1 00:00:00 1970
***************
*** 1,61 ****
- // ensure that non-defined entities in assume contracts do not error
- // { dg-do compile }
- // { dg-options "-std=c++2a -fcontracts" }
- 
- template<typename T>
- T id2(T n);
- 
- int fun(int n)
-   [[ pre assume: id2(n) > 0 ]]
-   [[ pre: n > 0 ]]
- {
-   return -n;
- }
- 
- template<typename T>
- T tfun(T n)
-   [[ pre assume: id2(n) > 0 ]]
-   [[ pre: n > 0 ]]
- {
-   return -n;
- }
- 
- template<typename T>
- constexpr T id(T n); // { dg-warning "used but never defined" }
- 
- template<typename T>
- constexpr T cfun(T n)
-   [[ pre assume: id(n) > 0 ]]
-   [[ pre: id(n) > 0 ]] // { dg-error "used before its definition" }
- {
-   return -n;
- }
- 
- template<typename T>
- constexpr T id3(T n)
- {
-   return n;
- }
- 
- template<typename T>
- constexpr T cfun2(T n)
-   [[ pre assume: id3(n) > 0 ]] // { dg-error "contract predicate" }
- {
-   return -n;
- }
- 
- template<typename T>
- constexpr T cfun3(T n)
-   [[ pre: id3(n) > 0 ]] // { dg-error "contract predicate" }
- {
-   return -n;
- }
- 
- int main() {
-   constexpr int n = cfun(-5);
-   constexpr int n2 = cfun2(-5);
-   constexpr int n3 = cfun3(-5);
-   fun(-5);
-   tfun(-5);
- }
- 
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-comdat1.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-comdat1.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-comdat1.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-comdat1.C	Thu Jan  1 00:00:00 1970
***************
*** 1,19 ****
- // Contract condition functions should be local symbols in a comdat group with
- // the guarded function.
- 
- // { dg-do compile { target { c++20 && comdat_group } } }
- // { dg-additional-options -fcontracts }
- // { dg-final { scan-assembler-not "_Z1fi.pre,comdat" } }
- // { dg-final { scan-assembler-not {(weak|globl)[^\n]*_Z1fi.pre} } }
- 
- inline int f(int i)
-   [[ pre: i > 0 ]]
- {
-   return i;
- }
- 
- int main()
- {
-   if (f(42) != 42)
-     __builtin_abort ();
- }
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-config1.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-config1.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-config1.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-config1.C	Thu Jan  1 00:00:00 1970
***************
*** 1,47 ****
- // Small test to ensure that the level and role information printed by various
- // contract configurations is correct.
- // { dg-do run }
- // { dg-options "-std=c++2a -fcontracts -fcontract-role=default:maybe,maybe,ignore" }
- 
- int fun(int n)
-   [[ post default r: r > 0 ]]
- {
-   return -n;
- }
- 
- int main(int, char **)
- {
-   [[ assert default: false ]];
-   [[ assert: false ]];
-   [[ assert audit: false ]];
-   [[ assert default %new_role: false ]];
-   [[ assert %new_role: false ]];
-   [[ assert audit %new_role: false ]];
-   [[ assert check_maybe_continue: false ]];
-   [[ assert %default: false ]];
-   [[ assert audit %default: false ]];
-   fun(5);
-   return 0;
- }
- 
- // { dg-skip-if "requires hosted libstdc++ for stdc++exp" { ! hostedlib } }
- // { dg-output {contract violation in function main at .*:14: false(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {contract violation in function main at .*:15: false(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {contract violation in function main at .*:16: false(\n|\r\n|\r)} }
- // { dg-output {\[level:audit, continue:on\](\n|\r\n|\r)} }
- // { dg-output {contract violation in function main at .*:17: false(\n|\r\n|\r)} }
- // { dg-output {\[role:new_role, continue:on\](\n|\r\n|\r)} }
- // { dg-output {contract violation in function main at .*:18: false(\n|\r\n|\r)} }
- // { dg-output {\[role:new_role, continue:on\](\n|\r\n|\r)} }
- // { dg-output {contract violation in function main at .*:19: false(\n|\r\n|\r)} }
- // { dg-output {\[level:audit, role:new_role, continue:on\](\n|\r\n|\r)} }
- // { dg-output {contract violation in function main at .*:20: false(\n|\r\n|\r)} }
- // { dg-output {\[level:, role:, continue:on\](\n|\r\n|\r)} }
- // { dg-output {contract violation in function main at .*:21: false(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {contract violation in function main at .*:22: false(\n|\r\n|\r)} }
- // { dg-output {\[level:audit, continue:on\](\n|\r\n|\r)} }
- // { dg-output {contract violation in function fun at .*:7: r > 0(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-constexpr1.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-constexpr1.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-constexpr1.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-constexpr1.C	Thu Jan  1 00:00:00 1970
***************
*** 1,75 ****
- // ensure that passing pre/post do not affect constexpr functions
- // ensure that failing pre/post generate an error at runtime in constexpr funcs
- // { dg-do run }
- // { dg-options "-std=c++20 -fcontracts -fcontract-continuation-mode=on" }
- 
- constexpr int wfun(int a)
-   [[ pre: a > 0 ]]
-   [[ post r: r > 0 ]]
- {
-   return a;
- }
- 
- constexpr int ffun(int a)
-   [[ pre: a > 0 ]]
-   [[ post r: r > 0 ]]
- {
-   return a;
- }
- 
- template<typename T>
- constexpr int tfun(T a)
-   [[ pre: a > 0 ]]
-   [[ post r: r > 0 ]]
- {
-   return a;
- }
- 
- template<typename T>
- constexpr int wtfun(T a)
-   [[ pre: a > 0 ]]
-   [[ post r: r > 0 ]]
- {
-   return a;
- }
- 
- template<typename T>
- constexpr int ftfun(T a)
-   [[ pre: a > 0 ]]
-   [[ post r: r > 0 ]]
- {
-   return a;
- }
- 
- constexpr int explicitfn(int a)
-   [[ pre ignore: a > 0 ]]
-   [[ pre check_maybe_continue: a > 0 ]]
-   [[ post ignore r: r > 0 ]]
-   [[ post check_maybe_continue r: r > 0 ]]
- {
-   return a;
- }
- 
- int main(int, char **) {
-   constexpr int a = wfun(10);
-   int b = ffun(-10);
-   constexpr int c = wtfun(10);
-   int d = ftfun(-10);
- 
-   int e = explicitfn(-10);
- 
-   int z = ftfun(-10.0);
- 
-   return 0;
- }
- 
- // { dg-skip-if "requires hosted libstdc++ for stdc++exp" { ! hostedlib } }
- // { dg-output "contract violation in function ffun at .*.C:14: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function ffun at .*.C:15: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function ftfun<int> at .*.C:38: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function ftfun<int> at .*.C:39: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function explicitfn at .*.C:46: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function explicitfn at .*.C:48: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function ftfun<double> at .*.C:38: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function ftfun<double> at .*.C:39: .*(\n|\r\n|\r)" }
- 
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-constexpr2.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-constexpr2.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-constexpr2.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-constexpr2.C	Thu Jan  1 00:00:00 1970
***************
*** 1,58 ****
- // ensure that failing pre/post can fail at constexpr time
- // { dg-do compile }
- // { dg-options "-std=c++20 -fcontracts -fcontract-continuation-mode=on" }
- 
- constexpr int ffun(int a)
-   [[ pre: a > 0 ]]
-   [[ post r: r > 10 ]]
- {
-   return a;
- }
- 
- template<typename T>
- constexpr int ftfun(T a)
-   [[ pre: a > 0 ]]
-   [[ post r: r > 10 ]]
- {
-   return a;
- }
- 
- constexpr int explicitfn(int a)
-   [[ pre ignore: a > 0 ]]
-   [[ pre check_maybe_continue: a > 0 ]]
-   [[ post ignore r: r > 10 ]]
-   [[ post check_maybe_continue r: r > 10 ]]
- {
-   return a;
- }
- 
- template<typename T>
- constexpr int ftfun2(T a)
-   [[ pre: a > 0 ]]
-   [[ post r: r > 10 ]]
- {
-   return a;
- }
- 
- int main(int, char **) {
-   constexpr int a = ffun(-10);
-   // { dg-error "contract predicate" "" { target *-*-* } 6 }
-   constexpr int b = ftfun(-10);
-   // { dg-error "contract predicate" "" { target *-*-* } 14 }
-   constexpr int c = explicitfn(-10);
-   // { dg-error "contract predicate" "" { target *-*-* } 22 }
-   constexpr int d = ftfun2(-10.0);
-   // { dg-error "contract predicate" "" { target *-*-* } 31 }
- 
-   constexpr int e = ffun(5);
-   // { dg-error "contract predicate" "" { target *-*-* } 7 }
-   constexpr int f = ftfun(5);
-   // { dg-error "contract predicate" "" { target *-*-* } 15 }
-   constexpr int g = explicitfn(5);
-   // { dg-error "contract predicate" "" { target *-*-* } 24 }
-   constexpr int h = ftfun2(5.5);
-   // { dg-error "contract predicate" "" { target *-*-* } 32 }
- 
-   return 0;
- }
- 
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-constexpr3.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-constexpr3.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-constexpr3.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-constexpr3.C	Thu Jan  1 00:00:00 1970
***************
*** 1,10 ****
- // An assumed contract shouldn't break constant evaluation.
- 
- // { dg-do compile { target c++20 } }
- // { dg-additional-options -fcontracts }
- 
- bool b;
- 
- constexpr int f() [[ pre assume: b ]] { return 42; }
- 
- static_assert (f() > 0);
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-conversion1.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-conversion1.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-conversion1.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-conversion1.C	Thu Jan  1 00:00:00 1970
***************
*** 1,19 ****
- // Test to ensure that diagnostic location for condition conversion is in the
- // right place.
- // { dg-do compile }
- // { dg-options "-std=c++2a -fcontracts" }
- 
- 
- template<typename T>
- void fn()
-   [[ pre: T{} ]] // { dg-error "no match" }
- {
- }
- 
- struct Z { };
- 
- int main(int, char**) {
-   fn<int>();
-   fn<Z>();
-   return 0;
- }
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-ctor-dtor1.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-ctor-dtor1.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-ctor-dtor1.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-ctor-dtor1.C	Thu Jan  1 00:00:00 1970
***************
*** 1,177 ****
- // Tests to ensure that contracts are properly emitted for constructors,
- // destructors, and their intersection with templates.
- // { dg-do compile }
- // { dg-options "-std=c++2a -fcontracts" }
- 
- bool pre_{false}, post_{false};
- bool delegate_{false};
- 
- struct S
- {
-   S() [[ pre: pre_ ]] [[ post: post_ ]];
-   ~S() [[ pre: pre_ ]] [[ post: post_ ]];
- };
- 
- S::S() { return; }
- S::~S() { return; }
- 
- struct SInline
- {
-   SInline() [[ pre: pre_ ]] [[ post: post_ ]] { return; }
-   ~SInline() [[ pre: pre_ ]] [[ post: post_ ]] { return; }
- };
- 
- struct SDelegate0
- {
-   SDelegate0(int) [[ pre: pre_ ]] [[ post: post_ ]] { return; }
-   SDelegate0() : SDelegate0(0) { return; }
-   ~SDelegate0() [[ pre: pre_ ]] [[ post: post_ ]] { return; }
- };
- 
- struct SDelegate1
- {
-   SDelegate1(int) { return; }
-   SDelegate1() [[ pre: pre_ ]] [[ post: post_ ]] : SDelegate1(0) { return; }
-   ~SDelegate1() [[ pre: pre_ ]] [[ post: post_ ]] { return; }
- };
- 
- struct SDelegate2
- {
-   SDelegate2(int) [[ pre: pre_ ]] [[ post: post_ ]] { return; }
-   SDelegate2() [[ pre: pre_ && delegate_ ]] [[ post: post_ && delegate_ ]] : SDelegate2(0) { return; }
-   ~SDelegate2() [[ pre: pre_ ]] [[ post: post_ ]] { return; }
- };
- 
- struct SDelegate3
- {
-   SDelegate3(int) [[ pre: pre_ ]] [[ post: post_ ]] { return; }
-   SDelegate3() [[ pre: pre_ && delegate_ ]] [[ post: post_ && delegate_ ]] : SDelegate3(0) { return; }
-   ~SDelegate3() [[ pre: pre_ ]] [[ post: post_ ]] { return; }
- };
- 
- template<typename T>
- struct S1
- {
-   S1() [[ pre: pre_ ]] [[ post: post_ ]] { }
- };
- 
- struct S2
- {
-   template<typename T>
-   S2(T) [[ pre: pre_ ]] [[ post: post_ ]] { }
- };
- 
- template<typename T>
- struct S3
- {
-   template<typename S>
-   S3(S) [[ pre: pre_ ]] [[ post: post_ ]] { }
- };
- 
- struct G0
- {
-   G0() [[ post: x > 0 ]] {}
-   ~G0() [[ pre: x > 0 ]] {}
-   int x{-1};
- };
- 
- struct G1
- {
-   G1() [[ post: this->x > 0 ]] {}
-   ~G1() [[ pre: this->x > 0 ]] {}
-   int x{-1};
- };
- 
- int x{-1};
- 
- struct G2
- {
-   G2() [[ pre: ::x > 0 ]] {}
-   ~G2() [[ post: ::x > 0 ]] {}
-   int x{1};
- };
- 
- void test0()
- {
-   S s;
-   SInline si;
-   SDelegate0 sd0;
-   SDelegate1 sd1;
-   SDelegate2 sd2;
-   SDelegate3 sd3;
-   S1<int> s1_i;
-   S1<double> s1_d;
-   S2 s2_i{1};
-   S2 s2_d{.1};
-   S3<int> s3_i_i{1};
-   S3<int> s3_i_d{.1};
-   S3<double> s3_d_i{1};
-   S3<double> s3_d_d{.1};
- }
- 
- void test1()
- {
-   G0 g0;
-   G1 g1;
-   G2 g2;
- }
- 
- int main(int, char**)
- {
-   test0();
-   test1();
-   return 0;
- };
- 
- // test0
- // { dg-output "contract violation in function S::S at .*.C:11 .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function S::S at .*.C:11 .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function SInline::SInline at .*.C:20 .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function SInline::SInline at .*.C:20 .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function SDelegate0::SDelegate0 at .*.C:26 .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function SDelegate0::SDelegate0 at .*.C:26 .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function SDelegate1::SDelegate1 at .*.C:34 .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function SDelegate1::SDelegate1 at .*.C:34 .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function SDelegate2::SDelegate2 at .*.C:41 .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function SDelegate2::SDelegate2 at .*.C:40 .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function SDelegate2::SDelegate2 at .*.C:40 .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function SDelegate2::SDelegate2 at .*.C:41 .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function SDelegate3::SDelegate3 at .*.C:48 .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function SDelegate3::SDelegate3 at .*.C:47 .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function SDelegate3::SDelegate3 at .*.C:47 .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function SDelegate3::SDelegate3 at .*.C:48 .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function S1<int>::S1 at .*.C:55 .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function S1<int>::S1 at .*.C:55 .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function S1<double>::S1 at .*.C:55 .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function S1<double>::S1 at .*.C:55 .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function S2::S2<int> at .*.C:61 .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function S2::S2<int> at .*.C:61 .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function S2::S2<double> at .*.C:61 .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function S2::S2<double> at .*.C:61 .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function S3<int>::S3<int> at .*.C:68 .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function S3<int>::S3<int> at .*.C:68 .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function S3<int>::S3<double> at .*.C:68 .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function S3<int>::S3<double> at .*.C:68 .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function S3<double>::S3<int> at .*.C:68 .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function S3<double>::S3<int> at .*.C:68 .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function S3<double>::S3<double> at .*.C:68 .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function S3<double>::S3<double> at .*.C:68 .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function SDelegate3::~SDelegate3 at .*.C:49 .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function SDelegate3::~SDelegate3 at .*.C:49 .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function SDelegate2::~SDelegate2 at .*.C:42 .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function SDelegate2::~SDelegate2 at .*.C:42 .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function SDelegate1::~SDelegate1 at .*.C:35 .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function SDelegate1::~SDelegate1 at .*.C:35 .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function SDelegate0::~SDelegate0 at .*.C:28 .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function SDelegate0::~SDelegate0 at .*.C:28 .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function SInline::~SInline at .*.C:21 .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function SInline::~SInline at .*.C:21 .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function S::~S at .*.C:12 .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function S::~S at .*.C:12 .*(\n|\r\n|\r)" }
- 
- // test1
- // { dg-output "contract violation in function G0::G0 at .*.C:73 .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function G1::G1 at .*.C:80 .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function G1::~G1 at .*.C:81 .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function G0::~G0 at .*.C:74 .*(\n|\r\n|\r)" }
- 
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-ctor-dtor2.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-ctor-dtor2.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-ctor-dtor2.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-ctor-dtor2.C	Thu Jan  1 00:00:00 1970
***************
*** 1,35 ****
- // Tests to ensure that an invalid this parm cannot be used in pre on ctors or
- // in post on dtors.
- // { dg-do compile }
- // { dg-options "-std=c++2a -fcontracts" }
- 
- struct F0
- {
-   F0() [[ pre: x > 0 ]]; // { dg-error "invalid use of member" }
-   ~F0() [[ post: x > 0 ]]; // { dg-error "invalid use of member" }
-   int x{-1};
- };
- 
- struct F1
- {
-   F1() [[ pre: this->x > 0 ]]; // { dg-error "may not be used" }
-   ~F1() [[ post: this->x > 0 ]]; // { dg-error "may not be used" }
-   int x{-1};
- };
- 
- struct F2
- {
-   F2()
-     [[ post ret: false ]] // { dg-error "does not return a value" }
-   {
-   }
-   ~F2()
-     [[ post r: false ]] // { dg-error "does not return a value" }
-   {
-   }
-   void f()
-     [[ post r: false ]] // { dg-error "does not return a value" }
-   {
-   }
- };
- 
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-cv1.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-cv1.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-cv1.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-cv1.C	Thu Jan  1 00:00:00 1970
***************
*** 1,37 ****
- // Tests to ensure that contracts have a properly cv qualified this
- // { dg-do compile }
- // { dg-options "-std=c++2a -fcontracts" }
- 
- struct S
- {
-   int g() const { return x_; }
-   int f() { return x_; }
- 
-   void mem_c() const
-     [[ pre: f() ]] // { dg-error "discards qualifiers" }
-   {
-   }
-   void mem_nc()
-     [[ pre: f() ]]
-   {
-   }
- 
-   void memc_c() const
-     [[ pre: g() ]]
-   {
-   }
-   void memc_nc()
-     [[ pre: g() ]]
-   {
-   }
- 
-   private:
-     int x_{-10};
- };
- 
- int main(int, char**)
- {
-   S s;
-   return 0;
- };
- 
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-deduced1.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-deduced1.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-deduced1.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-deduced1.C	Thu Jan  1 00:00:00 1970
***************
*** 1,108 ****
- // Tests to ensure that deduced return types work with postconditions using
- // the return value on defining declarations.
- // { dg-do compile }
- // { dg-options "-std=c++2a -fcontracts --param ggc-min-heapsize=0 --param ggc-min-expand=0" }
- 
- auto undeduced(int z)
- {
-   if (!(sizeof(decltype(undeduced(5))) > 4)) // { dg-error "before deduction" }
-     return 5;
-   return 4;
- }
- 
- // defining declaration, fine
- auto g0(int a) [[ pre: a < 0 ]] [[ post r: r > 0 ]]
- {
-   return -a * 1.2;
- }
- 
- // non defining post using nondeduced identifier, fine
- int g1(int m) [[ post r: r == m ]];
- 
- int g1(int n) [[ post s: s == n ]]
- {
-   return -n;
- }
- 
- int g2(int z)
-   [[ pre: sizeof(decltype(g2(5))) > 4 ]]; // { dg-error "not declared" }
- 
- int g3(int z)
-   [[ pre: sizeof(decltype(g2(5))) > 4 ]]
- {
-   return -z;
- }
- 
- // deduced that doesn't use return, good
- auto g4(int m) [[ post: m ]];
- 
- auto g4(int m) [[ post: m ]]
- {
-   return -m;
- }
- 
- auto g5(int m) [[ pre: m ]];
- 
- auto g5(int m) [[ pre: m ]]
- {
-   return -m;
- }
- 
- template<typename T>
- auto g6(T t) [[ post r: r == t ]];
- 
- template<typename S>
- auto g6(S s) [[ post q: q == s ]]
- {
-   return s;
- }
- 
- template<typename T>
- T g7(T t) [[ post r: r == t ]];
- 
- template<typename S>
- S g7(S s) [[ post q: q == s ]]
- {
-   return s;
- }
- 
- template<typename T>
- auto g8(T t) [[ post r: r == t && sizeof(decltype(::g8(t))) > 2 ]]; // { dg-error "not been declared" }
- 
- // This failure is related to the fact that we've invalidated the previous
- // contract. 
- template<typename S>
- auto g8(S s) [[ post q: q == s && sizeof(decltype(::g8(s))) > 2 ]] // { dg-error "mismatched" }
- {
-   return s;
- }
- 
- // non defining pre, bad
- auto f0(int z)
-   [[ pre: sizeof(decltype(f0(5))) > 4 ]]; // { dg-error "not declared" }
- 
- // defining pre, still ill formed
- auto f1(int z)
-   [[ pre: sizeof(decltype(f1(5))) > 4 ]] // { dg-error "not declared" }
- {
-   return '5';
- }
- 
- // undeduced using postcon, OK
- auto f2(int m) [[ post r: r == m ]];
- 
- auto f2(int n) [[ post s: s == n ]]
- {
-   return n;
- }
- 
- template<typename T>
- void f3(T t) [[ post r: false ]] // { dg-error "function does not return a value" }
- {
- }
- 
- int main(int, char**)
- {
-   return 0;
- }
- 
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-deduced2.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-deduced2.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-deduced2.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-deduced2.C	Thu Jan  1 00:00:00 1970
***************
*** 1,85 ****
- // check that contracts work around deduced return types
- // { dg-do run }
- // { dg-options "-std=c++2a -fcontracts -fcontract-continuation-mode=on" }
- 
- auto g0(int a) [[ pre: a < 0 ]] [[ post r: r > 0 ]]
- {
-   return -a * 1.2;
- }
- 
- int g1(int m) [[ post r: r == m ]];
- 
- int g1(int n) [[ post s: s == n ]]
- {
-   return -n;
- }
- 
- int g2(int z)
- {
-   return -z;
- }
- 
- int g3(int z)
-   [[ pre: sizeof(decltype(g2(5))) > 4 ]]
- {
-   return -z;
- }
- 
- auto g4(int m) [[ post: m ]];
- 
- auto g4(int m) [[ post: m ]]
- {
-   return -m;
- }
- 
- auto g5(int m) [[ pre: m ]];
- 
- auto g5(int m) [[ pre: m ]]
- {
-   return -m;
- }
- 
- template<typename T>
- auto g6(T t) [[ post r: r == t ]];
- 
- template<typename S>
- auto g6(S s) [[ post q: q == s ]]
- {
-   return -s;
- }
- 
- // template<typename T>
- // T g7(T t) [[ post r: r == t ]];
- 
- template<typename S>
- S g7(S s) [[ post q: q == s ]]
- {
-   return -s;
- }
- 
- int main(int, char**) {
-   g0(5);
-   g1(6);
-   g2(1);
-   g3(1);
-   g4(0);
-   g5(0);
-   g6(5);
-   g6(5.5);
-   g7(5);
-   g7(6.6);
-   return 0;
- }
- 
- // { dg-skip-if "requires hosted libstdc++ for stdc++exp" { ! hostedlib } }
- // { dg-output "contract violation in function g0 at .*.C:5: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function g0 at .*.C:5: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function g1 at .*.C:12: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function g3 at .*.C:23: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function g4 at .*.C:30: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function g5 at .*.C:37: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function g6<int> at .*.C:46: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function g6<double> at .*.C:46: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function g7<int> at .*.C:55: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function g7<double> at .*.C:55: .*(\n|\r\n|\r)" }
- 
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-err1.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-err1.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-err1.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-err1.C	Thu Jan  1 00:00:00 1970
***************
*** 1,7 ****
- // PR c++/108542
- // { dg-additional-options -fcontracts }
- // { dg-do compile { target c++11 } }
- 
- template<typename T>
- void f (T n) {}
- void g() [[pre: f]];			// { dg-error "overloaded" }
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-externC.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-externC.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-externC.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-externC.C	Thu Jan  1 00:00:00 1970
***************
*** 1,20 ****
- // simple check to ensure we don't emit a function with the same name twice,
- // when wrapping functions in pre- and postconditions.
- // { dg-do link }
- // { dg-options "-std=c++2a -fcontracts -fcontract-continuation-mode=on" }
- // { dg-skip-if "requires hosted libstdc++ for stdc++exp" { ! hostedlib } }
- 
- volatile int x = 10;
- 
- extern "C" void
- f ()
-   [[ pre: x < 10 ]]
- {
- }
- 
- int
- main ()
-   [[ post: x > 10 ]]
- {
-   f();
- }
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-friend1.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-friend1.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-friend1.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-friend1.C	Thu Jan  1 00:00:00 1970
***************
*** 1,41 ****
- // ensure contracts on friend declarations are a complete class context
- // { dg-do run }
- // { dg-options "-std=c++2a -fcontracts -fcontract-continuation-mode=on" }
- 
- struct X {
-   friend void fn0(X x) [[ pre: x.a > 0 ]] { }
- 
-   friend void fn2(X x);
-   static void fns0(X x) [[ pre: x.a > 0 ]] { }
-   static void fns1(X x) [[ pre: x.a > 0 ]];
-   static void fns2(X x);
- 
-   friend void fn(X &x) { x.a = -5; }
- 
- private:
-   int a{10};
- };
- 
- void fn2(X x) [[ pre: x.a > 0 ]] { }
- void X::fns1(X x) { }
- void X::fns2(X x) [[ pre: x.a > 0 ]] { }
- 
- int main(int, char**) {
-   X x;
-   fn(x); // no contract
- 
-   fn0(x);
-   fn2(x);
- 
-   X::fns0(x);
-   X::fns1(x);
-   X::fns2(x);
-   return 0;
- }
- 
- // { dg-skip-if "requires hosted libstdc++ for stdc++exp" { ! hostedlib } }
- // { dg-output "contract violation in function fn0 at .*.C:6: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function fn2 at .*.C:19: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function X::fns0 at .*.C:9: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function X::fns1 at .*.C:10: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function X::fns2 at .*.C:21: .*(\n|\r\n|\r)" }
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-ft1.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-ft1.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-ft1.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-ft1.C	Thu Jan  1 00:00:00 1970
***************
*** 1,14 ****
- // { dg-do compile }
- 
- #ifdef __cpp_contracts
- static_assert (false);
- #endif
- 
- #ifdef __cpp_contracts_literal_semantics
- static_assert (false);
- #endif
- 
- #ifdef __cpp_contracts_roles
- static_assert (false);
- #endif
- 
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-ignore1.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-ignore1.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-ignore1.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-ignore1.C	Thu Jan  1 00:00:00 1970
***************
*** 1,30 ****
- // test that ignored contracts do instatiate templates
- // { dg-do compile }
- // { dg-options "-std=c++2a -fcontracts" }
- 
- template<typename T>
- int f(T t)
- {
-   return -t;
- }
- 
- int dummy()
- {
-   [[ assert ignore: f(1.0) > 0 ]];
-   return -1;
- }
- 
- template<>
- int f(double t) // { dg-error "specialization of.*after instantiation" }
- {
-   return -1.0;
- }
- 
- int main()
- {
-   dummy();
-   f(1);
-   f(1.0);
-   return 0;
- }
- 
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-ignore2.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-ignore2.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-ignore2.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-ignore2.C	Thu Jan  1 00:00:00 1970
***************
*** 1,27 ****
- // baseline for testing assert contracts being turned into compile time
- // assumptions; see contracts-assume2 for the assumed case
- // { dg-do run }
- // { dg-options "-std=c++2a -fcontracts" }
- // { dg-skip-if "requires hosted libstdc++ for cstdio" { ! hostedlib } }
- #include <cstdio>
- 
- int fun(int x) {
-   [[assert audit: x > 0]];
-   if(x <= 0)
-   {
-     printf("%d: test x<=0 opt out\n", x);
-     return -1;
-   }
-   else
-   {
-     printf("%d: test x>0\n", x);
-     return 0;
-   }
- }
- 
- int main(int, char**) {
-   volatile int x = -1;
-   return fun(x);
- }
- 
- // { dg-shouldfail "" }
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-large-return.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-large-return.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-large-return.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-large-return.C	Thu Jan  1 00:00:00 1970
***************
*** 1,15 ****
- // { dg-do compile }
- // { dg-options "-std=c++2a -fcontracts" }
- 
- struct Foo
- {
-   int x;
-   bool y;
-   long z[4];
- };
- 
- Foo foo() [[ pre: true ]]
- {
-   return {};
- }
- 
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-multiline1.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-multiline1.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-multiline1.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-multiline1.C	Thu Jan  1 00:00:00 1970
***************
*** 1,20 ****
- // { dg-do run }
- // { dg-options "-std=c++2a -fcontracts -fcontract-continuation-mode=on" }
- 
- int main(int, char **)
- {
-   int x = 5;
-   int y = 10;
-   [[ assert:
-     x
-     <
-     10
-     &&
-     y
-     >
-     123
-   ]];
- }
- 
- // { dg-skip-if "requires hosted libstdc++ for stdc++exp" { ! hostedlib } }
- // { dg-output "contract violation in function main at .*.C:8: x < 10 && y > 123.*(\n|\r\n|\r)" }
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-multiple-inheritance1.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-multiple-inheritance1.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-multiple-inheritance1.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-multiple-inheritance1.C	Thu Jan  1 00:00:00 1970
***************
*** 1,15 ****
- // { dg-do compile }
- // { dg-options "-std=c++2a -fcontracts -fcontract-continuation-mode=on" }
- 
- struct BaseA {
-   virtual int fun(int n) [[ pre: n > 0 ]] { return -n; }
- };
- 
- struct BaseB {
-   virtual int fun(int n) [[ pre: n > 0 ]] { return -n; }
- };
- 
- struct Child : public BaseA, BaseB {
-   int fun(int n) [[ pre: n > 0 ]] { return -n; }
- };
- 
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-multiple-inheritance2.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-multiple-inheritance2.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-multiple-inheritance2.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-multiple-inheritance2.C	Thu Jan  1 00:00:00 1970
***************
*** 1,33 ****
- // { dg-do compile }
- // { dg-options "-std=c++2a -fcontracts -fcontract-continuation-mode=on" }
- 
- struct BaseA {
-   virtual int fun(int n) [[ pre: n > 0 ]] { return -n; }
- };
- 
- struct BaseB {
-   virtual int fun(int n) [[ pre: n < 0 ]] { return -n; }
- };
- 
- struct Child1 : public BaseA, BaseB {
-   int fun(int n) [[ pre: n > 0 ]] { return -n; } // { dg-error "mismatched" }
- };
- 
- struct Child2 : public BaseA, BaseB {
-   int fun(int n) [[ pre: n < 0 ]] { return -n; } // { dg-error "mismatched" }
- };
- 
- struct Child3 : public BaseA, BaseB {
-   int fun(int n) { return -n; }
- };
- 
- struct Child4 : public BaseA {
-   int fun(int n);
- };
- 
- int Child4::fun(int n)
-   [[ pre: n != 0 ]] // { dg-error "mismatched" }
- {
-   return -n;
- }
- 
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-nested-class1.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-nested-class1.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-nested-class1.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-nested-class1.C	Thu Jan  1 00:00:00 1970
***************
*** 1,24 ****
- // { dg-do compile }
- // { dg-options "-std=c++2a -fcontracts" }
- 
- void gfn3(int n) [[ pre: n > 0 ]];
- 
- struct Outer {
-   struct Inner {
-     void fn(int n) [[ pre: n > 0 && bob > 1 ]];
-     void fn2(int n) [[ pre: n > 0 && bob > 1 ]];
-   };
- 
-   void fn(int m) [[ pre: m > 1 ]];
-   friend void Inner::fn(int n) [[ pre: n > 0 && bob > 1 ]]; // { dg-error "not declared" }
- 
-   friend void gfn(int p) [[ pre: p > 0 ]];
-   friend void gfn(int q) [[ pre: q > 1 ]]; // { dg-error "'q' was not declared" }
- 
-   // This should be okay.
-   friend void gfn2(int q);
-   friend void gfn2(int p) [[ pre: p > 0 ]] { }
- 
-   static int bob;
- };
- int Outer::bob{-1};
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-nested-class2.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-nested-class2.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-nested-class2.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-nested-class2.C	Thu Jan  1 00:00:00 1970
***************
*** 1,41 ****
- // { dg-do run }
- // { dg-options "-std=c++2a -fcontracts -fcontract-continuation-mode=on" }
- // { dg-skip-if "requires hosted libstdc++ for stdc++exp" { ! hostedlib } }
- 
- void gfn3(int n) [[ pre: n > 0 ]];
- 
- struct Outer {
-   struct Inner {
-     void fn(int n) [[ pre: n > 0 && bob > 1 ]];
-   };
- 
-   void fn(int m) [[ pre: m > 1 ]];
- 
-   friend void gfn1(int q);
-   friend void gfn1(int p) [[ pre: p > 0 ]] { }
- 
-   friend void gfn2(int q, Outer *);
-   friend void gfn2(int p, Outer *) [[ pre: p > 0 ]] { }
- 
-   friend void gfn3(int n);
- 
-   static int bob;
- };
- int Outer::bob{-1};
- 
- void Outer::Inner::fn(int x) { }
- void Outer::fn(int y) { }
- 
- void gfn3(int n) { }
- void gfn1(int q);
- 
- int main(int, char **) {
-   Outer::Inner in;
-   in.fn(-5);
-   Outer out;
-   out.fn(-6);
-   gfn1(-7);
-   gfn2(-8, &out);
-   gfn3(-9);
- }
- 
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-nocopy1.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-nocopy1.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-nocopy1.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-nocopy1.C	Thu Jan  1 00:00:00 1970
***************
*** 1,24 ****
- // Contracts shouldn't introduce more copies.
- 
- // { dg-do compile { target c++20 } }
- // { dg-additional-options -fcontracts }
- 
- struct A
- {
-   int i;
-   A(int i): i(i) { }
-   A(const A&) = delete;
- };
- 
- A f(A a)
-   [[ pre: a.i > 0 ]]
-   [[ post r: r.i > 0 ]]
- {
-   return {a.i};
- }
- 
- int main()
- {
-   if (f({42}).i != 42)
-     __builtin_abort ();
- }
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-override.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-override.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-override.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-override.C	Thu Jan  1 00:00:00 1970
***************
*** 1,43 ****
- // { dg-do compile }
- // { dg-options "-std=c++2a -fcontracts" }
- 
- struct Foo {
-   virtual int f0(int n) [[ pre: false ]] { return n; }
-   virtual int f1(int n) [[ pre: false ]] { return n; }
-   virtual int f2(int n) [[ pre: false ]] { return n; }
-   virtual int f3(int n) [[ pre: false ]] { return n; }
-   virtual int f4(int n) [[ pre: false ]] { return n; }
-   virtual int f5(int n) [[ pre: false ]] { return n; }
-   virtual int f6(int n) [[ pre: false ]] { return n; }
-   virtual int f7(int n) [[ pre: false ]] { return n; }
-   virtual int f8(int n) [[ pre: false ]] { return n; }
-   virtual int f9(int n) [[ pre: false ]] { return n; }
-   virtual int f10(int n) [[ pre: false ]] { return n; }
-   virtual int f11(int n) [[ pre: n > 0 ]] [[ pre: n > 1 ]] { return n; }
-   virtual int f12(int n) [[ pre: n > 0 ]] [[ pre: n > 1 ]] { return n; }
- };
- 
- struct Bar : Foo {
-   [[ pre: n > -1 ]] int f0(int n = 0) override { return -n; } // { dg-error "contracts must appertain" }
-   int [[ pre: n > -2 ]] f1(int n = 0) override { return -n; } // { dg-error "contracts must appertain" }
-   int f2 [[ pre: n > -3 ]] (int n = 0) override { return -n; } // { dg-error "contracts must appertain" }
-   int f4([[ pre: n > -4 ]] int n = 0) override { return -n; } // { dg-error "contracts must appertain" }
-   int f5(int [[ pre: n > -5 ]] n = 0) override { return -n; } // { dg-error "contracts must appertain" }
-   int f6(int n [[ pre: n > -6 ]] = 0) override { return -n; } // { dg-error "contracts must appertain" }
-   int f7(int n = [[ pre: n > -7 ]] 0) override { return -n; }
-   // { dg-error "expected identifier" "" { target *-*-* } .-1 }
-   // { dg-error "expected .\{. before numeric" "" { target *-*-* } .-2 }
-   // { dg-error "invalid user-defined conversion" "" { target *-*-* } .-3 }
-   // { dg-error "expected .,." "" { target *-*-* } .-4 }
-   int f8(int n = 0 [[ pre: n > -8 ]]) override { return -n; }
-   // { dg-error "shall only introduce an attribute" "" { target *-*-* } .-1 }
-   int f9(int n = 0) [[ pre: n > -9 ]] override { return -n; } // { dg-error "mismatched contract" }
- 
-   // The grammar doesn't appear to permit contracts after the virt-specifiers
-   // but the parser will happily add these to an attribute list that is not
-   // owned by the function declarator.
-   int f10(int n = 0) override [[ pre: n > -10 ]] { return -n; } // { dg-error "contracts must appertain" }
-   int f11(int n) [[ pre: n > 1 ]] override [[ pre: n > 0 ]] { return -n; } // { dg-error "contracts must appertain" }
-   int f12(int n) [[ pre: n > 0 ]] override [[ pre: n > 1 ]] { return -n; } // { dg-error "contracts must appertain" }
- };
- 
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-post1.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-post1.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-post1.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-post1.C	Thu Jan  1 00:00:00 1970
***************
*** 1,74 ****
- // { dg-do compile }
- // { dg-options "-std=c++2a -fcontracts" }
- 
- int f1(int n)
-   [[pre: n >= 0]]
-   [[post r: r >= 0]]
-   [[post r: !(r < 0)]]
- {
-   return n;
- }
- 
- int f2(int n)
-   [[post: true]]
- {
-   return 0;
- }
- 
- int f3(int n)
-   [[post r: r >= n]]
- {
-   return n + 1;
- }
- 
- int f4(int n)
-   [[post: x > 0]] // { dg-error "not declared" }
- {
-   return 0;
- }
- 
- void f5()
-   [[post: true]]
- { }
- 
- void f6()
-   [[post r: true]] // { dg-error "function does not return a value" }
- { }
- 
- int f7(int n)
-   [[post: n > 0]]
- {
-   return x; // { dg-error "not declared" }
- }
- 
- void f8(int n)
-   [[post: n > 0]]
- {
-   return;
- }
- 
- void f9(int n)
-   [[post: n > 0]]
- {
-   return n; // { dg-error "return-statement with a value" }
- }
- 
- int f10(int n)
-   [[post: n > 0]]
- {
-   return; // { dg-error "return-statement with no value" }
- }
- 
- void f11()
-   [[post: true]]
- {
-   constexpr int n = 0;
-   return n; // { dg-error "return-statement with a value" }
- }
- 
- int f12()
-   [[post: true]]
- {
-   return; // { dg-error "return-statement with no value" }
- }
- 
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-post2.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-post2.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-post2.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-post2.C	Thu Jan  1 00:00:00 1970
***************
*** 1,14 ****
- // { dg-do run }
- // { dg-options "-std=c++2a -fcontracts" }
- // { dg-skip-if "requires hosted libstdc++ for stdc++exp" { ! hostedlib } }
- 
- int f1(int n)
-   [[post r: r == n]]
- {
-   return n;
- }
- 
- int main()
- {
-   f1(0);
- }
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-post3.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-post3.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-post3.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-post3.C	Thu Jan  1 00:00:00 1970
***************
*** 1,16 ****
- // { dg-do run }
- // { dg-options "-std=c++2a -fcontracts" }
- // { dg-shouldfail "assert violation" }
- // { dg-output "contract violation in function f1" }
- // { dg-skip-if "requires hosted libstdc++ for stdc++exp" { ! hostedlib } }
- 
- int f1(int n)
-   [[post r: r > n]]
- {
-   return n;
- }
- 
- int main()
- {
-   f1(0);
- }
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-post4.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-post4.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-post4.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-post4.C	Thu Jan  1 00:00:00 1970
***************
*** 1,36 ****
- // { dg-do compile }
- // { dg-options "-std=c++2a -fcontracts" }
- 
- struct S
- {
-   S() [[post: n == 0]]
-     : n(0)
-   { }
- 
-   ~S() [[post: true]]
-   { }
- 
-   int f1()
-     [[post r: n == r]]
-   {
-     return n;
-   }
- 
-   int f2()
-     [[post r: r == x]] // { dg-error "not declared" }
-   {
-     return n;
-   }
- 
-   void f3()
-     [[post r: n]] // { dg-error "does not return a value" }
-   {
-   }
- 
-   int n = 0;
- };
- 
- int main()
- {
-   // f1(0);
- }
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-post5.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-post5.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-post5.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-post5.C	Thu Jan  1 00:00:00 1970
***************
*** 1,19 ****
- // { dg-do compile }
- // { dg-options "-std=c++2a -fcontracts" }
- 
- // Tests for function templates
- 
- template<typename T>
- T f1(T n)
-   [[pre: n >= 0]]
-   [[post r: r >= 0]]
-   [[post r: !(r < 0)]]
- {
-   return n;
- }
- 
- 
- void driver()
- {
-   f1(0);
- }
\ No newline at end of file
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-post6.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-post6.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-post6.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-post6.C	Thu Jan  1 00:00:00 1970
***************
*** 1,30 ****
- // { dg-do compile }
- // { dg-options "-std=c++2a -fcontracts" }
- 
- // Test for class members
- 
- template<typename T>
- struct S
- {
-   S(T n)
-     [[post: true]]
-     : n(n)
-   { }
- 
-   T f1(T n)
-     [[pre: n >= 0]]
-     [[post r: r >= 0]]
-     [[post r: !(r < 0)]]
-   {
-     return n;
-   }
- 
-   T n;
- };
- 
- 
- void driver()
- {
-   S<int> s1(0);
-   s1.f1(2);
- }
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-post7.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-post7.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-post7.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-post7.C	Thu Jan  1 00:00:00 1970
***************
*** 1,30 ****
- // { dg-do run }
- // { dg-options "-std=c++2a -fcontracts" }
- /* { dg-skip-if "requires hosted libstdc++ for cwchar" { ! hostedlib } } */
- 
- #include <experimental/contract>
- 
- using std::experimental::contract_violation;
- void handle_contract_violation(const contract_violation &violation)
- {
-   __builtin_exit (0);
- }
- 
- struct A {
-   int i;
-   A(): i(42) {}
-   A(const A&);
- };
- 
- A f()
-   [[ post r: r.i == 24 ]]
- {
-   A a;
-   return a;
- }
- 
- int main()
- {
-   f();
-   return -1;
- }
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-pre1.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-pre1.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-pre1.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-pre1.C	Thu Jan  1 00:00:00 1970
***************
*** 1,36 ****
- // generic pre contract parsing checks
- //   check omitted, 'default', 'audit', and 'axiom' contract levels parse
- //   ensure that an invalid contrcat level 'off' errors
- //   ensure that a predicate referencing an undefined variable errors
- //   ensure that a missing colon after contract level errors
- // { dg-do compile }
- // { dg-options "-std=c++2a -fcontracts" }
- 
- void f1(int x) [[ pre: x >= 0 ]] { }
- void f2(int x) [[ pre default: x >= 0 ]] { }
- void f3(int x) [[ pre audit: x >= 0 ]] { }
- void f4(int x) [[ pre axiom: x >= 0 ]] { }
- 
- void finvalid(int x) [[ pre invalid: x >= 0 ]] { } // { dg-error "expected contract level" }
- void fundeclared() [[ pre: x >= 0 ]] { } // { dg-error ".x. was not declared in this scope" }
- void fmissingcolon(int x) [[ pre default x == 0]] { } // { dg-error "expected .:. before .x." }
- 
- int Z;
- void (*fp1)(int x) [[ pre: Z > 0 ]]; // { dg-error "contracts must appertain" }
- void (*fp2 [[ pre: Z > 0 ]])(int x); // { dg-error "contracts must appertain" }
- typedef void (*fp3)(int x) [[ pre: Z > 0 ]]; // { dg-error "contracts must appertain" }
- typedef void (*fp4 [[ pre: Z > 0 ]])(int x); // { dg-error "contracts must appertain" }
- fp3 fn5(int a) [[ pre: a > 0 ]]; // { dg-bogus "contracts must appertain" }
- 
- int xyz;
- [[ pre: xyz ]] struct Bar; // { dg-error "contracts must appertain" }
- // { dg-warning "attribute ignored" "" { target *-*-* } .-1 }
- struct [[ pre: xyz ]] Bar; // { dg-error "contracts must appertain" }
- struct Bar [[ pre: xyz ]]; // { dg-error "contracts must appertain" }
- struct Zoo {} x [[ pre: xyz ]]; // { dg-error "contracts must appertain" }
- 
- void f6(int x) [[ pre: x > 0 ; // { dg-error "expected .]." }
- void f7(int x) [[ pre: x > 0 ]; // { dg-error "expected .]." }
- void f8(int x) [[ pre: x > 0 { }; // { dg-error "expected .]." }
- void f9(int x) [[ pre: x > 0 ] { }; // { dg-error "expected .]." }
- 
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-pre10.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-pre10.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-pre10.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-pre10.C	Thu Jan  1 00:00:00 1970
***************
*** 1,217 ****
- // { dg-do run }
- // { dg-options "-std=c++2a -fcontracts -fcontract-continuation-mode=on" }
- 
- struct M
- {
-   template<typename T>
-   int f(int a) [[ pre: a > 0 ]];
- 
-   template<typename T>
-   int g(int a) [[ pre: a > 0 ]]
-   {
-     return -a;
-   }
- 
-   template<typename T>
-   int f_arg(T a) [[ pre: a > 0 ]];
- 
-   template<typename T>
-   int g_arg(T a) [[ pre: a > 0 ]]
-   {
-     return (int)-a;
-   }
- 
-   template<typename T>
-   T f_ret(int a) [[ pre: a > 0 ]];
- 
-   template<typename T>
-   T g_ret(int a) [[ pre: a > 0 ]]
-   {
-     return -a * 1.5;
-   }
- };
- 
- template<typename T>
- int M::f(int a)
- {
-   return -a;
- }
- 
- template<typename T>
- int M::f_arg(T a)
- {
-   return (int)-a;
- }
- 
- template<typename T>
- T M::f_ret(int a)
- {
-   return -a * (T)1.5;
- }
- 
- template<typename T>
- struct S
- {
-   template<typename Q>
-   int f(int a) [[ pre: a > 0 ]];
- 
-   template<typename Q>
-   int g(int a) [[ pre: a > 0 ]]
-   {
-     return -a;
-   }
- };
- 
- template<typename T>
- template<typename Q>
- int S<T>::f(int a)
- {
-   return -a;
- }
- 
- #include <cstdio>
- int main(int, char**)
- {
-   {
-     M m;
-     printf ("=================================\n");
-     printf ("m.f<int>(-10): %d\n", m.f<int>(-10));
-     printf ("m.f<double>(-11.5): %d\n", m.f<double>(-11.5));
-     printf ("m.f<int>(10): %d\n", m.f<int>(10));
-     printf ("m.f<double>(11.5): %d\n", m.f<double>(11.5));
- 
-     printf ("=================================\n");
-     printf ("m.g<int>(-10): %d\n", m.g<int>(-10));
-     printf ("m.g<double>(-11.5): %d\n", m.g<double>(-11.5));
-     printf ("m.g<int>(10): %d\n", m.g<int>(10));
-     printf ("m.g<double>(11.5): %d\n", m.g<double>(11.5));
- 
-     printf ("=================================\n");
-     printf ("m.f_arg(-10): %d\n", m.f_arg(-10));
-     printf ("m.f_arg(-11.5): %d\n", m.f_arg(-11.5));
-     printf ("m.f_arg(10): %d\n", m.f_arg(10));
-     printf ("m.f_arg(11.5): %d\n", m.f_arg(11.5));
- 
-     printf ("=================================\n");
-     printf ("m.g_arg(-10): %d\n", m.g_arg(-10));
-     printf ("m.g_arg(-11.5): %d\n", m.g_arg(-11.5));
-     printf ("m.g_arg(10): %d\n", m.g_arg(10));
-     printf ("m.g_arg(11.5): %d\n", m.g_arg(11.5));
- 
-     printf ("=================================\n");
-     printf ("m.f_ret<int>(-10): %d\n", m.f_ret<int>(-10));
-     printf ("m.f_ret<double>(-11.5): %f\n", m.f_ret<double>(-11.5));
-     printf ("m.f_ret<int>(10): %d\n", m.f_ret<int>(10));
-     printf ("m.f_ret<double>(11.5): %f\n", m.f_ret<double>(11.5));
- 
-     printf ("=================================\n");
-     printf ("m.g_ret<int>(-10): %d\n", m.g_ret<int>(-10));
-     printf ("m.g_ret<double>(-11.5): %f\n", m.g_ret<double>(-11.5));
-     printf ("m.g_ret<int>(10): %d\n", m.g_ret<int>(10));
-     printf ("m.g_ret<double>(11.5): %f\n", m.g_ret<double>(11.5));
-   }
- 
-   {
-     S<int> s;
-     printf ("=================================\n");
-     s.f<int>(-10);
- 
-     s.f<double>(-10);
- 
-     printf ("=================================\n");
-     s.g<int>(-10);
- 
-     s.g<double>(-10);
-   }
- 
-   {
-     S<double> s;
-     printf ("=================================\n");
-     s.f<int>(-10);
- 
-     s.f<double>(-10);
- 
-     printf ("=================================\n");
-     s.g<int>(-10);
- 
-     s.g<double>(-10);
-   }
- 
-   return 0;
- }
- 
- // { dg-skip-if "requires hosted libstdc++ for cstdio" { ! hostedlib } }
- // { dg-output {=================================(\n|\r\n|\r)} }
- // { dg-output {contract violation in function M::f<int> at .*:7: a > 0(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {m.f<int>\(-10\): 10(\n|\r\n|\r)} }
- // { dg-output {contract violation in function M::f<double> at .*:7: a > 0(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {m.f<double>\(-11.5\): 11(\n|\r\n|\r)} }
- // { dg-output {m.f<int>\(10\): -10(\n|\r\n|\r)} }
- // { dg-output {m.f<double>\(11.5\): -11(\n|\r\n|\r)} }
- // { dg-output {=================================(\n|\r\n|\r)} }
- // { dg-output {contract violation in function M::g<int> at .*:10: a > 0(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {m.g<int>\(-10\): 10(\n|\r\n|\r)} }
- // { dg-output {contract violation in function M::g<double> at .*:10: a > 0(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {m.g<double>\(-11.5\): 11(\n|\r\n|\r)} }
- // { dg-output {m.g<int>\(10\): -10(\n|\r\n|\r)} }
- // { dg-output {m.g<double>\(11.5\): -11(\n|\r\n|\r)} }
- // { dg-output {=================================(\n|\r\n|\r)} }
- // { dg-output {contract violation in function M::f_arg<int> at .*:16: a > 0(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {m.f_arg\(-10\): 10(\n|\r\n|\r)} }
- // { dg-output {contract violation in function M::f_arg<double> at .*:16: a > 0(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {m.f_arg\(-11.5\): 11(\n|\r\n|\r)} }
- // { dg-output {m.f_arg\(10\): -10(\n|\r\n|\r)} }
- // { dg-output {m.f_arg\(11.5\): -11(\n|\r\n|\r)} }
- // { dg-output {=================================(\n|\r\n|\r)} }
- // { dg-output {contract violation in function M::g_arg<int> at .*:19: a > 0(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {m.g_arg\(-10\): 10(\n|\r\n|\r)} }
- // { dg-output {contract violation in function M::g_arg<double> at .*:19: a > 0(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {m.g_arg\(-11.5\): 11(\n|\r\n|\r)} }
- // { dg-output {m.g_arg\(10\): -10(\n|\r\n|\r)} }
- // { dg-output {m.g_arg\(11.5\): -11(\n|\r\n|\r)} }
- // { dg-output {=================================(\n|\r\n|\r)} }
- // { dg-output {contract violation in function M::f_ret<int> at .*:25: a > 0(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {m.f_ret<int>\(-10\): 10(\n|\r\n|\r)} }
- // { dg-output {contract violation in function M::f_ret<double> at .*:25: a > 0(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {m.f_ret<double>\(-11.5\): 16.500000(\n|\r\n|\r)} }
- // { dg-output {m.f_ret<int>\(10\): -10(\n|\r\n|\r)} }
- // { dg-output {m.f_ret<double>\(11.5\): -16.500000(\n|\r\n|\r)} }
- // { dg-output {=================================(\n|\r\n|\r)} }
- // { dg-output {contract violation in function M::g_ret<int> at .*:28: a > 0(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {m.g_ret<int>\(-10\): 15(\n|\r\n|\r)} }
- // { dg-output {contract violation in function M::g_ret<double> at .*:28: a > 0(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {m.g_ret<double>\(-11.5\): 16.500000(\n|\r\n|\r)} }
- // { dg-output {m.g_ret<int>\(10\): -15(\n|\r\n|\r)} }
- // { dg-output {m.g_ret<double>\(11.5\): -16.500000(\n|\r\n|\r)} }
- // { dg-output {=================================(\n|\r\n|\r)} }
- // { dg-output {contract violation in function S<int>::f<int> at .*:56: a > 0(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {contract violation in function S<int>::f<double> at .*:56: a > 0(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {=================================(\n|\r\n|\r)} }
- // { dg-output {contract violation in function S<int>::g<int> at .*:59: a > 0(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {contract violation in function S<int>::g<double> at .*:59: a > 0(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {=================================(\n|\r\n|\r)} }
- // { dg-output {contract violation in function S<double>::f<int> at .*:56: a > 0(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {contract violation in function S<double>::f<double> at .*:56: a > 0(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {=================================(\n|\r\n|\r)} }
- // { dg-output {contract violation in function S<double>::g<int> at .*:59: a > 0(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {contract violation in function S<double>::g<double> at .*:59: a > 0(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-pre2.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-pre2.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-pre2.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-pre2.C	Thu Jan  1 00:00:00 1970
***************
*** 1,213 ****
- // basic test to ensure pre contracts work for free functions
- // { dg-do run }
- // { dg-options "-std=c++2a -fcontracts -fcontract-continuation-mode=on" }
- #include <cstdio>
- 
- namespace nullary
- {
-   int x = 10;
-   int y = 10;
- 
-   void fun()
-     [[ pre: x < 0 ]]
-   {
-     printf("fun::x: %d\n", x);
-   }
- 
-   void fun2()
-     [[ pre: x < 0 ]]
-     [[ pre: y < 0 ]]
-   {
-     printf("fun2::x: %d fun2::y: %d\n", x, y);
-   }
- 
-   void funend()
-     [[ pre: x < 0 ]];
- }
- 
- namespace nonvoid
- {
-   int x = 10;
-   double y = 10.5;
- 
-   struct S
-   {
-     bool z;
-   };
- 
-   void vfun()
-     [[ pre: x < 0 ]]
-   {
-     printf("vfun::x: %d\n", x);
-   }
- 
-   int fun()
-     [[ pre: x < 0 ]]
-   {
-     printf("fun::x: %d\n", x);
-     return x;
-   }
- 
-   double fun2()
-     [[ pre: x < 0 ]]
-     [[ pre: y < 0 ]]
-   {
-     printf("fun2::x: %d fun2::y: %f\n", x, y);
-     return y;
-   }
- 
-   S funend()
-     [[ pre: x < 0 ]];
- }
- 
- namespace nonnullary
- {
-   int x = 10;
-   double y = 10.5;
- 
-   struct S
-   {
-     bool z;
-   };
- 
-   void vfun(int m, double n)
-     [[ pre: x < 0 ]]
-     [[ pre: m < 0 ]]
-   {
-     printf("vfun::x: %d\n", x);
-   }
- 
-   int fun(int m, double n)
-     [[ pre: x < 0 ]]
-   {
-     printf("fun::x: %d\n", x);
-     return x;
-   }
- 
-   double fun2(int m, double n)
-     [[ pre: x < 0 ]]
-     [[ pre: y < 0 ]]
-     [[ pre: m < 0 ]]
-     [[ pre: n < 0 ]]
-   {
-     printf("fun2::x: %d fun2::y: %f\n", x, y);
-     return y;
-   }
- 
-   S funend(int m, double n)
-     [[ pre: x < 0 ]]
-     [[ pre: m < 0 ]];
- }
- 
- int main(int, char**) {
-   // nullary void
-   {
-     nullary::fun();
-     nullary::fun2();
-     nullary::funend();
-   }
- 
-   // nullary non void
-   {
-     nonvoid::vfun();
- 
-     int f = 13;
-     f = nonvoid::fun();
-     printf("main::f: %d\n", f);
-     double d = 13.37;
-     d = nonvoid::fun2();
-     printf("main::d: %f\n", d);
-     nonvoid::S s = nonvoid::funend();
-     printf("main::s.z: %d\n", s.z ? 1 : 0);
-   }
- 
-   // non-nullary non-void
-   {
-     int x = 11;
-     double y = 11.5;
- 
-     nonnullary::vfun(x, y);
- 
-     int f = 13;
-     f = nonnullary::fun(x, y);
-     printf("main::f: %d\n", f);
-     double d = 13.37;
-     d = nonnullary::fun2(x, y);
-     printf("main::d: %f\n", d);
-     nonnullary::S s = nonnullary::funend(x, y);
-     printf("main::s.z: %d\n", s.z ? 1 : 0);
-   }
-   return 0;
- }
- 
- namespace nullary
- {
-   void funend()
-     [[ pre: x < 0 ]]
-   {
-     printf("funend::x: %d\n", x);
-   }
- }
- 
- namespace nonvoid
- {
-   S funend()
-     [[ pre: x < 0 ]]
-   {
-     printf("funend::x: %d\n", x);
-     S s;
-     s.z = true;
-     return s;
-   }
- }
- 
- namespace nonnullary
- {
-   S funend(int m, double n)
-     [[ pre: x < 0 ]]
-     [[ pre: m < 0 ]]
-   {
-     printf("funend::x: %d\n", x);
-     S s;
-     s.z = true;
-     return s;
-   }
- }
- 
- // { dg-skip-if "requires hosted libstdc++ for cstdio" { ! hostedlib } }
- // { dg-output "contract violation in function nullary::fun at .*.C:12: .*(\n|\r\n|\r)" }
- // { dg-output "fun::x: 10(\n|\r\n|\r)" }
- // { dg-output "contract violation in function nullary::fun2 at .*.C:18: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function nullary::fun2 at .*.C:19: .*(\n|\r\n|\r)" }
- // { dg-output "fun2::x: 10 fun2::y: 10(\n|\r\n|\r)" }
- // { dg-output "contract violation in function nullary::funend at .*.C:146: .*(\n|\r\n|\r)" }
- // { dg-output "funend::x: 10(\n|\r\n|\r)" }
- // { dg-output "contract violation in function nonvoid::vfun at .*.C:39: .*(\n|\r\n|\r)" }
- // { dg-output "vfun::x: 10(\n|\r\n|\r)" }
- // { dg-output "contract violation in function nonvoid::fun at .*.C:45: .*(\n|\r\n|\r)" }
- // { dg-output "fun::x: 10(\n|\r\n|\r)" }
- // { dg-output "main::f: 10(\n|\r\n|\r)" }
- // { dg-output "contract violation in function nonvoid::fun2 at .*.C:52: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function nonvoid::fun2 at .*.C:53: .*(\n|\r\n|\r)" }
- // { dg-output "fun2::x: 10 fun2::y: 10.500000(\n|\r\n|\r)" }
- // { dg-output "main::d: 10.500000(\n|\r\n|\r)" }
- // { dg-output "contract violation in function nonvoid::funend at .*.C:155: .*(\n|\r\n|\r)" }
- // { dg-output "funend::x: 10(\n|\r\n|\r)" }
- // { dg-output "main::s.z: 1(\n|\r\n|\r)" }
- // { dg-output "contract violation in function nonnullary::vfun at .*.C:74: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function nonnullary::vfun at .*.C:75: .*(\n|\r\n|\r)" }
- // { dg-output "vfun::x: 10(\n|\r\n|\r)" }
- // { dg-output "contract violation in function nonnullary::fun at .*.C:81: .*(\n|\r\n|\r)" }
- // { dg-output "fun::x: 10(\n|\r\n|\r)" }
- // { dg-output "main::f: 10(\n|\r\n|\r)" }
- // { dg-output "contract violation in function nonnullary::fun2 at .*.C:88: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function nonnullary::fun2 at .*.C:89: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function nonnullary::fun2 at .*.C:90: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function nonnullary::fun2 at .*.C:91: .*(\n|\r\n|\r)" }
- // { dg-output "fun2::x: 10 fun2::y: 10.500000(\n|\r\n|\r)" }
- // { dg-output "main::d: 10.500000(\n|\r\n|\r)" }
- // { dg-output "contract violation in function nonnullary::funend at .*.C:167: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function nonnullary::funend at .*.C:168: .*(\n|\r\n|\r)" }
- // { dg-output "funend::x: 10(\n|\r\n|\r)" }
- // { dg-output "main::s.z: 1(\n|\r\n|\r)" }
- 
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-pre2a1.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-pre2a1.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-pre2a1.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-pre2a1.C	Thu Jan  1 00:00:00 1970
***************
*** 1,33 ****
- // ensure the feature test macros are defined pre c++20 while we still support
- // -fcontracts independent of std version
- // { dg-do compile { target c++11 } }
- // { dg-additional-options "-fcontracts" }
- 
- static_assert (__cpp_contracts >= 201906, "__cpp_contracts");
- static_assert (__cpp_contracts_literal_semantics >= 201906, "__cpp_contracts_literal_semantics");
- static_assert (__cpp_contracts_roles >= 201906, "__cpp_contracts_roles");
- 
- int main()
- {
-   int x;
- 
-   [[assert: x >= 0]];
-   [[assert default: x < 0]];
-   [[assert audit: x == 0]];
-   [[assert axiom: x == 1]];
- 
-   [[assert: x > 0 ? true : false]];
-   [[assert: x < 0 ? true : false]];
- 
-   [[assert ignore: x >= 0]];
-   [[assert assume: x >= 0]];
-   [[assert check_never_continue: x >= 0]];
-   [[assert check_maybe_continue: x >= 0]];
- 
-   [[assert %default: x >= 0]];
-   [[assert default %default: x < 0]];
-   [[assert audit %default: x == 0]];
-   [[assert axiom %default: x == 1]];
-   return 0;
- }
- 
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-pre2a2.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-pre2a2.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-pre2a2.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-pre2a2.C	Thu Jan  1 00:00:00 1970
***************
*** 1,23 ****
- // basic test to ensure contracts work pre-c++2a
- // { dg-do run { target c++11 } }
- // { dg-additional-options "-fcontracts -fcontract-continuation-mode=on" }
- 
- int f(int n)
-   [[ pre: n > 0 ]]
-   [[ post r: r < 0 ]]
- {
-   [[ assert: n > 0 ]];
-   return -n;
- }
- 
- int main()
- {
-   f(-5);
-   return 0;
- }
- 
- // { dg-skip-if "requires hosted libstdc++ for stdc++exp" { ! hostedlib } }
- // { dg-output "contract violation in function f at .*\\.C:6: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function f at .*\\.C:9: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function f at .*\\.C:7: .*(\n|\r\n|\r)" }
- 
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-pre3.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-pre3.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-pre3.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-pre3.C	Thu Jan  1 00:00:00 1970
***************
*** 1,526 ****
- // tests to ensure pre contracts work on member functions
- // { dg-do compile }
- // { dg-options "-std=c++2a -fcontracts -fcontract-continuation-mode=on" }
- #include <cstdio>
- 
- namespace member
- {
-   int x = 10;
-   double y = 10.5;
- 
-   struct S
-   {
-     bool z;
-   };
- 
-   struct T1
-   {
-     void vfun(int m, double n)
-       [[ pre: x < 0 ]]
-       [[ pre: m < 0 ]];
- 
-     int fun(int m, double n)
-       [[ pre: x < 0 ]];
- 
-     double fun2(int m, double n)
-       [[ pre: x < 0 ]]
-       [[ pre: y < 0 ]]
-       [[ pre: m < 0 ]]
-       [[ pre: n < 0 ]];
- 
-     S funend(int m, double n)
-       [[ pre: x < 0 ]]
-       [[ pre: m < 0 ]];
-   };
- 
-   void T1::vfun(int m, double n)
-     [[ pre: x < 0 ]]
-     [[ pre: m < 0 ]]
-   {
-     printf("vfun::x: %d\n", x);
-   }
- 
- 
-   int T1::fun(int m, double n)
-     [[ pre: x < 0 ]]
-   {
-     printf("fun::x: %d\n", x);
-     return x;
-   }
- 
-   double T1::fun2(int m, double n)
-     [[ pre: x < 0 ]]
-     [[ pre: y < 0 ]]
-     [[ pre: m < 0 ]]
-     [[ pre: n < 0 ]]
-   {
-     printf("fun2::x: %d fun2::y: %f\n", x, y);
-     return y;
-   }
- }
- 
- namespace special
- {
-   struct T1
-   {
-     T1(int m, int n)
-       [[ pre: m < 0 ]]
-       [[ pre: n < 0 ]];
- 
-     int operator+(int m)
-       [[ pre: m > 0 ]]
-       [[ pre: v > 0 ]];
- 
-     int operator-(int m)
-       [[ pre: m > 0 ]]
-       [[ pre: v > 0 ]];
- 
-     ~T1()
-       [[ pre: v > 0 ]];
- 
-     int v{-10};
-   };
- 
-   T1::T1(int m, int n)
-     [[ pre: m < 0 ]]
-     [[ pre: n < 0 ]]
-     : v{-m * n}
-   {
-   }
- 
-   int T1::operator+(int m)
-     [[ pre: m > 0 ]]
-     [[ pre: v > 0 ]]
-   {
-     return v + m;
-   }
- 
-   int T1::operator-(int m)
-     [[ pre: m > 0 ]]
-     [[ pre: v > 0 ]]
-   {
-     return v - m;
-   }
- 
-   T1::~T1()
-     [[ pre: v > 0 ]]
-   {
-   }
- 
-   struct T2
-   {
-     T2(int m, int n)
-       [[ pre: m < 0 ]]
-       [[ pre: n < 0 ]]
-       : v{-m * n}
-     {
-     }
- 
-     int operator+(int m)
-       [[ pre: m > 0 ]]
-       [[ pre: v > 0 ]]
-     {
-       return v + m;
-     }
- 
-     int operator-(int m)
-       [[ pre: m > 0 ]]
-       [[ pre: v > 0 ]]
-     {
-       return v - m;
-     }
- 
-     ~T2()
-       [[ pre: v > 0 ]]
-     {
-     }
- 
-     int v{-10};
-   };
- 
-   struct TC : T1
-   {
-     TC(int m, int n)
-       [[ pre: m < -1 ]]
-       [[ pre: n < -1 ]]
-       : T1{m, n}
-     {
-     }
- 
-     ~TC()
-       [[ pre: vc < 0 ]]
-     {
-     }
- 
-     TC(int a)
-       [[ pre: a < 0 ]]
-       : TC{a, a}
-     {
-     }
- 
-     int vc{10};
-   };
- 
-   void test()
-   {
-     T1 t1{10, 20};
-     int a = t1 - -5;
-     int b = t1 + -5;
-     printf("==========\n");
- 
-     T2 t2{10, 20};
-     int k = t2 - -5;
-     int j = t2 + -5;
-     printf("==========\n");
- 
-     TC tc{10, 20};
-     printf("==========\n");
- 
-     TC tc2{10};
-     printf("==========\n");
-   }
- }
- 
- namespace virt
- {
-   struct T1
-   {
-     virtual int fun(int m, int n)
-       [[ pre: m > 0 ]]
-       [[ pre: n > 0 ]]
-       [[ pre: v > 0 ]];
-     int v{-10};
-   };
- 
-   int T1::fun(int m, int n)
-     [[ pre: m > 0 ]]
-     [[ pre: n > 0 ]]
-     [[ pre: v > 0 ]]
-   {
-     printf("T1::fun::m: %d, T1::fun::n: %d, T1::v: %d\n", m, n, v);
-     return m * n * v;
-   }
- 
-   struct T2 : T1
-   {
-   };
- 
-   struct T3 : T2
-   {
-     virtual int fun(int m, int n)
-       [[ pre: m > 0 ]]
-       [[ pre: n > 0 ]]
-       [[ pre: v > 0 ]]
-       override
-     {
-       printf("T3::fun::m: %d, T3::fun::n: %d, T3::v: %d\n", m, n, v);
-       return m * n * v;
-     }
-   };
- 
-   struct T3b : T2
-   {
-     virtual int fun(int m, int n)
-       [[ pre: m > 0 ]]
-       [[ pre: n > 0 ]]
-       [[ pre: v > 0 ]]
-       override;
- 
-     int p(int a)
-       [[ pre: a > 0 ]]
-       [[ pre: v > 0 ]];
- 
-     int u(int a)
-       [[ pre: a > 0 ]]
-       [[ pre: z > 0 ]];
- 
-     int n(int a)
-       [[ pre: a > 0 ]];
- 
-     static int Sn(int a)
-       [[ pre: a > 0 ]];
- 
-     int z{-10};
-   };
- 
-   int T3b::fun(int m, int n)
-     [[ pre: m > 0 ]]
-     [[ pre: n > 0 ]]
-     [[ pre: v > 0 ]]
-   {
-     printf("T3b::fun::m: %d, T3b::fun::n: %d, T3b::v: %d\n", m, n, v);
-     return m * n * v;
-   }
- 
-   int T3b::p(int a)
-     [[ pre: a > 0 ]]
-     [[ pre: v > 0 ]]
-   {
-     printf("T3b::p: a: %d, v: %d\n", a, v);
-     return a * v;
-   }
- 
-   int T3b::u(int a)
-     [[ pre: a > 0 ]]
-     [[ pre: z > 0 ]]
-   {
-     printf("T3b::u: a: %d, z: %d\n", a, z);
-     return a * z;
-   }
- 
-   int T3b::n(int a)
-     [[ pre: a > 0 ]]
-   {
-     printf("T3b::n: a: %d\n", a);
-     return a;
-   }
- 
-   int T3b::Sn(int a)
-     [[ pre: a > 0 ]]
-   {
-     printf("T3b::Sn: a: %d\n", a);
-     return a;
-   }
- 
-   struct T3c : T2
-   {
-     int fun(int m, int n)
-       [[ pre: m > 0 ]]
-       [[ pre: n > 0 ]]
-       [[ pre: v > 0 ]]
-     {
-       printf("T3c::fun::m: %d, T3c::fun::n: %d, T3c::v: %d\n", m, n, v);
-       return m * n * v;
-     }
- 
-     int p(int a)
-       [[ pre: a > 0 ]]
-       [[ pre: v > 0 ]]
-     {
-       printf("T3c::p: a: %d, v: %d\n", a, v);
-       return a * v;
-     }
- 
-     int u(int a)
-       [[ pre: a > 0 ]]
-       [[ pre: z > 0 ]]
-     {
-       printf("T3c::u: a: %d, z: %d\n", a, z);
-       return a * z;
-     }
- 
-     int n(int a)
-       [[ pre: a > 0 ]]
-     {
-       printf("T3c::n: a: %d\n", a);
-       return a;
-     }
- 
-     static int Sn(int a)
-       [[ pre: a > 0 ]]
-     {
-       printf("T3c::Sn: a: %d\n", a);
-       return a;
-     }
- 
-     int z{-10};
-   };
- 
-   void t(const char *kind, T1 *t)
-   {
-     printf("=================\n%s:\n", kind);
-     t->fun(-1, -2);
-   }
- 
-   void test()
-   {
-     T1 t1;
-     t1.fun(-10, -20);
- 
-     T2 t2;
-     t2.fun(-10, -20);
- 
-     T3 t3;
-     t3.fun(-10, -20);
- 
-     T3b t3b;
-     t3b.fun(-10, -20);
- 
-     T3c t3c;
-     t3c.fun(-10, -20);
- 
-     t("T1", &t1);
-     t("T2", &t2);
-     t("T3", &t3);
-     t("T3b", &t3b);
-     t("T3c", &t3c);
- 
-     printf("=============\n");
-     t3b.p(-3);
-     t3b.u(-3);
-     t3b.n(-3);
-     T3b::Sn(-3);
- 
-     printf("=============\n");
-     t3c.p(-3);
-     t3c.u(-3);
-     t3c.n(-3);
-     T3c::Sn(-3);
-   }
- }
- 
- int main(int, char**) 
- {
-   // ordinary member functions
-   {
-     int x = 11;
-     double y = 11.5;
-     member::T1 t1;
-     t1.vfun(x, y);
- 
-     int f = 13;
-     f = t1.fun(x, y);
-     printf("main::f: %d\n", f);
-     double d = 13.37;
-     d = t1.fun2(x, y);
-     printf("main::d: %f\n", d);
-     member::S s = t1.funend(x, y);
-     printf("main::s.z: %d\n", s.z ? 1 : 0);
-   }
- 
-   special::test();
-   virt::test();
-   return 0;
- }
- 
- member::S member::T1::funend(int m, double n)
-   [[ pre: x < 0 ]]
-   [[ pre: m < 0 ]]
- {
-   printf("funend::x: %d\n", x);
-   S s;
-   s.z = true;
-   return s;
- }
- 
- // { dg-skip-if "requires hosted libstdc++ for cstdio" { ! hostedlib } }
- // { dg-output "contract violation in function member::T1::vfun at .*.C:37:  .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function member::T1::vfun at .*.C:38:  .*(\n|\r\n|\r)" }
- // { dg-output "vfun::x: 10(\n|\r\n|\r)" }
- // { dg-output "contract violation in function member::T1::fun at .*.C:45:  .*(\n|\r\n|\r)" }
- // { dg-output "fun::x: 10(\n|\r\n|\r)" }
- // { dg-output "main::f: 10(\n|\r\n|\r)" }
- // { dg-output "contract violation in function member::T1::fun2 at .*.C:52:  .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function member::T1::fun2 at .*.C:53:  .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function member::T1::fun2 at .*.C:54:  .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function member::T1::fun2 at .*.C:55:  .*(\n|\r\n|\r)" }
- // { dg-output "fun2::x: 10 fun2::y: 10.500000(\n|\r\n|\r)" }
- // { dg-output "main::d: 10.500000(\n|\r\n|\r)" }
- // { dg-output "contract violation in function member::T1::funend at .*.C:397:  .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function member::T1::funend at .*.C:398:  .*(\n|\r\n|\r)" }
- // { dg-output "funend::x: 10(\n|\r\n|\r)" }
- // { dg-output "main::s.z: 1(\n|\r\n|\r)" }
- // { dg-output "contract violation in function special::T1::T1 at .*.C:85:  .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function special::T1::T1 at .*.C:86:  .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function special::T1::operator- at .*.C:99:  .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function special::T1::operator- at .*.C:100:  .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function special::T1::operator. at .*.C:92:  .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function special::T1::operator. at .*.C:93:  .*(\n|\r\n|\r)" }
- // { dg-output "==========(\n|\r\n|\r)" }
- // { dg-output "contract violation in function special::T2::T2 at .*.C:113:  .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function special::T2::T2 at .*.C:114:  .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function special::T2::operator- at .*.C:127:  .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function special::T2::operator- at .*.C:128:  .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function special::T2::operator. at .*.C:120:  .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function special::T2::operator. at .*.C:121:  .*(\n|\r\n|\r)" }
- // { dg-output "==========(\n|\r\n|\r)" }
- // { dg-output "contract violation in function special::TC::TC at .*.C:144:  .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function special::TC::TC at .*.C:145:  .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function special::T1::T1 at .*.C:85:  .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function special::T1::T1 at .*.C:86:  .*(\n|\r\n|\r)" }
- // { dg-output "==========(\n|\r\n|\r)" }
- // { dg-output "contract violation in function special::TC::TC at .*.C:156:  .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function special::TC::TC at .*.C:144:  .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function special::TC::TC at .*.C:145:  .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function special::T1::T1 at .*.C:85:  .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function special::T1::T1 at .*.C:86:  .*(\n|\r\n|\r)" }
- // { dg-output "==========(\n|\r\n|\r)" }
- // { dg-output "contract violation in function special::TC::~TC at .*.C:151:  .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function special::T1::~T1 at .*.C:106:  .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function special::TC::~TC at .*.C:151:  .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function special::T1::~T1 at .*.C:106:  .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function special::T2::~T2 at .*.C:134:  .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function special::T1::~T1 at .*.C:106:  .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function virt::T1::fun at .*.C:196:  .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function virt::T1::fun at .*.C:197:  .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function virt::T1::fun at .*.C:198:  .*(\n|\r\n|\r)" }
- // { dg-output "T1::fun::m: -10, T1::fun::n: -20, T1::v: -10(\n|\r\n|\r)" }
- // { dg-output "contract violation in function virt::T1::fun at .*.C:196:  .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function virt::T1::fun at .*.C:197:  .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function virt::T1::fun at .*.C:198:  .*(\n|\r\n|\r)" }
- // { dg-output "T1::fun::m: -10, T1::fun::n: -20, T1::v: -10(\n|\r\n|\r)" }
- // { dg-output "contract violation in function virt::T3::fun at .*.C:211:  .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function virt::T3::fun at .*.C:212:  .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function virt::T3::fun at .*.C:213:  .*(\n|\r\n|\r)" }
- // { dg-output "T3::fun::m: -10, T3::fun::n: -20, T3::v: -10(\n|\r\n|\r)" }
- // { dg-output "contract violation in function virt::T3b::fun at .*.C:247:  .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function virt::T3b::fun at .*.C:248:  .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function virt::T3b::fun at .*.C:249:  .*(\n|\r\n|\r)" }
- // { dg-output "T3b::fun::m: -10, T3b::fun::n: -20, T3b::v: -10(\n|\r\n|\r)" }
- // { dg-output "contract violation in function virt::T3c::fun at .*.C:288:  .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function virt::T3c::fun at .*.C:289:  .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function virt::T3c::fun at .*.C:290:  .*(\n|\r\n|\r)" }
- // { dg-output "T3c::fun::m: -10, T3c::fun::n: -20, T3c::v: -10(\n|\r\n|\r)" }
- // { dg-output "=================(\n|\r\n|\r)" }
- // { dg-output "T1:(\n|\r\n|\r)" }
- // { dg-output "contract violation in function virt::T1::fun at .*.C:196:  .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function virt::T1::fun at .*.C:197:  .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function virt::T1::fun at .*.C:198:  .*(\n|\r\n|\r)" }
- // { dg-output "T1::fun::m: -1, T1::fun::n: -2, T1::v: -10(\n|\r\n|\r)" }
- // { dg-output "=================(\n|\r\n|\r)" }
- // { dg-output "T2:(\n|\r\n|\r)" }
- // { dg-output "contract violation in function virt::T1::fun at .*.C:196:  .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function virt::T1::fun at .*.C:197:  .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function virt::T1::fun at .*.C:198:  .*(\n|\r\n|\r)" }
- // { dg-output "T1::fun::m: -1, T1::fun::n: -2, T1::v: -10(\n|\r\n|\r)" }
- // { dg-output "=================(\n|\r\n|\r)" }
- // { dg-output "T3:(\n|\r\n|\r)" }
- // { dg-output "contract violation in function virt::T3::fun at .*.C:211:  .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function virt::T3::fun at .*.C:212:  .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function virt::T3::fun at .*.C:213:  .*(\n|\r\n|\r)" }
- // { dg-output "T3::fun::m: -1, T3::fun::n: -2, T3::v: -10(\n|\r\n|\r)" }
- // { dg-output "=================(\n|\r\n|\r)" }
- // { dg-output "T3b:(\n|\r\n|\r)" }
- // { dg-output "contract violation in function virt::T3b::fun at .*.C:247:  .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function virt::T3b::fun at .*.C:248:  .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function virt::T3b::fun at .*.C:249:  .*(\n|\r\n|\r)" }
- // { dg-output "T3b::fun::m: -1, T3b::fun::n: -2, T3b::v: -10(\n|\r\n|\r)" }
- // { dg-output "=================(\n|\r\n|\r)" }
- // { dg-output "T3c:(\n|\r\n|\r)" }
- // { dg-output "contract violation in function virt::T3c::fun at .*.C:288:  .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function virt::T3c::fun at .*.C:289:  .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function virt::T3c::fun at .*.C:290:  .*(\n|\r\n|\r)" }
- // { dg-output "T3c::fun::m: -1, T3c::fun::n: -2, T3c::v: -10(\n|\r\n|\r)" }
- // { dg-output "=============(\n|\r\n|\r)" }
- // { dg-output "contract violation in function virt::T3b::p at .*.C:256:  .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function virt::T3b::p at .*.C:257:  .*(\n|\r\n|\r)" }
- // { dg-output "T3b::p: a: -3, v: -10(\n|\r\n|\r)" }
- // { dg-output "contract violation in function virt::T3b::u at .*.C:264:  .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function virt::T3b::u at .*.C:265:  .*(\n|\r\n|\r)" }
- // { dg-output "T3b::u: a: -3, z: -10(\n|\r\n|\r)" }
- // { dg-output "contract violation in function virt::T3b::n at .*.C:272:  .*(\n|\r\n|\r)" }
- // { dg-output "T3b::n: a: -3(\n|\r\n|\r)" }
- // { dg-output "contract violation in function virt::T3b::Sn at .*.C:279:  .*(\n|\r\n|\r)" }
- // { dg-output "T3b::Sn: a: -3(\n|\r\n|\r)" }
- // { dg-output "=============(\n|\r\n|\r)" }
- // { dg-output "contract violation in function virt::T3c::p at .*.C:297:  .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function virt::T3c::p at .*.C:298:  .*(\n|\r\n|\r)" }
- // { dg-output "T3c::p: a: -3, v: -10(\n|\r\n|\r)" }
- // { dg-output "contract violation in function virt::T3c::u at .*.C:305:  .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function virt::T3c::u at .*.C:306:  .*(\n|\r\n|\r)" }
- // { dg-output "T3c::u: a: -3, z: -10(\n|\r\n|\r)" }
- // { dg-output "contract violation in function virt::T3c::n at .*.C:313:  .*(\n|\r\n|\r)" }
- // { dg-output "T3c::n: a: -3(\n|\r\n|\r)" }
- // { dg-output "contract violation in function virt::T3c::Sn at .*.C:320:  .*(\n|\r\n|\r)" }
- // { dg-output "T3c::Sn: a: -3(\n|\r\n|\r)" }
- 
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-pre4.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-pre4.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-pre4.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-pre4.C	Thu Jan  1 00:00:00 1970
***************
*** 1,93 ****
- // test that contracts on overriding functions are found correctly
- // { dg-do run }
- // { dg-options "-std=c++2a -fcontracts -fcontract-continuation-mode=on" }
- 
- struct Base
- {
-   virtual int f(int a) [[ pre: a > 0 ]];
- };
- 
- int Base::f(int a)
- {
-   return a + 10;
- }
- 
- // inherits original
- struct Child0 : Base
- {
- };
- 
- // defined out of line, explicit override
- struct Child1 : Base
- {
-   virtual int f(int a) override;
- };
- 
- int Child1::f(int a)
- {
-   return a + 20;
- }
- 
- // defined out of line
- struct Child2 : Base
- {
-   int f(int a);
- };
- 
- int Child2::f(int a)
- {
-   return a + 30;
- }
- 
- // defined inline, explicitly override
- struct Child3 : Base
- {
-   virtual int f(int a) override
-   {
-     return a + 40;
-   }
- };
- 
- // defined inline
- struct Child4 : Base
- {
-   int f(int a)
-   {
-     return a + 50;
-   }
- };
- 
- #include <cstdio>
- int main(int, char**)
- {
-   Base b;
-   Child0 c0;
-   Child1 c1;
-   Child2 c2;
-   Child3 c3;
-   Child4 c4;
- 
-   printf("Base: %d\n", b.f(-10));
-   printf("Child0: %d\n", c0.f(-10));
-   printf("Child1: %d\n", c1.f(-10));
-   printf("Child2: %d\n", c2.f(-10));
-   printf("Child3: %d\n", c3.f(-10));
-   printf("Child4: %d\n", c4.f(-10));
- 
-   return 0;
- }
- 
- // { dg-skip-if "requires hosted libstdc++ for cstdio" { ! hostedlib } }
- // { dg-output "contract violation in function Base::f at .*.C:7: .*(\n|\r\n|\r)" }
- // { dg-output "Base: 0(\n|\r\n|\r)" }
- // { dg-output "contract violation in function Base::f at .*.C:7: .*(\n|\r\n|\r)" }
- // { dg-output "Child0: 0(\n|\r\n|\r)" }
- // { dg-output "contract violation in function Child1::f at .*.C:7: .*(\n|\r\n|\r)" }
- // { dg-output "Child1: 10(\n|\r\n|\r)" }
- // { dg-output "contract violation in function Child2::f at .*.C:7: .*(\n|\r\n|\r)" }
- // { dg-output "Child2: 20(\n|\r\n|\r)" }
- // { dg-output "contract violation in function Child3::f at .*.C:7: .*(\n|\r\n|\r)" }
- // { dg-output "Child3: 30(\n|\r\n|\r)" }
- // { dg-output "contract violation in function Child4::f at .*.C:7: .*(\n|\r\n|\r)" }
- // { dg-output "Child4: 40(\n|\r\n|\r)" }
- 
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-pre5.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-pre5.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-pre5.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-pre5.C	Thu Jan  1 00:00:00 1970
***************
*** 1,82 ****
- // basic test to ensure pre contracts work for free templates
- // { dg-do run }
- // { dg-options "-std=c++2a -fcontracts -fcontract-continuation-mode=on" }
- #include <cstdio>
- 
- template<typename T>
- int body(int a)
-   [[ pre: a > 0 ]]
- {
-   T t = a * 2.5;
-   return t;
- }
- 
- template<typename T>
- int none(int a)
-   [[ pre: a > 0 ]]
- {
-   return -a;
- }
- 
- template<typename T>
- int arg0(T t)
-   [[ pre: t > 0 ]]
- {
-   return -t - 10;
- }
- 
- template<typename T>
- int arg1(int a, T t)
-   [[ pre: a > 0 ]]
-   [[ pre: t > 0 ]]
- {
-   return -t * a;
- }
- 
- template<typename T>
- T ret(int a)
-   [[ pre: a > 0 ]]
- {
-   return -a;
- }
- 
- int main(int, char**)
- {
-   printf("%d\n", body<int>(-1));
-   printf("%d\n", body<double>(-2));
-   printf("%d\n", none<int>(-1));
-   printf("%d\n", none<double>(-2));
-   printf("%d\n", arg0(-1));
-   printf("%d\n", arg0(-2.9));
-   printf("%d\n", arg1(-3, -1));
-   printf("%d\n", arg1(-4, -2.9));
-   printf("%d\n", (int)ret<int>(-3));
-   printf("%d\n", (int)ret<double>(-4.9));
- 
-   return 0;
- }
- 
- // { dg-skip-if "requires hosted libstdc++ for cstdio" { ! hostedlib } }
- // { dg-output "contract violation in function body<int> at .*.C:8: .*(\n|\r\n|\r)" }
- // { dg-output "-2(\n|\r\n|\r)" }
- // { dg-output "contract violation in function body<double> at .*.C:8: .*(\n|\r\n|\r)" }
- // { dg-output "-5(\n|\r\n|\r)" }
- // { dg-output "contract violation in function none<int> at .*.C:16: .*(\n|\r\n|\r)" }
- // { dg-output "1(\n|\r\n|\r)" }
- // { dg-output "contract violation in function none<double> at .*.C:16: .*(\n|\r\n|\r)" }
- // { dg-output "2(\n|\r\n|\r)" }
- // { dg-output "contract violation in function arg0<int> at .*.C:23: .*(\n|\r\n|\r)" }
- // { dg-output "-9(\n|\r\n|\r)" }
- // { dg-output "contract violation in function arg0<double> at .*.C:23: .*(\n|\r\n|\r)" }
- // { dg-output "-7(\n|\r\n|\r)" }
- // { dg-output "contract violation in function arg1<int> at .*.C:30: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function arg1<int> at .*.C:31: .*(\n|\r\n|\r)" }
- // { dg-output "-3(\n|\r\n|\r)" }
- // { dg-output "contract violation in function arg1<double> at .*.C:30: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function arg1<double> at .*.C:31: .*(\n|\r\n|\r)" }
- // { dg-output "-11(\n|\r\n|\r)" }
- // { dg-output "contract violation in function ret<int> at .*.C:38: .*(\n|\r\n|\r)" }
- // { dg-output "3(\n|\r\n|\r)" }
- // { dg-output "contract violation in function ret<double> at .*.C:38: .*(\n|\r\n|\r)" }
- // { dg-output "4(\n|\r\n|\r)" }
- 
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-pre6.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-pre6.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-pre6.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-pre6.C	Thu Jan  1 00:00:00 1970
***************
*** 1,74 ****
- // ensure no errors are thrown when we have to insert a decl for the internal
- // unchecked function after leaving a (possibly nested) namespace
- // { dg-do compile }
- // { dg-options "-std=c++2a -fcontracts" }
- 
- namespace ns0
- {
-   int f(int a) [[ pre: a > 0 ]];
- }
- 
- int ns0::f(int a) [[ pre: a > 0 ]]
- {
-   return -a;
- }
- 
- namespace ns0
- {
-   namespace ns1
-   {
-     int f(int a) [[ pre: a > 0 ]];
-   }
- }
- 
- int ns0::ns1::f(int a) [[ pre: a > 0 ]]
- {
-   return -a;
- }
- 
- namespace ns0
- {
-   namespace ns1
-   {
-     int f2(int a) [[ pre: a > 0 ]];
-     namespace ns2
-     {
-       int f(int a) [[ pre: a > 0 ]];
-     }
-   }
-   int ns1::f2(int a) [[ pre: a > 0 ]]
-   {
-     return -a;
-   }
- }
- 
- int ns0::ns1::ns2::f(int a) [[ pre: a > 0 ]]
- {
-   return -a;
- }
- 
- namespace ns0
- {
-   struct S
-   {
-     int f(int a) [[ pre: a > 0 ]];
-   };
-   namespace ns1
-   {
-     struct S2
-     {
-       int f(int a) [[ pre: a > 0 ]];
-     };
-   }
- }
- 
- int ns0::S::f(int a) [[ pre: a > 0 ]]
- {
-   return -a;
- }
- 
- int ns0::ns1::S2::f(int a) [[ pre: a > 0 ]]
- {
-   return -a;
- }
- 
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-pre7.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-pre7.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-pre7.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-pre7.C	Thu Jan  1 00:00:00 1970
***************
*** 1,135 ****
- // ensure no errors are thrown when we have to insert a decl for the internal
- // unchecked function after leaving a (possibly nested) namespace
- // { dg-do run }
- // { dg-options "-std=c++2a -fcontracts -fcontract-continuation-mode=on" }
- 
- namespace ns0
- {
-   template<typename T>
-   int f(T a) [[ pre: a > 0 ]];
- }
- 
- template<typename T>
- int ns0::f(T a) [[ pre: a > 0 ]]
- {
-   return (int)-a;
- }
- 
- namespace ns0
- {
-   namespace ns1
-   {
-     template<typename T>
-     int f(T a) [[ pre: a > 0 ]];
-   }
- }
- 
- template<typename T>
- int ns0::ns1::f(T a) [[ pre: a > 0 ]]
- {
-   return -a;
- }
- 
- namespace ns0
- {
-   namespace ns1
-   {
-     template<typename T>
-     int f2(T a) [[ pre: a > 0 ]];
-     namespace ns2
-     {
-       template<typename T>
-       int f(T a) [[ pre: a > 0 ]];
-     }
-   }
-   template<typename T>
-   int ns1::f2(T a) [[ pre: a > 0 ]]
-   {
-     return -a;
-   }
- }
- 
- template<typename T>
- int ns0::ns1::ns2::f(T a) [[ pre: a > 0 ]]
- {
-   return -a;
- }
- 
- namespace ns0
- {
-   template<typename T>
-   struct S
-   {
-     int f(T a) [[ pre: a > 0 ]];
-   };
-   namespace ns1
-   {
-     template<typename T>
-     struct S2
-     {
-       int f(T a) [[ pre: a > 0 ]];
-     };
-   }
- }
- 
- template<typename T>
- int ns0::S<T>::f(T a) [[ pre: a > 0 ]]
- {
-   return -a;
- }
- 
- template<typename T>
- int ns0::ns1::S2<T>::f(T a) [[ pre: a > 0 ]]
- {
-   return -a;
- }
- 
- #include <cstdio>
- int main(int, char**)
- {
-   printf ("%d\n", ns0::f(-1));
-   printf ("%d\n", ns0::ns1::f(-2));
-   printf ("%d\n", ns0::ns1::f2(-3));
-   printf ("%d\n", ns0::ns1::ns2::f(-4));
-   ns0::S<int> ns0_s;
-   printf ("%d\n", ns0_s.f(-5));
-   ns0::ns1::S2<int> ns0_ns1_s2;
-   printf ("%d\n", ns0_ns1_s2.f(-6));
- 
-   printf ("%d\n", ns0::f(-7.5));
-   printf ("%d\n", ns0::ns1::f(-8.5));
-   printf ("%d\n", ns0::ns1::f2(-9.5));
-   printf ("%d\n", ns0::ns1::ns2::f(-10.5));
-   ns0::S<double> ns0_sd;
-   printf ("%d\n", ns0_sd.f(-11.5));
-   ns0::ns1::S2<double> ns0_ns1_s2d;
-   printf ("%d\n", ns0_ns1_s2d.f(-12.5));
- 
-   return 0;
- }
- 
- // { dg-skip-if "requires hosted libstdc++ for cstdio" { ! hostedlib } }
- // { dg-output "contract violation in function ns0::f<int> at .*.C:13: .*(\n|\r\n|\r)" }
- // { dg-output "1(\n|\r\n|\r)" }
- // { dg-output "contract violation in function ns0::ns1::f<int> at .*.C:28: .*(\n|\r\n|\r)" }
- // { dg-output "2(\n|\r\n|\r)" }
- // { dg-output "contract violation in function ns0::ns1::f2<int> at .*.C:46: .*(\n|\r\n|\r)" }
- // { dg-output "3(\n|\r\n|\r)" }
- // { dg-output "contract violation in function ns0::ns1::ns2::f<int> at .*.C:53: .*(\n|\r\n|\r)" }
- // { dg-output "4(\n|\r\n|\r)" }
- // { dg-output "contract violation in function ns0::S<int>::f at .*.C:76: .*(\n|\r\n|\r)" }
- // { dg-output "5(\n|\r\n|\r)" }
- // { dg-output "contract violation in function ns0::ns1::S2<int>::f at .*.C:82: .*(\n|\r\n|\r)" }
- // { dg-output "6(\n|\r\n|\r)" }
- // { dg-output "contract violation in function ns0::f<double> at .*.C:13: .*(\n|\r\n|\r)" }
- // { dg-output "7(\n|\r\n|\r)" }
- // { dg-output "contract violation in function ns0::ns1::f<double> at .*.C:28: .*(\n|\r\n|\r)" }
- // { dg-output "8(\n|\r\n|\r)" }
- // { dg-output "contract violation in function ns0::ns1::f2<double> at .*.C:46: .*(\n|\r\n|\r)" }
- // { dg-output "9(\n|\r\n|\r)" }
- // { dg-output "contract violation in function ns0::ns1::ns2::f<double> at .*.C:53: .*(\n|\r\n|\r)" }
- // { dg-output "10(\n|\r\n|\r)" }
- // { dg-output "contract violation in function ns0::S<double>::f at .*.C:76: .*(\n|\r\n|\r)" }
- // { dg-output "11(\n|\r\n|\r)" }
- // { dg-output "contract violation in function ns0::ns1::S2<double>::f at .*.C:82: .*(\n|\r\n|\r)" }
- // { dg-output "12(\n|\r\n|\r)" }
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-pre9.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-pre9.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-pre9.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-pre9.C	Thu Jan  1 00:00:00 1970
***************
*** 1,147 ****
- // ensure no errors are thrown for various combinations of class templates
- // with guarded members
- // { dg-do run }
- // { dg-options "-std=c++2a -fcontracts -fcontract-continuation-mode=on" }
- 
- template<typename T>
- struct S
- {
-   int f(int a) [[ pre: a > 0 ]];
-   int g(int a) [[ pre: a > 0 ]];
- };
- 
- template<typename T>
- int S<T>::f(int a) [[ pre: a > 0 ]]
- {
-   return -a;
- }
- 
- template<typename T>
- int S<T>::g(int a) // Contract is inherited (error from line 10).
- {
-   return -a;
- }
- 
- template<typename T>
- struct S_arg
- {
-   int f(T a) [[ pre: a > 0 ]];
-   int g(T a) [[ pre: a > 0 ]];
- };
- 
- template<typename T>
- int S_arg<T>::f(T a) [[ pre: a > 0 ]]
- {
-   return -a;
- }
- 
- template<typename T>
- int S_arg<T>::g(T a) // Contract is inherited (error from line 29).
- {
-   return -a;
- }
- 
- template<typename T>
- struct S_ret
- {
-   T f(int a) [[ pre: a > 0 ]];
-   T g(int a) [[ pre: a > 0 ]];
- };
- 
- template<typename T>
- T S_ret<T>::f(int a) [[ pre: a > 0 ]]
- {
-   return -a;
- }
- 
- template<typename T>
- T S_ret<T>::g(int a) // Contract is inherited (error from line 48).
- {
-   return -a;
- }
- 
- #include <cstdio>
- int main(int, char**)
- {
-   {
-     S<int> s_int;
-     printf ("s_int.f(-10): %d\n", s_int.f(-10));
-     printf ("s_int.g(-10): %d\n", s_int.g(-10));
-     printf ("s_int.f(10): %d\n", s_int.f(10));
-     printf ("s_int.g(10): %d\n", s_int.g(10));
- 
-     S<double> s_double;
-     printf ("s_double.f(-10.5): %d\n", s_double.f(-10.5));
-     printf ("s_double.g(-10.5): %d\n", s_double.g(-10.5));
-     printf ("s_double.f(10.5): %d\n", s_double.f(10.5));
-     printf ("s_double.g(10.5): %d\n", s_double.g(10.5));
-   }
- 
-   {
-     S_arg<int> s_arg_int;
-     printf ("s_arg_int.f(-10): %d\n", s_arg_int.f(-10));
-     printf ("s_arg_int.g(-10): %d\n", s_arg_int.g(-10));
-     printf ("s_arg_int.f(10): %d\n", s_arg_int.f(10));
-     printf ("s_arg_int.g(10): %d\n", s_arg_int.g(10));
- 
-     S_arg<double> s_arg_double;
-     printf ("s_arg_double.f(-10): %d\n", s_arg_double.f(-10));
-     printf ("s_arg_double.g(-10): %d\n", s_arg_double.g(-10));
-     printf ("s_arg_double.f(10): %d\n", s_arg_double.f(10));
-     printf ("s_arg_double.g(10): %d\n", s_arg_double.g(10));
-   }
- 
-   {
-     S_ret<int> s_ret_int;
-     printf ("s_ret_int.f(-10): %d\n", s_ret_int.f(-10));
-     printf ("s_ret_int.g(-10): %d\n", s_ret_int.g(-10));
-     printf ("s_ret_int.f(10): %d\n", s_ret_int.f(10));
-     printf ("s_ret_int.g(10): %d\n", s_ret_int.g(10));
- 
-     S_ret<double> s_ret_double;
-     printf ("s_ret_double.f(-10): %f\n", s_ret_double.f(-10));
-     printf ("s_ret_double.g(-10): %f\n", s_ret_double.g(-10));
-     printf ("s_ret_double.f(10): %f\n", s_ret_double.f(10));
-     printf ("s_ret_double.g(10): %f\n", s_ret_double.g(10));
-   }
- 
-   return 0;
- }
- 
- // { dg-skip-if "requires hosted libstdc++ for cstdio" { ! hostedlib } }
- // { dg-output "contract violation in function S<int>::f at .*.C:14: .*(\n|\r\n|\r)" }
- // { dg-output "s_int.f.-10.: 10(\n|\r\n|\r)" }
- // { dg-output "contract violation in function S<int>::g at .*.C:10: .*(\n|\r\n|\r)" }
- // { dg-output "s_int.g.-10.: 10(\n|\r\n|\r)" }
- // { dg-output "s_int.f.10.: -10(\n|\r\n|\r)" }
- // { dg-output "s_int.g.10.: -10(\n|\r\n|\r)" }
- // { dg-output "contract violation in function S<double>::f at .*.C:14: .*(\n|\r\n|\r)" }
- // { dg-output "s_double.f.-10.5.: 10(\n|\r\n|\r)" }
- // { dg-output "contract violation in function S<double>::g at .*.C:10: .*(\n|\r\n|\r)" }
- // { dg-output "s_double.g.-10.5.: 10(\n|\r\n|\r)" }
- // { dg-output "s_double.f.10.5.: -10(\n|\r\n|\r)" }
- // { dg-output "s_double.g.10.5.: -10(\n|\r\n|\r)" }
- // { dg-output "contract violation in function S_arg<int>::f at .*.C:33: .*(\n|\r\n|\r)" }
- // { dg-output "s_arg_int.f.-10.: 10(\n|\r\n|\r)" }
- // { dg-output "contract violation in function S_arg<int>::g at .*.C:29: .*(\n|\r\n|\r)" }
- // { dg-output "s_arg_int.g.-10.: 10(\n|\r\n|\r)" }
- // { dg-output "s_arg_int.f.10.: -10(\n|\r\n|\r)" }
- // { dg-output "s_arg_int.g.10.: -10(\n|\r\n|\r)" }
- // { dg-output "contract violation in function S_arg<double>::f at .*.C:33: .*(\n|\r\n|\r)" }
- // { dg-output "s_arg_double.f.-10.: 10(\n|\r\n|\r)" }
- // { dg-output "contract violation in function S_arg<double>::g at .*.C:29: .*(\n|\r\n|\r)" }
- // { dg-output "s_arg_double.g.-10.: 10(\n|\r\n|\r)" }
- // { dg-output "s_arg_double.f.10.: -10(\n|\r\n|\r)" }
- // { dg-output "s_arg_double.g.10.: -10(\n|\r\n|\r)" }
- // { dg-output "contract violation in function S_ret<int>::f at .*.C:52: .*(\n|\r\n|\r)" }
- // { dg-output "s_ret_int.f.-10.: 10(\n|\r\n|\r)" }
- // { dg-output "contract violation in function S_ret<int>::g at .*.C:48: .*(\n|\r\n|\r)" }
- // { dg-output "s_ret_int.g.-10.: 10(\n|\r\n|\r)" }
- // { dg-output "s_ret_int.f.10.: -10(\n|\r\n|\r)" }
- // { dg-output "s_ret_int.g.10.: -10(\n|\r\n|\r)" }
- // { dg-output "contract violation in function S_ret<double>::f at .*.C:52: .*(\n|\r\n|\r)" }
- // { dg-output "s_ret_double.f.-10.: 10.000000(\n|\r\n|\r)" }
- // { dg-output "contract violation in function S_ret<double>::g at .*.C:48: .*(\n|\r\n|\r)" }
- // { dg-output "s_ret_double.g.-10.: 10.000000(\n|\r\n|\r)" }
- // { dg-output "s_ret_double.f.10.: -10.000000(\n|\r\n|\r)" }
- // { dg-output "s_ret_double.g.10.: -10.000000(\n|\r\n|\r)" }
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-redecl1.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-redecl1.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-redecl1.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-redecl1.C	Thu Jan  1 00:00:00 1970
***************
*** 1,149 ****
- // generic error tests for contract redecls with generalized redecl
- // { dg-do compile }
- // { dg-options "-std=c++2a -fcontracts" }
- 
- // OK if equivalent -- even through renames.
- int g0(int a) [[ pre: a > 0 ]];
- int g0(int a) [[ pre: a > 0 ]];
- 
- int g0b(int a) [[ pre: a > 0 ]];
- int g0b(int b) [[ pre: b > 0 ]];
- int g0b(int c) [[ pre: c > 0 ]]
- {
-   return 0;
- }
- 
- // OK if specified before.
- int g1(int a) [[ pre: a > 0 ]];
- int g1(int a);
- 
- // OK if specified after.
- int g2(int a);
- int g2(int a) [[ pre: a > 0 ]];
- 
- int g2b(int a);
- int g2b(int b) [[ pre: b > 0 ]];
- 
- // can add to non-virtual methods
- struct G0
- {
-   int f(int a);
- };
- 
- // OK to add contracts at the point of definition.
- int G0::f(int a) [[ pre: a > 0 ]]
- {
-   return -a;
- }
- 
- struct G1
- {
-   int f1(int a);
- };
- 
- // OK to redeclare functions and add constraints...
- int G1::f1(int a) [[ pre: a > 0 ]];
- 
- // ...and leave them off later.
- int G1::f1(int a)
- {
-   return -a;
- }
- 
- int f0(int a) [[ pre: a > 0 ]];
- int f0(int a) [[ pre: a > 0 ]] [[ pre: a > 10 ]]; // { dg-error "different number of contracts" }
- 
- int f1(int a) [[ pre: a > 0 ]] [[ pre: a > 10 ]];
- int f1(int a) [[ pre: a > 0 ]]; // { dg-error "different number of contracts" }
- 
- int f2(int a) [[ pre: a > 0 ]];
- int f2(int a) [[ pre: a < 0 ]]; // { dg-error "mismatched contract" }
- 
- int f3(int a) { return a; }
- int f3(int a) [[ pre: a < 0 ]]; // { dg-error "cannot add contracts" }
- 
- struct Base
- {
-   virtual int f(int a) [[ pre: a > 0 ]];
- };
- 
- struct Child : Base
- {
-   int f(int a) [[ pre: a < 0 ]]; // { dg-error "mismatched contract" }
- };
- 
- struct S1
- {
-   virtual int f(int a); // contracts are inherited at the point of declarations
- };
- 
- int S1::f(int a) [[ pre: a > 0 ]] // { dg-error "cannot add" }
- {
-   return -a;
- }
- 
- struct S2
- {
-   int f() { return 0; }
- };
- 
- int S2::f(); // OK?
- 
- 
- struct S3
- {
-   int f() { return 0; }
- };
- 
- int S3::f() [[pre: true]]; // { dg-error "cannot add contracts" }
- 
- 
- // The initial decl of a guarded member must appear inside the class.
- struct S4
- {
-   int f(int a);
- };
- 
- int S4::g(int a) [[ pre: a > 0 ]]; // { dg-error "no declaration matches" }
- 
- 
- struct S5
- {
-   template<typename T>
-   S5(T a);
- };
- 
- template<typename T>
- S5::S5(T a) [[ pre: a > 0 ]]
- {
- }
- 
- struct S6
- {
-   template<typename T>
-   S6(T a);
- };
- 
- template<typename T>
- S6::S6(T a) [[ pre: a > 0 ]];
- 
- template<typename T>
- S6::S6(T a)
- {
- }
- 
- int p0(int n)
-   [[ post r: r > 0 && r == n ]]
-   [[ post r: r > 1 && r == n ]]
-   [[ post r: r > 2 && r == n ]]
-   [[ post r: r > 3 && r == n ]];
- 
- int p0(int z)
-   [[ post r: r > 0 && r == z ]]
-   [[ post r1: r1 > 1 && r1 == z ]]
-   [[ post r2: r2 > 2 && r2 == z ]]
-   [[ post r3: r3 > 3 && r3 == z ]]
- {
-   return z;
- }
- 
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-redecl2.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-redecl2.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-redecl2.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-redecl2.C	Thu Jan  1 00:00:00 1970
***************
*** 1,149 ****
- // generic error tests for generalized contract redecls
- // { dg-do compile }
- // { dg-options "-std=c++2a -fcontracts" }
- 
- // allowed to repeat contracts or omit them
- int g0(int a) [[ pre: a > 0 ]];
- int g0(int a) [[ pre: a > 0 ]];
- 
- int g1(int a) [[ pre: a > 0 ]];
- int g1(int a);
- 
- // allowed to add from none if generalized redecl is on (by default)
- int g2(int a);
- int g2(int a) [[ pre: a > 0 ]];
- 
- // can add to non-virtual methods
- struct G0
- {
-   int f(int a);
- };
- 
- int G0::f(int a) [[ pre: a > 0 ]]
- {
-   return -a;
- }
- 
- struct G1
- {
-   int f(int a);
- };
- 
- int G1::f(int a) [[ pre: a > 0 ]];
- 
- int G1::f(int a)
- {
-   return -a;
- }
- 
- // allowed to redeclare even without contracts
- struct G2
- {
-   int f(int a);
- };
- 
- int G2::f(int a);
- 
- 
- int f0(int a) [[ pre: a > 0 ]];
- int f0(int a) [[ pre: a > 0 ]] [[ pre: a > 10 ]]; // { dg-error "different number of contracts" }
- 
- int f1(int a) [[ pre: a > 0 ]];
- int f1(int a) [[ pre: a < 0 ]]; // { dg-error "mismatched contract" }
- 
- int f2(int a) { return a; }
- int f2(int a) [[ pre: a < 0 ]]; // { dg-error "cannot add contracts after definition" }
- 
- struct Base
- {
-   virtual int f(int a) [[ pre: a > 0 ]];
- };
- 
- struct Child : Base
- {
-   int f(int a) [[ pre: a < 0 ]]; // { dg-error "mismatched contract" }
- };
- 
- // the initial decl of a guarded member must appear inside the class
- struct F2
- {
-   int f(int a);
- };
- 
- int F2::g(int a) [[ pre: a > 0 ]]; // { dg-error "no declaration matches" }
- // FIXME if we move F2 down then a different error makes F2 undeclared
- 
- struct F0
- {
-   virtual int f(int a);
- };
- 
- int F0::f(int a); // { dg-error "declaration.*is not definition" }
- 
- struct F1
- {
-   virtual int f(int a);
- };
- 
- int F1::f(int a) [[ pre: a > 0 ]] // { dg-error "cannot add" }
- {
-   return -a;
- }
- 
- // cannot "re"declare members of a forward declared class
- struct F2;
- int F2::test(); // { dg-error "no declaration matches" }
- int F2::test2() [[ pre: true ]]; // { dg-error "no declaration matches" }
- 
- // can only redeclare member functions
- struct F3
- {
-   int x;
-   typedef int my_int;
- 
-   struct Inner0;
-   struct Inner1;
-   enum my_enum0; // { dg-error "use of enum.*without previous decl" }
-   enum my_enum1 { E1, E2 };
- 
-   int test0();
-   int test1();
-   int test2();
- };
- 
- int F3::x{-1}; // { dg-error "is not a static data member" }
- typedef double F3::my_int; // { dg-error "typedef name may not be a nested-name-specifier" }
- struct F3::Inner0; // { dg-warning "declaration.*does not declare anything" }
- 
- struct F3::Inner1 { };
- 
- enum F3::my_enum1 { E0, E1, END }; // { dg-error "multiple definition" }
- 
- struct F4
- {
-   int test0();
- 
-   int F3::test0() [[ pre: true ]]; // { dg-error "cannot declare member function" }
-   friend int F3::test1();
-   friend int F3::test2();
- };
- int F3::test2() [[ pre: true ]] { return -1; }
- 
- void dummy0()
- {
-   int F4::test0() [[ pre: true ]]; // { dg-error "qualified-id in declaration" }
- }
- 
- namespace ns0
- {
-   typedef int value;
-   struct X
-   {
-     int test1(value);
-     typedef double value;
-     int test2(value);
-   };
-   int X::test1(value); // { dg-error "no declaration matches" }
-   int X::test2(value);
- }
- 
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-redecl3.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-redecl3.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-redecl3.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-redecl3.C	Thu Jan  1 00:00:00 1970
***************
*** 1,196 ****
- // basic test to ensure contracts generalized redecl works
- // { dg-do run }
- // { dg-options "-std=c++2a -fcontracts -fcontract-continuation-mode=on" }
- #include <cstdio>
- 
- namespace defining
- {
-   int x = 10;
-   double y = 10.5;
- 
-   struct S
-   {
-     bool z;
-   };
- 
-   struct T1
-   {
-     void vfun(int m, double n);
-     int fun(int m, double n);
-     double fun2(int m, double n);
-     S funend(int m, double n);
-   };
- 
-   void T1::vfun(int m, double n)
-     [[ pre: x < 0 ]]
-     [[ pre: m < 0 ]]
-   {
-     printf("vfun::x: %d\n", x);
-   }
- 
-   int T1::fun(int m, double n)
-     [[ pre: x < 0 ]]
-   {
-     printf("fun::x: %d\n", x);
-     return x;
-   }
- 
-   double T1::fun2(int m, double n)
-     [[ pre: x < 0 ]]
-     [[ pre: y < 0 ]]
-     [[ pre: m < 0 ]]
-     [[ pre: n < 0 ]]
-   {
-     printf("fun2::x: %d fun2::y: %f\n", x, y);
-     return y;
-   }
- }
- 
- namespace nondefining
- {
-   int x = 10;
-   double y = 10.5;
- 
-   struct S
-   {
-     bool z;
-   };
- 
-   struct T1
-   {
-     void vfun(int m, double n);
-     int fun(int m, double n);
-     double fun2(int m, double n);
-     S funend(int m, double n);
-   };
- 
-   void T1::vfun(int m, double n)
-     [[ pre: x < 0 ]]
-     [[ pre: m < 0 ]];
-   int T1::fun(int m, double n)
-     [[ pre: x < 0 ]];
-   double T1::fun2(int m, double n)
-     [[ pre: x < 0 ]]
-     [[ pre: y < 0 ]]
-     [[ pre: m < 0 ]]
-     [[ pre: n < 0 ]];
- 
-   void T1::vfun(int m, double n)
-   {
-     printf("vfun::x: %d\n", x);
-   }
- 
-   int T1::fun(int m, double n)
-   {
-     printf("fun::x: %d\n", x);
-     return x;
-   }
- 
-   double T1::fun2(int m, double n)
-   {
-     printf("fun2::x: %d fun2::y: %f\n", x, y);
-     return y;
-   }
- }
- 
- int main(int, char**) {
-   // defining redecl
-   {
-     int x = 11;
-     double y = 11.5;
- 
-     defining::T1 t1;
-     t1.vfun(x, y);
- 
-     int f = 13;
-     f = t1.fun(x, y);
-     printf("main::f: %d\n", f);
-     double d = 13.37;
-     d = t1.fun2(x, y);
-     printf("main::d: %f\n", d);
-     defining::S s = t1.funend(x, y);
-     printf("main::s.z: %d\n", s.z ? 1 : 0);
-   }
- 
-   // nondefining redecl
-   {
-     int x = 12;
-     double y = 12.5;
- 
-     nondefining::T1 t1;
-     t1.vfun(x, y);
- 
-     int f = 13;
-     f = t1.fun(x, y);
-     printf("main::f: %d\n", f);
-     double d = 13.37;
-     d = t1.fun2(x, y);
-     printf("main::d: %f\n", d);
-     nondefining::S s = t1.funend(x, y);
-     printf("main::s.z: %d\n", s.z ? 1 : 0);
-   }
-   return 0;
- }
- 
- namespace defining
- {
-   S T1::funend(int m, double n)
-     [[ pre: x < 0 ]]
-     [[ pre: m < 0 ]]
-   {
-     printf("funend::x: %d\n", x);
-     S s;
-     s.z = true;
-     return s;
-   }
- }
- 
- namespace nondefining
- {
-   S T1::funend(int m, double n)
-     [[ pre: x < 0 ]]
-     [[ pre: m < 0 ]];
- 
-   S T1::funend(int m, double n)
-   {
-     printf("funend::x: %d\n", x);
-     S s;
-     s.z = true;
-     return s;
-   }
- }
- 
- // { dg-skip-if "requires hosted libstdc++ for cstdio" { ! hostedlib } }
- // { dg-output "contract violation in function defining::T1::vfun at .*.C:25: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function defining::T1::vfun at .*.C:26: .*(\n|\r\n|\r)" }
- // { dg-output "vfun::x: 10(\n|\r\n|\r)" }
- // { dg-output "contract violation in function defining::T1::fun at .*.C:32: .*(\n|\r\n|\r)" }
- // { dg-output "fun::x: 10(\n|\r\n|\r)" }
- // { dg-output "main::f: 10(\n|\r\n|\r)" }
- // { dg-output "contract violation in function defining::T1::fun2 at .*.C:39: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function defining::T1::fun2 at .*.C:40: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function defining::T1::fun2 at .*.C:41: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function defining::T1::fun2 at .*.C:42: .*(\n|\r\n|\r)" }
- // { dg-output "fun2::x: 10 fun2::y: 10.500000(\n|\r\n|\r)" }
- // { dg-output "main::d: 10.500000(\n|\r\n|\r)" }
- // { dg-output "contract violation in function defining::T1::funend at .*.C:138: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function defining::T1::funend at .*.C:139: .*(\n|\r\n|\r)" }
- // { dg-output "funend::x: 10(\n|\r\n|\r)" }
- // { dg-output "main::s.z: 1(\n|\r\n|\r)" }
- // { dg-output "contract violation in function nondefining::T1::vfun at .*.C:68: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function nondefining::T1::vfun at .*.C:69: .*(\n|\r\n|\r)" }
- // { dg-output "vfun::x: 10(\n|\r\n|\r)" }
- // { dg-output "contract violation in function nondefining::T1::fun at .*.C:71: .*(\n|\r\n|\r)" }
- // { dg-output "fun::x: 10(\n|\r\n|\r)" }
- // { dg-output "main::f: 10(\n|\r\n|\r)" }
- // { dg-output "contract violation in function nondefining::T1::fun2 at .*.C:73: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function nondefining::T1::fun2 at .*.C:74: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function nondefining::T1::fun2 at .*.C:75: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function nondefining::T1::fun2 at .*.C:76: .*(\n|\r\n|\r)" }
- // { dg-output "fun2::x: 10 fun2::y: 10.500000(\n|\r\n|\r)" }
- // { dg-output "main::d: 10.500000(\n|\r\n|\r)" }
- // { dg-output "contract violation in function nondefining::T1::funend at .*.C:151: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function nondefining::T1::funend at .*.C:152: .*(\n|\r\n|\r)" }
- // { dg-output "funend::x: 10(\n|\r\n|\r)" }
- // { dg-output "main::s.z: 1(\n|\r\n|\r)" }
- 
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-redecl4.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-redecl4.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-redecl4.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-redecl4.C	Thu Jan  1 00:00:00 1970
***************
*** 1,57 ****
- // test that free functions can be redeclared with contracts without affecting
- // normal default parm handling
- // { dg-do run }
- // { dg-options "-std=c++2a -fcontracts -fcontract-continuation-mode=on" }
- #include <cstdio>
- 
- int f(int a, int, int c = 10);
- int f(int a, int b = 11, int);
- int f(int a, int b, int c)
-   [[ pre: a < 0 ]]
-   [[ pre: b < 0 ]]
-   [[ pre: c < 0 ]];
- 
- int f(int, int, int);
- 
- int f(int a, int b, int c)
- {
-   printf("f: a: %d, b: %d, c: %d\n", a, b, c);
-   return a * b - c;
- }
- 
- int f(int a = 12, int, int);
- 
- int main(int, char **)
- {
-   f(1,1,1);
-   printf("=====\n");
-   f(1,1);
-   printf("=====\n");
-   f(1);
-   printf("=====\n");
-   f();
-   printf("=====\n");
- }
- 
- // { dg-skip-if "requires hosted libstdc++ for cstdio" { ! hostedlib } }
- // { dg-output "contract violation in function f at .*.C:10: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function f at .*.C:11: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function f at .*.C:12: .*(\n|\r\n|\r)" }
- // { dg-output "f: a: 1, b: 1, c: 1(\n|\r\n|\r)" }
- // { dg-output "=====(\n|\r\n|\r)" }
- // { dg-output "contract violation in function f at .*.C:10: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function f at .*.C:11: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function f at .*.C:12: .*(\n|\r\n|\r)" }
- // { dg-output "f: a: 1, b: 1, c: 10(\n|\r\n|\r)" }
- // { dg-output "=====(\n|\r\n|\r)" }
- // { dg-output "contract violation in function f at .*.C:10: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function f at .*.C:11: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function f at .*.C:12: .*(\n|\r\n|\r)" }
- // { dg-output "f: a: 1, b: 11, c: 10(\n|\r\n|\r)" }
- // { dg-output "=====(\n|\r\n|\r)" }
- // { dg-output "contract violation in function f at .*.C:10: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function f at .*.C:11: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function f at .*.C:12: .*(\n|\r\n|\r)" }
- // { dg-output "f: a: 12, b: 11, c: 10(\n|\r\n|\r)" }
- // { dg-output "=====(\n|\r\n|\r)" }
- 
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-redecl5.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-redecl5.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-redecl5.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-redecl5.C	Thu Jan  1 00:00:00 1970
***************
*** 1,101 ****
- // generic error tests for generalized contract redecls
- //   we also test for the warning diagnostic for strict redecl
- // { dg-do compile }
- // { dg-options "-std=c++2a -fcontracts -fcontract-strict-declarations=on" }
- 
- // allowed to repeat contracts or omit them
- int g0(int a) [[ pre: a > 0 ]];
- int g0(int a) [[ pre: a > 0 ]];
- 
- int g1(int a) [[ pre: a > 0 ]];
- int g1(int a);
- 
- // allowed to add from none if generalized redecl is on (by default)
- int g2(int a);
- int g2(int a) [[ pre: a > 0 ]]; // { dg-warning "adds contracts" }
- int g2(int a) [[ pre: a > 0 ]]; // { dg-bogus "adds contracts" }
- 
- // can add to non-virtual methods
- struct G0
- {
-   int f(int a);
- };
- 
- int G0::f(int a) [[ pre: a > 0 ]] // { dg-warning "adds contracts" }
- {
-   return -a;
- }
- 
- struct G1
- {
-   int f(int a);
- };
- 
- int G1::f(int a) [[ pre: a > 0 ]]; // { dg-warning "adds contracts" }
- // { dg-warning "outside of class is not definition" "" { target *-*-* } .-1 }
- 
- int G1::f(int a);
- // { dg-warning "outside of class is not definition" "" { target *-*-* } .-1 }
- 
- int G1::f(int a) [[ pre: a > 0 ]];
- // { dg-warning "outside of class is not definition" "" { target *-*-* } .-1 }
- 
- int G1::f(int a)
- {
-   return -a;
- }
- 
- // allowed to redeclare even without contracts
- struct G2
- {
-   int f(int a);
- };
- 
- int G2::f(int a); // { dg-warning "outside of class is not definition" }
- 
- 
- int f0(int a) [[ pre: a > 0 ]];
- int f0(int a) [[ pre: a > 0 ]] [[ pre: a > 10 ]]; // { dg-error "different number of contracts" }
- 
- int f1(int a) [[ pre: a > 0 ]];
- int f1(int a) [[ pre: a < 0 ]]; // { dg-error "mismatched contract" }
- 
- int f2(int a) { return a; }
- int f2(int a) [[ pre: a < 0 ]]; // { dg-error "cannot add contracts after definition" }
- 
- struct Base
- {
-   virtual int f(int a) [[ pre: a > 0 ]];
- };
- 
- struct Child : Base
- {
-   int f(int a) [[ pre: a < 0 ]]; // { dg-error "mismatched contract" }
- };
- 
- // the initial decl of a guarded member must appear inside the class
- struct F2
- {
-   int f(int a);
- };
- 
- int F2::g(int a) [[ pre: a > 0 ]]; // { dg-error "no declaration matches" }
- // FIXME if we move F2 down then a different error makes F2 undeclared
- 
- struct F0
- {
-   virtual int f(int a);
- };
- 
- int F0::f(int a); // { dg-error "declaration.*is not definition" }
- 
- struct F1
- {
-   virtual int f(int a);
- };
- 
- int F1::f(int a) [[ pre: a > 0 ]] // { dg-error "cannot add" }
- {
-   return -a;
- }
- 
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-redecl6.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-redecl6.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-redecl6.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-redecl6.C	Thu Jan  1 00:00:00 1970
***************
*** 1,196 ****
- // basic test to ensure contracts generalized redecl works
- // { dg-do run }
- // { dg-options "-std=c++2a -fcontracts -fcontract-continuation-mode=on" }
- #include <cstdio>
- 
- namespace defining
- {
-   int x = 10;
-   double y = 10.5;
- 
-   struct S
-   {
-     bool z;
-   };
- 
-   struct T1
-   {
-     void vfun(int m, double n) const;
-     int fun(int m, double n) volatile;
-     double fun2(int m, double n) const volatile;
-     static S funend(int m, double n);
-   };
- 
-   void T1::vfun(int m, double n) const
-     [[ pre: x < 0 ]]
-     [[ pre: m < 0 ]]
-   {
-     printf("vfun::x: %d\n", x);
-   }
- 
-   int T1::fun(int m, double n) volatile
-     [[ pre: x < 0 ]]
-   {
-     printf("fun::x: %d\n", x);
-     return x;
-   }
- 
-   double T1::fun2(int m, double n) const volatile
-     [[ pre: x < 0 ]]
-     [[ pre: y < 0 ]]
-     [[ pre: m < 0 ]]
-     [[ pre: n < 0 ]]
-   {
-     printf("fun2::x: %d fun2::y: %f\n", x, y);
-     return y;
-   }
- }
- 
- namespace nondefining
- {
-   int x = 10;
-   double y = 10.5;
- 
-   struct S
-   {
-     bool z;
-   };
- 
-   struct T1
-   {
-     void vfun(int m, double n) const;
-     int fun(int m, double n) volatile;
-     double fun2(int m, double n) const volatile;
-     static S funend(int m, double n);
-   };
- 
-   void T1::vfun(int m, double n) const
-     [[ pre: x < 0 ]]
-     [[ pre: m < 0 ]];
-   int T1::fun(int m, double n) volatile
-     [[ pre: x < 0 ]];
-   double T1::fun2(int m, double n) const volatile
-     [[ pre: x < 0 ]]
-     [[ pre: y < 0 ]]
-     [[ pre: m < 0 ]]
-     [[ pre: n < 0 ]];
- 
-   void T1::vfun(int m, double n) const
-   {
-     printf("vfun::x: %d\n", x);
-   }
- 
-   int T1::fun(int m, double n) volatile
-   {
-     printf("fun::x: %d\n", x);
-     return x;
-   }
- 
-   double T1::fun2(int m, double n) const volatile
-   {
-     printf("fun2::x: %d fun2::y: %f\n", x, y);
-     return y;
-   }
- }
- 
- int main(int, char**) {
-   // defining redecl
-   {
-     int x = 11;
-     double y = 11.5;
- 
-     defining::T1 t1;
-     t1.vfun(x, y);
- 
-     int f = 13;
-     f = t1.fun(x, y);
-     printf("main::f: %d\n", f);
-     double d = 13.37;
-     d = t1.fun2(x, y);
-     printf("main::d: %f\n", d);
-     defining::S s = defining::T1::funend(x, y);
-     printf("main::s.z: %d\n", s.z ? 1 : 0);
-   }
- 
-   // nondefining redecl
-   {
-     int x = 12;
-     double y = 12.5;
- 
-     nondefining::T1 t1;
-     t1.vfun(x, y);
- 
-     int f = 13;
-     f = t1.fun(x, y);
-     printf("main::f: %d\n", f);
-     double d = 13.37;
-     d = t1.fun2(x, y);
-     printf("main::d: %f\n", d);
-     nondefining::S s = nondefining::T1::funend(x, y);
-     printf("main::s.z: %d\n", s.z ? 1 : 0);
-   }
-   return 0;
- }
- 
- namespace defining
- {
-   S T1::funend(int m, double n)
-     [[ pre: x < 0 ]]
-     [[ pre: m < 0 ]]
-   {
-     printf("funend::x: %d\n", x);
-     S s;
-     s.z = true;
-     return s;
-   }
- }
- 
- namespace nondefining
- {
-   S T1::funend(int m, double n)
-     [[ pre: x < 0 ]]
-     [[ pre: m < 0 ]];
- 
-   S T1::funend(int m, double n)
-   {
-     printf("funend::x: %d\n", x);
-     S s;
-     s.z = true;
-     return s;
-   }
- }
- 
- // { dg-skip-if "requires hosted libstdc++ for cstdio" { ! hostedlib } }
- // { dg-output "contract violation in function defining::T1::vfun at .*.C:25: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function defining::T1::vfun at .*.C:26: .*(\n|\r\n|\r)" }
- // { dg-output "vfun::x: 10(\n|\r\n|\r)" }
- // { dg-output "contract violation in function defining::T1::fun at .*.C:32: .*(\n|\r\n|\r)" }
- // { dg-output "fun::x: 10(\n|\r\n|\r)" }
- // { dg-output "main::f: 10(\n|\r\n|\r)" }
- // { dg-output "contract violation in function defining::T1::fun2 at .*.C:39: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function defining::T1::fun2 at .*.C:40: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function defining::T1::fun2 at .*.C:41: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function defining::T1::fun2 at .*.C:42: .*(\n|\r\n|\r)" }
- // { dg-output "fun2::x: 10 fun2::y: 10.500000(\n|\r\n|\r)" }
- // { dg-output "main::d: 10.500000(\n|\r\n|\r)" }
- // { dg-output "contract violation in function defining::T1::funend at .*.C:138: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function defining::T1::funend at .*.C:139: .*(\n|\r\n|\r)" }
- // { dg-output "funend::x: 10(\n|\r\n|\r)" }
- // { dg-output "main::s.z: 1(\n|\r\n|\r)" }
- // { dg-output "contract violation in function nondefining::T1::vfun at .*.C:68: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function nondefining::T1::vfun at .*.C:69: .*(\n|\r\n|\r)" }
- // { dg-output "vfun::x: 10(\n|\r\n|\r)" }
- // { dg-output "contract violation in function nondefining::T1::fun at .*.C:71: .*(\n|\r\n|\r)" }
- // { dg-output "fun::x: 10(\n|\r\n|\r)" }
- // { dg-output "main::f: 10(\n|\r\n|\r)" }
- // { dg-output "contract violation in function nondefining::T1::fun2 at .*.C:73: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function nondefining::T1::fun2 at .*.C:74: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function nondefining::T1::fun2 at .*.C:75: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function nondefining::T1::fun2 at .*.C:76: .*(\n|\r\n|\r)" }
- // { dg-output "fun2::x: 10 fun2::y: 10.500000(\n|\r\n|\r)" }
- // { dg-output "main::d: 10.500000(\n|\r\n|\r)" }
- // { dg-output "contract violation in function nondefining::T1::funend at .*.C:151: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function nondefining::T1::funend at .*.C:152: .*(\n|\r\n|\r)" }
- // { dg-output "funend::x: 10(\n|\r\n|\r)" }
- // { dg-output "main::s.z: 1(\n|\r\n|\r)" }
- 
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-redecl7.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-redecl7.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-redecl7.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-redecl7.C	Thu Jan  1 00:00:00 1970
***************
*** 1,96 ****
- // test that contracts can be added during (defining) friend declarations
- // { dg-do run }
- // { dg-options "-std=c++2a -fcontracts -fcontract-continuation-mode=on" }
- #include <cstdio>
- struct T;
- 
- struct S
- {
-   int now(int a, T *t) [[ pre: a > 0 ]] [[ pre: x < 0 ]];
- 
- 
-   int x{-1};
- };
- 
- int now(int a, T *t) [[ pre: a > 0 ]];
- int later(int a, T *t);
- int both(int a, T *t) [[ pre: a > 0 ]];
- 
- struct T
- {
-   friend int now(int a, T *t);
-   friend int later(int a, T *t) [[ pre: a > 0 ]] [[ pre: t->pri > 0 ]]
-   {
-     printf("later: a: %d, t->pri: %d\n", a, t->pri);
-     return -a * t->pri;
-   }
-   friend int both(int a, T *t) [[ pre: a > 0 ]]
-   {
-     printf("both: a: %d, t->pri: %d\n", a, t->pri);
-     return -a * t->pri;
-   }
- 
- 
-   friend int S::now(int a, T *t);
- 
-   friend int hidden(int a, T *t) [[ pre: a > 0 ]] [[ pre: t->pri > 0 ]]
-   {
-     printf("hidden: a: %d, t->pri: %d\n", a, t->pri);
-     return -a * t->pri;
-   }
-   friend int hidden2(int a, T *t) [[ pre: a > 0 ]] [[ pre: t->pri > 0 ]]
-   {
-     printf("hidden2: a: %d, t->pri: %d\n", a, t->pri);
-     return -a * t->pri;
-   }
- 
-   int x{1};
-   private:
-     int pri{-10};
- };
- 
- int hidden2(int a, T *t) [[ pre: a > 0 ]] [[ pre: t->pri > 0 ]];
- 
- int S::now(int a, T *t)
- {
-   printf("S::now: a: %d, t->pri: %d\n", a, t->pri);
-   return -a * t->pri;
- }
- 
- int now(int a, T *t)
- {
-   printf("now: a: %d, t->pri: %d\n", a, t->pri);
-   return -a * t->pri;
- }
- 
- int main(int, char**)
- {
-   T t;
-   S s;
-   s.now(-10, &t);
- 
-   now(-20, &t);
-   later(-21, &t);
-   both(-22, &t);
-   hidden(-23, &t);
-   hidden2(-24, &t);
-   return 0;
- }
- 
- // { dg-skip-if "requires hosted libstdc++ for cstdio" { ! hostedlib } }
- // { dg-output "contract violation in function S::now at .*.C:9: .*(\n|\r\n|\r)" }
- // { dg-output "S::now: a: -10, t->pri: -10(\n|\r\n|\r)" }
- // { dg-output "contract violation in function now at .*.C:15: .*(\n|\r\n|\r)" }
- // { dg-output "now: a: -20, t->pri: -10(\n|\r\n|\r)" }
- // { dg-output "contract violation in function later at .*.C:22: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function later at .*.C:22: .*(\n|\r\n|\r)" }
- // { dg-output "later: a: -21, t->pri: -10(\n|\r\n|\r)" }
- // { dg-output "contract violation in function both at .*.C:27: .*(\n|\r\n|\r)" }
- // { dg-output "both: a: -22, t->pri: -10(\n|\r\n|\r)" }
- // { dg-output "contract violation in function hidden at .*.C:36: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function hidden at .*.C:36: .*(\n|\r\n|\r)" }
- // { dg-output "hidden: a: -23, t->pri: -10(\n|\r\n|\r)" }
- // { dg-output "contract violation in function hidden2 at .*.C:41: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function hidden2 at .*.C:41: .*(\n|\r\n|\r)" }
- // { dg-output "hidden2: a: -24, t->pri: -10(\n|\r\n|\r)" }
- 
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-redecl8.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-redecl8.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-redecl8.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-redecl8.C	Thu Jan  1 00:00:00 1970
***************
*** 1,64 ****
- // test that contracts are matched on friend decls when the type is complete
- // { dg-do compile }
- // { dg-options "-std=c++2a -fcontracts" }
- 
- struct T;
- 
- int both(int x, T *t) [[ pre: x > 0 ]] { return 0; }
- int both2(int x, T *t) [[ pre: x > 0 ]];
- 
- template<typename Z>
- int fn(int x, Z *z) [[ pre: x > 0 ]];
- 
- template<typename Z>
- int fn2(int x, Z *z);
- 
- template<typename Z>
- int fn3(int x, Z *z) [[ pre: x > 0 ]];
- 
- template<>
- int fn3<T>(int x, T *z) [[ pre: x > 1 ]];
- 
- struct T
- {
-   friend int both2(int x, T *t) [[ pre: x > 1 ]] // { dg-error "mismatched" }
-   {
-     return 0;
-   }
- 
-   friend int hidden(int x, T *t)
-     [[ pre: x > 1 ]] [[ pre: t->pri > 0 ]]
-   {
-     return x;
-   }
- 
-   /* cannot define friend spec, so we never get to matching contracts
-   friend int fn<T>(int x, T *t)
-     [[ pre: t->pri > 0 ]] { return 0; } // error defining explicit spec friend
-     */
- 
-   // bad, general contracts must match general
-   template<typename Z>
-   friend int fn(int x, Z *z)
-     [[ pre: z->pri > 1 ]] { return 0; } // { dg-error "mismatched" }
- 
-   // fine, can add contracts
-   template<typename Z>
-   friend int fn2(int x, Z *z)
-     [[ pre: z->pri > 1 ]] { return 0; } // { dg-bogus "mismatched" }
- 
-   /* cannot declare without definition, so dup friend can't occur:
-   friend int dup(int x, T *t)
-     [[ pre: t->pri > 0 ]]; // error non-defining friend with contracts
-   friend int dup(int x, T *t)
-     [[ pre: t->pri > 1 ]]; // error non-defining friend with contracts
-     */
- 
-   int x{1};
-   private:
-     int pri{-10};
- };
- 
- int hidden(int x, T *t)
-   [[ pre: x > 0 ]] [[ pre: t->pri > 1 ]]; // { dg-error "mismatched" }
- 
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-tmpl-attr1.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-tmpl-attr1.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-tmpl-attr1.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-tmpl-attr1.C	Thu Jan  1 00:00:00 1970
***************
*** 1,19 ****
- // { dg-do compile }
- // { dg-options "-std=c++2a -fcontracts" }
- 
- template<typename T>
- [[z]]
- [[nodiscard]]
- T fun(T n)
-   [[ pre: n > 0 ]]
-   [[ post r: r > 0 ]] // { dg-warning ".z. attribute.*ignored" }
- {
-   return n;
- }
- 
- int main(int, char**) {
-   fun(-5); // { dg-warning "ignoring return value" }
-   fun(-5.3); // { dg-warning "ignoring return value" }
-   return 0;
- }
- 
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-tmpl-spec1.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-tmpl-spec1.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-tmpl-spec1.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-tmpl-spec1.C	Thu Jan  1 00:00:00 1970
***************
*** 1,122 ****
- // basic test to ensure pre contracts work for free template specializations
- // { dg-do run }
- // { dg-options "-std=c++2a -fcontracts -fcontract-continuation-mode=on" }
- #include <cstdio>
- 
- template<typename T>
- int body(int a)
-   [[ pre: a > 0 ]]
- {
-   T t = a * 2.5;
-   return t;
- }
- 
- template<>
- int body<double>(int a)
-   [[ pre: a > 0 ]]
- {
-   double t = a * 3.3;
-   return t;
- }
- 
- template<typename T>
- int none(int a)
-   [[ pre: a > 0 ]]
- {
-   return -a;
- }
- 
- template<>
- int none<double>(int a)
-   [[ pre: a > 0 ]]
- {
-   return a - 100;
- }
- 
- template<typename T>
- int arg0(T t)
-   [[ pre: t > 0 ]]
- {
-   return -t - 10;
- }
- 
- template<>
- int arg0<double>(double t)
-   [[ pre: t > 0 ]]
- {
-   return -t + 10;
- }
- 
- template<typename T>
- int arg1(int a, T t)
-   [[ pre: a > 0 ]]
-   [[ pre: t > 0 ]]
- {
-   return -t * a;
- }
- 
- template<>
- int arg1<double>(int a, double t)
-   [[ pre: a > 0 ]]
-   [[ pre: t > 0 ]]
- {
-   return -t * a + 17;
- }
- 
- template<typename T>
- T ret(int a)
-   [[ pre: a > 0 ]]
- {
-   return -a;
- }
- 
- template<>
- double ret<double>(int a)
-   [[ pre: a > 0 ]]
- {
-   return -a * 3.3;
- }
- 
- 
- int main(int, char**)
- {
-   printf("%d\n", body<int>(-1));
-   printf("%d\n", body<double>(-1));
-   printf("%d\n", none<int>(-1));
-   printf("%d\n", none<double>(-1));
-   printf("%d\n", arg0(-1));
-   printf("%d\n", arg0(-1.0));
-   printf("%d\n", arg1(-3, -1));
-   printf("%d\n", arg1(-3, -1.0));
-   printf("%d\n", (int)ret<int>(-1));
-   printf("%d\n", (int)ret<double>(-1));
-   printf("%f\n", ret<double>(-1));
-   return 0;
- }
- 
- // { dg-skip-if "requires hosted libstdc++ for cstdio" { ! hostedlib } }
- // { dg-output "contract violation in function body<int> at .*.C:8: .*(\n|\r\n|\r)" }
- // { dg-output "-2(\n|\r\n|\r)" }
- // { dg-output "contract violation in function body<double> at .*.C:16: .*(\n|\r\n|\r)" }
- // { dg-output "-3(\n|\r\n|\r)" }
- // { dg-output "contract violation in function none<int> at .*.C:24: .*(\n|\r\n|\r)" }
- // { dg-output "1(\n|\r\n|\r)" }
- // { dg-output "contract violation in function none<double> at .*.C:31: .*(\n|\r\n|\r)" }
- // { dg-output "-101(\n|\r\n|\r)" }
- // { dg-output "contract violation in function arg0<int> at .*.C:38: .*(\n|\r\n|\r)" }
- // { dg-output "-9(\n|\r\n|\r)" }
- // { dg-output "contract violation in function arg0<double> at .*.C:45: .*(\n|\r\n|\r)" }
- // { dg-output "11(\n|\r\n|\r)" }
- // { dg-output "contract violation in function arg1<int> at .*.C:52: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function arg1<int> at .*.C:53: .*(\n|\r\n|\r)" }
- // { dg-output "-3(\n|\r\n|\r)" }
- // { dg-output "contract violation in function arg1<double> at .*.C:60: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function arg1<double> at .*.C:61: .*(\n|\r\n|\r)" }
- // { dg-output "14(\n|\r\n|\r)" }
- // { dg-output "contract violation in function ret<int> at .*.C:68: .*(\n|\r\n|\r)" }
- // { dg-output "1(\n|\r\n|\r)" }
- // { dg-output "contract violation in function ret<double> at .*.C:75: .*(\n|\r\n|\r)" }
- // { dg-output "3(\n|\r\n|\r)" }
- // { dg-output "contract violation in function ret<double> at .*.C:75: .*(\n|\r\n|\r)" }
- // { dg-output "3.300000(\n|\r\n|\r)" }
- 
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-tmpl-spec2.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-tmpl-spec2.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-tmpl-spec2.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-tmpl-spec2.C	Thu Jan  1 00:00:00 1970
***************
*** 1,448 ****
- // basic test to ensure contracts work for class and member specializations
- // { dg-do run }
- // { dg-options "-std=c++2a -fcontracts -fcontract-continuation-mode=on -fsigned-char" }
- #include <cstdio>
- 
- // template specializations can have differing contracts
- template<typename T>
- int body(int a)
-   [[ pre: a > 0 ]]
- {
-   T t = a * 2.5;
-   return t;
- }
- 
- template<>
- int body<double>(int a)
-   [[ pre: a > 1 ]]
- {
-   double t = a * 3.3;
-   return t;
- }
- 
- template<typename T>
- int none(int a)
-   [[ pre: a > 0 ]]
- {
-   return -a;
- }
- 
- template<>
- int none<double>(int a)
-   [[ pre: a > 1 ]]
- {
-   return a - 100;
- }
- 
- template<typename T>
- int arg0(T t)
-   [[ pre: t > 0 ]]
- {
-   return -t - 10;
- }
- 
- template<>
- int arg0<double>(double t)
-   [[ pre: t > 1 ]]
- {
-   return -t + 10;
- }
- 
- template<typename T>
- int arg1(int a, T t)
-   [[ pre: a > 0 ]]
-   [[ pre: t > 0 ]]
- {
-   return -t * a;
- }
- 
- template<>
- int arg1<double>(int a, double t)
-   [[ pre: a > 1 ]]
-   [[ pre: t > 1 ]]
- {
-   return -t * a + 17;
- }
- 
- template<typename T>
- T ret(int a)
-   [[ pre: a > 0 ]]
- {
-   return -a;
- }
- 
- template<>
- double ret<double>(int a)
-   [[ pre: a > 1 ]]
- {
-   return -a * 3.3;
- }
- 
- // template specializations can have no contracts
- template<typename T>
- int g1(T t) [[ pre: t > 0 ]]
- {
-   return (int)t;
- }
- 
- template<>
- int g1<double>(double t)
- {
-   return (int)t;
- }
- 
- // template specializations can have no contracts in the first decl but add
- // them later
- template<typename T>
- int g2(T t) [[ pre: t > 0 ]]
- {
-   return (int)t;
- }
- 
- template<>
- int g2<double>(double t);
- 
- template<>
- int g2<double>(double t)
-   [[ pre: t < 0 ]]
- {
-   return (int)t;
- }
- 
- template<>
- int g2<char>(char t)
-   [[ pre: t < 'c' ]]
- {
-   return (int)t;
- }
- 
- // contracts can be different on the general template, partial and full specs
- template<typename T, typename S>
- struct G3
- {
-   void f(T t, S s)
-     [[ pre: t > 0 ]]
-     [[ pre: s > 0 ]]
-   {
-     printf ("G3 general T S\n");
-   }
- };
- 
- template<typename S>
- struct G3<int, S>
- {
-   void f(int t, S s);
- };
- 
- template<typename S>
- void G3<int, S>::f(int t, S s)
-   [[ pre: t > 1 ]]
-   [[ pre: s > 1 ]]
- {
-   printf ("G3 partial int S\n");
- }
- 
- template<>
- void G3<int, double>::f(int t, double s)
-   [[ pre: t > 2 ]]
-   [[ pre: s > 2 ]]
- {
-   printf ("G3 full int double\n");
- }
- 
- struct C
- {
-   bool operator>(int rhs) { return false; }
- };
- 
- // deletes contracts
- template<>
- void G3<int, C>::f(int t, C s);
- 
- template<>
- void G3<int, C>::f(int t, C s)
- {
-   printf ("G3 full int C\n");
- };
- 
- // specialized ctors
- template<typename T, typename S>
- struct G4
- {
-   G4(T t, S s)
-     [[ pre: t > 0 ]]
-     [[ pre: s > 0 ]]
-     [[ post: x > 0 ]]
-   {
-     printf ("G4 general T S\n");
-     return;
-   }
-   int x{-1};
- };
- 
- template<typename S>
- struct G4<char, S>
- {
-   G4(char t, S s)
-     [[ pre: t > 'c' ]]
-     [[ pre: s > 3 ]]
-     [[ post: x2 > 3 ]]
-   {
-     printf ("G4 partial char S\n");
-     return;
-   }
-   int x2{-1};
- };
- 
- template<>
- G4<double, double>::G4(double, double)
- {
-   printf ("G4 full double double\n");
-   return;
- }
- 
- template<>
- G4<double, char>::G4(double a, char b)
-   [[ pre: a > 0 ]]
-   [[ pre: b > 'b' ]]
-   [[ post: x > 1 ]]
- {
-   printf ("G4 full double char\n");
-   return;
- }
- 
- // crossover of template classes and template members ok
- template<typename T, typename S>
- struct G5
- {
-   template<typename P>
-   void f(T t, S s, P r)
-     [[ pre: t > 0 ]]
-     [[ pre: s > 0 ]]
-     [[ pre: r > 0 ]]
-   {
-     printf ("G5 gen T S, f gen R\n");
-   }
- };
- 
- template<typename S>
- struct G5<char, S>
- {
-   template<typename R>
-   void f(char x, S y, R z)
-     [[ pre: x > 'z' ]]
-     [[ pre: y > 1 ]]
-     [[ pre: z > 1 ]]
-   {
-     printf ("G5 partial char S, f gen R\n");
-   }
- };
- 
- template<>
- template<typename Q>
- void G5<double, double>::f(double a, double b, Q c)
-   [[ pre: a > 2 ]]
-   [[ pre: b > 2 ]]
-   [[ pre: c > 2 ]]
- {
-   printf ("G5 full double double, f gen R\n");
- }
- 
- int main(int, char**)
- {
-   printf("%d\n", body<int>(-1));
-   printf("%d\n", body<double>(-1));
-   printf("%d\n", none<int>(-1));
-   printf("%d\n", none<double>(-1));
-   printf("%d\n", arg0(-1));
-   printf("%d\n", arg0(-1.0));
-   printf("%d\n", arg1(-3, -1));
-   printf("%d\n", arg1(-3, -1.0));
-   printf("%d\n", (int)ret<int>(-1));
-   printf("%d\n", (int)ret<double>(-1));
-   printf("%f\n", ret<double>(-1));
- 
-   printf("%d\n", g1(-1));
-   printf("%d\n", g1(-1.0));
- 
-   printf("%d\n", g2(-1));
-   printf("%d\n", g2(1.0));
-   printf("%d\n", g2('d'));
- 
-   G3<double, double> g3_gen;
-   G3<int, int> g3_partial;
-   G3<int, double> g3_full;
-   g3_gen.f(-1.0, -1.0); // general
-   g3_partial.f(-2, -2); // partial spec
-   g3_full.f(-3, -3.0); // full spec
- 
-   G3<char, char> g3_gen2;
-   G3<int, char> g3_partial2;
-   g3_gen2.f((char)-1, (char)-1);
-   g3_partial2.f(-1, (char)-1);
- 
-   G3<int, C> g3_full2;
-   g3_full2.f(5, C{});
-   g3_full2.f(-5, C{});
- 
-   G4 g4_gen{-1, -1};
-   G4 g4_full1{-1.0, -1.0};
-   G4 g4_full2{-1.0, (char)'b'};
-   G4 g4_partial{(char)'c', -5};
- 
-   G5<int, int> g5_gen;
-   g5_gen.f(-1, -1, -2);
-   g5_gen.f(-1, -1, -2.0);
- 
-   G5<char, int> g5_part;
-   g5_part.f('a', -1, -2);
-   g5_part.f('a', -1, -2.1);
- 
-   G5<double, double> g5_full;
-   g5_full.f(-1.0, -1.0, -2);
-   g5_full.f(-1.0, -1.0, -2.1);
-   return 0;
- }
- 
- // { dg-skip-if "requires hosted libstdc++ for cstdio" { ! hostedlib } }
- // { dg-output {contract violation in function body<int> at .*:9: a > 0(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {-2(\n|\r\n|\r)} }
- // { dg-output {contract violation in function body<double> at .*:17: a > 1(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {-3(\n|\r\n|\r)} }
- // { dg-output {contract violation in function none<int> at .*:25: a > 0(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {1(\n|\r\n|\r)} }
- // { dg-output {contract violation in function none<double> at .*:32: a > 1(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {-101(\n|\r\n|\r)} }
- // { dg-output {contract violation in function arg0<int> at .*:39: t > 0(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {-9(\n|\r\n|\r)} }
- // { dg-output {contract violation in function arg0<double> at .*:46: t > 1(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {11(\n|\r\n|\r)} }
- // { dg-output {contract violation in function arg1<int> at .*:53: a > 0(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {contract violation in function arg1<int> at .*:54: t > 0(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {-3(\n|\r\n|\r)} }
- // { dg-output {contract violation in function arg1<double> at .*:61: a > 1(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {contract violation in function arg1<double> at .*:62: t > 1(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {14(\n|\r\n|\r)} }
- // { dg-output {contract violation in function ret<int> at .*:69: a > 0(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {1(\n|\r\n|\r)} }
- // { dg-output {contract violation in function ret<double> at .*:76: a > 1(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {3(\n|\r\n|\r)} }
- // { dg-output {contract violation in function ret<double> at .*:76: a > 1(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {3.300000(\n|\r\n|\r)} }
- // { dg-output {contract violation in function g1<int> at .*:83: t > 0(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {-1(\n|\r\n|\r)} }
- // { dg-output {-1(\n|\r\n|\r)} }
- // { dg-output {contract violation in function g2<int> at .*:97: t > 0(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {-1(\n|\r\n|\r)} }
- // { dg-output {contract violation in function g2<double> at .*:107: t < 0(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {1(\n|\r\n|\r)} }
- // { dg-output {contract violation in function g2<char> at .*:114: t < 'c'(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {100(\n|\r\n|\r)} }
- // { dg-output {contract violation in function G3<double, double>::f at .*:124: t > 0(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {contract violation in function G3<double, double>::f at .*:125: s > 0(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {G3 general T S(\n|\r\n|\r)} }
- // { dg-output {contract violation in function G3<int, int>::f at .*:139: t > 1(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {contract violation in function G3<int, int>::f at .*:140: s > 1(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {G3 partial int S(\n|\r\n|\r)} }
- // { dg-output {contract violation in function G3<int, double>::f at .*:147: t > 2(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {contract violation in function G3<int, double>::f at .*:148: s > 2(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {G3 full int double(\n|\r\n|\r)} }
- // { dg-output {contract violation in function G3<char, char>::f at .*:124: t > 0(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {contract violation in function G3<char, char>::f at .*:125: s > 0(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {G3 general T S(\n|\r\n|\r)} }
- // { dg-output {contract violation in function G3<int, char>::f at .*:139: t > 1(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {contract violation in function G3<int, char>::f at .*:140: s > 1(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {G3 partial int S(\n|\r\n|\r)} }
- // { dg-output {G3 full int C(\n|\r\n|\r)} }
- // { dg-output {G3 full int C(\n|\r\n|\r)} }
- // { dg-output {contract violation in function G4<int, int>::G4 at .*:173: t > 0(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {contract violation in function G4<int, int>::G4 at .*:174: s > 0(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {G4 general T S(\n|\r\n|\r)} }
- // { dg-output {contract violation in function G4<int, int>::G4 at .*:175: x > 0(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {G4 full double double(\n|\r\n|\r)} }
- // { dg-output {contract violation in function G4<double, char>::G4 at .*:206: a > 0(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {contract violation in function G4<double, char>::G4 at .*:207: b > 'b'(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {G4 full double char(\n|\r\n|\r)} }
- // { dg-output {contract violation in function G4<double, char>::G4 at .*:208: x > 1(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {contract violation in function G4<char, int>::G4 at .*:187: t > 'c'(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {contract violation in function G4<char, int>::G4 at .*:188: s > 3(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {G4 partial char S(\n|\r\n|\r)} }
- // { dg-output {contract violation in function G4<char, int>::G4 at .*:189: x2 > 3(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {contract violation in function G5<int, int>::f<int> at .*:220: t > 0(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {contract violation in function G5<int, int>::f<int> at .*:221: s > 0(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {contract violation in function G5<int, int>::f<int> at .*:222: r > 0(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {G5 gen T S, f gen R(\n|\r\n|\r)} }
- // { dg-output {contract violation in function G5<int, int>::f<double> at .*:220: t > 0(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {contract violation in function G5<int, int>::f<double> at .*:221: s > 0(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {contract violation in function G5<int, int>::f<double> at .*:222: r > 0(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {G5 gen T S, f gen R(\n|\r\n|\r)} }
- // { dg-output {contract violation in function G5<char, int>::f<int> at .*:233: x > 'z'(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {contract violation in function G5<char, int>::f<int> at .*:234: y > 1(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {contract violation in function G5<char, int>::f<int> at .*:235: z > 1(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {G5 partial char S, f gen R(\n|\r\n|\r)} }
- // { dg-output {contract violation in function G5<char, int>::f<double> at .*:233: x > 'z'(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {contract violation in function G5<char, int>::f<double> at .*:234: y > 1(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {contract violation in function G5<char, int>::f<double> at .*:235: z > 1(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {G5 partial char S, f gen R(\n|\r\n|\r)} }
- // { dg-output {contract violation in function G5<double, double>::f<int> at .*:244: a > 2(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {contract violation in function G5<double, double>::f<int> at .*:245: b > 2(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {contract violation in function G5<double, double>::f<int> at .*:246: c > 2(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {G5 full double double, f gen R(\n|\r\n|\r)} }
- // { dg-output {contract violation in function G5<double, double>::f<double> at .*:244: a > 2(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {contract violation in function G5<double, double>::f<double> at .*:245: b > 2(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {contract violation in function G5<double, double>::f<double> at .*:246: c > 2(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {G5 full double double, f gen R(\n|\r\n|\r)} }
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-tmpl-spec3.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-tmpl-spec3.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts-tmpl-spec3.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts-tmpl-spec3.C	Thu Jan  1 00:00:00 1970
***************
*** 1,51 ****
- // { dg-do run }
- // { dg-options "-std=c++2a -fcontracts -fcontract-continuation-mode=on" }
- #include <cstdio>
- 
- template<typename T, typename S>
- struct G5
- {
-   template<typename R>
-   void f(T t, S s, R r)
-     [[ pre: t > 0 ]] [[ pre: s > 0 ]] [[ pre: r > 0 ]]
-   {
-     printf ("G5 gen T S, f gen R\n");
-   }
- };
- 
- // specializations can remove contracts
- template<>
- template<typename R>
- void G5<double, double>::f(double a, double b, R c)
- {
-   printf ("G5 full double double, f gen R\n");
- }
- 
- int main(int, char**) {
-   G5<double, double> g5_full;
-   g5_full.f(-1.0, -1.0, -2);
-   g5_full.f(-1.0, -1.0, -2.1);
- 
-   G5<int, double> g5_gen;
-   g5_gen.f(-1, -1.0, -2);
-   g5_gen.f(-1, -1.0, -2.1);
-   return 0;
- }
- 
- // { dg-skip-if "requires hosted libstdc++ for cstdio" { ! hostedlib } }
- // { dg-output {G5 full double double, f gen R(\n|\r\n|\r)} }
- // { dg-output {G5 full double double, f gen R(\n|\r\n|\r)} }
- // { dg-output {contract violation in function G5<int, double>::f<int> at .*:10: t > 0(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {contract violation in function G5<int, double>::f<int> at .*:10: s > 0(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {contract violation in function G5<int, double>::f<int> at .*:10: r > 0(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {G5 gen T S, f gen R(\n|\r\n|\r)} }
- // { dg-output {contract violation in function G5<int, double>::f<double> at .*:10: t > 0(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {contract violation in function G5<int, double>::f<double> at .*:10: s > 0(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {contract violation in function G5<int, double>::f<double> at .*:10: r > 0(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {G5 gen T S, f gen R(\n|\r\n|\r)} }
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts1.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts1.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts1.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts1.C	Thu Jan  1 00:00:00 1970
***************
*** 1,49 ****
- // generic assert contract parsing checks
- //   check omitted, 'default', 'audit', and 'axiom' contract levels parse
- //   check that all concrete semantics parse
- //   check omitted, '%default' contract roles parse
- //   ensure that an invalid contract level 'invalid' errors
- //   ensure that a predicate referencing an undefined variable errors
- //   ensure that a missing colon after contract level errors
- //   ensure that an invalid contract role 'invalid' errors
- //   ensure that a missing colon after contract role errors
- // { dg-do compile }
- // { dg-options "-std=c++2a -fcontracts" }
- 
- static_assert (__cpp_contracts >= 201906);
- static_assert (__cpp_contracts_literal_semantics >= 201906);
- static_assert (__cpp_contracts_roles >= 201906);
- 
- int main()
- {
-   int x;
- 
-   [[assert: x >= 0]];
-   [[assert default: x < 0]];
-   [[assert audit: x == 0]];
-   [[assert axiom: x == 1]];
- 
-   [[assert: x > 0 ? true : false]];
-   [[assert: x < 0 ? true : false]];
- 
-   [[assert: x = 0]]; // { dg-error "expected .]. before .=. token" }
- 
-   [[assert ignore: x >= 0]];
-   [[assert assume: x >= 0]];
-   [[assert check_never_continue: x >= 0]];
-   [[assert check_maybe_continue: x >= 0]];
- 
-   [[assert %default: x >= 0]];
-   [[assert default %default: x < 0]];
-   [[assert audit %default: x == 0]];
-   [[assert axiom %default: x == 1]];
- 
-   [[assert check_always_continue: x >= 0]]; // { dg-error "expected contract level" }
-   [[assert invalid: x == 0]]; // { dg-error "expected contract level" }
-   [[assert: y == 0]]; // { dg-error ".y. was not declared in this scope" }
-   [[assert default x == 0]]; // { dg-error "expected .:. before .x." }
-   [[assert %default x >= 0]]; // { dg-error "expected .:. before .x." }
- 
-   [[assert %invalid: x >= 0]]; // TODO: optional warning?
-   return 0;
- }
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts10.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts10.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts10.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts10.C	Thu Jan  1 00:00:00 1970
***************
*** 1,74 ****
- // general checks to ensure that contract violations are generated during
- // runtime when appropriate
- // each check also validates the expected file name, line number, function,
- // predicate, and contract level are included in the violation_info object
- // { dg-do run }
- // { dg-options "-std=c++2a -fcontracts -fcontract-build-level=audit -fcontract-continuation-mode=on" }
- 
- namespace tns
- {
-   int fun()
-   {
-     int x = 1;
-     [[ assert: x < 0 ]];
-     return 0;
-   }
-   int fun2();
- 
-   struct TestType
-   {
-     static int fun();
-     static int fun2()
-     {
-       int x = 1;
-       [[ assert: x < 0 ]];
-       return 0;
-     }
-   };
- }
- 
- int tns::fun2()
- {
-   int x = 1;
-   [[ assert: x < 0 ]];
-   return 0;
- }
- 
- int tns::TestType::fun()
- {
-   int x = 1;
-   [[ assert: x < 0 ]];
-   return 0;
- }
- 
- int main()
- {
-   int x = 100;
-   [[assert: x < 0]];
-   [[assert default: x < 1]];
-   [[assert audit: x < 2]];
- // contract_violation.line_number() may eventually come from
- // std::source_location which *is* affected by the #line macro; our current
- // implementation conforms to this so we've included it as a check
- #line 100
-   [[assert: x < 3]];
-   [[assert axiom: x < 4]];
- 
-   tns::fun();
-   tns::fun2();
- 
-   tns::TestType::fun();
-   tns::TestType::fun2();
-   return 0;
- }
- 
- // { dg-skip-if "requires hosted libstdc++ for stdc++exp" { ! hostedlib } }
- // { dg-output "contract violation in function main at .*.C:47: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function main at .*.C:48: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function main at .*.C:49: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function main at .*.C:100: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function tns::fun at .*.C:13: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function tns::fun2 at .*.C:33: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function tns::TestType::fun at .*.C:40: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function tns::TestType::fun2 at .*.C:24: .*(\n|\r\n|\r)" }
-  
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts11.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts11.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts11.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts11.C	Thu Jan  1 00:00:00 1970
***************
*** 1,103 ****
- // ensure that assert contract predicates that are not convertible to bool
- // generate an error
- // ensure the same for instatiated template functions
- // ensure the same for non-instatiated template functions when the predicate
- // is not dependent on the template parameters
- // ensure template parameter dependent, potentially non-boolean, contract
- // predicates do not generate an error if never instatiated
- // { dg-do compile }
- // { dg-options "-std=c++2a -fcontracts" }
- 
- void fun()
- {
-   return;
- }
- 
- template<typename T>
- void fun2(T a)
- {
-   [[assert: fun()]]; // { dg-error "could not convert|in argument" }
- }
- 
- template<typename T>
- void fun3(T a)
- {
-   [[assert: fun()]]; // { dg-error "could not convert|in argument" }
- }
- 
- template<typename T>
- void fun4(T a)
- {
-   [[assert: a.fun()]];
- }
- 
- struct test
- {
-   void fun() { }
-   void fun2() { }
- };
- 
- template<typename T>
- void fun5(T a)
- {
-   [[assert: a.fun2()]]; // { dg-error "could not convert" }
- }
- 
- struct VoidFun
- {
-   void fun() { }
- };
- struct BoolFun
- {
-   bool fun() { return true; }
- };
- 
- template<typename T>
- void fun6(T a)
- {
-   [[ assert: a.fun() ]]; // { dg-error "could not convert" }
- }
- 
- template void fun6(VoidFun);
- 
- template<typename T>
- void fun7(T a)
- {
-   [[ assert: a.fun() ]];
- }
- 
- template void fun7(BoolFun);
- 
- struct ImplicitBool
- {
-   operator bool() { return true; }
- };
- struct ExplicitBool
- {
-   explicit operator bool() { return true; }
- };
- 
- template<typename T>
- void fun8(T a)
- {
-   [[ assert: T() ]];
- }
- 
- template void fun8(ImplicitBool);
- template void fun8(ExplicitBool);
- 
- void fun9()
- {
-   [[ assert: ImplicitBool() ]];
-   [[ assert: ExplicitBool() ]];
- }
- 
- int main()
- {
-   [[assert: fun()]]; // { dg-error "could not convert" }
-   fun2(1);
- 
-   test t;
-   fun5(t);
-   return 0;
- }
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts12.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts12.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts12.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts12.C	Thu Jan  1 00:00:00 1970
***************
*** 1,15 ****
- // ensure that constants for contract levels are inserted into the binary when
- // used and omitted when the runtime check is not generated
- // { dg-do compile }
- // { dg-options "-std=c++2a -fcontracts -fcontract-build-level=default" }
- // { dg-final { scan-assembler-not "audit" } }
- // { dg-final { scan-assembler "default" } }
- 
- int main()
- {
-   int x = 1;
-   [[assert: x < 0]];
-   [[assert default: x < 0]];
-   [[assert audit: x < 0]];
-   return 0;
- }
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts13.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts13.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts13.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts13.C	Thu Jan  1 00:00:00 1970
***************
*** 1,51 ****
- // ensure that passing asserts do not affect constexpr functions
- // ensure that failing asserts generate an error in a constexpr function
- // { dg-do compile }
- // { dg-options "-std=c++2a -fcontracts" }
- 
- constexpr int wfun(int a) {
-   [[assert: a > 0]];
-   return a;
- }
- 
- constexpr int ffun(int a) {
-   [[assert: a > 0]];
-   return a;
- }
- 
- template<typename T>
- constexpr int tfun(T a) {
-   [[assert: a > 0]];
-   return a;
- }
- 
- template<typename T>
- constexpr int wtfun(T a) {
-   [[assert: a > 0]];
-   return a;
- }
- 
- template<typename T>
- constexpr int ftfun(T a) {
-   [[assert: a > 0]];
-   return a;
- }
- 
- constexpr int explicitfn(int a) {
-   [[assert ignore: a > 0]];
-   [[assert check_never_continue: a > 0]];
-   return a;
- }
- 
- int main(int, char **) {
-   constexpr int a = wfun(10);
-   constexpr int b = ffun(-10); // { dg-message "in .constexpr. expansion" }
-   // { dg-error "contract predicate" "" { target *-*-* } 12 }
-   constexpr int c = wtfun(10);
-   constexpr int d = ftfun(-10);  // { dg-message "in .constexpr. expansion" }
-   // { dg-error "contract predicate" "" { target *-*-* } 30 }
-   constexpr int e = explicitfn(-10); // { dg-message "in .constexpr. expansion" }
-   // { dg-error "contract predicate" "" { target *-*-* } 36 }
-   return 0;
- }
- 
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts14.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts14.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts14.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts14.C	Thu Jan  1 00:00:00 1970
***************
*** 1,59 ****
- // ensure that exceptions thrown inside a custom contract violation handler
- // are catchable up the call stack
- // { dg-do run }
- // { dg-options "-std=c++2a -fcontracts -fcontract-continuation-mode=on" }
- #include <iostream>
- #include <experimental/contract>
- 
- void handle_contract_violation(const std::experimental::contract_violation &violation) {
-   std::cerr << "custom std::handle_contract_violation called:"
-     << " " << violation.line_number()
-     << " " << violation.file_name()
-     << std::endl;
-   throw -(int)violation.line_number();
- }
- 
- int fun() {
-   int x = 0;
-   [[ assert: x < 0 ]];
-   return 0;
- }
- 
- int fun3() {
-   fun();
-   return 2;
- }
- 
- int main(int, char**) {
-   try {
-     int x = 0;
-     [[ assert: x < 0 ]];
-   } catch(int &ex) {
-     std::cerr << "synth caught direct: " << ex << std::endl;
-   }
- 
-   try {
-     fun();
-   } catch(int &ex) {
-     std::cerr << "synth caught indirect: " << ex << std::endl;
-   }
- 
-   try {
-     fun3();
-   } catch(int &ex) {
-     std::cerr << "synth caught double indirect: " << ex << std::endl;
-   }
- 
-   std::cerr << "end main" << std::endl;
-   return 0;
- }
- 
- // { dg-skip-if "requires hosted libstdc++ for iostream" { ! hostedlib } }
- // { dg-output "custom std::handle_contract_violation called: 30 .*/contracts14.C(\n|\r\n|\r)" }
- // { dg-output "synth caught direct: -30(\n|\r\n|\r)" }
- // { dg-output "custom std::handle_contract_violation called: 18 .*/contracts14.C(\n|\r\n|\r)" }
- // { dg-output "synth caught indirect: -18(\n|\r\n|\r)" }
- // { dg-output "custom std::handle_contract_violation called: 18 .*/contracts14.C(\n|\r\n|\r)" }
- // { dg-output "synth caught double indirect: -18(\n|\r\n|\r)" }
- // { dg-output "end main" }
- 
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts15.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts15.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts15.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts15.C	Thu Jan  1 00:00:00 1970
***************
*** 1,57 ****
- // ensure that exceptions thrown inside a custom contract violation handler
- // are not catchable up the call stack when failing in a noexcept function
- // { dg-do run }
- // { dg-options "-std=c++2a -fcontracts -fcontract-continuation-mode=on" }
- #include <iostream>
- #include <experimental/contract>
- 
- void handle_contract_violation(const std::experimental::contract_violation &violation) {
-   std::cerr << "custom std::handle_contract_violation called:"
-     << " " << violation.line_number()
-     << " " << violation.file_name()
-     << std::endl;
-   throw -(int)violation.line_number();
- }
- 
- int fun() noexcept {
-   int x = 0;
-   [[ assert: x < 0 ]];
-   return 0;
- }
- 
- int fun3() {
-   fun();
-   return 2;
- }
- 
- int main(int, char**) {
-   try {
-     int x = 0;
-     [[ assert: x < 0 ]];
-   } catch(int &ex) {
-     std::cerr << "synth caught direct: " << ex << std::endl;
-   }
- 
-   try {
-     fun();
-   } catch(int &ex) {
-     std::cerr << "synth caught indirect: " << ex << std::endl;
-   }
- 
-   try {
-     fun3();
-   } catch(int &ex) {
-     std::cerr << "synth caught double indirect: " << ex << std::endl;
-   }
- 
-   std::cerr << "end main" << std::endl;
-   return 0;
- }
- 
- // { dg-skip-if "requires hosted libstdc++ for iostream" { ! hostedlib } }
- // { dg-output "custom std::handle_contract_violation called: 30 .*/contracts15.C(\n|\r\n|\r)" }
- // { dg-output "synth caught direct: -30(\n|\r\n|\r)" }
- // { dg-output "custom std::handle_contract_violation called: 18 .*/contracts15.C(\n|\r\n|\r)" }
- // { dg-output "terminate called after throwing an instance of .int.(\n|\r\n|\r)" }
- // { dg-shouldfail "throwing in noexcept" }
- 
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts16.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts16.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts16.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts16.C	Thu Jan  1 00:00:00 1970
***************
*** 1,35 ****
- // ensure that exceptions thrown inside a custom contract violation handler
- // are not catchable up the call stack even when continue mode is off
- // { dg-do run }
- // { dg-options "-std=c++2a -fcontracts" }
- #include <iostream>
- #include <experimental/contract>
- 
- void handle_contract_violation(const std::experimental::contract_violation &violation) {
-   std::cerr << "custom std::handle_contract_violation called:"
-     << " " << violation.line_number()
-     << " " << violation.file_name()
-     << std::endl;
-   throw -(int)violation.line_number();
- }
- 
- int fun() {
-   int x = 0;
-   [[ assert: x < 0 ]];
-   return 0;
- }
- 
- int main(int, char**) {
-   try {
-     fun();
-   } catch(int &ex) {
-     std::cerr << "synth caught indirect: " << ex << std::endl;
-   }
- 
-   return 0;
- }
- 
- // { dg-skip-if "requires hosted libstdc++ for iostream" { ! hostedlib } }
- // { dg-output "custom std::handle_contract_violation called: 18 .*/contracts16.C(\n|\r\n|\r)" }
- // { dg-output "synth caught indirect: -18(\n|\r\n|\r)" }
- 
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts17.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts17.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts17.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts17.C	Thu Jan  1 00:00:00 1970
***************
*** 1,36 ****
- // ensure that exceptions thrown inside a custom contract violation handler
- // are not catchable up the call stack when continue mode is off and the
- // assert fails in a noexcept function
- // { dg-do run }
- // { dg-options "-std=c++2a -fcontracts" }
- #include <iostream>
- #include <experimental/contract>
- 
- void handle_contract_violation(const std::experimental::contract_violation &violation) {
-   std::cerr << "custom std::handle_contract_violation called:"
-     << " " << violation.line_number()
-     << " " << violation.file_name()
-     << std::endl;
-   throw -violation.line_number();
- }
- 
- int fun() noexcept {
-   int x = 0;
-   [[ assert: x < 0 ]];
-   return 0;
- }
- 
- int main(int, char**) {
-   try {
-     fun();
-   } catch(int &ex) {
-     std::cerr << "synth caught indirect: " << ex << std::endl;
-   }
- 
-   return 0;
- }
- 
- // { dg-skip-if "requires hosted libstdc++ for iostream" { ! hostedlib } }
- // { dg-output "custom std::handle_contract_violation called: 19 .*/contracts17.C(\n|\r\n|\r)" }
- // { dg-shouldfail "throwing in noexcept" }
- 
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts18.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts18.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts18.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts18.C	Thu Jan  1 00:00:00 1970
***************
*** 1,16 ****
- // check that a valid program using assertions compiles and runs
- //   ensure an axiom with a failing predicate doesn't prevent a successful run
- //   (axiom level contracts are never checked at runtime)
- // { dg-do run }
- // { dg-options "-std=c++2a -fcontracts -fcontract-role=custom:never,ignore,ignore" }
- // { dg-skip-if "requires hosted libstdc++ for stdc++exp" { ! hostedlib } }
- 
- int main()
- {
-   int x = 1;
-   [[assert axiom: x < 0]];
-   [[assert %custom: x > 0]];
-   [[assert audit %custom: x < 0]];
-   return 0;
- }
- 
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts19.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts19.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts19.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts19.C	Thu Jan  1 00:00:00 1970
***************
*** 1,20 ****
- // check that a valid program using assertions compiles and runs
- //   ensure an axiom with a failing predicate doesn't prevent a successful run
- //   (axiom level contracts are never checked at runtime)
- // { dg-do run }
- // { dg-options "-std=c++2a -fcontracts -fcontract-role=custom:maybe,maybe,ignore" }
- 
- int main()
- {
-   int x = 10;
-   [[assert axiom: x < 0]];
-   [[assert %custom: x < 0]];
-   [[assert audit %custom: x < 1]];
-   [[assert axiom %custom: x < 1]];
-   return 0;
- }
- 
- // { dg-skip-if "requires hosted libstdc++ for stdc++exp" { ! hostedlib } }
- // { dg-output "contract violation in function main at .*.C:11: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function main at .*.C:12: .*(\n|\r\n|\r)" }
- 
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts2.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts2.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts2.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts2.C	Thu Jan  1 00:00:00 1970
***************
*** 1,14 ****
- // check that a valid program using assertions compiles and runs
- //   ensure an axiom with a failing predicate doesn't prevent a successful run
- //   (axiom level contracts are never checked at runtime)
- // { dg-do run }
- // { dg-options "-std=c++2a -fcontracts" }
- // { dg-skip-if "requires hosted libstdc++ for stdc++exp" { ! hostedlib } }
- 
- int main()
- {
-   int x = 1;
-   [[assert axiom: x < 0]];
-   [[assert default: x > 0]];
-   return 0;
- }
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts20.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts20.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts20.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts20.C	Thu Jan  1 00:00:00 1970
***************
*** 1,11 ****
- // test that contract attributes cause errors pre-c++2a
- // { dg-do compile { target c++17_only } }
- 
- int fun(int a)
-   [[ pre: a > 0 ]] // { dg-error "contracts are only available with .-fcontracts." }
-   [[ post r: r < 0 ]] // { dg-error "contracts are only available with .-fcontracts." }
- {
-   [[ assert: a != 0 ]]; // { dg-error "contracts are only available with .-fcontracts." }
-   return -a;
- }
- 
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts22.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts22.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts22.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts22.C	Thu Jan  1 00:00:00 1970
***************
*** 1,33 ****
- // ensure a default level assert with a failing predicate does not generate an
- // error during runtime when the contracts mode is off
- // { dg-do run }
- // { dg-options "-std=c++2a -fcontracts -fcontract-mode=off" }
- // { dg-output "returning from main" }
- // { dg-skip-if "requires hosted libstdc++ for cstdio" { ! hostedlib } }
- #include <cstdio>
- 
- int constexpr f()
- {
-   constexpr int x = 1;
-   [[assert default: x < 0]];
-   return x;
- }
- 
- template<typename T> int k()
- {
-   int x = 1;
-   [[assert default: x < 0]];
-   return x;
- }
- 
- 
- int main()
- {
-   int x = 1;
-   [[assert default: x < 0]];
-   constexpr int x2 = f();
-   int x3 = k<int>();
- 
-   printf ("returning from main\n");
-   return 0;
- }
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts24.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts24.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts24.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts24.C	Thu Jan  1 00:00:00 1970
***************
*** 1,16 ****
- // check that a valid program using assertions compiles and runs
- //   ensure an axiom with a failing predicate doesn't prevent a successful run
- //   (axiom level contracts are never checked at runtime)
- // { dg-do run }
- // { dg-options "-std=c++2a -fcontracts -fcontract-semantic=default:never -fcontract-semantic=audit:ignore -fcontract-semantic=axiom:ignore" }
- // { dg-skip-if "requires hosted libstdc++ for stdc++exp" { ! hostedlib } }
- 
- int main()
- {
-   int x = 1;
-   [[assert axiom: x < 0]];
-   [[assert: x > 0]];
-   [[assert audit: x < 0]];
-   return 0;
- }
- 
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts25.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts25.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts25.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts25.C	Thu Jan  1 00:00:00 1970
***************
*** 1,58 ****
- // ensure that passing asserts do not affect constexpr functions
- // ensure that failing asserts generate an error at runtime in constexpr funcs
- // { dg-do run }
- // { dg-options "-std=c++2a -fcontracts -fcontract-continuation-mode=on" }
- 
- constexpr int wfun(int a) {
-   [[assert: a > 0]];
-   return a;
- }
- 
- constexpr int ffun(int a) {
-   [[assert: a > 0]];
-   return a;
- }
- 
- template<typename T>
- constexpr int tfun(T a) {
-   [[assert: a > 0]];
-   return a;
- }
- 
- template<typename T>
- constexpr int wtfun(T a) {
-   [[assert: a > 0]];
-   return a;
- }
- 
- template<typename T>
- constexpr int ftfun(T a) {
-   [[assert: a > 0]];
-   return a;
- }
- 
- constexpr int explicitfn(int a) {
-   [[assert ignore: a > 0]];
-   [[assert check_maybe_continue: a > 0]];
-   return a;
- }
- 
- int main(int, char **) {
-   int a = wfun(10);
-   int b = ffun(-10);
-   int c = wtfun(10);
-   int d = ftfun(-10);
- 
-   int e = explicitfn(-10);
- 
-   int z = ftfun(-10.0);
- 
-   return 0;
- }
- 
- // { dg-skip-if "requires hosted libstdc++ for stdc++exp" { ! hostedlib } }
- // { dg-output "contract violation in function ffun at .*.C:12: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function ftfun<int> at .*.C:30: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function explicitfn at .*.C:36: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function ftfun<double> at .*.C:30: .*(\n|\r\n|\r)" }
- 
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts3.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts3.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts3.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts3.C	Thu Jan  1 00:00:00 1970
***************
*** 1,14 ****
- // ensure a default level assert with a failing predicate generates an error
- // during runtime when the contract build level is default
- // { dg-do run }
- // { dg-options "-std=c++2a -fcontracts" }
- // { dg-shouldfail "assert violation" }
- // { dg-output "contract violation in function main" }
- // { dg-skip-if "requires hosted libstdc++ for stdc++exp" { ! hostedlib } }
- 
- int main()
- {
-   int x = 1;
-   [[assert default: x < 0]];
-   return 0;
- }
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts35.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts35.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts35.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts35.C	Thu Jan  1 00:00:00 1970
***************
*** 1,48 ****
- // { dg-do run }
- // { dg-options "-std=c++2a -fcontracts -fcontract-continuation-mode=on" }
- #include <cstdio>
- 
- struct S
- {
-   template<typename T>
-   S(T a) [[ pre: a > 0 ]] [[ pre: a > 10 ]];
- };
- 
- template<typename T>
- S::S(T a)
- {
-   printf ("S::S(T): %d\n", (int)a);
- }
- 
- struct S1
- {
-   template<typename T>
-   S1(T a) [[ pre: a > 0 ]] [[ pre: a > 10 ]]
-   {
-     printf ("S1::S1(T): %d\n", (int)a);
-   }
- };
- 
- int main(int, char **) {
-   S s{-1};
-   S s2{-2.5};
- 
-   S1 s1_1{-3};
-   S1 s1_2{-4.5};
-   return 0;
- }
- 
- // { dg-skip-if "requires hosted libstdc++ for cstdio" { ! hostedlib } }
- // { dg-output "contract violation in function S::S<int> at .*.C:8: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function S::S<int> at .*.C:8: .*(\n|\r\n|\r)" }
- // { dg-output "S::S.T.: -1(\n|\r\n|\r)" }
- // { dg-output "contract violation in function S::S<double> at .*.C:8: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function S::S<double> at .*.C:8: .*(\n|\r\n|\r)" }
- // { dg-output "S::S.T.: -2(\n|\r\n|\r)" }
- // { dg-output "contract violation in function S1::S1<int> at .*.C:20: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function S1::S1<int> at .*.C:20: .*(\n|\r\n|\r)" }
- // { dg-output "S1::S1.T.: -3(\n|\r\n|\r)" }
- // { dg-output "contract violation in function S1::S1<double> at .*.C:20: .*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function S1::S1<double> at .*.C:20: .*(\n|\r\n|\r)" }
- // { dg-output "S1::S1.T.: -4(\n|\r\n|\r)" }
- 
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts4.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts4.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts4.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts4.C	Thu Jan  1 00:00:00 1970
***************
*** 1,12 ****
- // ensure an audit level assert with a failing predicate does not generate an
- // error during runtime when the contract build level is default
- // { dg-do run }
- // { dg-options "-std=c++2a -fcontracts" }
- // { dg-skip-if "requires hosted libstdc++ for stdc++exp" { ! hostedlib } }
- 
- int main()
- {
-   int x = 1;
-   [[assert audit: x < 0]];
-   return 0;
- }
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts5.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts5.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts5.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts5.C	Thu Jan  1 00:00:00 1970
***************
*** 1,14 ****
- // ensure an audit level assert with a failing predicate generates an error
- // during runtime when the contract build level is audit
- // { dg-do run }
- // { dg-options "-std=c++2a -fcontracts -fcontract-build-level=audit" }
- // { dg-shouldfail "assert violation" }
- // { dg-output "contract violation in function main" }
- // { dg-skip-if "requires hosted libstdc++ for stdc++exp" { ! hostedlib } }
- 
- int main()
- {
-   int x = 1;
-   [[assert audit: x < 0]];
-   return 0;
- }
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts6.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts6.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts6.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts6.C	Thu Jan  1 00:00:00 1970
***************
*** 1,12 ****
- // ensure a default level assert with a failing predicate does not generate an
- // error during runtime when the contract build level is off
- // { dg-do run }
- // { dg-options "-std=c++2a -fcontracts -fcontract-build-level=off" }
- // { dg-skip-if "requires hosted libstdc++ for stdc++exp" { ! hostedlib } }
- 
- int main()
- {
-   int x = 1;
-   [[assert default: x < 0]];
-   return 0;
- }
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts7.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts7.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts7.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts7.C	Thu Jan  1 00:00:00 1970
***************
*** 1,15 ****
- // ensure a default level assert with a failing predicate does generates an
- // error during runtime but lets the program continue and complete
- // successfully when the contract build level is default but continuation on
- // contract failure is switched on
- // { dg-do run }
- // { dg-options "-std=c++2a -fcontracts -fcontract-continuation-mode=on" }
- // { dg-output "contract violation in function main" }
- // { dg-skip-if "requires hosted libstdc++ for stdc++exp" { ! hostedlib } }
- 
- int main()
- {
-   int x = 1;
-   [[assert default: x < 0]];
-   return 0;
- }
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts8.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts8.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts8.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts8.C	Thu Jan  1 00:00:00 1970
***************
*** 1,43 ****
- // generic assert contract parsing checks
- //   ensure that existing generalized attribute parsing is not intefered with
- //   ensure that an assert contract cannot chain into an empty attribute list
- //   ensure that an attribute list cannot chain into an assert contract
- // { dg-do compile }
- // { dg-options "-std=c++2a -fcontracts" }
- 
- constexpr bool fun(int x) {
-   return x < 0;
- }
- 
- namespace tns {
-   constexpr bool f(int x) {
-     return x < 0;
-   }
- }
- 
- bool assert(int x) {
-   return x < 0;
- }
- 
- int main()
- {
-   constexpr int x = 1;
-   [[fun(x)]]; // { dg-warning "attributes at the beginning of statement are ignored" }
-   [[fun(x), assert(x)]]; // { dg-warning "attributes at the beginning of statement are ignored" }
- 
-   [[assert default: fun(x), ]]; // { dg-error "expected ']'" }
-   [[assert default: fun(x) ]];
- 
-   [[fun(x), assert default: fun(x)]]; // { dg-error "expected .]. before .default." }
-   // { dg-warning "attributes at the beginning of statement are ignored" "" { target *-*-* } .-1 }
-   [[fun(x), assert: fun(x)]]; // { dg-error "expected .]. before .:. token" }
-   // { dg-warning "attributes at the beginning of statement are ignored" "" { target *-*-* } .-1 }
-   [[fun(x), assert fun(x)]]; // { dg-error "expected .]. before .fun." }
-   // { dg-warning "attributes at the beginning of statement are ignored" "" { target *-*-* } .-1 }
-   [[ using tns: f(x) ]]; // { dg-warning "attributes at the beginning of statement are ignored" }
-   [[ using tns: f(x), assert default: fun(x) ]]; // { dg-error "expected .]. before .default." }
-   // { dg-warning "attributes at the beginning of statement are ignored" "" { target *-*-* } .-1 }
-   [[ using tns: f(x), , default: fun(x) ]]; // { dg-error "expected .]. before .:." }
-   // { dg-warning "attributes at the beginning of statement are ignored" "" { target *-*-* } .-1 }
-   return 0;
- }
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts9.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts9.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/contracts9.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/contracts9.C	Thu Jan  1 00:00:00 1970
***************
*** 1,54 ****
- // ensure that dependent and non-dependent asserts inside templated
- // functions parse without error whether the function is instatiated or not
- // ensure that assert contract checks are generated inside called templates
- // ensure that template functions can be used as assert predicates
- // { dg-do run }
- // { dg-options "-std=c++2a -fcontracts -fcontract-continuation-mode=on" }
- 
- template<typename T>
- int fun1(int a, T b)
- {
-   [[ assert: a > 0 ]];
-   [[ assert: (long long)b > 0 ]];
-   return a > 0;
- }
- 
- template<typename T>
- struct test
- {
-   static int fun(int a, T b) {
-     [[ assert: a > 0 ]];
-     [[ assert: b > 0 ]];
-     return a > 0;
-   }
- };
- 
- int main()
- {
-   fun1(1, -1);
-   fun1(-1, 1.0);
-   fun1(-1, (const char *)0x1234);
- 
-   [[ assert: fun1(-1, -5) ]];
-   [[ assert: test<int>::fun(10, -6) ]];
-   [[ assert: test<double>::fun(10.0, -7) ]];
-   // return 0;
- }
- 
- // { dg-skip-if "requires hosted libstdc++ for stdc++exp" { ! hostedlib } }
- // { dg-output {contract violation in function fun1<int> at .*:12: \(long long\)b > 0(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {contract violation in function fun1<double> at .*:11: a > 0(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {contract violation in function fun1<const char\*> at .*:11: a > 0(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {contract violation in function fun1<int> at .*:11: a > 0(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {contract violation in function fun1<int> at .*:12: \(long long\)b > 0(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {contract violation in function main at .*:32: fun1\(-1, -5\)(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {contract violation in function test<int>::fun at .*:21: b > 0(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
- // { dg-output {contract violation in function test<double>::fun at .*:21: b > 0(\n|\r\n|\r)} }
- // { dg-output {\[continue:on\](\n|\r\n|\r)} }
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/BZ121936-workaround-noipa.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/BZ121936-workaround-noipa.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/BZ121936-workaround-noipa.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/BZ121936-workaround-noipa.C	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,22 ----
+ // check that we do not optimise based on contract_asssert
+ // { dg-additional-options "-O3 -fcontracts -fcontract-evaluation-semantic=quick_enforce -fdump-tree-optimized " }
+ // { dg-do compile { target c++26 } }
+ 
+ [[gnu::used, gnu::noinline]]
+ inline int* f(int *y) {
+   contract_assert(y != nullptr);
+   return y;
+ }
+ 
+ 
+ int foo(int *x) {
+     if (f(x) == nullptr)
+     {
+         return 0;
+     }
+     return *x;
+ }
+ 
+ // Check that the if condition in foo isn't optimised away, we should see the
+ // nullptr check twice.
+ // { dg-final { scan-tree-dump-times {if \([^=]+== 0B\)} 2 "optimized" } }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/assertion-statement-errors.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/assertion-statement-errors.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/assertion-statement-errors.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/assertion-statement-errors.C	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,41 ----
+ // generic assertion-statement parsing checks
+ // N5008
+ // assertion-statement :
+ // contract_assert attribute-specifier-seq opt ( conditional-expression ) ;
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-fcontracts" }
+ 
+ // { dg-prune-output "not declared" }
+ 
+ static_assert (__cpp_contracts >= 202502L);
+ 
+ contract_assert f(); // { dg-error "expected unqualified-id before .contract_assert." }
+ 
+ void f(contract_assert); // { dg-error "expected primary-expression before|declared void" }
+ struct contract_assert{}; // { dg-error "expected unqualified-id before|expected identifier" }
+ void contract_assert(); // { dg-error "expected unqualified-id before" }
+ 
+ void g(){};
+ int main()
+ {
+     contract_assert(x==0); // { dg-error ".x. was not declared in this scope"}
+     contract_assert int i = 0; // // { dg-error "expected primary-expression before|before .int." }
+ 
+     i = 7;
+ 
+     int j = 4;
+ 
+     contract_assert( x = 0); // { dg-error  "expected primary-expression before|expected .\\). before .=. token" }
+ 
+     contract_assert( y == 0); // { dg-error ".y. was not declared in this scope" }
+ 
+     contract_assert(true) // { dg-error  "expected .;. before .int." }
+     int k = 4;
+ 
+     contract_assert(true) // { dg-error  "expected .;. before .g." }
+     g();
+ 
+     contract_assert [[deprecated]] (i == 3);  // { dg-warning {attributes are ignored on 'contract_assert'} }
+ 
+     return 0;
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/assertion-statement.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/assertion-statement.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/assertion-statement.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/assertion-statement.C	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,34 ----
+ // generic assertion-statement parsing checks
+ // N5008
+ // assertion-statement :
+ // contract_assert attribute-specifier-seq opt ( conditional-expression ) ;
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-fcontracts" }
+ 
+ static_assert (__cpp_contracts >= 202502L);
+ 
+ int main()
+ {
+   int x;
+ 
+   contract_assert( x >= 0);
+   contract_assert( x < 0);
+   contract_assert( x == 0);
+ 
+   contract_assert( x > 0 ? true : false);
+   contract_assert( x < 0 ? true : false);
+ 
+   contract_assert( x >= 0);
+   contract_assert( x >= 0);
+   contract_assert( x >= 0);
+   contract_assert( x >= 0);
+ 
+   contract_assert( x >= 0);
+   contract_assert( x < 0);
+   contract_assert( x == 0);
+   contract_assert( x == 1);
+ 
+ 
+ 
+   return 0;
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p11-observe.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p11-observe.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p11-observe.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p11-observe.C	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,31 ----
+ // N5008 :
+ // dcl.contract.res/p1
+ // If a contract violation occurs in a context that is not manifestly constant-evaluated and the evaluation
+ // semantic is enforce or observe, the contract-violation handler (6.10.3) is invoked with an lvalue referring to
+ //  n object v of type const std::contracts::contract_violation (17.10.3) containing information about
+ // the contract violation. Storage for v is allocated in an unspecified manner except as noted in 6.7.6.5.2. The
+ // lifetime of v persists for the duration of the invocation of the contract-violation handler.
+ //
+ // Check the contract violation information in observe semantic
+ //
+ // { dg-do run { target c++26 } }
+ // { dg-additional-options "-fcontracts -fcontract-evaluation-semantic=observe" }
+ 
+ int f(int i, int j = 1) pre(i > 0) post(r: r < 5)
+ {
+   contract_assert( j > 0);
+   return i;
+ }
+ 
+ 
+ int main(int, char**)
+ {
+   f(5);
+   f(0,0);
+ }
+ // { dg-output "contract violation in function int f.int, int. at .*: r < 5.*(\n|\r\n|\r)" }
+ // { dg-output ".assertion_kind: post, semantic: observe, mode: predicate_false, terminating: no.*(\n|\r\n|\r)" }
+ // { dg-output "contract violation in function int f.int, int. at .*: i > 0.*(\n|\r\n|\r)" }
+ // { dg-output ".assertion_kind: pre, semantic: observe, mode: predicate_false, terminating: no.*(\n|\r\n|\r)" }
+ // { dg-output "contract violation in function int f.int, int. at .*: j > 0.*(\n|\r\n|\r)" }
+ // { dg-output ".assertion_kind: assert, semantic: observe, mode: predicate_false, terminating: no.*(\n|\r\n|\r)" }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p14.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p14.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p14.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p14.C	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,25 ----
+ // N5008 :
+ // basic.contract.eval/p14
+ // Note 10 : If the contract-violation handler returns normally and the evaluation semantic is observe, control flow
+ // continues normally after the point of evaluation of the contract assertion. — end note
+ // { dg-do compile { target c++23 } }
+ // { dg-additional-options "-fcontracts -fcontract-evaluation-semantic=observe" }
+ 
+ bool check(int i){
+   if (i > 10)
+     throw 3;
+ 
+   return true;
+ }
+ 
+ void f() pre(check(15)){}
+ 
+ 
+ int main(int, char**)
+ {
+ 
+   f();
+ }
+ 
+ // { dg-output "contract violation in function void f.. at .*: check.15..*(\n|\r\n|\r)" }
+ // { dg-output ".assertion_kind: pre, semantic: observe, mode: evaluation_exception: threw an instance of .int., terminating: no.*(\n|\r\n|\r)" }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p17-2.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p17-2.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p17-2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p17-2.C	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,47 ----
+ // N5008:
+ // basic.contract.eval/p17
+ // If a contract-violation handler invoked from the evaluation of a function contract assertion (9.4.1) exits via
+ // an exception, the behavior is as if the function body exits via that same exception.
+ // [Note 12 : A function-try-block (14.1) is the function body when present and thus does not have an opportunity to
+ // catch the exception. If the function has a non-throwing exception specification, the function std::terminate is
+ // invoked (14.6.2). — end note]
+ // { dg-do run { target c++26 } }
+ // { dg-additional-options "-fcontracts -fcontract-evaluation-semantic=observe " }
+ 
+ #include <contracts>
+ #include <exception>
+ #include <cstdlib>
+ 
+ struct MyException{};
+ 
+ // Test that there is an active exception when we reach the terminate handler.
+ void my_term()
+ {
+   try { throw; }
+   catch(MyException) { std::exit(0); }
+ }
+ 
+ 
+ void handle_contract_violation(const std::contracts::contract_violation& violation)
+ {
+   throw MyException{};
+ }
+ 
+ void f(int x) noexcept pre(x>1)
+ {
+   try{
+    int i = 1;
+   }
+   catch(...) {}
+ }
+ 
+ int main()
+ {
+   std::set_terminate (my_term);
+   try
+   {
+       f(-42);
+   } catch (...) {}
+   // We should not get here
+   __builtin_abort ();
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p17-3.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p17-3.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p17-3.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p17-3.C	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,58 ----
+ // N5008:
+ // basic.contract.eval/p17
+ // If a contract-violation handler invoked from the evaluation of a function contract assertion (9.4.1) exits via
+ // an exception, the behavior is as if the function body exits via that same exception.
+ // [Note 13 : If a contract-violation handler invoked from an assertion-statement (8.8)) exits via an exception, the search
+ // for a handler continues from the execution of that statement. — end note]
+ // { dg-do run { target c++26 } }
+ // { dg-additional-options "-fcontracts -fcontract-evaluation-semantic=observe " }
+ 
+ #include <contracts>
+ #include <exception>
+ #include <cstdlib>
+ 
+ struct MyException{};
+ 
+ 
+ void handle_contract_violation(const std::contracts::contract_violation& violation)
+ {
+   throw MyException{};
+ }
+ 
+ void free_f(const int x) {
+   try {
+ 	  contract_assert(x>1);
+ 	  int i = 1;
+   }
+   catch(...){}
+ }
+ 
+ struct X
+ {
+     void f(const int x) {
+       try {
+ 	  contract_assert(x>1);
+ 	  int i = 1;
+       }
+       catch(...){}
+     }
+ 
+     virtual void virt_f(const int x) {
+       try {
+ 	  contract_assert(x>1);
+ 	  int i = 1;
+       }
+       catch(...){}
+     }
+ 
+ };
+ 
+ int main()
+ {
+   free_f(-42);
+ 
+   X x;
+   x.f(-42);
+   x.virt_f(-42);
+ 
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p17-4.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p17-4.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p17-4.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p17-4.C	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,55 ----
+ // N5008:
+ // basic.contract.eval/p17
+ // If a contract-violation handler invoked from the evaluation of a function contract assertion (9.4.1) exits via
+ // an exception, the behavior is as if the function body exits via that same exception.
+ // [Note 12 : A function-try-block (14.1) is the function body when present and thus does not have an opportunity to
+ // catch the exception. If the function has a non-throwing exception specification, the function std::terminate is
+ // invoked (14.6.2). — end note]
+ //
+ // This tests the behaviour of a post condition on a member function
+ //
+ // { dg-do run { target c++26 } }
+ // { dg-additional-options "-fcontracts -fcontract-evaluation-semantic=observe " }
+ 
+ #include <contracts>
+ #include <exception>
+ #include <cstdlib>
+ 
+ struct MyException{};
+ 
+ // Test that there is an active exception when we reach the terminate handler.
+ void my_term()
+ {
+   try { throw; }
+   catch(MyException) { std::exit(0); }
+ }
+ 
+ 
+ void handle_contract_violation(const std::contracts::contract_violation& violation)
+ {
+   throw MyException{};
+ }
+ 
+ struct X
+ {
+     void f(const int x) noexcept post(x>1)
+     {
+       try{
+        int i = 1;
+       }
+       catch(...) {}
+     }
+ };
+ 
+ int main()
+ {
+   std::set_terminate (my_term);
+   try
+   {
+       X x;
+       x.f(-42);
+   } catch (...) {
+   }
+   // We should not get here
+   __builtin_abort ();
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p17-5.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p17-5.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p17-5.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p17-5.C	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,52 ----
+ // N5008:
+ // basic.contract.eval/p17
+ // If a contract-violation handler invoked from the evaluation of a function contract assertion (9.4.1) exits via
+ // an exception, the behavior is as if the function body exits via that same exception.
+ // [Note 12 : A function-try-block (14.1) is the function body when present and thus does not have an opportunity to
+ // catch the exception. If the function has a non-throwing exception specification, the function std::terminate is
+ // invoked (14.6.2). — end note]
+ //
+ // This tests the behaviour of a pre condition on a member function
+ //
+ // { dg-do run { target c++26 } }
+ // { dg-additional-options "-fcontracts -fcontract-evaluation-semantic=observe " }
+ 
+ #include <contracts>
+ #include <exception>
+ #include <cstdlib>
+ 
+ struct MyException{};
+ 
+ // Test that there is an active exception when we reach the terminate handler.
+ void my_term()
+ {
+   try { throw; }
+   catch(MyException) { std::exit(0); }
+ }
+ 
+ 
+ void handle_contract_violation(const std::contracts::contract_violation& violation)
+ {
+   throw MyException{};
+ }
+ 
+ struct X
+ {
+     void f(int x) noexcept pre(x>1) {
+        int i = 1;
+     }
+ };
+ 
+ int main()
+ {
+   std::set_terminate (my_term);
+   try
+   {
+       X x;
+       x.f(-42);
+   } catch (...) {
+   }
+ 
+   // We should not get here
+   __builtin_abort ();
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p17-SMF-post.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p17-SMF-post.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p17-SMF-post.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p17-SMF-post.C	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,54 ----
+ // N5008:
+ // basic.contract.eval/p17
+ // If a contract-violation handler invoked from the evaluation of a function contract assertion (9.4.1) exits via
+ // an exception, the behavior is as if the function body exits via that same exception.
+ // [Note 12 : A function-try-block (14.1) is the function body when present and thus does not have an opportunity to
+ // catch the exception. If the function has a non-throwing exception specification, the function std::terminate is
+ // invoked (14.6.2). — end note]
+ //
+ // This tests the behaviour of a post condition on a constructor with function
+ // try block
+ //
+ // { dg-do run { target c++26 } }
+ // { dg-additional-options "-fcontracts -fcontract-evaluation-semantic=observe " }
+ 
+ #include <contracts>
+ #include <exception>
+ #include <cstdlib>
+ 
+ struct MyException{};
+ 
+ // Test that there is an active exception when we reach the terminate handler.
+ void my_term()
+ {
+   try { throw; }
+   catch(MyException) { std::exit(0); }
+ }
+ 
+ 
+ void handle_contract_violation(const std::contracts::contract_violation& violation)
+ {
+   throw MyException{};
+ }
+ 
+ struct X
+ {
+ 
+     X(const int x) noexcept post(x>1) try
+     {
+        int i = 1;
+     }
+     catch(...) {}
+ };
+ 
+ int main()
+ {
+   std::set_terminate (my_term);
+   try
+   {
+       X x(-42);
+   } catch (...) {
+   }
+   // We should not get here
+   return 1;
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p17-SMF-pre.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p17-SMF-pre.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p17-SMF-pre.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p17-SMF-pre.C	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,54 ----
+ // N5008:
+ // basic.contract.eval/p17
+ // If a contract-violation handler invoked from the evaluation of a function contract assertion (9.4.1) exits via
+ // an exception, the behavior is as if the function body exits via that same exception.
+ // [Note 12 : A function-try-block (14.1) is the function body when present and thus does not have an opportunity to
+ // catch the exception. If the function has a non-throwing exception specification, the function std::terminate is
+ // invoked (14.6.2). — end note]
+ //
+ // This tests the behaviour of a pre condition on a constructor with function
+ // try block
+ //
+ // { dg-do run { target c++26 } }
+ // { dg-additional-options "-fcontracts -fcontract-evaluation-semantic=observe " }
+ 
+ #include <contracts>
+ #include <exception>
+ #include <cstdlib>
+ 
+ struct MyException{};
+ 
+ // Test that there is an active exception when we reach the terminate handler.
+ void my_term()
+ {
+   try { throw; }
+   catch(MyException) { std::exit(0); }
+ }
+ 
+ 
+ void handle_contract_violation(const std::contracts::contract_violation& violation)
+ {
+   throw MyException{};
+ }
+ 
+ struct X
+ {
+ 
+     X(int x) noexcept pre(x>1) try
+     {
+        int i = 1;
+     }
+     catch(...) {}
+ };
+ 
+ int main()
+ {
+   std::set_terminate (my_term);
+   try
+   {
+       X x(-42);
+   } catch (...) {
+   }
+   // We should not get here
+   return 1;
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p17-SMF2.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p17-SMF2.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p17-SMF2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p17-SMF2.C	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,57 ----
+ // N5008:
+ // basic.contract.eval/p17
+ // If a contract-violation handler invoked from the evaluation of a function contract assertion (9.4.1) exits via
+ // an exception, the behavior is as if the function body exits via that same exception.
+ // [Note 12 : A function-try-block (14.1) is the function body when present and thus does not have an opportunity to
+ // catch the exception. If the function has a non-throwing exception specification, the function std::terminate is
+ // invoked (14.6.2). — end note]
+ //
+ // This tests the behaviour of a pre condition on a constructor
+ //
+ // { dg-do run { target c++26 } }
+ // { dg-additional-options "-fcontracts -fcontract-evaluation-semantic=observe " }
+ 
+ #include <contracts>
+ #include <exception>
+ #include <cstdlib>
+ 
+ struct MyException{};
+ 
+ // Test that there is an active exception when we reach the terminate handler.
+ void my_term()
+ {
+   try { throw; }
+   catch(MyException) { std::exit(0); }
+ }
+ 
+ 
+ void handle_contract_violation(const std::contracts::contract_violation& violation)
+ {
+   throw MyException{};
+ }
+ 
+ struct X
+ {
+ 
+     X(int x) noexcept pre(x>1)
+     {
+       try{
+        int i = 1;
+       }
+       catch(...) {
+       }
+     }
+ };
+ 
+ int main()
+ {
+   std::set_terminate (my_term);
+   try
+   {
+       X x(-42);
+   } catch (...) {
+   }
+   // We should not get here
+   return 1;
+ 
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p17-SMF3.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p17-SMF3.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p17-SMF3.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p17-SMF3.C	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,56 ----
+ // N5008:
+ // basic.contract.eval/p17
+ // If a contract-violation handler invoked from the evaluation of a function contract assertion (9.4.1) exits via
+ // an exception, the behavior is as if the function body exits via that same exception.
+ // [Note 12 : A function-try-block (14.1) is the function body when present and thus does not have an opportunity to
+ // catch the exception. If the function has a non-throwing exception specification, the function std::terminate is
+ // invoked (14.6.2). — end note]
+ //
+ // This tests the behaviour of a pre condition on a destructor
+ //
+ // { dg-do run { target c++26 } }
+ // { dg-additional-options "-fcontracts -fcontract-evaluation-semantic=observe " }
+ 
+ #include <contracts>
+ #include <exception>
+ #include <cstdlib>
+ 
+ struct MyException{};
+ 
+ // Test that there is an active exception when we reach the terminate handler.
+ void my_term()
+ {
+   try { throw; }
+   catch(MyException) { std::exit(0); }
+ }
+ 
+ 
+ void handle_contract_violation(const std::contracts::contract_violation& violation)
+ {
+   throw MyException{};
+ }
+ 
+ const int x = -42;
+ 
+ struct X
+ {
+ 
+     ~X() noexcept pre(x>1)
+     {
+       try{}
+       catch(...){
+       }
+     }
+ };
+ 
+ int main()
+ {
+   std::set_terminate (my_term);
+   try
+   {
+       X x;
+   } catch (...) {
+   }
+   // We should not get here
+   return 1;
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p17-SMF4.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p17-SMF4.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p17-SMF4.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p17-SMF4.C	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,56 ----
+ // N5008:
+ // basic.contract.eval/p17
+ // If a contract-violation handler invoked from the evaluation of a function contract assertion (9.4.1) exits via
+ // an exception, the behavior is as if the function body exits via that same exception.
+ // [Note 12 : A function-try-block (14.1) is the function body when present and thus does not have an opportunity to
+ // catch the exception. If the function has a non-throwing exception specification, the function std::terminate is
+ // invoked (14.6.2). — end note]
+ //
+ // This tests the behaviour of a pre condition on an implictly noexcept
+ // destructor
+ //
+ // { dg-do run { target c++26 } }
+ // { dg-additional-options "-fcontracts -fcontract-evaluation-semantic=observe " }
+ 
+ #include <contracts>
+ #include <exception>
+ #include <cstdlib>
+ 
+ struct MyException{};
+ 
+ // Test that there is an active exception when we reach the terminate handler.
+ void my_term()
+ {
+   try { throw; }
+   catch(MyException) { std::exit(0); }
+ }
+ 
+ 
+ void handle_contract_violation(const std::contracts::contract_violation& violation)
+ {
+   throw MyException{};
+ }
+ 
+ const int x = -42;
+ 
+ struct X
+ {
+ 
+     ~X() pre(x>1) try
+     {
+     }
+     catch(...) {}
+ };
+ 
+ int main()
+ {
+   std::set_terminate (my_term);
+   try
+   {
+       X x;
+   } catch (...) {
+   }
+   // We should not get here
+   return 1;
+ 
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p17.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p17.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p17.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p17.C	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,49 ----
+ // N5008:
+ // basic.contract.eval/p17
+ // If a contract-violation handler invoked from the evaluation of a function contract assertion (9.4.1) exits via
+ // an exception, the behavior is as if the function body exits via that same exception.
+ // [Note 12 : A function-try-block (14.1) is the function body when present and thus does not have an opportunity to
+ // catch the exception. If the function has a non-throwing exception specification, the function std::terminate is
+ // invoked (14.6.2). — end note]
+ // { dg-do run { target c++26 } }
+ // { dg-additional-options "-fcontracts -fcontract-evaluation-semantic=observe " }
+ 
+ #include <contracts>
+ #include <exception>
+ #include <cstdlib>
+ 
+ struct MyException{};
+ 
+ // Test that there is an active exception when we reach the terminate handler.
+ void my_term()
+ {
+   try { throw; }
+   catch(MyException) { std::exit(0); }
+ }
+ 
+ 
+ void handle_contract_violation(const std::contracts::contract_violation& violation)
+ {
+   throw MyException{};
+ }
+ 
+ void f(const int x) noexcept post(x>1)
+ {
+   try{
+    int i = 1;
+   }
+   catch(...) {
+   }
+ }
+ 
+ int main()
+ {
+   std::set_terminate (my_term);
+   try
+   {
+       f(-42);
+   } catch (...) {
+   }
+   // We should not get here
+   __builtin_abort ();
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p4-error.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p4-error.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p4-error.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p4-error.C	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,14 ----
+ // N5008 :
+ // basic.contract.eval/p4
+ // The evaluation of a contract assertion using the ignore semantic has no effect.
+ // [Note 2 : The predicate is potentially evaluated (6.3), but not evaluated. — end note]
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-fcontracts -fcontract-evaluation-semantic=ignore" }
+ 
+ struct S;
+ int f(int i, int j = 1)
+   pre (check(i)) // { dg-error "was not declared in this scope" }
+ {
+   contract_assert ( S{}.member ); // { dg-error "invalid use of incomplete type" }
+   return i;
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p4.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p4.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p4.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p4.C	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,27 ----
+ // N5008 :
+ // basic.contract.eval/p4
+ // The evaluation of a contract assertion using the ignore semantic has no effect.
+ // [Note 2 : The predicate is potentially evaluated (6.3), but not evaluated. — end note]
+ // { dg-do run { target c++26 } }
+ // { dg-additional-options "-fcontracts -fcontract-evaluation-semantic=ignore" }
+ 
+ #include <contracts>
+ 
+ int f(int i, int j = 1)
+   pre (i > 0)
+   post (r: r < 5)
+ {
+   contract_assert ( j > 0);
+   return i;
+ }
+ 
+ int main(int, char**)
+ {
+   f (0,0);
+ }
+ 
+ void
+ handle_contract_violation (const std::contracts::contract_violation &)
+ {
+   __builtin_abort ();
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p6.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p6.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p6.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p6.C	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,31 ----
+ // N5008 :
+ // basic.contract.eval/p6
+ // There is an observable checkpoint ([intro.abstract]) C that happens before
+ // (evaluation of a contract assertion ) A such that any other operation O
+ // that happens before A also happens before C
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-fcontracts -O -fdump-tree-original -fdump-tree-optimized -Wno-return-type" }
+ int f(int& i)
+ {
+    i++;
+    return i;
+ }
+ 
+ int f2 (int x, const int *y)
+ {
+     int b = x + *y;
+ }
+ 
+ int main(int ac, char *av[])
+ {
+    int i = 3;
+    *av[0] = (char) f(i);
+    contract_assert (f2(i, &i) > 42);
+   return i;
+ }
+ // Check that
+ // - observable checkpoint has been added to the contract_assert
+ // - observable has been removed from the optimized tree
+ 
+ // { dg-final { scan-tree-dump "__builtin_observable" "original" } }
+ // { dg-final { scan-tree-dump "_2 = 4" "optimized" } }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p6.observe.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p6.observe.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p6.observe.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p6.observe.C	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,17 ----
+ // N5008 :
+ // basic.contract.eval/p6
+ // There is an observable checkpoint ([intro.abstract]) C that happens before
+ // (evaluation of a contract assertion ) A such that any other operation O
+ // that happens before A also happens before C
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-fcontracts -fcontract-evaluation-semantic=observe -fdump-tree-gimple " }
+ 
+ 
+ int main(int ac, char *av[])
+ {
+    int i = ac;
+    contract_assert (i == 3);
+   return i;
+ }
+ 
+ // { dg-final { scan-tree-dump "__builtin_observable.*__tu_has_violation.*__builtin_observable" "gimple" } }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p7.3.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p7.3.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p7.3.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p7.3.C	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,14 ----
+ // basic.contract.eval/p7.3
+ // The evaluation of the predicate is performed in a context that is manifestly
+ // constant-evaluated ([expr.const]) and the predicate is not a core constant
+ // expression.
+ // { dg-do compile { target c++23 } }
+ // { dg-additional-options "-fcontracts  " }
+ 
+ extern bool runtime_check ();
+ 
+ consteval void foo( auto x ) pre ( runtime_check () ) {}
+ // { dg-error {contract condition is not constant} "" { target *-*-* } .-1 }
+ int main() {
+   foo( 42 ); // { dg-error {call to consteval function 'foo<int>\(42\)' is not a constant expression} }
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p8-2.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p8-2.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p8-2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p8-2.C	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,12 ----
+ // basic.contract.eval/p8
+ // If a contract violation occurs in a context that is manifestly
+ // constant-evaluated ([expr.const]), and the evaluation semantic is not
+ // terminating, then a diagnostic shall be emitted.
+ // { dg-do compile { target c++23 } }
+ // { dg-additional-options "-fcontracts -fcontract-evaluation-semantic=observe " }
+ 
+ consteval void foo( auto x ) pre( false ) {}
+ // { dg-warning {contract predicate is false in constant expression} "" { target *-*-* } .-1 }
+ int main() {
+   foo( 42 );
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p8.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p8.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p8.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/basic.contract.eval.p8.C	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,12 ----
+ // basic.contract.eval/p8
+ // If a contract violation occurs in a context that is manifestly
+ // constant-evaluated ([expr.const]), and the evaluation semantic is a
+ // terminating semantic, the program is ill-formed.
+ // { dg-do compile { target c++23 } }
+ // { dg-additional-options "-fcontracts  " }
+ 
+ consteval void foo( auto x ) pre( false ) {}
+ // { dg-error {contract predicate is false in constant expression} "" { target *-*-* } .-1 }
+ int main() {
+   foo( 42 ); // { dg-error {call to consteval function 'foo<int>\(42\)' is not a constant expression} }
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/basic.scope.contract.p1.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/basic.scope.contract.p1.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/basic.scope.contract.p1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/basic.scope.contract.p1.C	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,42 ----
+ // N5008
+ // basic.scope.contract/p1
+ // Each contract assertion (6.10) C introduces a contract-assertion scope that includes C.
+ // { dg-do compile { target c++23 } }
+ // { dg-additional-options "-fcontracts -fcontract-evaluation-semantic=observe " }
+ 
+ // Check that result vars are not visible in function bodies.
+ 
+ int free_fn (int x)
+   post (r: r > 5);
+ 
+ int free_fn (int x)
+   post (r: r > 5)
+ { r += 1; return r;} // { dg-error {'r' was not declared in this scope} }
+ 
+ struct X {
+   int fn0 (int x)
+     post (res: res > 5)
+     { res = 15; return res; } // { dg-error {'res' was not declared in this scope} }
+ 
+   int fn1 (int x)
+     post (res: res > 5);
+ };
+ 
+ int
+ X::fn1 (int y)
+     post (ans: ans > 5)
+     { ans = 15; return 1; } // { dg-error {'ans' was not declared in this scope} }
+ 
+ template <class T>
+ int
+ postcond (T x) post (res: res > 3); 
+ 
+ template <class T>
+ int
+ postcond (T x) post (out: out > 3)
+ { out = 5;  return x; } // { dg-error {'out' was not declared in this scope} }
+ 
+ int foo (int x)
+ {
+   return postcond (4);
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/basic.scope.contract.p2.1.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/basic.scope.contract.p2.1.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/basic.scope.contract.p2.1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/basic.scope.contract.p2.1.C	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,11 ----
+ // N5008 :
+ // basic.scope.contract/p2.1
+ // If a result-name-introducer (9.4.2) that is not name-independent (6.4.1) and whose enclosing postcondition
+ // assertion is associated with a function F potentially conflicts with a declaration whose target scope is
+ //	- the function parameter scope of F or
+ // { dg-do compile { target c++23 } }
+ // { dg-additional-options "-fcontracts -fcontract-evaluation-semantic=observe " }
+ 
+ int bad_mr_shadow (int r)
+   post (r: r > 5) // { dg-error "contract postcondition result name shadows a function parameter" }
+   { return r + 1; }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/callerside-checks/callerside-checks-all.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/callerside-checks/callerside-checks-all.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/callerside-checks/callerside-checks-all.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/callerside-checks/callerside-checks-all.C	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,52 ----
+ // { dg-do run { target c++20 } }
+ // { dg-additional-options "-fcontracts -fcontract-evaluation-semantic=observe -fcontracts-client-check=all" }
+ 
+ 
+ 
+ int f(const int a, const int b) pre (a > 2) post(r : r > 2){ return b;  }
+ 
+ 
+ struct S
+ {
+   int f(const int a, const int b) pre (a > 3) post(r : r > 3){ return b;  }
+ };
+ 
+ template<typename T>
+ struct TS
+ {
+   int f(const int a, const T b) pre (a > 4) post(r : r > 4){ return b;  }
+ 
+   template <typename U>
+   int tf(const int a, const U b) pre (a > 5) post(r : r > 5){ return b;  }
+ };
+ 
+ int main(int, char**)
+ {
+   f(1,1);
+ 
+   S s;
+   s.f(1,1);
+ 
+   TS<int> ts;
+   ts.f(1,1);
+ 
+   ts.tf(1,1);
+   return 0;
+ }
+ 
+ // { dg-output "contract violation in function int f.int, int. at .*: a > 2.*(\n|\r\n|\r)" }
+ // { dg-output "contract violation in function int f.int, int. at .*: a > 2.*(\n|\r\n|\r)" }
+ // { dg-output "contract violation in function int f.int, int. at .*: r > 2.*(\n|\r\n|\r)" }
+ // { dg-output "contract violation in function int f.int, int. at .*: r > 2.*(\n|\r\n|\r)" }
+ // { dg-output "contract violation in function int S::f.int, int. at .*: a > 3.*(\n|\r\n|\r)" }
+ // { dg-output "contract violation in function int S::f.int, int. at .*: a > 3.*(\n|\r\n|\r)" }
+ // { dg-output "contract violation in function int S::f.int, int. at .*: r > 3.*(\n|\r\n|\r)" }
+ // { dg-output "contract violation in function int S::f.int, int. at .*: r > 3.*(\n|\r\n|\r)" }
+ // { dg-output "contract violation in function int TS<T>::f.int, T. .with T = int. at .*: a > 4.*(\n|\r\n|\r)" }
+ // { dg-output "contract violation in function int TS<T>::f.int, T. .with T = int. at .*: a > 4.*(\n|\r\n|\r)" }
+ // { dg-output "contract violation in function int TS<T>::f.int, T. .with T = int. at .*: r > 4.*(\n|\r\n|\r)" }
+ // { dg-output "contract violation in function int TS<T>::f.int, T. .with T = int. at .*: r > 4.*(\n|\r\n|\r)" }
+ // { dg-output "contract violation in function int TS<T>::tf.int, U. .with U = int; T = int. at .*: a > 5.*(\n|\r\n|\r)" }
+ // { dg-output "contract violation in function int TS<T>::tf.int, U. .with U = int; T = int. at .*: a > 5.*(\n|\r\n|\r)" }
+ // { dg-output "contract violation in function int TS<T>::tf.int, U. .with U = int; T = int. at .*: r > 5.*(\n|\r\n|\r)" }
+ // { dg-output "contract violation in function int TS<T>::tf.int, U. .with U = int; T = int. at .*: r > 5.*(\n|\r\n|\r)" }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/callerside-checks/callerside-checks-non-trivial.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/callerside-checks/callerside-checks-non-trivial.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/callerside-checks/callerside-checks-non-trivial.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/callerside-checks/callerside-checks-non-trivial.C	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,18 ----
+ // { dg-do compile { target c++20 } }
+ // { dg-additional-options "-fcontracts -fcontract-evaluation-semantic=observe -fcontracts-client-check=all" }
+ 
+ 
+ struct S{
+   S(){};
+   S(const S&){}
+   ~S(){};
+   int x = 0;
+ };
+ 
+ void f(S s) pre(s.x == 1 ) {};
+ 
+ int main()
+ {
+   S s;
+   f(s);
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/callerside-checks/callerside-checks-none.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/callerside-checks/callerside-checks-none.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/callerside-checks/callerside-checks-none.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/callerside-checks/callerside-checks-none.C	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,64 ----
+ // { dg-do run { target c++26 } }
+ // { dg-additional-options "-fcontracts -fcontracts-client-check=none" }
+ static int pre_check = 0;
+ bool fpre()
+ {
+   pre_check++;
+   return true;
+ }
+ 
+ static int post_check = 0;
+ bool fpost()
+ {
+   post_check++;
+   return true;
+ }
+ 
+ 
+ int f(const int a, const int b) pre (fpre()) post(fpost()){ return b;  }
+ 
+ 
+ struct S
+ {
+   int f(const int a, const int b) post(fpost()){ return b;  }
+ };
+ 
+ template<typename T>
+ struct TS
+ {
+   int f(const int a, const T b) pre (fpre()) { return b;  }
+ 
+   template <typename U>
+   int tf(const int a, const U b) pre (fpre()) post(fpost()){ return b;  }
+ };
+ 
+ int main(int, char**)
+ {
+   f(1,1);
+   contract_assert(pre_check == 1);
+   contract_assert(post_check == 1);
+ 
+   pre_check = 0;
+   post_check = 0;
+ 
+   S s;
+   s.f(1,1);
+   contract_assert(post_check == 1);
+ 
+   pre_check = 0;
+   post_check = 0;
+ 
+   TS<int> ts;
+   ts.f(1,1);
+   contract_assert(pre_check == 1);
+ 
+   pre_check = 0;
+   post_check = 0;
+ 
+   ts.tf(1,1);
+   contract_assert(pre_check == 1);
+   contract_assert(post_check == 1);
+ 
+ 
+   return 0;
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/callerside-checks/callerside-checks-pre.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/callerside-checks/callerside-checks-pre.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/callerside-checks/callerside-checks-pre.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/callerside-checks/callerside-checks-pre.C	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,65 ----
+ // { dg-do run { target c++26 } }
+ // { dg-additional-options "-fcontracts -fcontracts-client-check=pre" }
+ 
+ static int pre_check = 0;
+ bool fpre()
+ {
+   pre_check++;
+   return true;
+ }
+ 
+ static int post_check = 0;
+ bool fpost()
+ {
+   post_check++;
+   return true;
+ }
+ 
+ 
+ int f(const int a, const int b) pre (fpre()) post(fpost()){ return b;  }
+ 
+ 
+ struct S
+ {
+   int f(const int a, const int b) post(fpost()){ return b;  }
+ };
+ 
+ template<typename T>
+ struct TS
+ {
+   int f(const int a, const T b) pre (fpre()) { return b;  }
+ 
+   template <typename U>
+   int tf(const int a, const U b) pre (fpre()) post(fpost()){ return b;  }
+ };
+ 
+ int main(int, char**)
+ {
+   f(1,1);
+   contract_assert(pre_check == 2);
+   contract_assert(post_check == 1);
+ 
+   pre_check = 0;
+   post_check = 0;
+ 
+   S s;
+   s.f(1,1);
+   contract_assert(post_check == 1);
+ 
+   pre_check = 0;
+   post_check = 0;
+ 
+   TS<int> ts;
+   ts.f(1,1);
+   contract_assert(pre_check == 2);
+ 
+   pre_check = 0;
+   post_check = 0;
+ 
+   ts.tf(1,1);
+   contract_assert(pre_check == 2);
+   contract_assert(post_check == 1);
+ 
+ 
+   return 0;
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/callerside-checks/ctor.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/callerside-checks/ctor.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/callerside-checks/ctor.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/callerside-checks/ctor.C	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,23 ----
+ // { dg-do compile { target c++20 } }
+ // { dg-additional-options "-fcontracts -fcontracts-client-check=pre" }
+ 
+ struct X
+ {
+     X (int x) noexcept
+      pre (x>1)
+     {
+       try {
+        int i = 1;
+       }
+       catch(...) {
+       }
+     }
+ };
+ 
+ int main()
+ {
+   try {
+     X x(-42);
+   } catch (...) {
+   }
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/callerside-checks/freefunc-noexcept-post.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/callerside-checks/freefunc-noexcept-post.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/callerside-checks/freefunc-noexcept-post.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/callerside-checks/freefunc-noexcept-post.C	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,49 ----
+ // Throwing violation handler in a pre/post check on a noexcept function
+ // behaves as if the function exited via an exception.
+ // This tests the behaviour of a post condition on a member function
+ // with caller side checks.
+ // { dg-do run { target c++26 } }
+ // { dg-additional-options "-fcontracts -fcontract-evaluation-semantic=observe -fcontracts-client-check=all " }
+ 
+ #include <contracts>
+ #include <iostream>
+ #include <exception>
+ #include <cstdlib>
+ 
+ struct MyException{};
+ 
+ // Test that there is an active exception when we reach the terminate handler.
+ void my_term()
+ {
+   try { throw; }
+   catch(MyException) { std::exit(0); }
+ }
+ 
+ 
+ void handle_contract_violation(const std::contracts::contract_violation& violation)
+ {
+   throw MyException{};
+ }
+ 
+ void f(const int x) noexcept 
+   post(x >= 0)
+ {
+   try{
+    int i = 1;
+   }
+   catch(...) {
+   }
+ }
+ 
+ int main()
+ {
+ 
+   std::set_terminate (my_term);
+   try
+   {
+       f(-42);
+   } catch (...) {
+   }
+   // We should not get here
+   return 1;
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/callerside-checks/freefunc-noexcept-pre.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/callerside-checks/freefunc-noexcept-pre.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/callerside-checks/freefunc-noexcept-pre.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/callerside-checks/freefunc-noexcept-pre.C	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,49 ----
+ // Throwing violation handler in a pre/post check on a noexcept function
+ // behaves as if the function exited via an exception.
+ // This tests the behaviour of a post condition on a member function
+ // with caller side checks.
+ // { dg-do run { target c++26 } }
+ // { dg-additional-options "-fcontracts -fcontract-evaluation-semantic=observe -fcontracts-client-check=all " }
+ 
+ #include <contracts>
+ #include <iostream>
+ #include <exception>
+ #include <cstdlib>
+ 
+ struct MyException{};
+ 
+ // Test that there is an active exception when we reach the terminate handler.
+ void my_term()
+ {
+   try { throw; }
+   catch(MyException) { std::exit(0); }
+ }
+ 
+ 
+ void handle_contract_violation(const std::contracts::contract_violation& violation)
+ {
+   throw MyException{};
+ }
+ 
+ void f(int x) noexcept 
+   pre(x >= 0)
+ {
+   try{
+    int i = 1;
+   }
+   catch(...) {
+   }
+ }
+ 
+ int main()
+ {
+ 
+   std::set_terminate (my_term);
+   try
+   {
+       f(-42);
+   } catch (...) {
+   }
+   // We should not get here
+   return 1;
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/contract-assert-run.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/contract-assert-run.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/contract-assert-run.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/contract-assert-run.C	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,56 ----
+ // generic assert contract parsing checks
+ //   check omitted, 'default', 'audit', and 'axiom' contract levels parse
+ //   check that all concrete semantics parse
+ //   check omitted, '%default' contract roles parse
+ //   ensure that an invalid contract level 'invalid' errors
+ //   ensure that a predicate referencing an undefined variable errors
+ //   ensure that a missing colon after contract level errors
+ //   ensure that an invalid contract role 'invalid' errors
+ //   ensure that a missing colon after contract role errors
+ // { dg-do run { target c++26 } }
+ // { dg-additional-options "-fcontracts -fcontract-evaluation-semantic=observe" }
+ 
+ #include <iostream>
+ #include <contracts>
+ 
+ #define VERIFY_ASSERT(statement, asserts)  \
+ 	{ \
+ 		bool violation = false;\
+ 		try{ \
+ 			statement; \
+ 		} catch(int &ex) { \
+ 			violation = true; \
+ 		} \
+ 		if ((asserts && !violation) || (!(asserts) && violation)) __builtin_abort(); \
+ 	} \
+ 
+ static_assert (__cpp_contracts >= 202502L);
+ 
+ void handle_contract_violation(const std::contracts::contract_violation &violation) {
+   std::cerr << "custom std::handle_contract_violation called:"
+     << " " << violation.location().line()
+     << " " << violation.location().file_name()
+     << std::endl;
+   throw -(int)violation.location().line();
+ }
+ 
+ void foo(int x) pre (x>10){};
+ 
+ int main()
+ {
+ 
+   VERIFY_ASSERT(contract_assert(true), false);
+   VERIFY_ASSERT(contract_assert(false), true);
+ 
+   int i = 4;
+   VERIFY_ASSERT(foo(i), true);
+   VERIFY_ASSERT(contract_assert( i == 4 ? true : false), false)
+   VERIFY_ASSERT(contract_assert( i > 4 ? true : false), true)
+ 
+   i = 18;
+   VERIFY_ASSERT(foo(i), false);
+   VERIFY_ASSERT(contract_assert( i == 4 ? true : false), true)
+   VERIFY_ASSERT(contract_assert( i > 4 ? true : false), false)
+ 
+   return 0;
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/contract-assert-warn-attributes.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/contract-assert-warn-attributes.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/contract-assert-warn-attributes.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/contract-assert-warn-attributes.C	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,7 ----
+ // { dg-options "-std=c++26 -fcontracts " }
+ 
+ int foo (int x)
+ pre [[unlikley]] ( x > 41 )  // { dg-warning "attributes are ignored on function contract specifiers" }
+ {
+   return x + 1;
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/contract-violation-noexcept.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/contract-violation-noexcept.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/contract-violation-noexcept.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/contract-violation-noexcept.C	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,112 ----
+ // test that the default contract violation handler can't throw
+ // { dg-do compile { target c++23 } }
+ // { dg-additional-options "-fcontracts -fcontract-evaluation-semantic=observe " }
+ 
+ #include <iostream>
+ #include <exception>
+ #include <cstdlib>
+ 
+ // Throws on all overflow and underflow calls.
+ struct underflow_error: std::exception { };
+ struct overflow_error: std::exception { };
+ struct positioning_error: std::exception { };
+ 
+ template<typename T>
+ struct fail_buf
+   : public T
+ {
+   typedef typename T::char_type   char_type;
+   typedef typename T::int_type    int_type;
+   typedef typename T::off_type    off_type;
+   typedef typename T::pos_type    pos_type;
+ 
+ private:
+   char_type p[2];
+ 
+ public:
+   fail_buf()
+   {
+     p[0] = char_type('s');
+     p[1] = char_type();
+     this->setg(p, p, p + 1);
+   }
+ 
+   virtual int_type underflow()
+   {
+     throw underflow_error();
+     return int_type();
+   }
+ 
+   virtual int_type uflow()
+   {
+     throw underflow_error();
+     return int_type();
+   }
+ 
+   virtual int_type
+   overflow(int_type)
+   {
+     throw overflow_error();
+     return int_type();
+   }
+ 
+   virtual pos_type
+   seekoff(off_type, std::ios_base::seekdir, std::ios_base::openmode)
+   {
+     throw positioning_error();
+     return pos_type(off_type(-1));
+   }
+ 
+   virtual pos_type
+   seekpos(pos_type, std::ios_base::openmode)
+   {
+     throw positioning_error();
+     return pos_type(off_type(-1));
+   }
+ 
+   virtual int
+   sync()
+   {
+     throw positioning_error();
+     return 0;
+   }
+ };
+ 
+ typedef  fail_buf<std::streambuf>   fail_streambuf;
+ std::streambuf* g_buf_to_restore;
+ 
+ // Test that there is an active exception when we reach the terminate handler.
+ void my_term()
+ {
+   std::cerr.rdbuf(g_buf_to_restore); // be nice, restore the buf of a global stream
+   try { throw; }
+   catch(const underflow_error&) { std::exit(0); }
+   catch(const overflow_error&) { std::exit(0); }
+   catch(const positioning_error&) { std::exit(0); }
+ }
+ 
+ 
+ 
+ void f(int x) pre(x >= 0)
+ {
+   try{
+    int i = 1;
+   }
+   catch(...) {
+   }
+ }
+ 
+ int main()
+ {
+   std::set_terminate (my_term);
+   fail_streambuf buf;
+   g_buf_to_restore = std::cerr.rdbuf(&buf);
+   std::cerr.exceptions(std::ios::badbit | std::ios::failbit | std::ios::eofbit);
+   try
+   {
+       f(-42);
+   } catch (...) {
+   }
+   // We should not get here
+   return 1;
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/contract-violation-noexcept2.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/contract-violation-noexcept2.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/contract-violation-noexcept2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/contract-violation-noexcept2.C	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,38 ----
+ // test that a noexcept function can't throw even if a violation handler throws
+ // { dg-do run { target c++26 } }
+ // { dg-additional-options "-fcontracts" }
+ // { dg-additional-sources "throwing-violation-handler.cc" }
+ 
+ #include <exception>
+ 
+ void f(int x) noexcept pre(x >= 0)
+ {
+ }
+ 
+ void g();
+ 
+ bool f_result = true;
+ 
+ void my_term()
+ {
+   try { throw; }
+   catch(int) { __builtin_exit(0); }
+ }
+ 
+ 
+ int main()
+ {
+   std::set_terminate (my_term);
+   try
+   {
+     g();
+   } catch (...) {
+     // We should not get here
+     __builtin_abort();
+   }
+   if (!f_result)
+     // We should not get here
+     __builtin_abort();
+   // We should not get here
+   __builtin_abort();
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/contract_genericize.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/contract_genericize.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/contract_genericize.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/contract_genericize.C	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,49 ----
+ // Check that we do not get a crash
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-fcontracts -fcontract-evaluation-semantic=enforce" }
+ 
+ 
+ struct Swapper {
+   static unsigned int swapBytes();
+   static bool isFinished();
+ };
+ 
+ 
+ struct Capacity {
+     Capacity(int capacity);
+     bool operator<( int rhs) const;
+     bool operator>=(int rhs) const;
+ };
+ 
+ template <class CAPACITY,  class SWAPPER>
+ struct Utf32ToUtf8Translator {
+ 
+     CAPACITY d_capacity;
+ 
+     Utf32ToUtf8Translator();
+ 
+     static void translate();
+ };
+ 
+ template <class CAPACITY,class SWAPPER>
+ void Utf32ToUtf8Translator<CAPACITY, SWAPPER>::translate()
+ {
+     Utf32ToUtf8Translator<CAPACITY, SWAPPER> translator;
+ 
+     unsigned int uc =0;
+     while (!SWAPPER::isFinished()) {
+         uc = SWAPPER::swapBytes();
+         if (0 != uc) {
+         }
+     }
+     contract_assert( translator.d_capacity >= 1 );
+ 
+ }
+ 
+ void func()
+ {
+     typedef Utf32ToUtf8Translator<Capacity,
+                                   Swapper> SwapTranslator;
+ 
+     SwapTranslator::translate();
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/contracts-friend1.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/contracts-friend1.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/contracts-friend1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/contracts-friend1.C	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,36 ----
+ // ensure contracts on friend declarations are a complete class context
+ // { dg-do compile { target c++23 } }
+ // { dg-additional-options "-fcontracts -fcontract-evaluation-semantic=observe" }
+ 
+ 
+ struct X {
+   friend void fn0(X x) pre (x.a > 0) { }
+ 
+   static void fns0(X x) pre ( x.a > 0 ) { }
+   static void fns1(X x) pre ( x.a > 0 );
+   static void fns2(X x) pre ( x.a > 0 );
+ 
+   friend void fn(X &x) { x.a = -5; }
+ 
+ private:
+   int a{10};
+ };
+ void X::fns1(X x) { }
+ void X::fns2(X x) pre ( x.a > 0 ) { }
+ 
+ int main(int, char**) {
+   X x;
+   fn(x); // no contract
+ 
+   fn0(x);
+ 
+   X::fns0(x);
+   X::fns1(x);
+   X::fns2(x);
+   return 0;
+ }
+ 
+ // { dg-output "contract violation in function void fn0.X. at .*.C:7: .*(\n|\r\n|\r)" }
+ // { dg-output "contract violation in function static void X::fns0.X. at .*.C:9: .*(\n|\r\n|\r)" }
+ // { dg-output "contract violation in function static void X::fns1.X. at .*.C:10: .*(\n|\r\n|\r)" }
+ // { dg-output "contract violation in function static void X::fns2.X. at .*.C:19: .*(\n|\r\n|\r)" }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/contracts-nested-class1.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/contracts-nested-class1.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/contracts-nested-class1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/contracts-nested-class1.C	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,23 ----
+ // { dg-do compile { target c++23 } }
+ // { dg-additional-options "-fcontracts" }
+ 
+ void gfn3(int n) pre ( n > 0 );
+ 
+ struct Outer {
+   struct Inner {
+     void fn(int n) pre ( n > 0 && bob > 1 );
+     void fn2(int n) pre ( n > 0 && bob > 1 );
+   };
+ 
+   void fn(int m) pre (m > 1 );
+   friend void Inner::fn(int n) pre ( n > 0 && bob > 1 ); // { dg-error "not declared" }
+ 
+   friend void gfn(int p) pre ( p > 0 );
+   friend void gfn(int q) pre ( q > 1 );
+ 
+   friend void gfn2(int q);
+   friend void gfn2(int p) pre ( p > 0 ) { } // { dg-error "declaration adds contracts" }
+ 
+   static int bob;
+ };
+ int Outer::bob{-1};
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/contracts-nested-class2.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/contracts-nested-class2.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/contracts-nested-class2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/contracts-nested-class2.C	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,38 ----
+ // { dg-do compile { target c++23 } }
+ // { dg-additional-options "-fcontracts -fcontract-evaluation-semantic=observe" }
+ 
+ void gfn3(int n) pre (n > 0 );
+ 
+ struct Outer {
+   struct Inner {
+     void fn(int n) pre (n > 0 && bob > 1);
+   };
+ 
+   void fn(int m) pre (m > 1);
+ 
+   friend void gfn1(int p) pre (p > 0) { }
+ 
+   friend void gfn2(int p, Outer *) pre (p > 0) { }
+ 
+   friend void gfn3(int n);
+ 
+   static int bob;
+ };
+ int Outer::bob{-1};
+ 
+ void Outer::Inner::fn(int x) { }
+ void Outer::fn(int y) { }
+ 
+ void gfn3(int n) { }
+ void gfn1(int q);
+ 
+ int main(int, char **) {
+   Outer::Inner in;
+   in.fn(-5);
+   Outer out;
+   out.fn(-6);
+   gfn1(-7);
+   gfn2(-8, &out);
+   gfn3(-9);
+ }
+ 
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/contracts-tmpl-spec2.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/contracts-tmpl-spec2.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/contracts-tmpl-spec2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/contracts-tmpl-spec2.C	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,446 ----
+ // { dg-do compile { target c++23 } }
+ // { dg-additional-options "-fcontracts -fcontract-evaluation-semantic=observe -fsigned-char" }
+ #include <cstdio>
+ 
+ // template specializations can have differing contracts
+ template<typename T>
+ int body(int a)
+   pre ( a > 0 )
+ {
+   T t = a * 2.5;
+   return t;
+ }
+ 
+ template<>
+ int body<double>(int a)
+   pre ( a > 1 )
+ {
+   double t = a * 3.3;
+   return t;
+ }
+ 
+ template<typename T>
+ int none(int a)
+   pre ( a > 0 )
+ {
+   return -a;
+ }
+ 
+ template<>
+ int none<double>(int a)
+   pre ( a > 1 )
+ {
+   return a - 100;
+ }
+ 
+ template<typename T>
+ int arg0(T t)
+   pre ( t > 0 )
+ {
+   return -t - 10;
+ }
+ 
+ template<>
+ int arg0<double>(double t)
+   pre ( t > 1 )
+ {
+   return -t + 10;
+ }
+ 
+ template<typename T>
+ int arg1(int a, T t)
+   pre ( a > 0 )
+   pre ( t > 0 )
+ {
+   return -t * a;
+ }
+ 
+ template<>
+ int arg1<double>(int a, double t)
+   pre ( a > 1 )
+   pre ( t > 1 )
+ {
+   return -t * a + 17;
+ }
+ 
+ template<typename T>
+ T ret(int a)
+   pre ( a > 0 )
+ {
+   return -a;
+ }
+ 
+ template<>
+ double ret<double>(int a)
+   pre ( a > 1 )
+ {
+   return -a * 3.3;
+ }
+ 
+ // template specializations can have no contracts
+ template<typename T>
+ int g1(T t) pre ( t > 0 )
+ {
+   return (int)t;
+ }
+ 
+ template<>
+ int g1<double>(double t)
+ {
+   return (int)t;
+ }
+ 
+ // template specializations can have no contracts in the first decl but add
+ // them later
+ template<typename T>
+ int g2(T t) pre ( t > 0 )
+ {
+   return (int)t;
+ }
+ 
+ template<>
+ int g2<double>(double t);
+ 
+ template<>
+ int g2<double>(double t)
+   pre ( t < 0 )
+ {
+   return (int)t;
+ }
+ 
+ template<>
+ int g2<char>(char t)
+   pre ( t < 'c' )
+ {
+   return (int)t;
+ }
+ 
+ // contracts can be different on the general template, partial and full specs
+ template<typename T, typename S>
+ struct G3
+ {
+   void f(T t, S s)
+     pre ( t > 0 )
+     pre ( s > 0 )
+   {
+     printf ("G3 general T S\n");
+   }
+ };
+ 
+ template<typename S>
+ struct G3<int, S>
+ {
+   void f(int t, S s)  pre ( t > 1 )  pre ( s > 1 ) ;
+ };
+ 
+ template<typename S>
+ void G3<int, S>::f(int t, S s)
+   pre ( t > 1 )
+   pre ( s > 1 )
+ {
+   printf ("G3 partial int S\n");
+ }
+ 
+ template<>
+ void G3<int, double>::f(int t, double s)
+   pre ( t > 2 )
+   pre ( s > 2 )
+ {
+   printf ("G3 full int double\n");
+ }
+ 
+ struct C
+ {
+   bool operator>(int rhs) { return false; }
+ };
+ 
+ // deletes contracts
+ template<>
+ void G3<int, C>::f(int t, C s);
+ 
+ template<>
+ void G3<int, C>::f(int t, C s)
+ {
+   printf ("G3 full int C\n");
+ };
+ 
+ // specialized ctors
+ template<typename T, typename S>
+ struct G4
+ {
+   G4(T t, S s)
+     pre ( t > 0 )
+     pre ( s > 0 )
+     post ( x > 0 )
+   {
+     printf ("G4 general T S\n");
+     return;
+   }
+   int x{-1};
+ };
+ 
+ template<typename S>
+ struct G4<char, S>
+ {
+   G4(char t, S s)
+     pre ( t > 'c' )
+     pre ( s > 3 )
+     post ( x2 > 3 )
+   {
+     printf ("G4 partial char S\n");
+     return;
+   }
+   int x2{-1};
+ };
+ 
+ template<>
+ G4<double, double>::G4(double, double)
+ {
+   printf ("G4 full double double\n");
+   return;
+ }
+ 
+ template<>
+ G4<double, char>::G4(double a, char b)
+   pre ( a > 0 )
+   pre ( b > 'b' )
+   post ( x > 1 )
+ {
+   printf ("G4 full double char\n");
+   return;
+ }
+ 
+ // crossover of template classes and template members ok
+ template<typename T, typename S>
+ struct G5
+ {
+   template<typename P>
+   void f(T t, S s, P r)
+     pre ( t > 0 )
+     pre ( s > 0 )
+     pre ( r > 0 )
+   {
+     printf ("G5 gen T S, f gen R\n");
+   }
+ };
+ 
+ template<typename S>
+ struct G5<char, S>
+ {
+   template<typename R>
+   void f(char x, S y, R z)
+     pre ( x > 'z' )
+     pre ( y > 1 )
+     pre ( z > 1 )
+   {
+     printf ("G5 partial char S, f gen R\n");
+   }
+ };
+ 
+ template<>
+ template<typename Q>
+ void G5<double, double>::f(double a, double b, Q c)
+   pre ( a > 2 )
+   pre ( b > 2 )
+   pre ( c > 2 )
+ {
+   printf ("G5 full double double, f gen R\n");
+ }
+ 
+ int main(int, char**)
+ {
+   printf("%d\n", body<int>(-1));
+   printf("%d\n", body<double>(-1));
+   printf("%d\n", none<int>(-1));
+   printf("%d\n", none<double>(-1));
+   printf("%d\n", arg0(-1));
+   printf("%d\n", arg0(-1.0));
+   printf("%d\n", arg1(-3, -1));
+   printf("%d\n", arg1(-3, -1.0));
+   printf("%d\n", (int)ret<int>(-1));
+   printf("%d\n", (int)ret<double>(-1));
+   printf("%f\n", ret<double>(-1));
+ 
+   printf("%d\n", g1(-1));
+   printf("%d\n", g1(-1.0));
+ 
+   printf("%d\n", g2(-1));
+   printf("%d\n", g2(1.0));
+   printf("%d\n", g2('d'));
+ 
+   G3<double, double> g3_gen;
+   G3<int, int> g3_partial;
+   G3<int, double> g3_full;
+   g3_gen.f(-1.0, -1.0); // general
+   g3_partial.f(-2, -2); // partial spec
+   g3_full.f(-3, -3.0); // full spec
+ 
+   G3<char, char> g3_gen2;
+   G3<int, char> g3_partial2;
+   g3_gen2.f((char)-1, (char)-1);
+   g3_partial2.f(-1, (char)-1);
+ 
+   G3<int, C> g3_full2;
+   g3_full2.f(5, C{});
+   g3_full2.f(-5, C{});
+ 
+   G4 g4_gen{-1, -1};
+   G4 g4_full1{-1.0, -1.0};
+   G4 g4_full2{-1.0, (char)'b'};
+   G4 g4_partial{(char)'c', -5};
+ 
+   G5<int, int> g5_gen;
+   g5_gen.f(-1, -1, -2);
+   g5_gen.f(-1, -1, -2.0);
+ 
+   G5<char, int> g5_part;
+   g5_part.f('a', -1, -2);
+   g5_part.f('a', -1, -2.1);
+ 
+   G5<double, double> g5_full;
+   g5_full.f(-1.0, -1.0, -2);
+   g5_full.f(-1.0, -1.0, -2.1);
+   return 0;
+ }
+ 
+ // { dg-output {contract violation in function int body.int. .with T = int. at .*:9: a > 0(\n|\r\n|\r)} }
+ // { dg-output ".assertion_kind: pre, semantic: observe, mode: predicate_false, terminating: no.(\n|\r\n|\r)" }
+ // { dg-output {-2(\n|\r\n|\r)} }
+ // { dg-output {contract violation in function int body.int. .with T = double. at .*:17: a > 1(\n|\r\n|\r)} }
+ // { dg-output ".assertion_kind: pre, semantic: observe, mode: predicate_false, terminating: no.(\n|\r\n|\r)" }
+ // { dg-output {-3(\n|\r\n|\r)} }
+ // { dg-output {contract violation in function int none.int. .with T = int. at .*:25: a > 0(\n|\r\n|\r)} }
+ // { dg-output ".assertion_kind: pre, semantic: observe, mode: predicate_false, terminating: no.(\n|\r\n|\r)" }
+ // { dg-output {1(\n|\r\n|\r)} }
+ // { dg-output {contract violation in function int none.int. .with T = double. at .*:32: a > 1(\n|\r\n|\r)} }
+ // { dg-output ".assertion_kind: pre, semantic: observe, mode: predicate_false, terminating: no.(\n|\r\n|\r)" }
+ // { dg-output {-101(\n|\r\n|\r)} }
+ // { dg-output {contract violation in function int arg0.T. .with T = int. at .*:39: t > 0(\n|\r\n|\r)} }
+ // { dg-output ".assertion_kind: pre, semantic: observe, mode: predicate_false, terminating: no.(\n|\r\n|\r)" }
+ // { dg-output {-9(\n|\r\n|\r)} }
+ // { dg-output {contract violation in function int arg0.T. .with T = double. at .*:46: t > 1(\n|\r\n|\r)} }
+ // { dg-output ".assertion_kind: pre, semantic: observe, mode: predicate_false, terminating: no.(\n|\r\n|\r)" }
+ // { dg-output {11(\n|\r\n|\r)} }
+ // { dg-output {contract violation in function int arg1.int, T. .with T = int. at .*:53: a > 0(\n|\r\n|\r)} }
+ // { dg-output ".assertion_kind: pre, semantic: observe, mode: predicate_false, terminating: no.(\n|\r\n|\r)" }
+ // { dg-output {contract violation in function int arg1.int, T. .with T = int. at .*:54: t > 0(\n|\r\n|\r)} }
+ // { dg-output ".assertion_kind: pre, semantic: observe, mode: predicate_false, terminating: no.(\n|\r\n|\r)" }
+ // { dg-output {-3(\n|\r\n|\r)} }
+ // { dg-output {contract violation in function int arg1.int, T. .with T = double. at .*:61: a > 1(\n|\r\n|\r)} }
+ // { dg-output ".assertion_kind: pre, semantic: observe, mode: predicate_false, terminating: no.(\n|\r\n|\r)" }
+ // { dg-output {contract violation in function int arg1.int, T. .with T = double. at .*:62: t > 1(\n|\r\n|\r)} }
+ // { dg-output ".assertion_kind: pre, semantic: observe, mode: predicate_false, terminating: no.(\n|\r\n|\r)" }
+ // { dg-output {14(\n|\r\n|\r)} }
+ // { dg-output {contract violation in function T ret.int. .with T = int. at .*:69: a > 0(\n|\r\n|\r)} }
+ // { dg-output ".assertion_kind: pre, semantic: observe, mode: predicate_false, terminating: no.(\n|\r\n|\r)" }
+ // { dg-output {1(\n|\r\n|\r)} }
+ // { dg-output {contract violation in function T ret.int. .with T = double. at .*:76: a > 1(\n|\r\n|\r)} }
+ // { dg-output ".assertion_kind: pre, semantic: observe, mode: predicate_false, terminating: no.(\n|\r\n|\r)" }
+ // { dg-output {3(\n|\r\n|\r)} }
+ // { dg-output {contract violation in function T ret.int. .with T = double. at .*:76: a > 1(\n|\r\n|\r)} }
+ // { dg-output ".assertion_kind: pre, semantic: observe, mode: predicate_false, terminating: no.(\n|\r\n|\r)" }
+ // { dg-output {3.300000(\n|\r\n|\r)} }
+ // { dg-output {contract violation in function int g1.T. .with T = int. at .*:83: t > 0(\n|\r\n|\r)} }
+ // { dg-output ".assertion_kind: pre, semantic: observe, mode: predicate_false, terminating: no.(\n|\r\n|\r)" }
+ // { dg-output {-1(\n|\r\n|\r)} }
+ // { dg-output {-1(\n|\r\n|\r)} }
+ // { dg-output {contract violation in function int g2.T. .with T = int. at .*:97: t > 0(\n|\r\n|\r)} }
+ // { dg-output ".assertion_kind: pre, semantic: observe, mode: predicate_false, terminating: no.(\n|\r\n|\r)" }
+ // { dg-output {-1(\n|\r\n|\r)} }
+ // { dg-output {contract violation in function int g2.T. .with T = double. at .*:107: t < 0(\n|\r\n|\r)} }
+ // { dg-output ".assertion_kind: pre, semantic: observe, mode: predicate_false, terminating: no.(\n|\r\n|\r)" }
+ // { dg-output {1(\n|\r\n|\r)} }
+ // { dg-output {contract violation in function int g2.T. .with T = char. at .*:114: t < 'c'(\n|\r\n|\r)} }
+ // { dg-output ".assertion_kind: pre, semantic: observe, mode: predicate_false, terminating: no.(\n|\r\n|\r)" }
+ // { dg-output {100(\n|\r\n|\r)} }
+ // { dg-output {contract violation in function void G3<T, S>::f.T, S. .with T = double; S = double. at .*:124: t > 0(\n|\r\n|\r)} }
+ // { dg-output ".assertion_kind: pre, semantic: observe, mode: predicate_false, terminating: no.(\n|\r\n|\r)" }
+ // { dg-output {contract violation in function void G3<T, S>::f.T, S. .with T = double; S = double. at .*:125: s > 0(\n|\r\n|\r)} }
+ // { dg-output ".assertion_kind: pre, semantic: observe, mode: predicate_false, terminating: no.(\n|\r\n|\r)" }
+ // { dg-output {G3 general T S(\n|\r\n|\r)} }
+ // { dg-output {contract violation in function void G3<int, S>::f.int, S. .with S = int. at .*:139: t > 1(\n|\r\n|\r)} }
+ // { dg-output ".assertion_kind: pre, semantic: observe, mode: predicate_false, terminating: no.(\n|\r\n|\r)" }
+ // { dg-output {contract violation in function void G3<int, S>::f.int, S. .with S = int. at .*:140: s > 1(\n|\r\n|\r)} }
+ // { dg-output ".assertion_kind: pre, semantic: observe, mode: predicate_false, terminating: no.(\n|\r\n|\r)" }
+ // { dg-output {G3 partial int S(\n|\r\n|\r)} }
+ // { dg-output {contract violation in function void G3<int, S>::f.int, S. .with S = double. at .*:147: t > 2(\n|\r\n|\r)} }
+ // { dg-output ".assertion_kind: pre, semantic: observe, mode: predicate_false, terminating: no.(\n|\r\n|\r)" }
+ // { dg-output {contract violation in function void G3<int, S>::f.int, S. .with S = double. at .*:148: s > 2(\n|\r\n|\r)} }
+ // { dg-output ".assertion_kind: pre, semantic: observe, mode: predicate_false, terminating: no.(\n|\r\n|\r)" }
+ // { dg-output {G3 full int double(\n|\r\n|\r)} }
+ // { dg-output {contract violation in function void G3<T, S>::f.T, S. .with T = char; S = char. at .*:124: t > 0(\n|\r\n|\r)} }
+ // { dg-output ".assertion_kind: pre, semantic: observe, mode: predicate_false, terminating: no.(\n|\r\n|\r)" }
+ // { dg-output {contract violation in function void G3<T, S>::f.T, S. .with T = char; S = char. at .*:125: s > 0(\n|\r\n|\r)} }
+ // { dg-output ".assertion_kind: pre, semantic: observe, mode: predicate_false, terminating: no.(\n|\r\n|\r)" }
+ // { dg-output {G3 general T S(\n|\r\n|\r)} }
+ // { dg-output {contract violation in function void G3<int, S>::f.int, S. .with S = char. at .*:139: t > 1(\n|\r\n|\r)} }
+ // { dg-output ".assertion_kind: pre, semantic: observe, mode: predicate_false, terminating: no.(\n|\r\n|\r)" }
+ // { dg-output {contract violation in function void G3<int, S>::f.int, S. .with S = char. at .*:140: s > 1(\n|\r\n|\r)} }
+ // { dg-output ".assertion_kind: pre, semantic: observe, mode: predicate_false, terminating: no.(\n|\r\n|\r)" }
+ // { dg-output {G3 partial int S(\n|\r\n|\r)} }
+ // { dg-output {G3 full int C(\n|\r\n|\r)} }
+ // { dg-output {G3 full int C(\n|\r\n|\r)} }
+ // { dg-output {contract violation in function G4<T, S>::G4.T, S. .with T = int; S = int. at .*:173: t > 0(\n|\r\n|\r)} }
+ // { dg-output ".assertion_kind: pre, semantic: observe, mode: predicate_false, terminating: no.(\n|\r\n|\r)" }
+ // { dg-output {contract violation in function G4<T, S>::G4.T, S. .with T = int; S = int. at .*:174: s > 0(\n|\r\n|\r)} }
+ // { dg-output ".assertion_kind: pre, semantic: observe, mode: predicate_false, terminating: no.(\n|\r\n|\r)" }
+ // { dg-output {G4 general T S(\n|\r\n|\r)} }
+ // { dg-output {contract violation in function G4<T, S>::G4.T, S. .with T = int; S = int. at .*:175: x > 0(\n|\r\n|\r)} }
+ // { dg-output ".assertion_kind: post, semantic: observe, mode: predicate_false, terminating: no.(\n|\r\n|\r)" }
+ // { dg-output {G4 full double double(\n|\r\n|\r)} }
+ // { dg-output {contract violation in function G4<T, S>::G4.T, S. .with T = double; S = char. at .*:206: a > 0(\n|\r\n|\r)} }
+ // { dg-output ".assertion_kind: pre, semantic: observe, mode: predicate_false, terminating: no.(\n|\r\n|\r)" }
+ // { dg-output {contract violation in function G4<T, S>::G4.T, S. .with T = double; S = char. at .*:207: b > 'b'(\n|\r\n|\r)} }
+ // { dg-output ".assertion_kind: pre, semantic: observe, mode: predicate_false, terminating: no.(\n|\r\n|\r)" }
+ // { dg-output {G4 full double char(\n|\r\n|\r)} }
+ // { dg-output {contract violation in function G4<T, S>::G4.T, S. .with T = double; S = char. at .*:208: x > 1(\n|\r\n|\r)} }
+ // { dg-output ".assertion_kind: post, semantic: observe, mode: predicate_false, terminating: no.(\n|\r\n|\r)" }
+ // { dg-output {contract violation in function G4<char, S>::G4.char, S. .with S = int. at .*:187: t > 'c'(\n|\r\n|\r)} }
+ // { dg-output ".assertion_kind: pre, semantic: observe, mode: predicate_false, terminating: no.(\n|\r\n|\r)" }
+ // { dg-output {contract violation in function G4<char, S>::G4.char, S. .with S = int. at .*:188: s > 3(\n|\r\n|\r)} }
+ // { dg-output ".assertion_kind: pre, semantic: observe, mode: predicate_false, terminating: no.(\n|\r\n|\r)" }
+ // { dg-output {G4 partial char S(\n|\r\n|\r)} }
+ // { dg-output {contract violation in function G4<char, S>::G4.char, S. .with S = int. at .*:189: x2 > 3(\n|\r\n|\r)} }
+ // { dg-output ".assertion_kind: post, semantic: observe, mode: predicate_false, terminating: no.(\n|\r\n|\r)" }
+ // { dg-output {contract violation in function void G5<T, S>::f.T, S, P. .with P = int; T = int; S = int. at .*:220: t > 0(\n|\r\n|\r)} }
+ // { dg-output ".assertion_kind: pre, semantic: observe, mode: predicate_false, terminating: no.(\n|\r\n|\r)" }
+ // { dg-output {contract violation in function void G5<T, S>::f.T, S, P. .with P = int; T = int; S = int. at .*:221: s > 0(\n|\r\n|\r)} }
+ // { dg-output ".assertion_kind: pre, semantic: observe, mode: predicate_false, terminating: no.(\n|\r\n|\r)" }
+ // { dg-output {contract violation in function void G5<T, S>::f.T, S, P. .with P = int; T = int; S = int. at .*:222: r > 0(\n|\r\n|\r)} }
+ // { dg-output ".assertion_kind: pre, semantic: observe, mode: predicate_false, terminating: no.(\n|\r\n|\r)" }
+ // { dg-output {G5 gen T S, f gen R(\n|\r\n|\r)} }
+ // { dg-output {contract violation in function void G5<T, S>::f.T, S, P. .with P = double; T = int; S = int. at .*:220: t > 0(\n|\r\n|\r)} }
+ // { dg-output ".assertion_kind: pre, semantic: observe, mode: predicate_false, terminating: no.(\n|\r\n|\r)" }
+ // { dg-output {contract violation in function void G5<T, S>::f.T, S, P. .with P = double; T = int; S = int. at .*:221: s > 0(\n|\r\n|\r)} }
+ // { dg-output ".assertion_kind: pre, semantic: observe, mode: predicate_false, terminating: no.(\n|\r\n|\r)" }
+ // { dg-output {contract violation in function void G5<T, S>::f.T, S, P. .with P = double; T = int; S = int. at .*:222: r > 0(\n|\r\n|\r)} }
+ // { dg-output ".assertion_kind: pre, semantic: observe, mode: predicate_false, terminating: no.(\n|\r\n|\r)" }
+ // { dg-output {G5 gen T S, f gen R(\n|\r\n|\r)} }
+ // { dg-output {contract violation in function void G5<char, S>::f.char, S, R. .with R = int; S = int. at .*:233: x > 'z'(\n|\r\n|\r)} }
+ // { dg-output ".assertion_kind: pre, semantic: observe, mode: predicate_false, terminating: no.(\n|\r\n|\r)" }
+ // { dg-output {contract violation in function void G5<char, S>::f.char, S, R. .with R = int; S = int. at .*:234: y > 1(\n|\r\n|\r)} }
+ // { dg-output ".assertion_kind: pre, semantic: observe, mode: predicate_false, terminating: no.(\n|\r\n|\r)" }
+ // { dg-output {contract violation in function void G5<char, S>::f.char, S, R. .with R = int; S = int. at .*:235: z > 1(\n|\r\n|\r)} }
+ // { dg-output ".assertion_kind: pre, semantic: observe, mode: predicate_false, terminating: no.(\n|\r\n|\r)" }
+ // { dg-output {G5 partial char S, f gen R(\n|\r\n|\r)} }
+ // { dg-output {contract violation in function void G5<char, S>::f.char, S, R. .with R = double; S = int. at .*:233: x > 'z'(\n|\r\n|\r)} }
+ // { dg-output ".assertion_kind: pre, semantic: observe, mode: predicate_false, terminating: no.(\n|\r\n|\r)" }
+ // { dg-output {contract violation in function void G5<char, S>::f.char, S, R. .with R = double; S = int. at .*:234: y > 1(\n|\r\n|\r)} }
+ // { dg-output ".assertion_kind: pre, semantic: observe, mode: predicate_false, terminating: no.(\n|\r\n|\r)" }
+ // { dg-output {contract violation in function void G5<char, S>::f.char, S, R. .with R = double; S = int. at .*:235: z > 1(\n|\r\n|\r)} }
+ // { dg-output ".assertion_kind: pre, semantic: observe, mode: predicate_false, terminating: no.(\n|\r\n|\r)" }
+ // { dg-output {G5 partial char S, f gen R(\n|\r\n|\r)} }
+ // { dg-output {contract violation in function void G5<T, S>::f.T, S, P. .with P = int; T = double; S = double. at .*:244: a > 2(\n|\r\n|\r)} }
+ // { dg-output ".assertion_kind: pre, semantic: observe, mode: predicate_false, terminating: no.(\n|\r\n|\r)" }
+ // { dg-output {contract violation in function void G5<T, S>::f.T, S, P. .with P = int; T = double; S = double. at .*:245: b > 2(\n|\r\n|\r)} }
+ // { dg-output ".assertion_kind: pre, semantic: observe, mode: predicate_false, terminating: no.(\n|\r\n|\r)" }
+ // { dg-output {contract violation in function void G5<T, S>::f.T, S, P. .with P = int; T = double; S = double. at .*:246: c > 2(\n|\r\n|\r)} }
+ // { dg-output ".assertion_kind: pre, semantic: observe, mode: predicate_false, terminating: no.(\n|\r\n|\r)" }
+ // { dg-output {G5 full double double, f gen R(\n|\r\n|\r)} }
+ // { dg-output {contract violation in function void G5<T, S>::f.T, S, P. .with P = double; T = double; S = double. at .*:244: a > 2(\n|\r\n|\r)} }
+ // { dg-output ".assertion_kind: pre, semantic: observe, mode: predicate_false, terminating: no.(\n|\r\n|\r)" }
+ // { dg-output {contract violation in function void G5<T, S>::f.T, S, P. .with P = double; T = double; S = double. at .*:245: b > 2(\n|\r\n|\r)} }
+ // { dg-output ".assertion_kind: pre, semantic: observe, mode: predicate_false, terminating: no.(\n|\r\n|\r)" }
+ // { dg-output {contract violation in function void G5<T, S>::f.T, S, P. .with P = double; T = double; S = double. at .*:246: c > 2(\n|\r\n|\r)} }
+ // { dg-output ".assertion_kind: pre, semantic: observe, mode: predicate_false, terminating: no.(\n|\r\n|\r)" }
+ // { dg-output {G5 full double double, f gen R(\n|\r\n|\r)} }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/dcl.contract.func.p4.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/dcl.contract.func.p4.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/dcl.contract.func.p4.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/dcl.contract.func.p4.C	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,138 ----
+ // N5008 :
+ // A declaration D of a function or function template f that is not a first declaration shall have either no
+ // function-contract-specifier-seq or the same function-contract-specifier-seq (see below) as any first declaration
+ // F reachable from D.
+ // { dg-do compile { target c++23 } }
+ // { dg-additional-options "-fcontracts" }
+ 
+ // allowed to repeat contracts or omit them
+ int g0(int a) pre (a > 0);
+ int g0(int a) pre (a > 0 );
+ int g0(int a) pre (a > 0);
+ 
+ int g1(int a) pre (a > 0);
+ int g1(int a);
+ 
+ int g2(int a);
+ int g2(int a) pre (a > 0); // { dg-error "declaration adds contracts" }
+ 
+ struct G0
+ {
+   int f(int a);
+ };
+ 
+ int G0::f(int a) pre (a > 0) // { dg-error "declaration adds contracts" }
+ {
+   return -a;
+ }
+ 
+ struct G1
+ {
+   int f(int a)
+     pre (a > 0);
+ };
+ 
+ int G1::f(int a)
+   pre ( a > 0 ) // OK. same as the first decl.
+ { return 0; }
+ 
+ int G1::f(int a); // OK not adding
+ 
+ int G1::f(int a) // { dg-error "different number of contracts" }
+   pre ( a > 0 ) pre ( a > 0 );
+ 
+ int f0(int a)
+   pre ( a > 0 );
+ 
+ int f0(int a) // { dg-error "different number of contracts" }
+   pre ( a > 0 ) pre ( a > 10 ); 
+ 
+ int f1(int a)
+   pre ( a > 0 );
+ int f1(int a)
+   pre ( a < 0 ); // { dg-error "mismatched contract" }
+ 
+ struct Base
+ {
+   virtual int f(int a) // { dg-error "contracts cannot be added to virtual functions" }
+     pre (a > 0);
+ };
+ 
+ struct Child : Base
+ {
+   int f(int a) // { dg-error "contracts cannot be added to virtual functions" }
+     pre (a < 0);
+ };
+ 
+ struct F1
+ {
+   virtual int f(int a);
+ };
+ 
+ int F1::f(int a) // { dg-error "declaration adds contracts" }
+   pre (a > 0)
+ {
+   return -a;
+ }
+ 
+ 
+ struct T1
+ {
+   void vfun(int m, double n);
+ };
+ 
+ void T1::vfun(int m, double n)
+    pre ( x < 0 ) // { dg-error "was not declared in this" }
+ {
+ }
+ 
+ void T1::vfun(int m, double n)  // { dg-error "declaration adds contracts" }
+   pre(true);
+ 
+ struct Foo {
+   virtual void f10 (int) // { dg-error "contracts cannot be added to virtual functions" }
+     pre ( false ) {}
+ };
+ 
+ struct Bar : Foo {
+   void f10 (int n = 0) override  // { dg-error "contracts cannot be added to virtual functions" }
+     pre ( false );
+ };
+ 
+ // we currently don't diagnose an error here if the original contract was erroneous.
+ void Bar::f10(int n)
+  pre (n >10) {}; // { dg-error "mismatched contract" }
+ 
+ 
+ struct NonTrivial{
+   NonTrivial(){};
+   NonTrivial(const NonTrivial&){}
+   ~NonTrivial(){};
+   int x = 0;
+ };
+ 
+ void f(const NonTrivial s) pre(s.x >0);
+ void f(const NonTrivial g) {};
+ void f(const NonTrivial t) pre(t.x >0);
+ 
+ void g(const NonTrivial t, const NonTrivial t1) pre(t.x >0);
+ void g(const NonTrivial t, const NonTrivial t1) pre(t1.x >0); // { dg-error "mismatched contract" }
+ void g(const NonTrivial g, const NonTrivial t1) pre(g.x >0){};
+ void g(const NonTrivial t, const NonTrivial t1) pre(t1.x >0); // { dg-error "mismatched contract" }
+ 
+ template<typename T>
+ bool somefunc(const T t){ return true;}
+ 
+ void h(const NonTrivial t, const NonTrivial t1) pre(somefunc(t) == true){};
+ void h(const NonTrivial t, const NonTrivial t1) pre(somefunc(t) == true);
+ void h(const NonTrivial t, const NonTrivial t1) pre(somefunc(t1) == true); // { dg-error "mismatched contract" }
+ 
+ double sqrt(const double x)
+   post( r : r >= 0 );
+ 
+ 
+ double sqrt(const double x)
+   post( r : r >= 0)
+ {
+   return x;
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/dcl.contract.func.p6.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/dcl.contract.func.p6.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/dcl.contract.func.p6.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/dcl.contract.func.p6.C	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,21 ----
+ // N5008:
+ // dcl.contract.func/p6
+ // A virtual function (11.7.3),
+ // TODO : a deleted function (9.6.3), or a function defaulted on its first declaration (9.6.2)
+ // shall not have a function-contract-specifier-seq.
+ // { dg-do compile { target c++23 } }
+ // { dg-additional-options "-fcontracts" }
+ 
+ struct Base
+ {
+   virtual int f1() pre(true); // { dg-error "contracts cannot be added to virtual functions" }
+   virtual int f2();
+ 
+ };
+ struct Child : Base
+ {
+   int f2() pre(true); // { dg-error "contracts cannot be added to virtual functions" }
+ 
+ };
+ 
+ 
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/dcl.contract.func.p7-t1.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/dcl.contract.func.p7-t1.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/dcl.contract.func.p7-t1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/dcl.contract.func.p7-t1.C	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,161 ----
+ // N5008:
+ // dcl.contract.func/p7
+ // If the predicate of a postcondition assertion of a function f odr-uses (6.3) a non-reference parameter of f,
+ // that parameter and the corresponding parameter on all declarations of f shall have const type
+ // These tests instantiate templates with a non const type.
+ // { dg-do compile { target c++23 } }
+ // { dg-additional-options "-fcontracts" }
+ #include <type_traits>
+ struct NTClass {
+     NTClass(){};
+     ~NTClass(){};
+     int x = 1;
+ };
+ 
+ template <typename... ARGS>
+ bool check(ARGS... args){ return true;}
+ 
+ namespace checkDeclaration{
+ 
+ template <class T>
+ void ft1 (T i, T &j, T *k, const T * l, T * const m)
+   post ( check (i)) // { dg-error "used in a postcondition must be const" }
+   post ( check (j))
+   post ( check (k)) // { dg-error "used in a postcondition must be const" }
+   post ( check (l)) // { dg-error "used in a postcondition must be const" }
+   post ( check (m)){};
+ 
+ template void ft1<int>(int, int&, int*, int const*, int* const);
+ // { dg-error "value parameter 'i'" "" { target *-*-* } 21 }
+ // { dg-error "value parameter 'k'" "" { target *-*-* } 21 }
+ // { dg-error "value parameter 'l'" "" { target *-*-* } 21 }
+ 
+ 
+ struct PostCond {
+ 
+   template <class T>
+   PostCond  (T i, T &j, T *k, const T * l, T * const m)
+     post ( check (i)) // { dg-error "used in a postcondition must be const" }
+     post ( check (j))
+     post ( check (k)) // { dg-error "used in a postcondition must be const" }
+     post ( check (l)) // { dg-error "used in a postcondition must be const" }
+     post ( check (m)){};
+ 
+   template <class T>
+   void ft1 (T i, T &j, T *k, const T * l, T * const m)
+     post ( check (i)) // { dg-error "used in a postcondition must be const" }
+     post ( check (j))
+     post ( check (k)) // { dg-error "used in a postcondition must be const" }
+     post ( check (l)) // { dg-error "used in a postcondition must be const" }
+     post ( check (m)){};
+ 
+ };
+ 
+ template
+ PostCond::PostCond<int> (int i,  int &j, int *k, const int * l,  int * const m);
+ // { dg-error "value parameter 'i'" "" { target *-*-* } 37 }
+ // { dg-error "value parameter 'k'" "" { target *-*-* } 37 }
+ // { dg-error "value parameter 'l'" "" { target *-*-* } 37 }
+ 
+ template
+ void PostCond::ft1<NTClass>(NTClass, NTClass&, NTClass*, NTClass const*, NTClass* const);
+ // { dg-error "value parameter 'i'" "" { target *-*-* } 45 }
+ // { dg-error "value parameter 'k'" "" { target *-*-* } 45 }
+ // { dg-error "value parameter 'l'" "" { target *-*-* } 45 }
+ 
+ 
+ template <typename T>
+ struct PostCondT
+ {
+ 
+   PostCondT (T i, T &j, T *k, const T * l, T * const m)
+     post ( check (i))
+     post ( check (j))
+     post ( check (k))
+     post ( check (l))
+     post ( check (m)){};
+ 
+   template <class U>
+   void f (U i, U &j, U *k, const U * l, U * const m)
+     post ( check (i))
+     post ( check (j))
+     post ( check (k))
+     post ( check (l))
+     post ( check (m)){};
+ };
+ 
+ 
+ template
+ PostCondT<int>::PostCondT (int i,  int &j, int *k, const int * l,  int * const m);
+ // { dg-error "value parameter 'i'" "" { target *-*-* } 71 }
+ // { dg-error "value parameter 'k'" "" { target *-*-* } 71 }
+ // { dg-error "value parameter 'l'" "" { target *-*-* } 71 }
+ 
+ template
+ void PostCondT<int>::f<NTClass>(NTClass, NTClass&, NTClass*, NTClass const*, NTClass* const);
+ // { dg-error "value parameter 'i'" "" { target *-*-* } 79 }
+ // { dg-error "value parameter 'k'" "" { target *-*-* } 79 }
+ // { dg-error "value parameter 'l'" "" { target *-*-* } 79 }
+ 
+ template <typename T>
+ int f2(const T i[10])
+ post(r : r == i[0]){ return 1;};
+ 
+ template
+ int f2<int>(const int i[10]);
+ // { dg-error "used in a postcondition must be const" "" { target *-*-* } 101  }
+ 
+ // P3520
+ template <typename T>
+ void f4(std::add_const_t<T> t) post(t > 0){}; //ok
+ template <typename T>
+ void f5(T t) post (t > 0){};
+ 
+ void test2(){
+   f4<int>(1);
+   f5<int>(1); // { dg-error "used in a postcondition must be const" "" { target *-*-* } 112  }
+ }
+ }
+ 
+ 
+ namespace checkNonOdr{
+ 
+ template <class T>
+ void f (T i, T *j)
+   post ( sizeof(i) )
+   post ( noexcept(check (&j))){};
+ 
+ template
+ void f<int>(int, int*);
+ 
+ struct PostCond {
+   template <class T>
+   void f (T i, T *j)
+   post ( sizeof(i) )
+   post ( noexcept(check (&j))){};
+ };
+ 
+ template
+ void PostCond::f<int>(int, int*);
+ 
+ 
+ template <typename T>
+ struct PostCondT
+ {
+   void f1 (T i, T *j)
+   post ( sizeof(i) )
+   post ( noexcept(check (&j))){};
+ 
+   template <class U>
+   void f2 (U i, U *j)
+   post ( sizeof(i) )
+   post ( noexcept(check (&j))){};
+ };
+ 
+ template
+ void PostCondT<int>::f1(int, int*);
+ 
+ template
+ void PostCondT<int>::f2<NTClass>(NTClass, NTClass*);
+ 
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/dcl.contract.func.p7-t2.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/dcl.contract.func.p7-t2.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/dcl.contract.func.p7-t2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/dcl.contract.func.p7-t2.C	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,157 ----
+ // N5008:
+ // dcl.contract.func/p7
+ // If the predicate of a postcondition assertion of a function f odr-uses (6.3) a non-reference parameter of f,
+ // that parameter and the corresponding parameter on all declarations of f shall have const type
+ // These tests instantiate templates with a const type.
+ // { dg-do compile { target c++23 } }
+ // { dg-additional-options "-fcontracts" }
+ #include <type_traits>
+ struct NTClass {
+     NTClass(){};
+     ~NTClass(){};
+     int x = 1;
+ };
+ 
+ template <typename... ARGS>
+ bool check(ARGS... args){ return true;}
+ 
+ namespace checkDeclaration{
+ 
+ template <class T>
+ void ft1 (T i, T &j, T *k, const T * l, T * const m)
+   post ( check (i))
+   post ( check (j))
+   post ( check (k)) // { dg-error "used in a postcondition must be const" }
+   post ( check (l)) // { dg-error "used in a postcondition must be const" }
+   post ( check (m)){};
+ 
+ template void ft1<const int>(const int, const int&, const int*, int const*, const int* const);
+ // { dg-error "value parameter 'k'" "" { target *-*-* } 21 }
+ // { dg-error "value parameter 'l'" "" { target *-*-* } 21 }
+ 
+ 
+ struct PostCond {
+ 
+   template <class T>
+   PostCond  (T i, T &j, T *k, const T * l, T * const m)
+     post ( check (i))
+     post ( check (j))
+     post ( check (k)) // { dg-error "used in a postcondition must be const" }
+     post ( check (l)) // { dg-error "used in a postcondition must be const" }
+     post ( check (m)){};
+ 
+   template <class T>
+   void ft1 (T i, T &j, T *k, const T * l, T * const m)
+     post ( check (i))
+     post ( check (j))
+     post ( check (k)) // { dg-error "used in a postcondition must be const" }
+     post ( check (l)) // { dg-error "used in a postcondition must be const" }
+     post ( check (m)){};
+ 
+ };
+ 
+ template
+ PostCond::PostCond<const int> (const int i, const int &j,const int *k, const int * l, const int * const m);
+ // { dg-error "value parameter 'k'" "" { target *-*-* } 36 }
+ // { dg-error "value parameter 'l'" "" { target *-*-* } 36 }
+ 
+ template
+ void PostCond::ft1<const NTClass>(const NTClass, const NTClass&, const NTClass*, NTClass const*, const NTClass* const);
+ // { dg-error "value parameter 'k'" "" { target *-*-* } 44 }
+ // { dg-error "value parameter 'l'" "" { target *-*-* } 44 }
+ 
+ 
+ template <typename T>
+ struct PostCondT
+ {
+ 
+   PostCondT (T i, T &j, T *k, const T * l, T * const m)
+     post ( check (i))
+     post ( check (j))
+     post ( check (k))
+     post ( check (l))
+     post ( check (m)){};
+ 
+   template <class U>
+   void f (U i, U &j, U *k, const U * l, U * const m)
+     post ( check (i))
+     post ( check (j))
+     post ( check (k))
+     post ( check (l))
+     post ( check (m)){};
+ };
+ 
+ 
+ template
+ PostCondT<const int>::PostCondT (const int i, const int &j, const int *k, const int * l, const int * const m);
+ // { dg-error "value parameter 'k'" "" { target *-*-* } 68 }
+ // { dg-error "value parameter 'l'" "" { target *-*-* } 68 }
+ 
+ template
+ void PostCondT<const int>::f<const NTClass>(const NTClass, const NTClass&, const NTClass*, NTClass const*, const NTClass* const);
+ // { dg-error "value parameter 'k'" "" { target *-*-* } 76 }
+ // { dg-error "value parameter 'l'" "" { target *-*-* } 76 }
+ 
+ template <typename T>
+ int f2(const T i[10])
+ post(r : r == i[0]){ return 1;};
+ 
+ template
+ int f2<const int>(const int i[10]);
+ // { dg-error "used in a postcondition must be const" "" { target *-*-* } 96  }
+ 
+ // P3520
+ template <typename T>
+ void f4(std::add_const_t<T> t) post(t > 0){}; //ok
+ template <typename T>
+ void f5(T t) post (t > 0){};
+ 
+ void test2(){
+   int i[10];
+   f4<const int>(1);
+   f5<const int>(1);
+ }
+ }
+ 
+ 
+ namespace checkNonOdr{
+ 
+ template <class T>
+ void f (T i, T *j)
+   post ( sizeof(i) )
+   post ( noexcept(check (&j))){};
+ 
+ template
+ void f<const int>(const int, const int*);
+ 
+ struct PostCond {
+   template <class T>
+   void f (T i, T *j)
+   post ( sizeof(i) )
+   post ( noexcept(check (&j))){};
+ };
+ 
+ template
+ void PostCond::f<const int>(const int, const int*);
+ 
+ 
+ template <typename T>
+ struct PostCondT
+ {
+   void f1 (T i, T *j)
+   post ( sizeof(i) )
+   post ( noexcept(check (&j))){};
+ 
+   template <class U>
+   void f2 (U i, U *j)
+   post ( sizeof(i) )
+   post ( noexcept(check (&j))){};
+ };
+ 
+ template
+ void PostCondT<const int>::f1(const int, const int*);
+ 
+ template
+ void PostCondT<const int>::f2<const NTClass>(const NTClass, const NTClass*);
+ 
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/dcl.contract.func.p7.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/dcl.contract.func.p7.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/dcl.contract.func.p7.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/dcl.contract.func.p7.C	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,335 ----
+ // N5008:
+ // dcl.contract.func/p7
+ // If the predicate of a postcondition assertion of a function f odr-uses (6.3) a non-reference parameter of f,
+ // that parameter and the corresponding parameter on all declarations of f shall have const type
+ // These tests do not instantiate templates with diagnosable errors
+ // { dg-do compile { target c++23 } }
+ // { dg-additional-options "-fcontracts" }
+ #include <type_traits>
+ struct NTClass {
+     NTClass(){};
+     ~NTClass(){};
+     int x = 1;
+ };
+ 
+ template <typename... ARGS>
+ bool check(ARGS... args){ return true;}
+ 
+ namespace checkDeclaration{
+ 
+ int f (int i, int &j, int *k, const int * l, int * const m)
+   post ( check (i)) // { dg-error "used in a postcondition must be const" }
+   post ( check (j))
+   post ( check (k)) // { dg-error "used in a postcondition must be const" }
+   post ( check (l)) // { dg-error "used in a postcondition must be const" }
+   post ( check (m));
+ 
+ int f (NTClass i, NTClass &j, NTClass *k, const NTClass * l, NTClass * const m)
+   post ( check (i)) // { dg-error "used in a postcondition must be const" }
+   post ( check (j))
+   post ( check (k)) // { dg-error "used in a postcondition must be const" }
+   post ( check (l)) // { dg-error "used in a postcondition must be const" }
+   post ( check (m));
+ 
+ template <class T>
+ void ft1 (T i, T &j, T *k, const T * l, T * const m)
+   post ( check (i))
+   post ( check (j))
+   post ( check (k))
+   post ( check (l))
+   post ( check (m)){};
+ 
+ 
+ struct PostCond {
+ 
+   PostCond (NTClass i, NTClass &j, NTClass *k, const NTClass * l, NTClass * const m)
+     post ( check (i)) // { dg-error "used in a postcondition must be const" }
+     post ( check (j))
+     post ( check (k)) // { dg-error "used in a postcondition must be const" }
+     post ( check (l)) // { dg-error "used in a postcondition must be const" }
+     post ( check (m));
+ 
+   template <class T>
+   PostCond  (T i, T &j, T *k, const T * l, T * const m)
+     post ( check (i))
+     post ( check (j))
+     post ( check (k))
+     post ( check (l))
+     post ( check (m));
+ 
+   int f (NTClass i, NTClass &j, NTClass *k, const NTClass * l, NTClass * const m)
+     post ( check (i)) // { dg-error "used in a postcondition must be const" }
+     post ( check (j))
+     post ( check (k)) // { dg-error "used in a postcondition must be const" }
+     post ( check (l)) // { dg-error "used in a postcondition must be const" }
+     post ( check (m));
+ 
+   template <class T>
+   int ft1 (T i, T &j, T *k, const T * l, T * const m)
+     post ( check (i))
+     post ( check (j))
+     post ( check (k))
+     post ( check (l))
+     post ( check (m));
+ };
+ 
+ /* Never instantiated to check errors without an instantiation.  */
+ template <typename T>
+ struct PostCondT
+ {
+ 
+   PostCondT (NTClass i, NTClass &j, NTClass *k, const NTClass * l, NTClass * const m)
+     post ( check (i)) // { dg-error "used in a postcondition must be const" }
+     post ( check (j))
+     post ( check (k)) // { dg-error "used in a postcondition must be const" }
+     post ( check (l)) // { dg-error "used in a postcondition must be const" }
+     post ( check (m));
+ 
+   PostCondT (T i, T &j, T *k, const T * l, T * const m)
+     post ( check (i))
+     post ( check (j))
+     post ( check (k))
+     post ( check (l))
+     post ( check (m));
+ 
+   template <class U>
+   PostCondT (U i, U &j, U *k, const U * l, U * const m)
+     post ( check (i))
+     post ( check (j))
+     post ( check (k))
+     post ( check (l))
+     post ( check (m));
+ 
+   int f (NTClass i, NTClass &j, NTClass *k, const NTClass * l, NTClass * const m)
+     post ( check (i)) // { dg-error "used in a postcondition must be const" }
+     post ( check (j))
+     post ( check (k)) // { dg-error "used in a postcondition must be const" }
+     post ( check (l)) // { dg-error "used in a postcondition must be const" }
+     post ( check (m));
+ 
+   int f (T i, T &j, T *k, const T * l, T * const m)
+     post ( check (i))
+     post ( check (j))
+     post ( check (k))
+     post ( check (l))
+     post ( check (m));
+ 
+   template <class U>
+   int f (U i, U &j, U *k, const U * l, U * const m)
+     post ( check (i))
+     post ( check (j))
+     post ( check (k))
+     post ( check (l))
+     post ( check (m));
+ };
+ 
+ 
+ // P29000R14  [dcl.contract.func]/p7
+ int f(const int i[10])
+ post(r : r == i[0]); // { dg-error "used in a postcondition must be const" }
+ 
+ template <typename T>
+ int f(const T i[10])
+ post(r : r == i[0]);
+ 
+ }
+ 
+ // P3520
+ using const_int_t = const int;
+ void f3(const_int_t i) post (i > 0);  //ok
+ 
+ template <typename T>
+ void f4(std::add_const_t<T> t) post(t > 0); //ok
+ 
+ template <typename T>
+ void f5(T t) post (t > 0);
+ 
+ 
+ namespace nonFirstDeclaration
+ {
+ 
+   int f (const NTClass i)
+     post ( check (i));
+ 
+   template <class T>
+   int f (const T i)
+     post ( check (i));
+ 
+   struct PostCond {
+     void f (const NTClass i)
+       post ( check (i));
+ 
+     template <class T>
+     void f (const T i)
+       post ( check (i));
+   };
+ 
+   template <typename T>
+   struct PostCondT
+   {
+     void f (const NTClass i)
+       post ( check (i));
+ 
+     void f (const T i)
+       post ( check (i));
+ 
+     template <class U>
+     void f (const U i)
+       post ( check (i));
+   };
+ 
+   int
+   f (NTClass i); // { dg-error "used in a postcondition must be const" }
+ 
+   template<class T>
+   int
+   f (T i);
+ 
+   void
+   PostCond::f (NTClass i){} // { dg-error "used in a postcondition must be const" }
+ 
+   template<class T>
+   void
+   PostCond::f (T i){}
+ 
+   template<typename T>
+   void PostCondT<T>::f (NTClass i){} // { dg-error "used in a postcondition must be const" }
+ 
+   template<typename T>
+   void PostCondT<T>::f (T i){}
+ 
+   template<typename T>
+   template<typename U>
+   void PostCondT<T>::f (U i){}
+ 
+ }
+ 
+ namespace nonFirstDeclarationNegative
+ {
+ 
+   int f (const NTClass i)
+     post ( check (true))
+     pre ( check (i));
+ 
+   template <class T>
+   int f (const T i)
+     post ( check (true))
+     pre ( check (i));
+ 
+   struct PostCond {
+     void f (const NTClass i)
+       post ( check (true))
+       pre ( check (i));
+ 
+     template <class T>
+     void f (const T i)
+       post ( check (true))
+       pre ( check (i));
+   };
+ 
+   template <typename T>
+   struct PostCondT
+   {
+     void f (const NTClass i)
+       post ( check (true))
+       pre ( check (i));
+ 
+     void f (const T i)
+       post ( check (true))
+       pre ( check (i));
+ 
+     template <class U>
+     void f (const U i)
+       post ( check (true))
+       pre ( check (i));
+   };
+ 
+   int
+   f (NTClass i);
+ 
+   template<class T>
+   int
+   f (T i);
+ 
+   void
+   PostCond::f (NTClass i){}
+ 
+   template<class T>
+   void
+   PostCond::f (T i){}
+ 
+   template<typename T>
+   void PostCondT<T>::f (NTClass i){}
+ 
+   template<typename T>
+   void PostCondT<T>::f (T i){}
+ 
+   template<typename T>
+   template<typename U>
+   void PostCondT<T>::f (U i){}
+ 
+ }
+ 
+ namespace checkNonOdr{
+ 
+ int f (int i, int *j)
+   post ( sizeof(i) )
+   post ( noexcept(check (&j)));
+ 
+ 
+ template <class T>
+ int f (T i, T *j)
+   post ( sizeof(i) )
+   post ( noexcept(check (&j)));
+ 
+ struct PostCond {
+ 
+   PostCond (int i, int *j)
+   post ( sizeof(i) )
+   post ( noexcept(check (&j)));
+ 
+ 
+   template <class T>
+   PostCond  (T i, T *j)
+   post ( sizeof(i) )
+   post ( noexcept(check (&j)));
+ 
+   int f (int i, int *j)
+   post ( sizeof(i) )
+   post ( noexcept(check (&j)));
+ 
+   template <class T>
+   int f (T i, T *j)
+   post ( sizeof(i) )
+   post ( noexcept(check (&j)));
+ };
+ 
+ template <typename T>
+ struct PostCondT
+ {
+ 
+   PostCondT (int i, int *j)
+    post ( sizeof(i) )
+    post ( noexcept(check (&j)));
+ 
+   template <class U>
+   PostCondT (U i, U *j)
+   post ( sizeof(i) )
+   post ( noexcept(check (&j)));
+ 
+   int f (int i, int *j)
+   post ( sizeof(i) )
+   post ( noexcept(check (&j)));
+ 
+   int f (T i, T *j)
+   post ( sizeof(i) )
+   post ( noexcept(check (&j)));
+ 
+   template <class U>
+   int f (U i, U *j)
+   post ( sizeof(i) )
+   post ( noexcept(check (&j)));
+ };
+ 
+ 
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/dcl.contract.res.p1-2.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/dcl.contract.res.p1-2.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/dcl.contract.res.p1-2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/dcl.contract.res.p1-2.C	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,69 ----
+ // N5008 :
+ // dcl.contract.res/p1
+ // The result-name-introducer of a postcondition-specifier is a declaration. The result-name-introducer introduces
+ // the identifier as the name of a result binding of the associated function. If a postcondition assertion has a
+ // result-name-introducer and the return type of the function is cv void, the program is ill-formed. A result
+ // binding denotes the object or reference returned by invocation of that function. The type of a result binding
+ // is the return type of its associated function. The optional attribute-specifier-seq of the attributed-identifier in
+ // the result-name-introducer appertains to the result binding so introduced.
+ // [Note 1 : An id-expression that names a result binding is a const lvalue (7.5.5.2). — end note]
+ //
+ // check that the return value has correct const qualification
+ // { dg-do compile { target c++23 } }
+ // { dg-additional-options "-fcontracts" }
+ 
+ 
+ #include <type_traits>
+ 
+ bool is_constified(int &){ return false;}
+ 
+ bool is_constified(const int &){ return true;}
+ 
+ 
+ int f1(int i)
+      pre (is_constified(i))
+      pre (std::is_same<decltype(i), int>::value)
+      pre (std::is_same<decltype((i)), const int&>::value)
+ 
+      post (r: is_constified(r))
+      post (r: std::is_same<decltype(r), int>::value)
+      post (r: std::is_same<decltype((r)), const int&>::value)
+      { return i; };
+ 
+ int& f2(int& i)
+     pre (is_constified(i))
+     pre (std::is_same<decltype(i), int&>::value)
+     pre (std::is_same<decltype((i)), const int&>::value)
+ 
+     post (r: is_constified(r))
+     post (r: std::is_same<decltype(r), int&>::value)
+     post (r: std::is_same<decltype((r)), const int&>::value)
+     {
+       static_assert(std::is_same<decltype(i), int&>::value);
+       return i;
+     }
+ 
+ int* f2(int* i)
+     pre (std::is_same<decltype(i), int*>::value)
+     pre (std::is_same<decltype((i)),int * const>::value)
+ 
+     post (r: std::is_same<decltype(r), int *>::value)
+     post (r: std::is_same<decltype((r)),int * const>::value)
+     { return i;}
+ 
+ int const * f2(int const * i)
+     pre (std::is_same<decltype(i), int const *>::value)
+     pre (std::is_same<decltype((i)),int const * const>::value)
+ 
+     post (r: std::is_same<decltype(r), int const *>::value)
+     post (r: std::is_same<decltype((r)),int const * const>::value)
+     { return i;}
+ 
+ int main()
+ {
+ 
+   int i = 4;
+   f1(i);
+   f2(i);
+ 
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/dcl.contract.res.p1-NT.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/dcl.contract.res.p1-NT.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/dcl.contract.res.p1-NT.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/dcl.contract.res.p1-NT.C	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,146 ----
+ // N5008 :
+ // dcl.contract.res/p1
+ // The result-name-introducer of a postcondition-specifier is a declaration. The result-name-introducer introduces
+ // the identifier as the name of a result binding of the associated function. If a postcondition assertion has a
+ // result-name-introducer and the return type of the function is cv void, the program is ill-formed.
+ //
+ // Various tests with non trivial return value identifier
+ //
+ // { dg-do compile { target c++23 } }
+ // { dg-additional-options "-fcontracts" }
+ 
+ 
+ struct NonTrivial{
+   NonTrivial(){};
+   NonTrivial(const NonTrivial&){}
+   ~NonTrivial(){};
+   int x = 0;
+ };
+ 
+ template<typename T>
+ bool check(T t){
+   return true;
+ }
+ struct S{
+  NonTrivial f1(const NonTrivial i) post(r: i.x > 0 ) { return NonTrivial{};}
+ 
+  template <typename T>
+  NonTrivial f2(const T i) post(r: i.x > 0 ) { return NonTrivial{};}
+ 
+  auto f3(const NonTrivial i) post(r: i.x > 0 ) { return NonTrivial{};}
+ 
+  template <typename T>
+  T f4(const T i) post(r: i.x > 0 ) { return NonTrivial{};}
+ 
+  template <typename T>
+  auto f5(const T i) post(r: i.x > 0 ) { return i;}
+ 
+  template <typename T>
+  auto f6(const T i) post(r: check(i) ) { return i;}
+ 
+  auto f7(const NonTrivial i) post(r: check(r) ) { return i;}
+ 
+ };
+ 
+ template <typename U>
+ struct S1
+ {
+ 
+   struct S2
+   {
+     NonTrivial
+     f1 (const NonTrivial i) post(r: i.x > 0 )
+       { return NonTrivial
+ 	  {};
+       }
+ 
+       template <typename T>
+       NonTrivial
+       f2 (const T i) post(r: i.x > 0 )
+ 	{ return NonTrivial
+ 	    {};
+ 	}
+ 
+ 	auto
+ 	f3 (const NonTrivial i)
+ 	post(r: i.x > 0 )
+ 	  { return NonTrivial
+ 	      {};}
+ 
+ 	template <typename T>
+ 	T
+ 	f4 (const T i)
+ 	post(r: i.x > 0 )
+ 	  { return NonTrivial
+ 	      {};}
+ 
+ 	template <typename T>
+ 	auto
+ 	f5 (const T i)
+ 	post(r: i.x > 0 )
+ 	  { return i;}
+ 
+       };
+ 
+     NonTrivial
+     f1 (const NonTrivial i)
+     post(r: i.x > 0 )
+       { S2 s;
+ 	return s.f1(i);
+       }
+ 
+     template <typename T>
+     NonTrivial
+     f2 (const T i)
+     post(r: i.x > 0 )
+       { S2 s;
+ 	return s.f2(i);
+       }
+ 
+     auto
+     f3 (const NonTrivial i)
+     post(r: i.x > 0 )
+       { S2 s;
+ 	return s.f3(i);
+       }
+ 
+     template <typename T>
+     T
+     f4 (const T i)
+     post(r: i.x > 0 )
+       { S2 s;
+ 	return s.f4(i);
+       }
+ 
+     template <typename T>
+     auto
+     f5 (const T i)
+     post(r: i.x > 0 )
+       { S2 s;
+ 	return s.f5(i);
+       }
+ 
+   };
+ 
+ 
+ int main()
+ {
+   S s;
+   NonTrivial n;
+   s.f1(NonTrivial{});
+ 
+   s.f2(n);
+   s.f3(n);
+   s.f4(n);
+   s.f5(n);
+   s.f6(n);
+   s.f7(n);
+ 
+ 
+   S1<NonTrivial> s1;
+   s1.f1(n);
+   s1.f2(n);
+   s1.f3(n);
+   s1.f4(n);
+   s1.f5(n);
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/dcl.contract.res.p1.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/dcl.contract.res.p1.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/dcl.contract.res.p1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/dcl.contract.res.p1.C	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,23 ----
+ // N5008 :
+ // dcl.contract.res/p1
+ // The result-name-introducer of a postcondition-specifier is a declaration. The result-name-introducer introduces
+ // the identifier as the name of a result binding of the associated function. If a postcondition assertion has a
+ // result-name-introducer and the return type of the function is cv void, the program is ill-formed.
+ // { dg-do compile { target c++23 } }
+ // { dg-additional-options "-fcontracts" }
+ 
+ 
+ void f(const int i) post (r: i > 2); // { dg-error "function does not return a value to test" }
+ 
+ template <typename T>
+ void g() post (r: true ){}; // { dg-error "function does not return a value to test" }
+ 
+ template
+ void g<int>();
+ 
+ struct S{
+ 
+   S() post (r : true); // { dg-error "does not return a value to test" }
+   void f(const int i) post (r: i > 2); // { dg-error "function does not return a value to test" }
+   ~S() post (r : true); // { dg-error "does not return a value to test" }
+ };
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/dcl.contract.res.p2.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/dcl.contract.res.p2.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/dcl.contract.res.p2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/dcl.contract.res.p2.C	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,25 ----
+ // N5008 :
+ // dcl.contract.res/p2
+ // When the declared return type of a non-templated function contains a placeholder type, a postcondition-
+ // specifier with a result-name-introducer shall be present only on a definition.
+ // { dg-do compile { target c++23 } }
+ // { dg-additional-options "-fcontracts -fcontract-evaluation-semantic=observe " }
+ 
+ 
+ auto no_deduced_res_types_on_non_defs (int x) // { dg-error "postconditions with deduced result name types must only appear on function definitions" }
+   pre (x > 1)
+   post (r: r > 17); 
+ 
+ // =====
+ 
+ auto g(auto&)
+ post (r: r >= 0); // OK, g is a template.
+ 
+ auto f2() post (r : r > 0) // OK, type of r is deduced below.
+ { return 5; }
+ 
+ template <typename T>
+ auto f3 () post (r: r > 0); // OK, postcondition instantiated with template
+ 
+ auto f4 () post (true); // OK, return value not named
+ 
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/debug-and-opt.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/debug-and-opt.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/debug-and-opt.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/debug-and-opt.C	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,15 ----
+ // Check that we do not ICE with debug + optimisation.
+ // { dg-do run { target c++23 } }
+ // { dg-additional-options "-fcontracts -fcontract-evaluation-semantic=observe -O -g" }
+ 
+ 
+ int foo (const int i)
+   pre (i > 3)
+ {
+   return i;
+ }
+ 
+ int main()
+ {
+   foo (1);
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/deferred1.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/deferred1.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/deferred1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/deferred1.C	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,49 ----
+ // This case should be diagnosed, but we do not handl deferred contracts properly at the moment.
+ // For now, diagnose that we at least don't accidentally merge the contracts
+ // { dg-do run { target c++23 } }
+ // { dg-additional-options "-fcontracts -g3" }
+ #include <cassert>
+ struct contract
+ {
+   int checked = 0;
+ };
+ 
+ contract a, b;
+ 
+ bool
+ checkA ()
+ {
+   a.checked++;
+   return true;
+ }
+ 
+ bool
+ checkB ()
+ {
+   b.checked++;
+   return true;
+ }
+ 
+ void
+ clear_checks ()
+ {
+   a.checked = b.checked = 0;
+ 
+ }
+ 
+ struct S
+ {
+   friend int f1(S) post (checkB());
+   friend int f1(S) pre (checkA()){ return 1;};
+ };
+ 
+ 
+ int main()
+ {
+   S s;
+ 
+   clear_checks ();
+   f1(s);
+   assert (a.checked > 0);
+   assert (b.checked == 0);
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/definition-checks/contract-assert-no-def-check.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/definition-checks/contract-assert-no-def-check.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/definition-checks/contract-assert-no-def-check.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/definition-checks/contract-assert-no-def-check.C	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,25 ----
+ // Check that contract asserts are checked when the definition side contracts
+ // are turned off
+ // { dg-do run { target c++26 } }
+ // { dg-options "-fcontracts -fcontracts-definition-check=off -fcontract-evaluation-semantic=observe" }
+ 
+ #include <cstdlib>
+ 
+ bool terminating_check(){
+   std::exit(-1);
+   return true;
+ }
+ // pre and post check would cause termination
+ void foo(int i) noexcept pre(terminating_check()) post(terminating_check()) {
+ 
+     contract_assert(i > 4);
+ 
+ }
+ 
+ int main(int, char**)
+ {
+ 
+   foo(1);
+   return 0;
+ }
+ // { dg-output "contract violation in function void foo.int. at .*: i > 4.*(\n|\r\n|\r)" }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/dependent_contract.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/dependent_contract.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/dependent_contract.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/dependent_contract.C	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,32 ----
+ // check that dependent contract check does not cause an ICE
+ // { dg-do run { target c++23 } }
+ // { dg-additional-options "-fcontracts -fcontract-evaluation-semantic=observe " }
+ template <typename ST>
+ struct S{
+ 
+   int* check() const
+   {
+       static int i = 6;
+       return &i;
+   }
+ 
+   template <typename T>
+   T* tcheck(T) const{
+     static T t;
+     return nullptr;
+   }
+ 
+   void f() pre(check()) pre(tcheck(1)){
+   }
+ 
+   template <typename T>
+   void f(T t) pre(check()) pre(tcheck(1)) pre(tcheck<T>(t)){
+   }
+ 
+ };
+ 
+ int main() {
+     S<int> s;
+     s.f();
+     s.f(1);
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/empty-nt-param.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/empty-nt-param.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/empty-nt-param.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/empty-nt-param.C	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,42 ----
+ // check that we do not ICE with an empty nontrivial parameter
+ // { dg-do run { target c++23 } }
+ // { dg-additional-options "-fcontracts -fcontract-checks-outlined" }
+ 
+ struct NTClass {
+   NTClass(){};
+   NTClass(const NTClass&){}
+   ~NTClass(){};
+ };
+ 
+ struct Empty {};
+ 
+ void f (const NTClass i) pre (true){
+ }
+ 
+ void g (const Empty i) pre (true){
+ }
+ 
+ 
+ struct S {
+   void f (const NTClass i)
+     post ( true);
+ 
+   void g (const Empty i)
+     post ( true);
+ 
+ };
+ 
+ void
+ S::f (NTClass i){}
+ 
+ void
+ S::g (Empty i){}
+ 
+ int main(){
+ 
+   NTClass n;
+   f(n);
+   g(Empty{});
+ 
+ 
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/expr.prim.id.unqual.p7-2.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/expr.prim.id.unqual.p7-2.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/expr.prim.id.unqual.p7-2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/expr.prim.id.unqual.p7-2.C	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,65 ----
+ // N5008 [expr.prim.id.unqual]/p7
+ // Otherwise, if the unqualified-id appears in the predicate of a contract assertion C (6.10) and the entity is
+ // (7.1) — a variable declared outside of C of object type T,
+ // (7.2) — a variable or template parameter declared outside of C of type “reference to T”, or
+ // (7.3) — a structured binding of type T whose corresponding variable is declared outside of C,
+ // then the type of the expression is const T
+ // { dg-do compile { target c++23 } }
+ // { dg-additional-options "-fcontracts -fcontract-evaluation-semantic=enforce -O" }
+ 
+ struct S{
+   S(){};
+   S(const S&){}
+   ~S(){};
+   int x = 0;
+ };
+ 
+ int i = 3;
+ int *pi = &i;
+ int *pi2 = &i;
+ 
+ 
+ void f1() pre(i++) {} // { dg-error "increment of read-only location" }
+ void f2() pre((*pi)++) {};
+ void f3() pre(pi2++) {} // { dg-error "increment of read-only location" }
+ 
+ int a[2] = {1, 2};
+ auto [x, y] = a;
+ auto& [xr, yr] = a;
+ 
+ void f4() pre(x++) {} // { dg-error "increment of read-only location" }
+ void f5() pre(xr++) {}; // { dg-error "increment of read-only location" }
+ 
+ void f7(int x) pre([](int& i)
+ 	      {
+ 		return true;
+ 	      }(x)){} // { dg-error "discards qualifiers" }
+ // { dg-error {no match for call to} "" { target *-*-* } .-1 }
+ 
+ 
+ int g = 0;
+ struct X { bool m(); };
+ struct Y {
+   int z = 0;
+ 
+   void f(int i)  pre (++g); // { dg-error "increment of read-only location" }
+   void f2(int i) pre (++i); // { dg-error "increment of read-only location" }
+   void f3(int* p) pre (++(*p)); // OK
+   void f4(int& r) pre (++r); // { dg-error "increment of read-only location" }
+   void f5(X x) pre (x.m()); // { dg-error " argument discards qualifiers" }
+   void f6(X* px) pre (px->m()); // OK
+ 
+   template <int N, int& R, int* P>
+   void tf1() pre(++N); 	// { dg-error "increment of read-only location" }
+   // { dg-error {lvalue required as increment operand} "" { target *-*-* } .-1 }
+ 
+   template <int N, int& R, int* P>
+   void tf2() pre(++R);	// { dg-error "increment of read-only location" }
+ 
+   template <int N, int& R, int* P>
+   void tf3() pre(++(*P)); // OK
+ 
+   int h1() post(r : ++r); // { dg-error "increment of read-only" }
+ 
+   int& k() post(r : ++r); // { dg-error "increment of read-only" }
+ };
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/expr.prim.id.unqual.p7-3.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/expr.prim.id.unqual.p7-3.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/expr.prim.id.unqual.p7-3.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/expr.prim.id.unqual.p7-3.C	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,55 ----
+ // N5008 [expr.prim.id.unqual]/p7
+ // Otherwise, if the unqualified-id appears in the predicate of a contract assertion C (6.10) and the entity is
+ // (7.1) — a variable declared outside of C of object type T,
+ // (7.2) — a variable or template parameter declared outside of C of type “reference to T”, or
+ // (7.3) — a structured binding of type T whose corresponding variable is declared outside of C,
+ // then the type of the expression is const T
+ // This tests modifications to the constified things if checks are outlined
+ // { dg-do run { target c++26 } }
+ // { dg-additional-options "-fcontracts -fcontract-checks-outlined" }
+ // { dg-xfail-run-if "PRXXXXXX" { *-*-* } }
+ 
+ struct S{
+   S(){};
+   S(const S&){}
+   ~S(){};
+   int x = 0;
+ };
+ 
+ int i = 0;
+ 
+ 
+ void f1() pre(const_cast<int&>(i)++) {};
+ int f2(int n,const S m) pre(const_cast<int&>(n)++)
+ 			pre((const_cast<S&>(m).x = 5))
+ 			post(r: const_cast<int&>(r)++)
+ 			post(r: const_cast<int&>(r)++)
+ {
+   contract_assert (n == 3);
+   contract_assert (m.x == 5);
+ 
+   return 1;
+ };
+ 
+ 
+ S f3(S s) post(r: (const_cast<S&>(r).x = 10) )
+ {
+   return s;
+ }
+ 
+ int main()
+ {
+   i = 3;
+   f1();
+   contract_assert (i == 4);
+ 
+   int j = 2;
+   S s;
+   int k = f2(j,s);
+   contract_assert (k == 3);
+   contract_assert (s.x == 0);
+ 
+   s = f3(s);
+   contract_assert (s.x == 10);
+ 
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/expr.prim.id.unqual.p7-4.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/expr.prim.id.unqual.p7-4.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/expr.prim.id.unqual.p7-4.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/expr.prim.id.unqual.p7-4.C	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,57 ----
+ // N5008 [expr.prim.id.unqual]/p7
+ // Otherwise, if the unqualified-id appears in the predicate of a contract assertion C (6.10) and the entity is
+ // (7.1) — a variable declared outside of C of object type T,
+ // (7.2) — a variable or template parameter declared outside of C of type “reference to T”, or
+ // (7.3) — a structured binding of type T whose corresponding variable is declared outside of C,
+ // then the type of the expression is const T
+ // This tests modifications to the constified things
+ // { dg-do run { target c++23 } }
+ // { dg-additional-options "-fcontracts -fcontract-evaluation-semantic=observe -O2 -g" }
+ // { dg-xfail-run-if "PRXXXXXX" { *-*-* } { "-fcontract-checks-outlined" } "" }
+ 
+ #include <cassert>
+ 
+ struct S{
+   S(){};
+   S(const S&){}
+   ~S(){};
+   int x = 0;
+ };
+ 
+ int i = 0;
+ 
+ 
+ void f1() pre(const_cast<int&>(i)++) {};
+ int f2(int n,const S m) pre(const_cast<int&>(n)++)
+ 			pre((const_cast<S&>(m).x = 5))
+ 			post(r: const_cast<int&>(r)++)
+ 			post(r: const_cast<int&>(r)++)
+ {
+   assert (n == 3);
+   assert (m.x == 5);
+ 
+   return 1;
+ };
+ 
+ 
+ S f3(S s) post(r: (const_cast<S&>(r).x = 10) )
+ {
+   return s;
+ }
+ 
+ int main()
+ {
+   i = 3;
+   f1();
+   assert (i == 4);
+ 
+   int j = 2;
+   S s;
+   int k = f2(j,s);
+   assert (k == 3);
+   assert (s.x == 0);
+ 
+   s = f3(s);
+   assert (s.x == 10);
+ 
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/expr.prim.id.unqual.p7.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/expr.prim.id.unqual.p7.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/expr.prim.id.unqual.p7.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/expr.prim.id.unqual.p7.C	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,139 ----
+ // N5008 [expr.prim.id.unqual]/p7
+ // Otherwise, if the unqualified-id appears in the predicate of a contract assertion C (6.10) and the entity is
+ // (7.1) — a variable declared outside of C of object type T,
+ // (7.2) — a variable or template parameter declared outside of C of type “reference to T”, or
+ // (7.3) — a structured binding of type T whose corresponding variable is declared outside of C,
+ // then the type of the expression is const T
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-fcontracts" }
+ 
+ 
+ static_assert (__cpp_contracts >= 202502L);
+ 
+ int gi = 7;
+ int &gri = gi;
+ int *gpi = &gi;
+ 
+ bool f(int&&){ return true;}
+ int temporary(){ return 4;}
+ 
+ void f1(int i) pre(i++); // { dg-error "increment of read-only location" }
+ void f2(int &i) pre(i++); // { dg-error "increment of read-only location" }
+ void f3(int *i) pre(i++); // { dg-error "increment of read-only location" }
+ void f4(int *i) pre((*i)++); // ok, not deep const
+ void f5(int *i) pre(gi++); // { dg-error "increment of read-only location" }
+ void f6() pre(f(temporary())); // ok, lifetime started within pre condition
+ 
+ 
+ struct S{
+ 
+   int i;
+   mutable int mi;
+   int *pi = &i;
+   int &ri = i;
+   int &rmi = mi;
+   int *pmi = &mi;
+ 
+ 
+   void f(){
+     int array[2] = {1,2};
+     auto [sb1, sb2] = array;
+ 
+     contract_assert(i++); // { dg-error "increment of member" }
+     contract_assert(mi++); // ok, mutable
+     contract_assert(sb1++); // { dg-error "increment of read-only location" }
+ 
+ 
+     contract_assert(ri++); // ok, not deep const
+     contract_assert(rmi++); // ok, not deep const
+ 
+     contract_assert(pi++); // { dg-error "increment of member" }
+     contract_assert((*pi)++); // ok, not deep const
+ 
+ 
+     contract_assert(pmi++); // { dg-error "increment of member" }
+     contract_assert((*pmi)++); // ok, not deep const
+ 
+     contract_assert(gi++); // { dg-error "increment of read-only location" }
+     contract_assert(gpi++); // { dg-error "increment of read-only location" }
+     contract_assert((*gpi)++); // ok, not deep const
+   }
+ 
+ };
+ 
+ template <class T> void perfect_forward(T&& t) pre(++t) {} // { dg-error "increment of read-only" }
+ 
+ struct S2
+ {
+   int i = 0;
+   template <class Self> void perfect_forward(this Self&& self) pre(++self.i) {} // { dg-error "increment of member.*in read-only object" }
+ };
+ 
+ void template_related_tests()
+ {
+   int i = 0;
+   const int ci = 42;
+   perfect_forward(i);
+   perfect_forward(666);
+   perfect_forward(ci);
+   perfect_forward((const int&&) ci);
+   S2 s;
+   const S2 cs;
+   s.perfect_forward();
+   cs.perfect_forward();
+   S2().perfect_forward();
+   ((const S2&&)S2()).perfect_forward();
+ }
+ 
+ int n = 0;
+ struct X { bool m(); };
+ 
+ struct Y {
+   int z = 0;
+ 
+   void f(int i, int* p, int& r, X x, X* px)
+     pre (++n)       // { dg-error "increment of read-only location" }
+     pre (++i)       // { dg-error "increment of read-only location" }
+     pre (++(*p))    // OK
+     pre (++r)       // { dg-error "increment of read-only location" }
+     pre (x.m())     // { dg-error "discards qualifiers" }
+     pre (px->m());  // OK
+ 
+   template <int N, int& R, int* P>
+   void g()
+     pre(++N)        // { dg-error "increment of read-only location" }
+     // { dg-error {lvalue required as increment operand} "" { target *-*-* } .-1 }
+     pre(++R)        // { dg-error "increment of read-only location" }
+     pre(++(*P));    // OK
+ 
+   int& k()
+     post(r : ++r);  // { dg-error "increment of read-only location" }
+ };
+ 
+ int main()
+ {
+   int i;
+   contract_assert(i++); // { dg-error "increment of read-only location" }
+   i = 5;
+ 
+   int& ri = i;
+   contract_assert(ri++); // { dg-error "increment of read-only location" }
+   ri = 6;
+ 
+   contract_assert(gi++); // { dg-error "increment of read-only location" }
+   contract_assert(gri++); // { dg-error "increment of read-only location" }
+ 
+   int& rgi = gi;
+   contract_assert(rgi++); // { dg-error "increment of read-only location" }
+   rgi = 6;
+ 
+ 
+   int *pi= &i;
+   contract_assert(pi++); // { dg-error "increment of read-only location" }
+   contract_assert((*pi)++); // ok, not deep const
+ 
+   contract_assert(i == 4 ? i : i ); // ok, no name clash
+ 
+ 
+   return 0;
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/function-contract-specifier-seq-error.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/function-contract-specifier-seq-error.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/function-contract-specifier-seq-error.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/function-contract-specifier-seq-error.C	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,50 ----
+ // generic function-contract-specifier-seq parsing checks
+ // N5008
+ // function-contract-specifier-seq :
+ //  	function-contract-specifier function-contract-specifier-seq opt
+ // function-contract-specifier :
+ //	precondition-specifier
+ // 	postcondition-specifier
+ // precondition-specifier : pre attribute-specifier-seq opt ( conditional-expression )
+ // postcondition-specifier :
+ //	post attribute-specifier-seq opt ( result-name-introducer opt conditional-expression )
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-fcontracts" }
+ 
+ int f(int);
+ int g1(int a) pre(f(a) > a) pre (true) post(false) pre(f(1) > 4)
+ {
+ 	int r = a - f(a);
+ 	return 2 * r;
+ }
+ 
+ int fun(int n)  pre (n > 0 );
+ void fun2(int n)  pre  n > 0 ; // { dg-error {expected '\(' before } }
+  // { dg-error {expected '\)' before ';' token} "" { target *-*-* } .-1 }
+ void fun2(int n)  pre (: n > 0 ]]; // { dg-error  }
+ 
+ int main()
+ {
+   int x;
+ 
+   contract_assert ( x >= 0 );
+ 
+   contract_assert ( x > 0 ? true : false );
+   contract_assert ( x < 0 ? true : false );
+ 
+   contract_assert ( x = 0 ); // { dg-error {expected '\)' before '=' token} }
+  // { dg-error {expected .;. before '=' token} "" { target *-*-* } .-1 }
+  // { dg-error {expected primary-expression before '=' token} "" { target *-*-* } .-2 }
+ 
+   contract_assert ( y == 0 ); // { dg-error ".y. was not declared in this scope" }
+ 
+   return 0;
+ }
+ 
+ struct Baz
+ {
+   void f(int x) pre(x = 0); // { dg-error "expected conditional-expression" }
+   void g(int x) pre(x, x); // { dg-error "expected conditional-expression" }
+   void h(const int x) post(x = 0); // { dg-error "expected conditional-expression" }
+   void i(const int x) post(x, x); // { dg-error "expected conditional-expression" }
+ };
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/function-contract-specifier-seq.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/function-contract-specifier-seq.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/function-contract-specifier-seq.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/function-contract-specifier-seq.C	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,122 ----
+ // generic function-contract-specifier-seq parsing checks
+ // N5008
+ // function-contract-specifier-seq :
+ //  	function-contract-specifier function-contract-specifier-seq opt
+ // function-contract-specifier :
+ //	precondition-specifier
+ // 	postcondition-specifier
+ // precondition-specifier : pre attribute-specifier-seq opt ( conditional-expression )
+ // postcondition-specifier :
+ //	post attribute-specifier-seq opt ( result-name-introducer opt conditional-expression )
+ // { dg-do compile { target c++23 } }
+ // { dg-additional-options "-fcontracts" }
+ // { dg-additional-options "-fcontracts" }
+ 
+ static_assert (__cpp_contracts >= 202502L);
+ 
+ void f(int i) pre (i>3);
+ 
+ int g(int j) post (r:r>4) pre (j !=0);
+ 
+ namespace parsing_basic_test {
+   int f(const int x)
+   pre (x >= 0)
+   post (r: r > x); // r is the return value
+ 
+   struct A {
+     bool empty() const noexcept;
+     void clear()
+       post (empty()); // return value is optional
+   };
+ }
+ 
+ namespace parsing_trailing_return_type_test {
+   auto f() -> int pre(true);
+ 
+   struct S1 {
+     auto g() const & noexcept -> int
+       pre(true);
+   };
+ }
+ 
+ 
+ namespace parsing_lambda_test {
+   auto f1 = [] (int x)
+     pre(x > 0) { return x * x; };
+ 
+   auto f2 = [] (int x) -> int
+     pre(x > 0) { return x * x; };
+ }
+ 
+ namespace parsing_pre_post_names_test {
+   void f(bool pre, bool post)
+   pre(pre) pre(post);
+ }
+ 
+ namespace parsing_requires_clause_test {
+   template <typename T> concept C = true;
+ 
+   template <typename T>
+   auto g(T x) -> bool
+     requires C<T>
+     pre (x > 0);
+ }
+ 
+ namespace parsing_ambig1_test {
+   const bool a = true;
+   using pre = int;
+ 
+   auto f() -> pre pre(a);
+   // pre is the return type, pre(a) the precondition
+ }
+ 
+ namespace parsing_ambig2_test {
+   const bool a = true;
+   template <typename T> struct pre {};
+   using post = int;
+ 
+   auto g() -> pre<post> pre(a);
+   // pre<post> is the return type, pre(a) the precondition
+ }
+ 
+ namespace parsing_ambig3_test {
+   constexpr bool a = true;
+   constexpr bool pre(bool) { return true; }
+ 
+   template <typename T>
+   void f1() requires (pre(a));
+   // just a requires clause, no postcondition
+ 
+   using b = bool;
+ 
+   template <typename T>
+   void f2() requires ((b)pre(a));
+   // just a requires clause, no postcondition
+ 
+   template <typename T>
+   void f3() requires (a) pre(a);
+   // pre(a) is a postcondition
+ }
+ 
+ namespace parsing_ambig_test4 {
+   constexpr int a = 1;
+   constexpr int b = 2;
+   constexpr int c = 0;
+   constexpr int pre(int i) { return i; }
+ 
+   template <typename T>
+   void f() requires (a < b > pre(c));
+   // just a requires clause, no postcondition
+ 
+   template <typename T> constexpr bool d = true;
+   using e = char;
+ 
+   template <typename T>
+   void g() requires d < e > pre(c);
+   // d<e> is a bool variable template, pre(c) is the precondition
+ 
+ 
+   template <typename T>
+   void f() requires (a < b > pre(c));
+   // just a requires clause, no postcondition
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/intro.compliance.general.p2.3.4.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/intro.compliance.general.p2.3.4.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/intro.compliance.general.p2.3.4.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/intro.compliance.general.p2.3.4.C	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,13 ----
+ // intro.compliance.general/2.34
+ // a contract assertion ([basic.contract.eval]) evaluated with a checking
+ // semantic in a manifestly constant-evaluated context ([expr.const])
+ // resulting in a contract violation...
+ // ... shall issue at least one diagnostic message.
+ // { dg-do compile { target c++23 } }
+ // { dg-additional-options "-fcontracts -fcontract-evaluation-semantic=observe " }
+ 
+ consteval void foo( auto x ) pre( false ) {}
+ // { dg-warning {contract predicate is false in constant expression} "" { target *-*-* } .-1 }
+ int main() {
+   foo( 42 );
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/lambda.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/lambda.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/lambda.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/lambda.C	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,5 ----
+ // check that we do not crash when capturing a constified entity in a contract assertion lambda
+ // { dg-do compile { target c++23 } }
+ // { dg-additional-options "-fcontracts -fcontract-evaluation-semantic=observe " }
+ void f(int i, int j) pre( [i, &j](){ return true;} ( ))
+ {}
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/name_mangling.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/name_mangling.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/name_mangling.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/name_mangling.C	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,15 ----
+ // check that we do not have conflicts with post condition that includes a return value
+ // identifier and post condition on an identically named void function with the
+ // additional parameter that matches the returen value of the first function
+ // { dg-do run { target c++23 } }
+ // { dg-additional-options "-fcontracts -fcontract-evaluation-semantic=observe " }
+ 
+ 
+ int f() post(r:r>1){ return 2;}
+ void f(int i) post(true){ }
+ 
+ int main() {
+ 
+   f();
+   f(2);
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/non-trivial-ice.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/non-trivial-ice.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/non-trivial-ice.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/non-trivial-ice.C	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,21 ----
+ // Test that there is no ICE with outlined contracts, caller side checks and
+ // Nontrivial types in inlined precondition checks
+ // { dg-do compile { target c++23 } }
+ // { dg-options "-fcontracts -fcontracts-client-check=all" }
+ struct NonTrivial{
+   NonTrivial(){};
+   NonTrivial(const NonTrivial&){}
+   ~NonTrivial(){};
+   int x = 0;
+ };
+ 
+ void f(const NonTrivial s) pre(s.x >0);
+ 
+ void f(const NonTrivial g) {};
+ 
+ 
+ int main()
+ {
+   NonTrivial nt;
+   f(nt);
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/outline-checks/freefunc-noexcept-post.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/outline-checks/freefunc-noexcept-post.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/outline-checks/freefunc-noexcept-post.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/outline-checks/freefunc-noexcept-post.C	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,46 ----
+ // Throwing violation handler in a pre/post check on a noexcept function
+ // behaves as if the function exited via an exception.
+ // This tests the behaviour of a pre condition on a member function
+ // { dg-do run { target c++26 } }
+ // { dg-additional-options "-fcontracts -fcontract-evaluation-semantic=observe -fcontract-checks-outlined" }
+ 
+ #include <contracts>
+ #include <exception>
+ #include <cstdlib>
+ 
+ struct MyException{};
+ 
+ // Test that there is an active exception when we reach the terminate handler.
+ void my_term()
+ {
+   try { throw; }
+   catch(MyException) { std::exit(0); }
+ }
+ 
+ 
+ void handle_contract_violation(const std::contracts::contract_violation& violation)
+ {
+   throw MyException{};
+ }
+ 
+ void f(const int x) noexcept post(x>1)
+ {
+   try{
+    int i = 1;
+   }
+   catch(...) {
+   }
+ }
+ 
+ int main()
+ {
+   std::set_terminate (my_term);
+   try
+   {
+       f(-42);
+   } catch (...) {
+   }
+   // We should not get here
+   return 1;
+ 
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/outline-checks/freefunc-noexcept-pre.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/outline-checks/freefunc-noexcept-pre.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/outline-checks/freefunc-noexcept-pre.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/outline-checks/freefunc-noexcept-pre.C	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,46 ----
+ // Throwing violation handler in a pre/post check on a noexcept function
+ // behaves as if the function exited via an exception.
+ // This tests the behaviour of a pre condition on a member function
+ // { dg-do run { target c++26 } }
+ // { dg-additional-options "-fcontracts -fcontract-evaluation-semantic=observe -fcontract-checks-outlined" }
+ 
+ #include <contracts>
+ #include <exception>
+ #include <cstdlib>
+ 
+ struct MyException{};
+ 
+ // Test that there is an active exception when we reach the terminate handler.
+ void my_term()
+ {
+   try { throw; }
+   catch(MyException) { std::exit(0); }
+ }
+ 
+ 
+ void handle_contract_violation(const std::contracts::contract_violation& violation)
+ {
+   throw MyException{};
+ }
+ 
+ void f(int x) noexcept pre(x>1)
+ {
+   try{
+    int i = 1;
+   }
+   catch(...) {
+   }
+ }
+ 
+ int main()
+ {
+   std::set_terminate (my_term);
+   try
+   {
+       f(-42);
+   } catch (...) {
+   }
+   // We should not get here
+   return 1;
+ 
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/outline-checks/func-noexcept-assert.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/outline-checks/func-noexcept-assert.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/outline-checks/func-noexcept-assert.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/outline-checks/func-noexcept-assert.C	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,55 ----
+ // Throwing violation handler in an assert check in a noexcept function
+ // can be caught by the function.
+ // { dg-do run { target c++26 } }
+ // { dg-additional-options "-fcontracts -fcontract-evaluation-semantic=observe -fcontract-checks-outlined" }
+ 
+ #include <contracts>
+ #include <exception>
+ #include <cstdlib>
+ 
+ struct MyException{};
+ 
+ 
+ void handle_contract_violation(const std::contracts::contract_violation& violation)
+ {
+   throw MyException{};
+ }
+ 
+ void free_f(const int x) {
+   try {
+ 	  contract_assert(x>1);
+ 	  int i = 1;
+   }
+   catch(...){}
+ }
+ 
+ struct X
+ {
+     void f(const int x) {
+       try {
+ 	  contract_assert(x>1);
+ 	  int i = 1;
+       }
+       catch(...){}
+     }
+ 
+     virtual void virt_f(const int x) {
+       try {
+ 	  contract_assert(x>1);
+ 	  int i = 1;
+       }
+       catch(...){}
+     }
+ 
+ };
+ 
+ int main()
+ {
+   free_f(-42);
+ 
+   X x;
+   x.f(-42);
+   x.virt_f(-42);
+ 
+ 
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/outline-checks/memberfunc-noexcept-post.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/outline-checks/memberfunc-noexcept-post.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/outline-checks/memberfunc-noexcept-post.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/outline-checks/memberfunc-noexcept-post.C	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,49 ----
+ // Throwing violation handler in a pre/post check on a noexcept function
+ // behaves as if the function exited via an exception.
+ // This tests the behaviour of a post condition on a member function
+ // { dg-do run { target c++26 } }
+ // { dg-additional-options "-fcontracts -fcontract-evaluation-semantic=observe -fcontract-checks-outlined" }
+ 
+ #include <contracts>
+ #include <exception>
+ #include <cstdlib>
+ 
+ struct MyException{};
+ 
+ // Test that there is an active exception when we reach the terminate handler.
+ void my_term()
+ {
+   try { throw; }
+   catch(MyException) { std::exit(0); }
+ }
+ 
+ 
+ void handle_contract_violation(const std::contracts::contract_violation& violation)
+ {
+   throw MyException{};
+ }
+ 
+ struct X
+ {
+     void f(const int x) noexcept post(x>1) {
+       try{
+        int i = 1;
+       }
+       catch(...) {
+       }
+     }
+ };
+ 
+ int main()
+ {
+   std::set_terminate (my_term);
+   try
+   {
+       X x;
+       x.f(-42);
+   } catch (...) {
+   }
+   // We should not get here
+   return 1;
+ 
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/outline-checks/memberfunc-noexcept-pre.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/outline-checks/memberfunc-noexcept-pre.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/outline-checks/memberfunc-noexcept-pre.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/outline-checks/memberfunc-noexcept-pre.C	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,49 ----
+ // Throwing violation handler in a pre/post check on a noexcept function
+ // behaves as if the function exited via an exception.
+ // This tests the behaviour of a pre condition on a member function
+ // { dg-do run { target c++26 } }
+ // { dg-additional-options "-fcontracts -fcontract-evaluation-semantic=observe -fcontract-checks-outlined" }
+ 
+ #include <contracts>
+ #include <exception>
+ #include <cstdlib>
+ 
+ struct MyException{};
+ 
+ // Test that there is an active exception when we reach the terminate handler.
+ void my_term()
+ {
+   try { throw; }
+   catch(MyException) { std::exit(0); }
+ }
+ 
+ 
+ void handle_contract_violation(const std::contracts::contract_violation& violation)
+ {
+   throw MyException{};
+ }
+ 
+ struct X
+ {
+     void f(int x) noexcept pre(x>1) {
+       try{
+        int i = 1;
+       }
+       catch(...) {
+       }
+     }
+ };
+ 
+ int main()
+ {
+   std::set_terminate (my_term);
+   try
+   {
+       X x;
+       x.f(-42);
+   } catch (...) {
+   }
+   // We should not get here
+   return 1;
+ 
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/over.call.func.p3.1.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/over.call.func.p3.1.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/over.call.func.p3.1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/over.call.func.p3.1.C	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,36 ----
+ // N5008 :
+ // [over.call.func/p3.1
+ // if the unqualified function call appears in a precondition assertion of a constructor or a postcondition
+ // assertion of a destructor and overload resolution selects a non-static member function, the call is
+ // ill-formed;
+ // { dg-do compile { target c++23 } }
+ // { dg-additional-options "-fcontracts" }
+ 
+ struct S{
+   bool f();
+   bool k;
+   S() pre(&k); // { dg-error "required when accessing a member" }
+   ~S()post(&f());  // { dg-error "required when accessing a member" }
+   S(int i) pre(&(this->k))
+       pre([](){
+             struct SIn{
+               bool i = true;
+               bool f()  const pre(i) { return i;}
+               SIn() pre(&i){}; // { dg-error "required when accessing a member" }
+               ;
+             };
+             SIn sin;
+             return sin.f();
+   }());
+ };
+ 
+ struct S2{
+   bool f() const { return true;}
+   bool i = true;
+   bool k = true;
+   S2() pre(&(this->k) != &(this->i)) post(i) {};
+   ~S2() pre(f()){};
+ };
+ int main()
+ {
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/pr113968.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/pr113968.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/pr113968.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/pr113968.C	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,23 ----
+ // check that an invalid contract condition doesn't cause an ICE
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-fcontracts" }
+ struct A {
+   A(A &);
+ };
+ struct S{
+   void f(A a) pre(a) // { dg-error "could not convert" }
+               pre(a.b) // { dg-error "has no member" }
+   {
+ 
+   }
+ };
+ void f(A a) pre(a) // { dg-error "could not convert" }
+ 	    pre(a.b) // { dg-error "has no member" }
+ 	    {
+   contract_assert(a); // { dg-error "could not convert" }
+   contract_assert(a.b); // { dg-error "has no member" }
+ }
+ 
+ int main()
+ {
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/src-loc-0.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/src-loc-0.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/src-loc-0.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/src-loc-0.C	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,18 ----
+ // { dg-do run { target c++23 } }
+ // { dg-additional-options "-fcontracts -fcontract-evaluation-semantic=observe " }
+ 
+ // Test source location without including <source_location>
+ 
+ int
+ foo (int x)
+   pre ( x > 10 )
+ {
+   return x - 9;
+ }
+ 
+ int main ()
+ {
+   foo (9);
+ }
+ 
+ // { dg-output "contract violation in function int foo.int. at .*:8: x > 10.*(\n|\r\n|\r)" }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/src-loc-1.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/src-loc-1.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/src-loc-1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/src-loc-1.C	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,18 ----
+ // { dg-do run { target c++23 } }
+ // { dg-additional-options "-fcontracts -fcontract-evaluation-semantic=observe " }
+ // Test source location with #include <source_location>
+ #include <source_location>
+ 
+ int
+ foo (int x)
+   pre ( x > 10 )
+ {
+   return x - 9;
+ }
+ 
+ int main ()
+ {
+   foo (9);
+ }
+ 
+ // { dg-output "contract violation in function int foo.int. at .*:8: x > 10.*(\n|\r\n|\r)" }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/src-loc-2.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/src-loc-2.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/src-loc-2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/src-loc-2.C	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,20 ----
+ // { dg-do run { target c++23 } }
+ // { dg-additional-options "-fcontracts -fcontract-evaluation-semantic=observe " }
+ 
+ // Test source location with a late inclusion of <source_location>
+ 
+ int
+ foo (int x)
+   pre ( x > 10 )
+ {
+   return x - 9;
+ }
+ 
+ #include <source_location>
+ 
+ int main ()
+ {
+   foo (9);
+ }
+ 
+ // { dg-output "contract violation in function int foo.int. at .*:8: x > 10.*(\n|\r\n|\r)" }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/throwing-violation-handler.cc gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/throwing-violation-handler.cc
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/throwing-violation-handler.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/throwing-violation-handler.cc	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,23 ----
+ #include <contracts>
+ 
+ void handle_contract_violation(const std::contracts::contract_violation&)
+ {
+   throw 666;
+ }
+ 
+ /* ODR hack to the hilt - f is actually noexcept, and has a contract.
+    We do this to avoid the call site knowing that, so that we verify
+    that the function terminates when it calls the throwing handler
+    that we use above. */
+ int f(int);
+ 
+ extern bool f_result;
+ 
+ void g()
+ {
+   try {
+     f(-42);
+   } catch (...) {
+     f_result = false;
+   }
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/unused_warning.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/unused_warning.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/unused_warning.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/unused_warning.C	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,25 ----
+ // check that we do not get unused warnings for contract check function parameters
+ // { dg-do compile { target c++23 } }
+ // { dg-additional-options "-fcontracts -fcontract-evaluation-semantic=enforce  -Wall -Wextra" }
+ 
+ struct TimeInterval{
+   int i = 4;
+   void addInterval(int i, int j);
+ };
+ 
+ TimeInterval operator-(const TimeInterval& lhs, const TimeInterval& rhs)
+     pre(2 != rhs.i);
+ 
+ inline
+ TimeInterval operator-(const TimeInterval& lhs,
+                                    const TimeInterval& rhs)
+ 
+ {
+     TimeInterval result(lhs);
+     result.addInterval(-rhs.i, -rhs.i);
+     return result;
+ }
+ 
+ int main(int, char**) {
+ 
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/vaargs.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/vaargs.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp26/vaargs.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp26/vaargs.C	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,35 ----
+ // Check contract assertion on a vaarg function
+ // { dg-do run { target c++23 } }
+ // { dg-additional-options "-fcontracts -fcontract-evaluation-semantic=enforce " }
+ #include <stdio.h>
+ #include <stdarg.h>
+ int simple_printf(const char* fmt, ...) pre (fmt != 0) post (r: r > 0)
+ {
+     va_list args;
+     va_start(args, fmt);
+ 
+     while (*fmt != '\0') {
+         if (*fmt == 'd') {
+             int i = va_arg(args, int);
+             printf("%d\n", i);
+         } else if (*fmt == 'c') {
+             // A 'char' variable will be promoted to 'int'
+             // A character literal in C is already 'int' by itself
+             int c = va_arg(args, int);
+             printf("%c\n", c);
+         } else if (*fmt == 'f') {
+             double d = va_arg(args, double);
+             printf("%f\n", d);
+         }
+         ++fmt;
+     }
+ 
+     va_end(args);
+ 
+     return 6;
+ }
+ 
+ int main()
+ {
+     simple_printf("dcff", 3, 'a', 1.999, 42.5);
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp2a/check-err.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp2a/check-err.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/cpp2a/check-err.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/cpp2a/check-err.C	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,18 ----
+ // test that attribute syntax is no longer recognized
+ // { dg-do compile { target c++20 } }
+ // { dg-additional-options "-fcontracts" }
+ 
+ int fun(int n)  [[ pre : n > 0 ]]; // { dg-error {expected ']' before ':' token} }
+ // { dg-warning {'pre' attribute directive ignored} "" { target *-*-* } .-1 }
+ int fun2(const int n)  [[ post : n > 0 ]]; // { dg-error {expected ']' before ':' token} }
+ // { dg-warning {'post' attribute directive ignored} "" { target *-*-* } .-1 }
+ 
+ int main()
+ {
+   int x;
+ 
+   [[assert: x >= 0]]; // { dg-error {expected ']' before ':' token} }
+   // { dg-warning {attributes at the beginning of statement are ignored} "" { target *-*-* } .-1 }
+ 
+   return 0;
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/except_preload_handler/Makefile gcc-16-20260201/gcc/testsuite/g++.dg/contracts/except_preload_handler/Makefile
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/except_preload_handler/Makefile	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/except_preload_handler/Makefile	Thu Jan  1 00:00:00 1970
***************
*** 1,13 ****
- CXXFLAGS=--std=c++17 -fcontract-continuation-mode=on
- 
- default: assert_fail libhandle_contract_violation.so
- 
- run: default
- 	LD_PRELOAD=./libhandle_contract_violation.so ./assert_fail
- 
- ./libhandle_contract_violation.so: ./handle_contract_violation.cpp
- 	${CXX} ${CXXFLAGS} -shared -fPIC -o $@ $<
- 
- clean:
- 	rm -fr ./*.o ./libhandle_contract_violation.so ./assert_fail
- 
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/except_preload_handler/README gcc-16-20260201/gcc/testsuite/g++.dg/contracts/except_preload_handler/README
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/except_preload_handler/README	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/except_preload_handler/README	Thu Jan  1 00:00:00 1970
***************
*** 1,13 ****
- build and install gcc to $prefix, then run:
- LD_LIBRARY_PATH=$prefix/lib64 CXX=$prefix/bin/g++ make run
- 
- this test has a custom handle_contract_violation that throws an exception
- this test is built with -fcontract-continuation-mode=on
- 
- since 1) our fun() is not marked noexcept and 2) the continue mode is set to
- on, we expect the exception thrown within the contract violation handler to
- propagate back up into the catch block located in main()
- 
- expected output therefore ends in:
- 	synth caught indirect: -1
- 
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/except_preload_handler/assert_fail.cpp gcc-16-20260201/gcc/testsuite/g++.dg/contracts/except_preload_handler/assert_fail.cpp
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/except_preload_handler/assert_fail.cpp	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/except_preload_handler/assert_fail.cpp	Thu Jan  1 00:00:00 1970
***************
*** 1,20 ****
- #include <iostream>
- #include <contract>
- 
- int fun() {
- 	int x = 0;
- 	[[ assert: x < 0 ]];
- 
- 	return 0;
- }
- 
- int main(int argc, char**) {
- 	try {
- 		fun();
- 	} catch(int &ex) {
- 		std::cerr << "synth caught indirect: " << ex << std::endl;
- 	}
- 
- 	return 0;
- }
- 
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/except_preload_handler/handle_contract_violation.cpp gcc-16-20260201/gcc/testsuite/g++.dg/contracts/except_preload_handler/handle_contract_violation.cpp
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/except_preload_handler/handle_contract_violation.cpp	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/except_preload_handler/handle_contract_violation.cpp	Thu Jan  1 00:00:00 1970
***************
*** 1,14 ****
- #include <iostream>
- #include <contract>
- 
- void handle_contract_violation(const std::contract_violation &violation) {
-   std::cerr << "custom handle_contract_violation: " << std::endl
-     << " line_number: " << violation.line_number() << std::endl
-     << " file_name: " << violation.file_name() << std::endl
-     << " function_name: " << violation.function_name() << std::endl
-     << " comment: " << violation.comment() << std::endl
-     << " assertion_level: " << violation.assertion_level() << std::endl
-     << std::endl;
-   throw -1;
- }
- 
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/noexcept_preload_handler/Makefile gcc-16-20260201/gcc/testsuite/g++.dg/contracts/noexcept_preload_handler/Makefile
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/noexcept_preload_handler/Makefile	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/noexcept_preload_handler/Makefile	Thu Jan  1 00:00:00 1970
***************
*** 1,13 ****
- CXXFLAGS=--std=c++17 -fcontract-continuation-mode=on
- 
- default: assert_fail libhandle_contract_violation.so
- 
- run: default
- 	LD_PRELOAD=./libhandle_contract_violation.so ./assert_fail
- 
- ./libhandle_contract_violation.so: ./handle_contract_violation.cpp
- 	${CXX} ${CXXFLAGS} -shared -fPIC -o $@ $<
- 
- clean:
- 	rm -fr ./*.o ./libhandle_contract_violation.so ./assert_fail
- 
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/noexcept_preload_handler/README gcc-16-20260201/gcc/testsuite/g++.dg/contracts/noexcept_preload_handler/README
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/noexcept_preload_handler/README	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/noexcept_preload_handler/README	Thu Jan  1 00:00:00 1970
***************
*** 1,15 ****
- build and install gcc to $prefix, then run:
- LD_LIBRARY_PATH=$prefix/lib64 CXX=$prefix/bin/g++ make run
- 
- this test has a custom handle_contract_violation that throws an exception
- this test is built with -fcontract-continuation-mode=on
- 
- since 1) our fun() *IS* marked noexcept even though 2) the continue mode is
- set to on, we expect the exception thrown within the contract violation
- handler to quashed and have std::terminate run.
- 
- expected output therefore ends in:
- 	terminate called after throwing an instance of 'int'
- 
- despite there being a catch(int &) handler in main
- 
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/noexcept_preload_handler/assert_fail.cpp gcc-16-20260201/gcc/testsuite/g++.dg/contracts/noexcept_preload_handler/assert_fail.cpp
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/noexcept_preload_handler/assert_fail.cpp	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/noexcept_preload_handler/assert_fail.cpp	Thu Jan  1 00:00:00 1970
***************
*** 1,20 ****
- #include <iostream>
- #include <contract>
- 
- int fun() noexcept {
- 	int x = 0;
- 	[[ assert: x < 0 ]];
- 
- 	return 0;
- }
- 
- int main(int argc, char**) {
- 	try {
- 		fun();
- 	} catch(int &ex) {
- 		std::cerr << "synth caught indirect: " << ex << std::endl;
- 	}
- 
- 	return 0;
- }
- 
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/noexcept_preload_handler/handle_contract_violation.cpp gcc-16-20260201/gcc/testsuite/g++.dg/contracts/noexcept_preload_handler/handle_contract_violation.cpp
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/noexcept_preload_handler/handle_contract_violation.cpp	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/noexcept_preload_handler/handle_contract_violation.cpp	Thu Jan  1 00:00:00 1970
***************
*** 1,14 ****
- #include <iostream>
- #include <contract>
- 
- void handle_contract_violation(const std::contract_violation &violation) {
-   std::cerr << "custom handle_contract_violation: " << std::endl
-     << " line_number: " << violation.line_number() << std::endl
-     << " file_name: " << violation.file_name() << std::endl
-     << " function_name: " << violation.function_name() << std::endl
-     << " comment: " << violation.comment() << std::endl
-     << " assertion_level: " << violation.assertion_level() << std::endl
-     << std::endl;
-   throw -1;
- }
- 
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/pr110159.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/pr110159.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/pr110159.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/pr110159.C	Thu Jan  1 00:00:00 1970
***************
*** 1,28 ****
- // check that contracts can be handled even when exceptions are disabled
- // { dg-do run }
- // { dg-options "-std=c++2a -fcontracts -fno-exceptions " }
- // { dg-skip-if "requires hosted libstdc++ for stdc++exp" { ! hostedlib } }
- // { dg-output "contract violation in function f at .* a<5" }
- 
- #include <exception>
- #include <cstdlib>
- 
- int terminate_called = 0;
- void my_term()
- {
-     std::exit(0);
- }
- 
- 
- void f(int a)
-   [[ pre : a<5 ]]
-   {
-   }
- 
- int
- main ()
- {
-   std::set_terminate (my_term);
-   f(3);
-   f(10);
- }
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/pr113968.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/pr113968.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/pr113968.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/pr113968.C	Thu Jan  1 00:00:00 1970
***************
*** 1,29 ****
- // check that an invalid contract condition doesn't cause an ICE
- // { dg-do compile }
- // { dg-options "-std=c++2a -fcontracts " }
- 
- struct A
- {
-   A (A&);
- };
- struct S
- {
-   void f(A a)
-     [[ pre : a]] // { dg-error "could not convert" }
-     [[ pre : a.b]]// { dg-error "has no member" }
-     {
- 
-     }
- };
- void f(A a)
-   [[ pre : a]] // { dg-error "could not convert" }
-   [[ pre : a.b]]// { dg-error "has no member" }
-   {
-     [[ assert : a ]]; // { dg-error "could not convert" }
-     [[ assert : a.b ]];// { dg-error "has no member" }
-   }
- 
- int
- main ()
- {
- }
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/pr115434.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/pr115434.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/pr115434.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/pr115434.C	Thu Jan  1 00:00:00 1970
***************
*** 1,17 ****
- // We were failing to apply post conditions to void functions.
- 
- // { dg-do run }
- // { dg-options "-std=c++20 -fcontracts -fcontract-continuation-mode=on" }
- // { dg-skip-if "requires hosted libstdc++ for stdc++exp" { ! hostedlib } }
- 
- 
- void foo (const int b)
- [[ post: b == 9 ]]  // contract not checked
- {}
- 
- int main()
- {
-    foo(3);
- }
- 
- // { dg-output "contract violation in function foo at .*.C:9: b == 9.*(\n|\r\n|\r)" }
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/pr116490.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/pr116490.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/pr116490.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/pr116490.C	Thu Jan  1 00:00:00 1970
***************
*** 1,57 ****
- // ICE in explicit instantiation of a function with contracts
- // { dg-do run }
- // { dg-options "-std=c++20 -fcontracts -fcontract-continuation-mode=on" }
- // { dg-skip-if "required hosted libstdc++ for stdc++exp" { ! hostedlib } }
- 
- template<class T>
- void foo(T t)
- [[pre : t == 9 ]] {
- }
- 
- template void foo<int>(int i);
- 
- 
- template<class T>
- struct templateS
- {
-   void fooS(T t)
-   [[pre : t == 9 ]] {
-   }
- };
- 
- template struct templateS<int>;
- 
- 
- struct S {
- 
-   template<class T>
-   void fooS(T t)
-   [[pre : t == 9 ]] {
-   }
- 
-   template<class T>
-   static void fooStatic(T t)
-   [[pre : t == 9 ]] {
-   }
- };
- 
- template void S::fooS<int>(int i);
- 
- template void S::fooStatic<int>(int i);
- 
- int main()
- {
-    foo(3);
- 
-    templateS<int> ts;
-    ts.fooS(3);
- 
-    S s;
-    s.fooS(3);
-    S::fooStatic(3);
- }
- 
- // { dg-output "contract violation in function foo<int> at .* t == 9.*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function templateS<int>::fooS at .* t == 9.*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function S::fooS<int> at .* t == 9.*(\n|\r\n|\r)" }
- // { dg-output "contract violation in function S::fooStatic<int> at .* t == 9.*(\n|\r\n|\r)" }
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/pr116607.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/pr116607.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/pr116607.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/pr116607.C	Thu Jan  1 00:00:00 1970
***************
*** 1,6 ****
- // { dg-options "-std=c++20 -fcontracts " }
- struct a {
-   __attribute__((no_sanitize("")))
-   int f(int) [[pre:true]];
- };
- int a::f(int) { return 0; }
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/pr117579.C gcc-16-20260201/gcc/testsuite/g++.dg/contracts/pr117579.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/pr117579.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/pr117579.C	Thu Jan  1 00:00:00 1970
***************
*** 1,9 ****
- // Check that contract assertion on a non-empty statement doesn't cause an
- // ICE.
- // { dg-options "-std=c++2a -fcontracts " }
- 
- void f();
- int main ()
- {
-   [[assert: true]] f(); // { dg-error "assertions must be followed by" }
- }
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/preload_handler/Makefile gcc-16-20260201/gcc/testsuite/g++.dg/contracts/preload_handler/Makefile
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/preload_handler/Makefile	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/preload_handler/Makefile	Thu Jan  1 00:00:00 1970
***************
*** 1,13 ****
- CXXFLAGS=--std=c++17
- 
- default: assert_fail libhandle_contract_violation.so
- 
- run: default
- 	LD_PRELOAD=./libhandle_contract_violation.so ./assert_fail
- 
- ./libhandle_contract_violation.so: ./handle_contract_violation.cpp
- 	${CXX} ${CXXFLAGS} -shared -fPIC -o $@ $<
- 
- clean:
- 	rm -fr ./libhandle_contract_violation.so ./assert_fail
- 
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/preload_handler/README gcc-16-20260201/gcc/testsuite/g++.dg/contracts/preload_handler/README
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/preload_handler/README	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/preload_handler/README	Thu Jan  1 00:00:00 1970
***************
*** 1,2 ****
- build and install gcc to $prefix, then run:
- LD_LIBRARY_PATH=$prefix/lib64 CXX=$prefix/bin/g++ make run
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/preload_handler/assert_fail.cpp gcc-16-20260201/gcc/testsuite/g++.dg/contracts/preload_handler/assert_fail.cpp
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/preload_handler/assert_fail.cpp	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/preload_handler/assert_fail.cpp	Thu Jan  1 00:00:00 1970
***************
*** 1,7 ****
- int main(int, char**) {
- 	int x = 0;
- 	[[ assert: x < 0 ]];
- 
- 	return 0;
- }
- 
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/preload_handler/handle_contract_violation.cpp gcc-16-20260201/gcc/testsuite/g++.dg/contracts/preload_handler/handle_contract_violation.cpp
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/preload_handler/handle_contract_violation.cpp	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/preload_handler/handle_contract_violation.cpp	Thu Jan  1 00:00:00 1970
***************
*** 1,15 ****
- #include <iostream>
- #include <contract>
- 
- void handle_contract_violation(const std::contract_violation &violation) {
-   std::cerr << "custom handle_contract_violation: " << std::endl
-     << " line_number: " << violation.line_number() << std::endl
-     << " file_name: " << violation.file_name() << std::endl
-     << " function_name: " << violation.function_name() << std::endl
-     << " comment: " << violation.comment() << std::endl
-     << " assertion_level: " << violation.assertion_level() << std::endl
-     << " assertion_role: " << violation.assertion_role() << std::endl
-     << " continuation_mode: " << (int)violation.continuation_mode() << std::endl
-     << std::endl;
- }
- 
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/preload_nocontinue_handler/Makefile gcc-16-20260201/gcc/testsuite/g++.dg/contracts/preload_nocontinue_handler/Makefile
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/preload_nocontinue_handler/Makefile	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/preload_nocontinue_handler/Makefile	Thu Jan  1 00:00:00 1970
***************
*** 1,23 ****
- CXXFLAGS=--std=c++17 -fcontract-continuation-mode=on
- LDFLAGS=-ldl
- 
- default: assert_fail libhandle_contract_violation.so libnocontinue.so
- 
- run: default
- 	./assert_fail
- 
- runno: default
- 	LD_PRELOAD="./libnocontinue.so ./libhandle_contract_violation.so" ./assert_fail
- 
- runnostd: default
- 	LD_PRELOAD=./libnocontinue.so ./assert_fail
- 
- ./libhandle_contract_violation.so: ./handle_contract_violation.cpp
- 	${CXX} ${CXXFLAGS} -shared -fPIC -o $@ $<
- 
- ./libnocontinue.so: ./nocontinue.cpp
- 	${CXX} ${CXXFLAGS} -shared -fPIC -o $@ $<
- 
- clean:
- 	rm -fr ./libhandle_contract_violation.so ./libnocontinue.so ./assert_fail
- 
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/preload_nocontinue_handler/README gcc-16-20260201/gcc/testsuite/g++.dg/contracts/preload_nocontinue_handler/README
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/preload_nocontinue_handler/README	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/preload_nocontinue_handler/README	Thu Jan  1 00:00:00 1970
***************
*** 1,23 ****
- build and install gcc to $prefix, then run:
- 
- LD_LIBRARY_PATH=$prefix/lib64 CXX=$prefix/bin/g++ make run
-   Build and run with continuation mode on; will print violation info from the
-   standard handler and then continue to print "returning from main"
- 
- LD_LIBRARY_PATH=$prefix/lib64 CXX=$prefix/bin/g++ make runnostd
-   Build and run with continuation mode on, using the default violation handler
-   while preloading the 'nocontinue' hook. This uses LD_PRELOAD to turn all
-   continuing contract violations into non-continuing versions.
- 
-   Will print violation info from the standard handler and then terminate -- it
-   will not print "returning from main"
- 
- LD_LIBRARY_PATH=$prefix/lib64 CXX=$prefix/bin/g++ make runno
-   Build and run with continuation mode on, using a custom violation handler
-   while preloading the 'nocontinue' hook. This uses LD_PRELOAD to turn all
-   continuing contract violations into non-continuing versions and to install a
-   custom violation handler.
- 
-   Will print violation info from the custom handler and then terminate -- it
-   will not print "returning from main"
- 
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/preload_nocontinue_handler/assert_fail.cpp gcc-16-20260201/gcc/testsuite/g++.dg/contracts/preload_nocontinue_handler/assert_fail.cpp
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/preload_nocontinue_handler/assert_fail.cpp	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/preload_nocontinue_handler/assert_fail.cpp	Thu Jan  1 00:00:00 1970
***************
*** 1,10 ****
- #include <iostream>
- 
- int main(int, char**) {
- 	int x = 0;
- 	[[ assert: x < 0 ]];
- 
- 	std::cout << "returning from main" << std::endl;
- 	return 0;
- }
- 
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/preload_nocontinue_handler/handle_contract_violation.cpp gcc-16-20260201/gcc/testsuite/g++.dg/contracts/preload_nocontinue_handler/handle_contract_violation.cpp
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/preload_nocontinue_handler/handle_contract_violation.cpp	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/preload_nocontinue_handler/handle_contract_violation.cpp	Thu Jan  1 00:00:00 1970
***************
*** 1,13 ****
- #include <iostream>
- #include <contract>
- 
- void handle_contract_violation(const std::contract_violation &violation) {
-   std::cerr << "custom handle_contract_violation: " << std::endl
-     << " line_number: " << violation.line_number() << std::endl
-     << " file_name: " << violation.file_name() << std::endl
-     << " function_name: " << violation.function_name() << std::endl
-     << " comment: " << violation.comment() << std::endl
-     << " assertion_level: " << violation.assertion_level() << std::endl
-     << std::endl;
- }
- 
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/contracts/preload_nocontinue_handler/nocontinue.cpp gcc-16-20260201/gcc/testsuite/g++.dg/contracts/preload_nocontinue_handler/nocontinue.cpp
*** gcc-16-20260125/gcc/testsuite/g++.dg/contracts/preload_nocontinue_handler/nocontinue.cpp	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/contracts/preload_nocontinue_handler/nocontinue.cpp	Thu Jan  1 00:00:00 1970
***************
*** 1,19 ****
- #include <exception>
- #include <contract>
- #include <dlfcn.h>
- 
- using handler = void (*)(const std::contract_violation &);
- constexpr const char *mangledHandlerName = "_Z25handle_contract_violationRKSt18contract_violation";
- void handle_contract_violation(const std::contract_violation &violation) {
-   try {
-     handler original_handle_contract_violation;
-     original_handle_contract_violation =
-       (handler)dlsym(RTLD_NEXT, mangledHandlerName);
-     (*original_handle_contract_violation)(violation);
-   }
-   catch(...) {
-     ; // squash
-   }
-   std::terminate();
- }
- 
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/coroutines/pr110871.C gcc-16-20260201/gcc/testsuite/g++.dg/coroutines/pr110871.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/coroutines/pr110871.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/coroutines/pr110871.C	Sun Feb  1 22:32:09 2026
***************
*** 1,5 ****
! // { dg-additional-options "-fcontracts -fcontract-continuation-mode=on" }
! // { dg-do run }
  // { dg-skip-if "requires hosted libstdc++ for iostream" { ! hostedlib } }
  
  #include <iostream>
--- 1,5 ----
! // { dg-additional-options "-fcontracts -fcontract-evaluation-semantic=observe" }
! // { dg-do run { target c++26 } }
  // { dg-skip-if "requires hosted libstdc++ for iostream" { ! hostedlib } }
  
  #include <iostream>
*************** struct coroutine_traits<generator<T>, Ar
*** 44,51 ****
  
  };
  
! generator<int> seq(int from, int to) [[pre: from <= to]]
! 
  {
      std::cout << "coro initial" << std::endl;
      for (int i = from; i <= to; ++i) {
--- 44,51 ----
  
  };
  
! generator<int> seq(int from, int to)
!  pre (from <= to)
  {
      std::cout << "coro initial" << std::endl;
      for (int i = from; i <= to; ++i) {
*************** int main() {
*** 61,64 ****
      std::cout << "main continues" << std::endl;
  }
  
! // { dg-output "contract violation in function seq at .*.C:47: from \<= to.*(\n|\r\n|\r)" }
--- 61,64 ----
      std::cout << "main continues" << std::endl;
  }
  
! // { dg-output "contract violation in function generator<int> seq.int, int. at .*.C:48: from \<= to.*(\n|\r\n|\r)" }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/coroutines/pr110872.C gcc-16-20260201/gcc/testsuite/g++.dg/coroutines/pr110872.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/coroutines/pr110872.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/coroutines/pr110872.C	Sun Feb  1 22:32:09 2026
***************
*** 1,6 ****
! // { dg-additional-options "-fcontracts -fcontract-continuation-mode=on" }
! // { dg-do run }
  // { dg-skip-if "requires hosted libstdc++ for iostream" { ! hostedlib } }
  
  #include <iostream>
  #include <coroutine>
--- 1,9 ----
! // { dg-additional-options "-fcontracts -fcontract-evaluation-semantic=observe" }
! // NOTE this should switch to run when the changes are resolved.
! // { dg-do compile { target c++26 } }
  // { dg-skip-if "requires hosted libstdc++ for iostream" { ! hostedlib } }
+ // { dg-prune-output "during RTL pass: expand" }
+ // { dg-ice "expand_expr_addr_expr_1" }
  
  #include <iostream>
  #include <coroutine>
*************** struct generator
*** 20,26 ****
          generator<T> get_return_object() noexcept { return {}; }
      };
  
!     bool is_valid() { return false; }
  };
  
  namespace std {
--- 23,29 ----
          generator<T> get_return_object() noexcept { return {}; }
      };
  
!     bool is_valid() const { return false; }
  };
  
  namespace std {
*************** struct coroutine_traits<generator<T>, Ar
*** 33,39 ****
  };
  
  generator<int> val(int v) 
! [[post g: g.is_valid()]]
  {
      std::cout << "coro initial" << std::endl;
      co_yield v;
--- 36,42 ----
  };
  
  generator<int> val(int v) 
!   post (g: g.is_valid())
  {
      std::cout << "coro initial" << std::endl;
      co_yield v;
*************** int main() {
*** 47,50 ****
      std::cout << "main continues" << std::endl;
  }
  
! // { dg-output "contract violation in function val at .*.C:36: g.is_valid().*(\n|\r\n|\r)" }
--- 50,53 ----
      std::cout << "main continues" << std::endl;
  }
  
! // { dg-output "contract violation in function generator<int> val.int. at .*.C:36: g.is_valid().*(\n|\r\n|\r)" }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor23.C gcc-16-20260201/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor23.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor23.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor23.C	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,26 ----
+ // Verify we diagnose and accept, as an extension, a non-empty constexpr
+ // constructor body in C++11 mode.
+ // PR c++/123845
+ // { dg-do compile { target c++11_only } }
+ // { dg-options "" }
+ 
+ constexpr int negate(int n) { return -n; }
+ 
+ struct A {
+   int m;
+   constexpr A() : m(42) {
+     ++m;
+     m = negate(m);
+   } // { dg-warning "does not have empty body \[-Wc++14-extensions\]" }
+ };
+ static_assert(A().m == -43, "");
+ 
+ template<class T>
+ struct B {
+   int m;
+   constexpr B() : m(42) {
+     ++m;
+     m = negate(m);
+   } // { dg-warning "does not have empty body \[-Wc++14-extensions\]" }
+ };
+ static_assert(B<int>().m == -43, "");
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/cpp0x/constexpr-ex3.C gcc-16-20260201/gcc/testsuite/g++.dg/cpp0x/constexpr-ex3.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/cpp0x/constexpr-ex3.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/cpp0x/constexpr-ex3.C	Sun Feb  1 22:32:09 2026
***************
*** 6,12 ****
  struct A
  {
    int i;
!   constexpr A(int _i) { i = _i; } // { dg-error "empty body|A::i" "" { target c++17_down } }
  };
  
  template <class T>
--- 6,13 ----
  struct A
  {
    int i;
!   constexpr A(int _i) { i = _i; } // { dg-warning "empty body" "" { target c++11_only } }
! 				  // { dg-error "'A::i' must be init" "" { target c++17_down } .-1 }
  };
  
  template <class T>
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/cpp0x/constexpr-ice22.C gcc-16-20260201/gcc/testsuite/g++.dg/cpp0x/constexpr-ice22.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/cpp0x/constexpr-ice22.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/cpp0x/constexpr-ice22.C	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,14 ----
+ // PR c++/123557
+ // { dg-do compile { target c++11 } }
+ 
+ struct a {
+   a() = default;
+   a(a const &) = default;
+   a(a &&);
+ };
+ struct c {
+   c();
+   a e;
+ };
+ constexpr a b;
+ c::c() : e(b) {}
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/cpp0x/nullptr47.C gcc-16-20260201/gcc/testsuite/g++.dg/cpp0x/nullptr47.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/cpp0x/nullptr47.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/cpp0x/nullptr47.C	Sun Feb  1 22:32:09 2026
***************
*** 0 ****
--- 1,10 ----
+ // PR c++/123790
+ // { dg-do compile { target c++11 } }
+ 
+ int
+ main ()
+ {
+   using nullptr_t = decltype (nullptr);
+   constexpr nullptr_t zero = nullptr;
+   constexpr nullptr_t other_zero = zero;
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/cpp1z/constexpr-asm-6.C gcc-16-20260201/gcc/testsuite/g++.dg/cpp1z/constexpr-asm-6.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/cpp1z/constexpr-asm-6.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/cpp1z/constexpr-asm-6.C	Sun Feb  1 22:32:10 2026
***************
*** 0 ****
--- 1,34 ----
+ /* { dg-do compile { target c++17 } } */
+ /* { dg-skip-if "requires hosted libstdc++ for string" { ! hostedlib } } */
+ // { dg-require-iconv "IBM1047" }
+ // { dg-options "-fexec-charset=IBM1047" }
+ 
+ #include <string>
+ 
+ constexpr std::string_view genfoo ()
+ {
+   return "foo %1,%0";
+ }
+ 
+ constexpr std::string_view genoutput ()
+ {
+   return "=r";
+ }
+ 
+ constexpr std::string_view geninput ()
+ {
+   return "r";
+ }
+ 
+ constexpr std::string_view genclobber ()
+ {
+   return "memory";
+ }
+ 
+ void f()
+ {
+   int a;
+   asm((genfoo ()) : (genoutput ()) (a) : (geninput ()) (1) : (genclobber ()));
+ }
+ 
+ /* { dg-final { scan-assembler "foo" } } */
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/cpp23/charset2.C gcc-16-20260201/gcc/testsuite/g++.dg/cpp23/charset2.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/cpp23/charset2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/cpp23/charset2.C	Sun Feb  1 22:32:10 2026
***************
*** 0 ****
--- 1,36 ----
+ // P2246R1
+ // { dg-do compile { target c++23 } }
+ // { dg-require-iconv "IBM1047" }
+ // { dg-options "-pedantic-errors -fexec-charset=IBM1047" }
+ 
+ [[deprecated ("foo")]] int d;		// { dg-message "declared here" }
+ int e = d;				// { dg-warning "'d' is deprecated: foo" }
+ static_assert (false, "bar");		// { dg-error "static assertion failed: bar" }
+ #error "baz"				// { dg-error "#error \"baz\"" }
+ [[nodiscard ("qux")]] int foo ();	// { dg-message "declared here" }
+ void
+ bar ()
+ {
+   foo ();				// { dg-warning "ignoring return value of 'int foo\\\(\\\)', declared with attribute 'nodiscard': 'qux'" }
+ }
+ #if __cplusplus > 202302L
+ #warning "fred"				// { dg-warning "#warning \"fred\"" "" { target c++26 } }
+ #endif
+ #if __cpp_static_assert >= 202306L
+ struct A { constexpr int size () const { return 5; }
+            constexpr const char *data () const { return "xyzzy"; } };
+ static_assert (false, A {});		// { dg-error "static assertion failed: xyzzy" "" { target c++26 } }
+ #endif
+ #if __cpp_deleted_function >= 202403L
+ int baz () = delete ("garply");		// { dg-message "declared here" "" { target c++26 } }
+ void
+ plugh ()
+ {
+   baz ();				// { dg-error "use of deleted function 'int baz\\\(\\\)': garply" "" { target c++26 } }
+ }
+ #endif
+ namespace [[deprecated ("corge")]] ND	// { dg-message "declared here" }
+ {
+   int i;
+ };
+ int j = ND::i;				// { dg-warning "'ND' is deprecated: corge" }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/cpp23/charset3.C gcc-16-20260201/gcc/testsuite/g++.dg/cpp23/charset3.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/cpp23/charset3.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/cpp23/charset3.C	Sun Feb  1 22:32:10 2026
***************
*** 0 ****
--- 1,24 ----
+ // P2246R1
+ // { dg-do compile { target c++11 } }
+ // { dg-require-iconv "IBM1047" }
+ // { dg-options "-fexec-charset=IBM1047" }
+ 
+ [[gnu::deprecated ("foo")]] int d;	// { dg-message "declared here" }
+ int e = d;				// { dg-warning "'d' is deprecated: foo" }
+ [[gnu::unavailable ("bar")]] int f;	// { dg-message "declared here" }
+ int g = f;				// { dg-error "'f' is unavailable: bar" }
+ __attribute__((deprecated ("baz"))) int h; // { dg-message "declared here" }
+ int i = h;				// { dg-warning "'h' is deprecated: baz" }
+ __attribute__((unavailable ("qux"))) int j;	// { dg-message "declared here" }
+ int k = j;				// { dg-error "'j' is unavailable: qux" }
+ #warning "fred"				// { dg-warning "#warning \"fred\"" }
+ namespace [[gnu::deprecated ("corge")]] ND // { dg-message "declared here" }
+ {
+   int l;
+ };
+ int m = ND::l;				// { dg-warning "'ND' is deprecated: corge" }
+ namespace __attribute__((deprecated ("xyzzy"))) NE // { dg-message "declared here" }
+ {
+   int l;
+ };
+ int n = NE::l;				// { dg-warning "'NE' is deprecated: xyzzy" }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/cpp23/charset4.C gcc-16-20260201/gcc/testsuite/g++.dg/cpp23/charset4.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/cpp23/charset4.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/cpp23/charset4.C	Sun Feb  1 22:32:10 2026
***************
*** 0 ****
--- 1,36 ----
+ // P2246R1
+ // { dg-do compile { target c++23 } }
+ // { dg-require-iconv "UTF-8" }
+ // { dg-options "-pedantic-errors -fexec-charset=UTF-8" }
+ 
+ [[deprecated ("áæ)")]] int d;		// { dg-message "declared here" }
+ int e = d;				// { dg-warning "'d' is deprecated: áæ" }
+ static_assert (false, "áæ");		// { dg-error "static assertion failed: áæ" }
+ #error "áæ"				// { dg-error "#error \"áæ\"" }
+ [[nodiscard ("áæ")]] int foo ();	// { dg-message "declared here" }
+ void
+ bar ()
+ {
+   foo ();				// { dg-warning "ignoring return value of 'int foo\\\(\\\)', declared with attribute 'nodiscard': 'áæ'" }
+ }
+ #if __cplusplus > 202302L
+ #warning "áæ"				// { dg-warning "#warning \"áæ\"" "" { target c++26 } }
+ #endif
+ #if __cpp_static_assert >= 202306L
+ struct A { constexpr int size () const { return sizeof ("áæ") - 1; }
+            constexpr const char *data () const { return "áæ"; } };
+ static_assert (false, A {});		// { dg-error "static assertion failed: áæ" "" { target c++26 } }
+ #endif
+ #if __cpp_deleted_function >= 202403L
+ int baz () = delete ("áæ");		// { dg-message "declared here" "" { target c++26 } }
+ void
+ plugh ()
+ {
+   baz ();				// { dg-error "use of deleted function 'int baz\\\(\\\)': áæ" "" { target c++26 } }
+ }
+ #endif
+ namespace [[deprecated ("áæ")]] ND	// { dg-message "declared here" }
+ {
+   int i;
+ };
+ int j = ND::i;				// { dg-warning "'ND' is deprecated: áæ" }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/cpp23/charset5.C gcc-16-20260201/gcc/testsuite/g++.dg/cpp23/charset5.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/cpp23/charset5.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/cpp23/charset5.C	Sun Feb  1 22:32:10 2026
***************
*** 0 ****
--- 1,24 ----
+ // P2246R1
+ // { dg-do compile { target c++11 } }
+ // { dg-require-iconv "UTF-8" }
+ // { dg-options "-fexec-charset=UTF-8" }
+ 
+ [[gnu::deprecated ("áæ")]] int d;	// { dg-message "declared here" }
+ int e = d;				// { dg-warning "'d' is deprecated: áæ" }
+ [[gnu::unavailable ("áæ")]] int f;	// { dg-message "declared here" }
+ int g = f;				// { dg-error "'f' is unavailable: áæ" }
+ __attribute__((deprecated ("áæ"))) int h; // { dg-message "declared here" }
+ int i = h;				// { dg-warning "'h' is deprecated: áæ" }
+ __attribute__((unavailable ("áæ"))) int j;	// { dg-message "declared here" }
+ int k = j;				// { dg-error "'j' is unavailable: áæ" }
+ #warning "áæ"				// { dg-warning "#warning \"áæ\"" }
+ namespace [[gnu::deprecated ("áæ")]] ND // { dg-message "declared here" }
+ {
+   int l;
+ };
+ int m = ND::l;				// { dg-warning "'ND' is deprecated: áæ" }
+ namespace __attribute__((deprecated ("áæ"))) NE // { dg-message "declared here" }
+ {
+   int l;
+ };
+ int n = NE::l;				// { dg-warning "'NE' is deprecated: áæ" }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/cpp26/attr-indeterminate5.C gcc-16-20260201/gcc/testsuite/g++.dg/cpp26/attr-indeterminate5.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/cpp26/attr-indeterminate5.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/cpp26/attr-indeterminate5.C	Sun Feb  1 22:32:10 2026
***************
*** 0 ****
--- 1,23 ----
+ // C++ 26 P2795R5 - Erroneous behaviour for uninitialized reads
+ // { dg-do compile { target c++11 } }
+ // { dg-skip-if "" { c++26 } { "-ftrivial-auto-var-init=*" } { "" } }
+ 
+ struct S { S (); S (const S &); ~S (); int s; };
+ void foo (S s);							// { dg-message "earlier declaration" }
+ void bar (S s [[indeterminate]]);
+ void baz (S s [[indeterminate]]);
+ 
+ void
+ fred ()
+ {
+   void foo (S t [[indeterminate]]);				// { dg-error "'indeterminate' attribute not specified for parameter 't' on the first declaration of its function" }
+   void bar (S t [[indeterminate]]);
+   void baz (S t);
+   void qux (S t);						// { dg-message "earlier declaration" }
+   void corge (S t [[indeterminate]]);
+   void garply (S t [[indeterminate]]);
+ }
+ 
+ void qux (S u [[indeterminate]]);				// { dg-error "'indeterminate' attribute not specified for parameter 'u' on the first declaration of its function" }
+ void corge (S u [[indeterminate]]);
+ void garply (S u);
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/cpp26/expansion-stmt1.C gcc-16-20260201/gcc/testsuite/g++.dg/cpp26/expansion-stmt1.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/cpp26/expansion-stmt1.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/cpp26/expansion-stmt1.C	Sun Feb  1 22:32:10 2026
*************** struct A
*** 24,29 ****
--- 24,30 ----
    constexpr int operator * () const { return x; }
    constexpr bool operator != (const A &o) const { return x != o.x; }
    constexpr A operator + (int o) const { A r (x + o); return r; }
+   constexpr int operator - (const A &o) const { return x - o.x; }
  };
  struct C
  {
*************** struct C
*** 33,52 ****
    constexpr C operator * () const { return *this; }
    constexpr bool operator != (const C &o) const { return x != o.x || y != o.y || z != o.z; }
    constexpr C operator + (int o) const { C r (x + o, y - o, z + o); return r; }
  };
  
  namespace N
  {
    struct B { constexpr B () {} };
!   constexpr A begin (B &) { return A (0); }
!   constexpr A end (B &) { return A (6); }
  }
  
  namespace O
  {
    struct D { constexpr D () {} };
!   constexpr C begin (D &) { return C (0, 42, 5); }
!   constexpr C end (D &) { return C (6, 36, 11); }
  }
  
  long long
--- 34,54 ----
    constexpr C operator * () const { return *this; }
    constexpr bool operator != (const C &o) const { return x != o.x || y != o.y || z != o.z; }
    constexpr C operator + (int o) const { C r (x + o, y - o, z + o); return r; }
+   constexpr int operator - (const C &o) const { return x - o.x; }
  };
  
  namespace N
  {
    struct B { constexpr B () {} };
!   constexpr A begin (const B &) { return A (0); }
!   constexpr A end (const B &) { return A (6); }
  }
  
  namespace O
  {
    struct D { constexpr D () {} };
!   constexpr C begin (const D &) { return C (0, 42, 5); }
!   constexpr C end (const D &) { return C (6, 36, 11); }
  }
  
  long long
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/cpp26/expansion-stmt16.C gcc-16-20260201/gcc/testsuite/g++.dg/cpp26/expansion-stmt16.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/cpp26/expansion-stmt16.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/cpp26/expansion-stmt16.C	Sun Feb  1 22:32:10 2026
*************** foo ()
*** 43,65 ****
  {
    B c = { 3 };
    template for (constexpr auto g : c)	// { dg-warning "'template for' only available with" "" { target c++23_down } }
!     ;					// { dg-error "'c' is not a constant expression" "" { target *-*-* } .-1 }
    C d = { 3 };
    template for (constexpr auto g : d)	// { dg-warning "'template for' only available with" "" { target c++23_down } }
!     ;					// { dg-error "'d' is not a constant expression" "" { target *-*-* } .-1 }
  					// { dg-error "call to non-'constexpr' function 'const A\\\* C::begin\\\(\\\) const'" "" { target c++11_down } .-1 }
  					// { dg-error "call to non-'constexpr' function 'const A\\\* C::end\\\(\\\) const'" "" { target c++11_down } .-2 }
    constexpr D e = { 3 };
    template for (constexpr auto g : e)	// { dg-warning "'template for' only available with" "" { target c++23_down } }
!     ;					// { dg-error "'e' is not a constant expression" "" { target *-*-* } .-1 }
  					// { dg-error "call to non-'constexpr' function 'const A\\\* D::end\\\(\\\) const'" "" { target *-*-* } .-1 }
    constexpr E f = { 3 };
    template for (constexpr auto g : f)	// { dg-warning "'template for' only available with" "" { target c++23_down } }
!     ;					// { dg-error "'f' is not a constant expression" "" { target *-*-* } .-1 }
  					// { dg-error "call to non-'constexpr' function 'const A\\\* E::begin\\\(\\\) const'" "" { target *-*-* } .-1 }
    constexpr G h = { 3 };
    template for (constexpr auto g : h)	// { dg-warning "'template for' only available with" "" { target c++23_down } }
!     ;					// { dg-error "'h' is not a constant expression" "" { target *-*-* } .-1 }
    template for (constexpr auto g : { 1, 2, F { 3 }, 4L })	// { dg-warning "'template for' only available with" "" { target c++23_down } }
      ;					// { dg-error "the type 'const F' of 'constexpr' variable 'g' is not literal" "" { target *-*-* } .-1 }
    template for (constexpr auto g : H {})// { dg-warning "'template for' only available with" "" { target c++23_down } }
--- 43,68 ----
  {
    B c = { 3 };
    template for (constexpr auto g : c)	// { dg-warning "'template for' only available with" "" { target c++23_down } }
!     ;					// { dg-error "'c' is not a constant expression" "" { target c++14 } .-1 }
! 					// { dg-error "the value of 'c' is not usable in a constant expression" "" { target c++11_down } .-1 }
    C d = { 3 };
    template for (constexpr auto g : d)	// { dg-warning "'template for' only available with" "" { target c++23_down } }
!     ;					// { dg-error "'d' is not a constant expression" "" { target c++14 } .-1 }
  					// { dg-error "call to non-'constexpr' function 'const A\\\* C::begin\\\(\\\) const'" "" { target c++11_down } .-1 }
  					// { dg-error "call to non-'constexpr' function 'const A\\\* C::end\\\(\\\) const'" "" { target c++11_down } .-2 }
+ 					// { dg-error "the type 'const C' of 'constexpr' variable '__for_range ' is not literal" "" { target c++11_down } .-3 }
    constexpr D e = { 3 };
    template for (constexpr auto g : e)	// { dg-warning "'template for' only available with" "" { target c++23_down } }
!     ;					// { dg-error "'e' is not a constant expression" "" { target c++14 } .-1 }
  					// { dg-error "call to non-'constexpr' function 'const A\\\* D::end\\\(\\\) const'" "" { target *-*-* } .-1 }
    constexpr E f = { 3 };
    template for (constexpr auto g : f)	// { dg-warning "'template for' only available with" "" { target c++23_down } }
!     ;					// { dg-error "'f' is not a constant expression" "" { target c++14 } .-1 }
  					// { dg-error "call to non-'constexpr' function 'const A\\\* E::begin\\\(\\\) const'" "" { target *-*-* } .-1 }
    constexpr G h = { 3 };
    template for (constexpr auto g : h)	// { dg-warning "'template for' only available with" "" { target c++23_down } }
!     ;					// { dg-error "'h' is not a constant expression" "" { target c++14 } .-1 }
! 					// { dg-error "the type 'const F' of 'constexpr' variable 'g' is not literal" "" { target c++11_down } .-2 }
    template for (constexpr auto g : { 1, 2, F { 3 }, 4L })	// { dg-warning "'template for' only available with" "" { target c++23_down } }
      ;					// { dg-error "the type 'const F' of 'constexpr' variable 'g' is not literal" "" { target *-*-* } .-1 }
    template for (constexpr auto g : H {})// { dg-warning "'template for' only available with" "" { target c++23_down } }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/cpp26/expansion-stmt18.C gcc-16-20260201/gcc/testsuite/g++.dg/cpp26/expansion-stmt18.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/cpp26/expansion-stmt18.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/cpp26/expansion-stmt18.C	Sun Feb  1 22:32:10 2026
*************** struct A
*** 11,23 ****
    constexpr int operator * () const { return x; }
    constexpr bool operator != (const A &o) const { return x != o.x; }
    constexpr A operator + (int o) const { A r (x + o); return r; }
  };
  
  namespace N
  {
    struct B { constexpr B () {} };
!   constexpr A begin (B &) { return A (0); }
!   constexpr A end (B &) { return A (6); }
  }
  
  void
--- 11,24 ----
    constexpr int operator * () const { return x; }
    constexpr bool operator != (const A &o) const { return x != o.x; }
    constexpr A operator + (int o) const { A r (x + o); return r; }
+   constexpr int operator - (const A &o) const { return x - o.x; }
  };
  
  namespace N
  {
    struct B { constexpr B () {} };
!   constexpr A begin (const B &) { return A (0); }
!   constexpr A end (const B &) { return A (6); }
  }
  
  void
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/cpp26/expansion-stmt2.C gcc-16-20260201/gcc/testsuite/g++.dg/cpp26/expansion-stmt2.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/cpp26/expansion-stmt2.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/cpp26/expansion-stmt2.C	Sun Feb  1 22:32:10 2026
*************** struct A
*** 24,29 ****
--- 24,30 ----
    constexpr int operator * () const { return x; }
    constexpr bool operator != (const A &o) const { return x != o.x; }
    constexpr A operator + (int o) const { A r (x + o); return r; }
+   constexpr int operator - (const A &o) const { return x - o.x; }
  };
  struct C
  {
*************** struct C
*** 33,52 ****
    constexpr C operator * () const { return *this; }
    constexpr bool operator != (const C &o) const { return x != o.x || y != o.y || z != o.z; }
    constexpr C operator + (int o) const { C r (x + o, y - o, z + o); return r; }
  };
  
  namespace N
  {
    struct B { constexpr B () {} };
!   constexpr A begin (B &) { return A (0); }
!   constexpr A end (B &) { return A (6); }
  }
  
  namespace O
  {
    struct D { constexpr D () {} };
!   constexpr C begin (D &) { return C (0, 42, 5); }
!   constexpr C end (D &) { return C (6, 36, 11); }
  }
  
  #if __cpp_nontype_template_parameter_class >= 201806L
--- 34,54 ----
    constexpr C operator * () const { return *this; }
    constexpr bool operator != (const C &o) const { return x != o.x || y != o.y || z != o.z; }
    constexpr C operator + (int o) const { C r (x + o, y - o, z + o); return r; }
+   constexpr int operator - (const C &o) const { return x - o.x; }
  };
  
  namespace N
  {
    struct B { constexpr B () {} };
!   constexpr A begin (const B &) { return A (0); }
!   constexpr A end (const B &) { return A (6); }
  }
  
  namespace O
  {
    struct D { constexpr D () {} };
!   constexpr C begin (const D &) { return C (0, 42, 5); }
!   constexpr C end (const D &) { return C (6, 36, 11); }
  }
  
  #if __cpp_nontype_template_parameter_class >= 201806L
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/cpp26/expansion-stmt25.C gcc-16-20260201/gcc/testsuite/g++.dg/cpp26/expansion-stmt25.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/cpp26/expansion-stmt25.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/cpp26/expansion-stmt25.C	Sun Feb  1 22:32:10 2026
***************
*** 0 ****
--- 1,27 ----
+ // C++26 P1306R5 - Expansion statements
+ // { dg-do compile { target c++14 } }
+ // { dg-options "" }
+ 
+ struct A
+ {
+   int x;
+   constexpr explicit A (int v) : x(v) {}
+   constexpr A &operator ++ () { ++x; return *this; }
+   constexpr int operator * () const { return x; }
+   constexpr bool operator != (const A &o) const { return x != o.x; }
+   constexpr A operator + (int o) const { A r (x + o); return r; }
+ };
+ 
+ namespace N
+ {
+   struct B { constexpr B () {} };
+   constexpr A begin (const B &) { return A (0); }
+   constexpr A end (const B &) { return A (6); }
+ }
+ 
+ void
+ foo ()
+ {
+   template for (auto i : N::B {})				// { dg-warning "'template for' only available with" "" { target c++23_down } }
+     ;								// { dg-error "no match for 'operator-' in '__for_begin  - __for_begin ' \\\(operand types are 'const A' and 'const A'\\\)" "" { target *-*-* } .-1 }
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/cpp26/expansion-stmt26.C gcc-16-20260201/gcc/testsuite/g++.dg/cpp26/expansion-stmt26.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/cpp26/expansion-stmt26.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/cpp26/expansion-stmt26.C	Sun Feb  1 22:32:10 2026
***************
*** 0 ****
--- 1,18 ----
+ // C++26 P1306R5 - Expansion statements
+ // { dg-do run { target c++23 } }
+ // { dg-options "" }
+ 
+ #include <span>
+ 
+ constexpr int arr[3] = { 1, 2, 3 };
+ consteval std::span <const int> foo () { return std::span <const int> (arr); }
+ 
+ int
+ main ()
+ {
+   int r = 0;
+   template for (constexpr auto m : foo ())	// { dg-warning "'template for' only available with" "" { target c++23_down } }
+     r += m;
+   if (r != 6)
+     __builtin_abort ();
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/cpp26/expansion-stmt3.C gcc-16-20260201/gcc/testsuite/g++.dg/cpp26/expansion-stmt3.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/cpp26/expansion-stmt3.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/cpp26/expansion-stmt3.C	Sun Feb  1 22:32:10 2026
*************** struct A
*** 24,29 ****
--- 24,30 ----
    constexpr int operator * () const { return x; }
    constexpr bool operator != (const A &o) const { return x != o.x; }
    constexpr A operator + (int o) const { A r (x + o); return r; }
+   constexpr int operator - (const A &o) const { return x - o.x; }
  };
  struct C
  {
*************** struct C
*** 33,52 ****
    constexpr C operator * () const { return *this; }
    constexpr bool operator != (const C &o) const { return x != o.x || y != o.y || z != o.z; }
    constexpr C operator + (int o) const { C r (x + o, y - o, z + o); return r; }
  };
  
  namespace N
  {
    struct B { constexpr B () {} };
!   constexpr A begin (B &) { return A (0); }
!   constexpr A end (B &) { return A (6); }
  }
  
  namespace O
  {
    struct D { constexpr D () {} };
!   constexpr C begin (D &) { return C (0, 42, 5); }
!   constexpr C end (D &) { return C (6, 36, 11); }
  }
  
  template <int N>
--- 34,54 ----
    constexpr C operator * () const { return *this; }
    constexpr bool operator != (const C &o) const { return x != o.x || y != o.y || z != o.z; }
    constexpr C operator + (int o) const { C r (x + o, y - o, z + o); return r; }
+   constexpr int operator - (const C &o) const { return x - o.x; }
  };
  
  namespace N
  {
    struct B { constexpr B () {} };
!   constexpr A begin (const B &) { return A (0); }
!   constexpr A end (const B &) { return A (6); }
  }
  
  namespace O
  {
    struct D { constexpr D () {} };
!   constexpr C begin (const D &) { return C (0, 42, 5); }
!   constexpr C end (const D &) { return C (6, 36, 11); }
  }
  
  template <int N>
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/cpp2a/concepts-decltype5.C gcc-16-20260201/gcc/testsuite/g++.dg/cpp2a/concepts-decltype5.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/cpp2a/concepts-decltype5.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/cpp2a/concepts-decltype5.C	Sun Feb  1 22:32:10 2026
***************
*** 0 ****
--- 1,10 ----
+ // PR c++/123676
+ // { dg-do compile { target c++20 } }
+ 
+ template<class...>
+ concept C = true;
+ 
+ template<class... Ts>
+ auto f() -> decltype(C<Ts...>) {
+   return true;
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/cpp2a/concepts-pr122494.C gcc-16-20260201/gcc/testsuite/g++.dg/cpp2a/concepts-pr122494.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/cpp2a/concepts-pr122494.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/cpp2a/concepts-pr122494.C	Sun Feb  1 22:32:10 2026
***************
*** 0 ****
--- 1,24 ----
+ // PR c++/122494
+ // { dg-do compile { target c++20 } }
+ 
+ template<class T>
+ concept C = false;
+ 
+ template<class T> requires (!C<T>)
+ struct A {
+   static constexpr unsigned v = 0;
+ };
+ 
+ template<class T>
+ struct B {
+   static constexpr unsigned v = A<T>::v;
+ 
+   constexpr static bool f() {
+     return [](auto) {
+       if (v == 0) { }
+       return true;
+     }(0);
+   }
+ };
+ 
+ static_assert(B<int>::f());
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/cpp2a/concepts-pr123663.C gcc-16-20260201/gcc/testsuite/g++.dg/cpp2a/concepts-pr123663.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/cpp2a/concepts-pr123663.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/cpp2a/concepts-pr123663.C	Sun Feb  1 22:32:10 2026
***************
*** 0 ****
--- 1,13 ----
+ // PR c++/123663
+ // { dg-do compile { target c++20 } }
+ 
+ template <typename T>
+ concept TestConcept = requires {
+   new T[1]{};
+ };
+ struct base {
+   base() {
+     struct Foo {};
+     TestConcept<Foo>;
+   }
+ };
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/cpp2a/concepts-pr123814.C gcc-16-20260201/gcc/testsuite/g++.dg/cpp2a/concepts-pr123814.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/cpp2a/concepts-pr123814.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/cpp2a/concepts-pr123814.C	Sun Feb  1 22:32:10 2026
***************
*** 0 ****
--- 1,34 ----
+ // PR c++/123814
+ // { dg-do compile { target c++20 } }
+ // { dg-additional-options "-Wall --param ggc-min-expand=0 --param ggc-min-heapsize=0" }
+ 
+ namespace std {
+   struct source_location {
+     struct __impl {
+       const char *_M_file_name;
+       const char *_M_function_name;
+       unsigned _M_line;
+       unsigned _M_column;
+     };
+     static void current(const __impl* = __builtin_source_location());
+   };
+ } // namespace std
+ 
+ template <typename> concept same_as = true;
+ 
+ template <typename... Us>
+ concept one_of = (same_as<Us> || ...);
+ 
+ template <one_of<> T> constexpr int buffer_size_for_int = 0;
+ template <> constexpr int buffer_size_for_int<int> = 1;
+ 
+ template <int> using Basic_Characters = int;
+ 
+ template <typename T>
+ Basic_Characters<buffer_size_for_int<T>> to_characters() {
+   std::source_location::current();
+ } // { dg-warning "return statement" }
+ 
+ void go() {
+   to_characters<int>();
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/cpp2a/constexpr-ref2.C gcc-16-20260201/gcc/testsuite/g++.dg/cpp2a/constexpr-ref2.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/cpp2a/constexpr-ref2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/cpp2a/constexpr-ref2.C	Sun Feb  1 22:32:10 2026
***************
*** 0 ****
--- 1,19 ----
+ // PR c++/123738
+ // { dg-do compile { target c++20 } }
+ 
+ struct OStringLiteral {
+     int str = 0;
+ };
+ 
+ template<auto L> struct OStringHolder {
+     static constexpr auto & literal = L;
+ };
+ 
+ struct OString {
+     template<auto L> constexpr OString(OStringHolder<L> const &):
+         p(&OStringHolder<L>::literal.str) {}
+     int const * p;
+ };
+ 
+ 
+ constexpr OString s = OStringHolder<OStringLiteral{}>{};
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/cpp2a/constexpr-try1.C gcc-16-20260201/gcc/testsuite/g++.dg/cpp2a/constexpr-try1.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/cpp2a/constexpr-try1.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/cpp2a/constexpr-try1.C	Sun Feb  1 22:32:10 2026
*************** struct S {
*** 32,37 ****
--- 32,38 ----
      } catch (int) {	// { dg-error "compound-statement in 'constexpr' function" "" { target c++11_only } }
      }			// { dg-error "compound-statement in 'constexpr' function" "" { target c++11_only } .-2 }
    } catch (...) {	// { dg-error "'constexpr' constructor does not have empty body" "" { target c++11_only } }
+ 		        // { dg-error "compound-statement in 'constexpr' function" "" { target c++11_only } .-1 }
    }
    int m;
  };
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/cpp2a/constexpr-try2.C gcc-16-20260201/gcc/testsuite/g++.dg/cpp2a/constexpr-try2.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/cpp2a/constexpr-try2.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/cpp2a/constexpr-try2.C	Sun Feb  1 22:32:10 2026
*************** struct S {
*** 32,38 ****
      try {		// { dg-warning "'try' in 'constexpr' function only available with" "" { target c++17_down } }
      } catch (int) {	// { dg-warning "compound-statement in 'constexpr' function" "" { target c++11_only } }
      }			// { dg-warning "compound-statement in 'constexpr' function" "" { target c++11_only } .-2 }
!   } catch (...) {	// { dg-error "'constexpr' constructor does not have empty body" "" { target c++11_only } }
    }
    int m;
  };
--- 32,39 ----
      try {		// { dg-warning "'try' in 'constexpr' function only available with" "" { target c++17_down } }
      } catch (int) {	// { dg-warning "compound-statement in 'constexpr' function" "" { target c++11_only } }
      }			// { dg-warning "compound-statement in 'constexpr' function" "" { target c++11_only } .-2 }
!   } catch (...) {	// { dg-warning "'constexpr' constructor does not have empty body" "" { target c++11_only } }
! 			// { dg-warning "compound-statement in 'constexpr' function" "" { target c++11_only } .-1 }
    }
    int m;
  };
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/cpp2a/constexpr-try3.C gcc-16-20260201/gcc/testsuite/g++.dg/cpp2a/constexpr-try3.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/cpp2a/constexpr-try3.C	Sun Jan 25 22:32:09 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/cpp2a/constexpr-try3.C	Sun Feb  1 22:32:10 2026
*************** struct S {
*** 31,37 ****
      try {		// { dg-warning "'try' in 'constexpr' function only available with" "" { target c++17_down } }
      } catch (int) {
      }
!   } catch (...) {	// { dg-error "'constexpr' constructor does not have empty body" "" { target c++11_only } }
    }
    int m;
  };
--- 31,37 ----
      try {		// { dg-warning "'try' in 'constexpr' function only available with" "" { target c++17_down } }
      } catch (int) {
      }
!   } catch (...) {	// { dg-warning "'constexpr' constructor does not have empty body" "" { target c++11_only } }
    }
    int m;
  };
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/cpp2a/pr123578.C gcc-16-20260201/gcc/testsuite/g++.dg/cpp2a/pr123578.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/cpp2a/pr123578.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/cpp2a/pr123578.C	Sun Feb  1 22:32:10 2026
***************
*** 0 ****
--- 1,9 ----
+ // PR c++/123578
+ // { dg-do compile { target c++20 } }
+ // { dg-options "-fdump-tree-all" }
+ 
+ namespace {
+   template <typename>
+   struct A { A (decltype ([] { return 0; } ())) {} };
+   A <int> b = 0;
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/debug/dwarf2/pr110885.C gcc-16-20260201/gcc/testsuite/g++.dg/debug/dwarf2/pr110885.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/debug/dwarf2/pr110885.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/debug/dwarf2/pr110885.C	Sun Feb  1 22:32:10 2026
***************
*** 0 ****
--- 1,16 ----
+ // { dg-do link }
+ // { dg-options "-gsplit-dwarf -fdebug-types-section" }
+ 
+ inline void foo() {}
+ 
+ struct Y
+ {
+     template<void (*func)()>
+     static void bar() {}
+ };
+ 
+ int main()
+ {
+     Y::bar<foo>();
+     return 0;
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/diagnostic/ptrtomem4.C gcc-16-20260201/gcc/testsuite/g++.dg/diagnostic/ptrtomem4.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/diagnostic/ptrtomem4.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/diagnostic/ptrtomem4.C	Sun Feb  1 22:32:10 2026
***************
*** 0 ****
--- 1,24 ----
+ // PR c++/38612
+ 
+ struct Base {};
+ struct X;    // X derived from Base later but incomplete here
+ struct Y {}; // Y not derived from Base
+ 
+ int test1(int Base::* p2m, X* object)
+ {
+     return object->*p2m; // { dg-error "int Base::.' incompatible with incomplete object type 'X'" }
+ }
+ 
+ struct X : Base
+ {
+ };
+ 
+ int test2(int Base::* p2m, X* object)
+ {
+     return object->*p2m;        // OK
+ }
+ 
+ int test3(int Base::* p2m, Y* object)
+ {
+     return object->*p2m;        // { dg-error "int Base::.' incompatible with object type 'Y' because 'Y' is not derived from 'Base'" }
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/gcov/gcov-18.C gcc-16-20260201/gcc/testsuite/g++.dg/gcov/gcov-18.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/gcov/gcov-18.C	Sun Jan 25 22:32:10 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/gcov/gcov-18.C	Sun Feb  1 22:32:10 2026
***************
*** 1,4 ****
! /* { dg-options "--coverage -fcondition-coverage -std=c++11" } */
  /* { dg-do run } */
  /* { dg-skip-if "requires hosted libstdc++ for vector" { ! hostedlib } } */
  
--- 1,4 ----
! /* { dg-options "-fcondition-coverage -std=c++11" } */
  /* { dg-do run } */
  /* { dg-skip-if "requires hosted libstdc++ for vector" { ! hostedlib } } */
  
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/gcov/gcov-22.C gcc-16-20260201/gcc/testsuite/g++.dg/gcov/gcov-22.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/gcov/gcov-22.C	Sun Jan 25 22:32:10 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/gcov/gcov-22.C	Sun Feb  1 22:32:10 2026
***************
*** 1,4 ****
! /* { dg-options "--coverage -fpath-coverage" } */
  /* { dg-do compile } */
  
  #include <stdexcept>
--- 1,4 ----
! /* { dg-options "-fpath-coverage" } */
  /* { dg-do compile } */
  
  #include <stdexcept>
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/guality/guality.exp gcc-16-20260201/gcc/testsuite/g++.dg/guality/guality.exp
*** gcc-16-20260125/gcc/testsuite/g++.dg/guality/guality.exp	Sun Jan 25 22:32:10 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/guality/guality.exp	Sun Feb  1 22:32:10 2026
*************** if {[check_guality "
*** 93,102 ****
  
      gcc-dg-runtest [lsort [glob $srcdir/$subdir/*.C]] "" ""
      gcc-dg-runtest $general "" ""
      set-torture-options \
  	[list "-O0" "-Og"] \
  	[list {}] \
! 	[list "-Og -flto"]
      gcc-dg-runtest $Og "" ""
  }
  
--- 93,109 ----
  
      gcc-dg-runtest [lsort [glob $srcdir/$subdir/*.C]] "" ""
      gcc-dg-runtest $general "" ""
+ 
+     if [check_effective_target_lto] {
+         set lto_option_list [list "-Og -flto"]
+     } else {
+         set lto_option_list ""  
+     }
+ 
      set-torture-options \
  	[list "-O0" "-Og"] \
  	[list {}] \
! 	$lto_option_list
      gcc-dg-runtest $Og "" ""
  }
  
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/lto/pr118817_0.C gcc-16-20260201/gcc/testsuite/g++.dg/lto/pr118817_0.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/lto/pr118817_0.C	Sun Jan 25 22:32:10 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/lto/pr118817_0.C	Sun Feb  1 22:32:10 2026
***************
*** 2,7 ****
--- 2,8 ----
  // { dg-lto-options { { -O3 -fPIC -flto -shared -std=c++20 -Wall } } }
  // { dg-require-effective-target fpic }
  // { dg-require-effective-target shared }
+ // { dg-skip-if "requires hosted libstdc++ for vector and string" { ! hostedlib } }
  
  #include <memory>
  #include <vector>
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/lto/pr123376_0.C gcc-16-20260201/gcc/testsuite/g++.dg/lto/pr123376_0.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/lto/pr123376_0.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/lto/pr123376_0.C	Sun Feb  1 22:32:10 2026
***************
*** 0 ****
--- 1,19 ----
+ // { dg-lto-do assemble }
+ // { dg-lto-options { { -flto -ffat-lto-objects -g } } }
+ 
+ template <typename T> void foo (void *, void *) { new T; }
+ using C = void (*) (void *, void *);
+ template <typename T> struct D { static constexpr C foo = ::foo <T>; };
+ struct E { void (*bar) (void *, void *); };
+ constexpr bool v = false;
+ template <typename T, typename> void baz () { E { D<T>::foo }; }
+ template <class, class, bool> struct F;
+ template <class R, class E> struct F <R, E, false> { static void qux () { baz <R, E> (); } };
+ template <typename... T> void corge () { (F <T, void, v>::qux (), ...); }
+ template <auto S> struct G { long long val = 0; };
+ struct H {
+   virtual void garply ();
+   void plugh (const int &);
+   G <&H::plugh> h;
+ };
+ void fred () { corge <H> (); }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/modules/adl-12_b.C gcc-16-20260201/gcc/testsuite/g++.dg/modules/adl-12_b.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/modules/adl-12_b.C	Sun Jan 25 22:32:10 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/modules/adl-12_b.C	Sun Feb  1 22:32:10 2026
*************** void test(Q::X x) {
*** 20,29 ****
  
  #if __cpp_impl_three_way_comparison >= 201907L
    rewrite_ops(0);  // OK
! 
!   // This should error, but lookup_qualified_name in add_candidates
!   // doesn't look in the instantiation context of this call, so
!   // we don't see the operator!= and think we can validly rewrite.
!   rewrite_ops_error(0);  // { dg-error "required from here" "PR122609" { xfail *-*-* } }
  #endif
  }
--- 20,26 ----
  
  #if __cpp_impl_three_way_comparison >= 201907L
    rewrite_ops(0);  // OK
!   rewrite_ops_error(0);  // { dg-message "required from here" "" { target c++20 } }
!   // { dg-prune-output "no match for" }
  #endif
  }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/modules/contracts-1_a.C gcc-16-20260201/gcc/testsuite/g++.dg/modules/contracts-1_a.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/modules/contracts-1_a.C	Sun Jan 25 22:32:10 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/modules/contracts-1_a.C	Thu Jan  1 00:00:00 1970
***************
*** 1,47 ****
- // Basic test to ensure that guarded templates correctly serialize and
- // deserialize their contracts through the CMI.
- // { dg-additional-options "-fmodules-ts -fcontracts -fcontract-continuation-mode=on" }
- // { dg-skip-if "requires hosted libstdc++ for cstdio" { ! hostedlib } }
- module;
- #include <cstdio>
- #include <experimental/contract>
- export module foo;
- // { dg-module-cmi foo }
- 
- export int violation_count{0};
- export extern "C++" void handle_contract_violation(const std::experimental::contract_violation &violation)
- {
-   violation_count++;
-   printf("violation_count: %d\n", violation_count);
- }
- 
- export int nontemplate(int n)
-   [[ pre: n > 0 ]]
-   [[ post r: r > 0 ]]
- {
-   return -n;
- }
- 
- export
- template<typename T>
- T fn(T n)
-   [[ pre: n > 0 ]]
-   [[ post r: r > 0 ]]
- {
-   printf("%s(%d)\n", __FUNCTION__, n);
-   return n;
- }
- 
- export
- template<typename T>
- void void_fn(T n)
-   [[ pre: n < 0 ]]
- {
-   printf("%s(%d)\n", __FUNCTION__, n);
- }
- 
- export void foo_fn()
- {
-   fn(5);
- }
- 
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/modules/contracts-1_b.C gcc-16-20260201/gcc/testsuite/g++.dg/modules/contracts-1_b.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/modules/contracts-1_b.C	Sun Jan 25 22:32:10 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/modules/contracts-1_b.C	Thu Jan  1 00:00:00 1970
***************
*** 1,31 ****
- // { dg-module-do run }
- // { dg-additional-options "-fmodules-ts -fcontracts -fcontract-continuation-mode=on" }
- // { dg-skip-if "requires hosted libstdc++ for cstdio" { ! hostedlib } }
- 
- #include <cstdio>
- import foo;
- 
- template<typename T>
- bool bar_fn_pre(T n) { printf("bar fn pre(%d)\n", n); return true; }
- 
- template<typename T>
- T bar_fn(T n)
-   [[ pre: bar_fn_pre(n) && n > 0 ]]
- {
-   printf("%s(%d)\n", __FUNCTION__, n);
-   return n;
- }
- 
- int main(int, char**)
- {
-   nontemplate(5);
-   nontemplate(-5);
-   fn(5);
-   fn(-5);
-   void_fn(5);
-   void_fn(-5);
-   bar_fn(5);
-   bar_fn(-5);
-   return violation_count == 6 ? 0 : -1;
- }
- 
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/modules/contracts-2_a.C gcc-16-20260201/gcc/testsuite/g++.dg/modules/contracts-2_a.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/modules/contracts-2_a.C	Sun Jan 25 22:32:10 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/modules/contracts-2_a.C	Thu Jan  1 00:00:00 1970
***************
*** 1,50 ****
- // Basic test to ensure that guarded function contracts are correctly
- // serialized and deserialized through the CMI.
- // This also tries to ensure that entities referenced in a function's
- // contracts are correctly marked as a dependency of the function itself and
- // serialized in the correct order.
- // { dg-additional-options "-fmodules-ts -fcontracts -fcontract-role=default:maybe,maybe,ignore" }
- module;
- #include <cstdio>
- #include <experimental/contract>
- export module foo;
- // { dg-module-cmi foo }
- 
- export int violation_count{0};
- export int violation_line_sum{0};
- export extern "C++" void handle_contract_violation(const std::experimental::contract_violation &violation)
- {
-   violation_count++;
-   violation_line_sum += violation.line_number () * violation_count;
-   printf("violation: %d %d\n", violation_count, violation_line_sum);
- }
- 
- export int fn2(int n);
- export int fn_in2(int n);
- export int pre_print(int n) { printf("pre_print(%d)\n", n); return n; }
- 
- export int fn_in1(int n) [[ pre: pre_print(n) > 0 ]]
- {
-   printf("%s blah (%d)\n", __FUNCTION__, n);
-   return n;
- }
- export int fn_in2(int x) [[ pre: pre_print(x) > 0 ]]
- {
-   printf("%s(%d)\n", __FUNCTION__, x);
-   return x;
- }
- 
- export int fn_iso(int n);
- 
- export int fn1(int n)
-   [[ pre: pre_print(n) > 0 ]];
- 
- export int fn2(int n)
-   [[ pre: pre_print(n) > 0 ]];
- 
- export int pre_print2(int n);
- 
- export int fn3(int n)
-   [[ pre: pre_print2(n) > 0 ]];
- 
- // { dg-skip-if "requires hosted libstdc++ for cstdio" { ! hostedlib } }
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/modules/contracts-2_b.C gcc-16-20260201/gcc/testsuite/g++.dg/modules/contracts-2_b.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/modules/contracts-2_b.C	Sun Jan 25 22:32:10 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/modules/contracts-2_b.C	Thu Jan  1 00:00:00 1970
***************
*** 1,36 ****
- // { dg-additional-options "-fmodules-ts -fcontracts -fcontract-role=default:maybe,maybe,ignore" }
- module;
- #include <cstdio>
- module foo;
- 
- int fn1(int x)
- {
-   printf("%s(%d)\n", __FUNCTION__, x);
-   return x;
- }
- 
- int fn_iso(int n) [[ pre: pre_print(n) > 0 ]]
- {
-   printf("%s(%d)\n", __FUNCTION__, n);
-   return n;
- }
- 
- int pre_print2(int n)
- {
-   printf("pre_print(%d)\n", n);
-   return n;
- }
- 
- int fn2(int x)
- {
-   printf("%s(%d)\n", __FUNCTION__, x);
-   return x;
- }
- 
- int fn3(int x)
- {
-   printf("%s(%d)\n", __FUNCTION__, x);
-   return x;
- }
- 
- // { dg-skip-if "requires hosted libstdc++ for cstdio" { ! hostedlib } }
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/modules/contracts-2_c.C gcc-16-20260201/gcc/testsuite/g++.dg/modules/contracts-2_c.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/modules/contracts-2_c.C	Sun Jan 25 22:32:10 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/modules/contracts-2_c.C	Thu Jan  1 00:00:00 1970
***************
*** 1,22 ****
- // { dg-module-do run }
- // { dg-additional-options "-fmodules-ts -fcontracts -fcontract-role=default:maybe,maybe,ignore" }
- import foo;
- 
- int main(int, char**)
- {
-   int x = -1;
- 
-   fn_iso(x--);
-   fn1(x--);
-   fn2(x--);
-   fn3(x--);
-   fn_in1(x--);
-   fn_in2(x--);
-   return (violation_count == 6 && violation_line_sum == 729) ? 0 : -1;
- }
- 
- // TODO does any of this actually get verified?
- // { dg-output "pre_print.-1.(\n|\r\n|\r)*" }
- // { dg-output "violation: 1 12(\n|\r\n|\r)*" }
- // { dg-output "fn_iso.-1.(\n|\r\n|\r)*" }
- 
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/modules/contracts-3_a.C gcc-16-20260201/gcc/testsuite/g++.dg/modules/contracts-3_a.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/modules/contracts-3_a.C	Sun Jan 25 22:32:10 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/modules/contracts-3_a.C	Thu Jan  1 00:00:00 1970
***************
*** 1,42 ****
- // Basic test to ensure that guarded templates correctly serialize and
- // deserialize their contracts through the CMI.
- // { dg-additional-options "-fmodules-ts -fcontracts -fcontract-continuation-mode=on" }
- // { dg-skip-if "requires hosted libstdc++ for cstdio" { ! hostedlib } }
- module;
- #include <cstdio>
- #include <experimental/contract>
- export module foo;
- // { dg-module-cmi foo }
- 
- export int violation_count{0};
- export extern "C++" void handle_contract_violation(const std::experimental::contract_violation &violation)
- {
-   violation_count++;
-   printf("violation_count: %d\n", violation_count);
- }
- 
- export int nontemplate(int n)
-   [[ pre: n > 0 ]]
-   [[ post r: r > 0 ]]
- {
-   return -n;
- }
- 
- export
- template<typename T>
- T fn(T n)
-   [[ pre: n > 0 ]]
-   [[ post r: r > 0 ]]
- {
-   printf("%s(%d)\n", __FUNCTION__, n);
-   return n;
- }
- 
- export
- template<typename T>
- void void_fn(T n)
-   [[ pre: n < 0 ]]
- {
-   printf("%s(%d)\n", __FUNCTION__, n);
- }
- 
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/modules/contracts-3_b.C gcc-16-20260201/gcc/testsuite/g++.dg/modules/contracts-3_b.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/modules/contracts-3_b.C	Sun Jan 25 22:32:10 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/modules/contracts-3_b.C	Thu Jan  1 00:00:00 1970
***************
*** 1,33 ****
- // { dg-module-do run }
- // { dg-additional-options "-fmodules-ts -fcontracts -fcontract-role=default:ignore,ignore,ignore" }
- // { dg-skip-if "requires hosted libstdc++ for cstdio" { ! hostedlib } }
- 
- #include <cstdio>
- import foo;
- 
- template<typename T>
- bool bar_fn_pre(T n) { printf("bar fn pre(%d)\n", n); return true; }
- 
- template<typename T>
- T bar_fn(T n)
-   [[ pre: bar_fn_pre(n) && n > 0 ]]
- {
-   printf("%s(%d)\n", __FUNCTION__, n);
-   return n;
- }
- 
- int main(int, char**)
- {
-   nontemplate(5);
-   nontemplate(-5);
-   fn(5);
-   fn(-5);
-   fn(5.3);
-   fn(-5.3);
-   void_fn(5);
-   void_fn(-5);
-   bar_fn(5);
-   bar_fn(-5);
-   return violation_count == 7 ? 0 : -1;
- }
- 
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/modules/contracts-4_a.C gcc-16-20260201/gcc/testsuite/g++.dg/modules/contracts-4_a.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/modules/contracts-4_a.C	Sun Jan 25 22:32:10 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/modules/contracts-4_a.C	Thu Jan  1 00:00:00 1970
***************
*** 1,29 ****
- // Test that template contracts are not reintpreted when the reinterpret
- // contracts flag is not set, regardless of the current TU's contract
- // configuration.
- // { dg-additional-options "-fmodules-ts -fcontracts -fcontract-role=default:maybe,maybe,ignore" }
- // { dg-skip-if "requires hosted libstdc++ for cstdio" { ! hostedlib } }
- module;
- #include <cstdio>
- #include <experimental/contract>
- export module foo;
- // { dg-module-cmi foo }
- 
- export int violation_count{0};
- export extern "C++" void handle_contract_violation(const std::experimental::contract_violation &violation)
- {
-   violation_count++;
-   printf("violation_count: %d\n", violation_count);
- }
- 
- export template<typename T>
- T fn_t(T t)
-   [[ pre: t > 0 ]]
-   [[ pre audit %custom: t > 0 ]]
- {
-   printf("%s(%d)\n", __FUNCTION__, t);
-   return t;
- }
- 
- export int fn_int(int n);
- 
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/modules/contracts-4_b.C gcc-16-20260201/gcc/testsuite/g++.dg/modules/contracts-4_b.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/modules/contracts-4_b.C	Sun Jan 25 22:32:10 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/modules/contracts-4_b.C	Thu Jan  1 00:00:00 1970
***************
*** 1,8 ****
- // { dg-additional-options "-fmodules-ts -fcontracts -fcontract-role=default:ignore,ignore,ignore" }
- module foo;
- 
- int fn_int(int n)
- {
-   return fn_t(n);
- }
- 
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/modules/contracts-4_c.C gcc-16-20260201/gcc/testsuite/g++.dg/modules/contracts-4_c.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/modules/contracts-4_c.C	Sun Jan 25 22:32:10 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/modules/contracts-4_c.C	Thu Jan  1 00:00:00 1970
***************
*** 1,9 ****
- // { dg-additional-options "-fmodules-ts -fcontracts -fcontract-role=default:ignore,ignore,ignore" }
- export module bar;
- import foo;
- 
- export int bar_fn_int(int n)
- {
-   return fn_t(n);
- }
- 
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/modules/contracts-4_d.C gcc-16-20260201/gcc/testsuite/g++.dg/modules/contracts-4_d.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/modules/contracts-4_d.C	Sun Jan 25 22:32:10 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/modules/contracts-4_d.C	Thu Jan  1 00:00:00 1970
***************
*** 1,22 ****
- // { dg-module-do run }
- // { dg-additional-options "-fmodules-ts -fcontracts" }
- // { dg-skip-if "requires hosted libstdc++ for cstdio" { ! hostedlib } }
- 
- #include <cstdio>
- import foo;
- import bar;
- 
- int main(int, char**)
- {
-   int x = -1;
- 
-   printf("calling fn_int\n");
-   fn_int(x--);
-   printf("calling bar_fn_int\n");
-   bar_fn_int(x--);
- 
-   return violation_count - 4;
- }
- 
- // TODO verify dg-output as well once the testsuite supports it
- 
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/modules/contracts-5_a.C gcc-16-20260201/gcc/testsuite/g++.dg/modules/contracts-5_a.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/modules/contracts-5_a.C	Sun Jan 25 22:32:10 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/modules/contracts-5_a.C	Thu Jan  1 00:00:00 1970
***************
*** 1,8 ****
- // PR c++/108205
- // Test that the implicitly declared handle_contract_violation function is
- // properly matched with a later declaration in an importing TU.
- // { dg-additional-options "-fmodules -fcontracts -fcontract-continuation-mode=on" }
- // { dg-module-cmi test }
- 
- export module test;
- export inline void foo(int x) noexcept [[ pre: x != 0 ]] {}
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/modules/contracts-5_b.C gcc-16-20260201/gcc/testsuite/g++.dg/modules/contracts-5_b.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/modules/contracts-5_b.C	Sun Jan 25 22:32:10 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/modules/contracts-5_b.C	Thu Jan  1 00:00:00 1970
***************
*** 1,21 ****
- // PR c++/108205
- // { dg-module-do run }
- // { dg-additional-options "-fmodules -fcontracts -fcontract-continuation-mode=on" }
- // { dg-skip-if "required hosted libstdc++ for experimental/contract" { ! hostedlib } }
- 
- #include <experimental/contract>
- import test;
- 
- bool saw_violation = false;
- void handle_contract_violation(const std::experimental::contract_violation& v) {
-   saw_violation = true;
- }
- 
- int main() {
-   foo(10);
-   if (saw_violation)
-     __builtin_abort();
-   foo(0);
-   if (!saw_violation)
-     __builtin_abort();
- }
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/modules/contracts-tpl-friend-1_a.C gcc-16-20260201/gcc/testsuite/g++.dg/modules/contracts-tpl-friend-1_a.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/modules/contracts-tpl-friend-1_a.C	Sun Jan 25 22:32:10 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/modules/contracts-tpl-friend-1_a.C	Thu Jan  1 00:00:00 1970
***************
*** 1,17 ****
- // { dg-additional-options "-fmodules-ts -fcontracts" }
- 
- export module foo;
- // { dg-module-cmi foo }
- 
- void foo (int, void *);
- void foo (float, void *);
- 
- template <typename T> class TPL
- {
-   friend void foo (T, void *); // { dg-warning "non-template function" }
- 
-   T member;
- };
- 
- template class TPL<float>;  // instantiate
- 
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/modules/contracts-tpl-friend-1_b.C gcc-16-20260201/gcc/testsuite/g++.dg/modules/contracts-tpl-friend-1_b.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/modules/contracts-tpl-friend-1_b.C	Sun Jan 25 22:32:10 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/modules/contracts-tpl-friend-1_b.C	Thu Jan  1 00:00:00 1970
***************
*** 1,19 ****
- // { dg-additional-options "-fmodules-ts -fcontracts" }
- 
- module foo;
- 
- void foo (int x, void *p)
-   [[ pre: x > 0 ]]
- {
-   auto *obj = reinterpret_cast<TPL<int> *> (p);
- 
-   obj->member = x;
- }
- 
- void foo (float x, void *p)
-   [[ pre: x > 0 ]]
- {
-   auto *obj = reinterpret_cast<TPL<float> *> (p);
- 
-   obj->member = x;
- }
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/modules/inst-10_a.C gcc-16-20260201/gcc/testsuite/g++.dg/modules/inst-10_a.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/modules/inst-10_a.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/modules/inst-10_a.C	Sun Feb  1 22:32:10 2026
***************
*** 0 ****
--- 1,9 ----
+ // PR c++/122609
+ // { dg-do compile { target c++20 } }
+ // { dg-additional-options "-fmodules" }
+ // { dg-module-cmi K }
+ 
+ export module K;
+ export template <typename T> void use_without_import(T t) {
+   auto [x] = t;
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/modules/inst-10_b.C gcc-16-20260201/gcc/testsuite/g++.dg/modules/inst-10_b.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/modules/inst-10_b.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/modules/inst-10_b.C	Sun Feb  1 22:32:10 2026
***************
*** 0 ****
--- 1,19 ----
+ // PR c++/122609
+ // { dg-do compile { target c++20 } }
+ // { dg-additional-options "-fmodules" }
+ // { dg-module-cmi U }
+ 
+ export module U;
+ import K;
+ 
+ namespace std {
+   template <typename T> struct tuple_size { static constexpr int value = 1; };
+   template <int I, typename T> struct tuple_element { using type = int; };
+ };
+ 
+ export struct S {};
+ template <int I> int get(S) { return 123; };
+ 
+ export template <typename T> void call_use_without_import(T t) {
+   use_without_import(t);
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/modules/inst-10_c.C gcc-16-20260201/gcc/testsuite/g++.dg/modules/inst-10_c.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/modules/inst-10_c.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/modules/inst-10_c.C	Sun Feb  1 22:32:10 2026
***************
*** 0 ****
--- 1,14 ----
+ // PR c++/122609
+ // { dg-do compile { target c++20 } }
+ // { dg-additional-options "-fmodules" }
+ 
+ import U;
+ 
+ int main() {
+   // std::tuple_size and std::tuple_element aren't visible from
+   // use_without_import, and also aren't visible from here,
+   // so despite being visible on the instantiation path this is an error.
+ 
+   call_use_without_import(S{});  // { dg-message "required from here" }
+   // { dg-error {cannot decompose class type} "" { target *-*-* } 0 }
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/modules/inst-8_a.C gcc-16-20260201/gcc/testsuite/g++.dg/modules/inst-8_a.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/modules/inst-8_a.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/modules/inst-8_a.C	Sun Feb  1 22:32:10 2026
***************
*** 0 ****
--- 1,27 ----
+ // PR c++/122609
+ // { dg-do compile { target c++20 } }
+ // { dg-additional-options "-fmodules" }
+ // { dg-module-cmi std }
+ 
+ module;
+ #include <coroutine>
+ #include <tuple>
+ #include <typeinfo>
+ export module std;
+ 
+ // PR c++/101140
+ export using ::operator new;
+ export using ::operator delete;
+ 
+ export namespace std {
+   using std::coroutine_handle;
+   using std::coroutine_traits;
+   using std::suspend_always;
+ 
+   using std::get;
+   using std::tuple;
+   using std::tuple_size;
+   using std::tuple_element;
+ 
+   using std::type_info;
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/modules/inst-8_b.C gcc-16-20260201/gcc/testsuite/g++.dg/modules/inst-8_b.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/modules/inst-8_b.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/modules/inst-8_b.C	Sun Feb  1 22:32:10 2026
***************
*** 0 ****
--- 1,42 ----
+ // PR c++/122609
+ // { dg-do compile { target c++20 } }
+ // { dg-additional-options "-fmodules" }
+ // { dg-module-cmi M }
+ 
+ export module M;
+ import std;  // not exported
+ 
+ export template <typename T> void structured_binding() {
+   std::tuple<T> t;
+   auto [x] = t;
+ }
+ 
+ export template <typename T> void operator_new() {
+   // PR c++/101140
+   T x;
+   new (&x) T;
+ }
+ 
+ export template <typename T> void use_typeid() {
+   const auto& id = typeid(T);
+ }
+ 
+ struct simple_promise;
+ struct simple_coroutine : std::coroutine_handle<simple_promise> {
+   using promise_type = ::simple_promise;
+ };
+ struct simple_promise {
+   simple_coroutine get_return_object() { return { simple_coroutine::from_promise(*this) }; }
+   std::suspend_always initial_suspend() noexcept { return {}; }
+   std::suspend_always final_suspend() noexcept { return {}; }
+   void return_void() {}
+   void unhandled_exception() {}
+ };
+ template <typename T> simple_coroutine coroutine_impl() {
+   co_return;
+ }
+ export template <typename T> void coroutine() {
+   simple_coroutine sc = coroutine_impl<T>();
+   sc.resume();
+   sc.destroy();
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/modules/inst-8_c.C gcc-16-20260201/gcc/testsuite/g++.dg/modules/inst-8_c.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/modules/inst-8_c.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/modules/inst-8_c.C	Sun Feb  1 22:32:10 2026
***************
*** 0 ****
--- 1,12 ----
+ // PR c++/122609
+ // { dg-do compile { target c++20 } }
+ // { dg-additional-options "-fmodules" }
+ 
+ import M;
+ 
+ int main() {
+   structured_binding<int>();
+   operator_new<int>();
+   use_typeid<int>();
+   coroutine<int>();
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/modules/inst-9_a.C gcc-16-20260201/gcc/testsuite/g++.dg/modules/inst-9_a.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/modules/inst-9_a.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/modules/inst-9_a.C	Sun Feb  1 22:32:10 2026
***************
*** 0 ****
--- 1,37 ----
+ // PR c++/122609
+ // PR c++/101140
+ // { dg-additional-options "-fmodules -Wno-global-module -fdump-lang-module" }
+ // { dg-module-cmi M }
+ 
+ module;
+ 
+ using size_t = decltype(sizeof(0));
+ 
+ namespace std {
+   template <typename T> struct tuple_size;
+   template <size_t I, typename T> struct tuple_element;
+ }
+ 
+ struct G {};
+ template <> struct std::tuple_size<G> { static constexpr size_t value = 1; };
+ template <> struct std::tuple_element<0, G> { using type = int; };
+ template <size_t I> int get(G) { return 123; }
+ 
+ export module M;
+ 
+ export using ::G;
+ export template <typename T> void use_gmf(T t) {
+   // This should make std::tuple_size and std::tuple_element decl-reachable;
+   // additionally, this should make ::get reachable via ADL.
+   auto [x] = t;
+   // { dg-final { scan-lang-dump "Bindings '::std::tuple_size'" module { xfail *-*-* } } }
+   // { dg-final { scan-lang-dump "Bindings '::std::tuple_element'" module { xfail *-*-* } } }
+   // { dg-final { scan-lang-dump "Bindings '::get'" module { xfail *-*-* } } }
+ }
+ 
+ export template <typename T> void use_future_decl(T t) {
+   ::new (t) int;
+ }
+ 
+ export struct F {};
+ void* operator new(size_t, F);  // not exported
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/modules/inst-9_b.C gcc-16-20260201/gcc/testsuite/g++.dg/modules/inst-9_b.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/modules/inst-9_b.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/modules/inst-9_b.C	Sun Feb  1 22:32:10 2026
***************
*** 0 ****
--- 1,15 ----
+ // PR c++/122609
+ // PR c++/101140
+ // { dg-additional-options "-fmodules" }
+ 
+ import M;
+ 
+ int main() {
+   use_gmf(G{});  // { dg-bogus "" "PR122609" { xfail *-*-* } }
+   // { dg-prune-output "cannot decompose" }
+ 
+   // operator new is not visible from point of definition,
+   // and is also not visible from this TU (point of instantiation),
+   // so the call below should fail.
+   use_future_decl(F{});  // { dg-error "" "PR122609" { xfail *-*-* } }
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/modules/reflect-1_a.H gcc-16-20260201/gcc/testsuite/g++.dg/modules/reflect-1_a.H
*** gcc-16-20260125/gcc/testsuite/g++.dg/modules/reflect-1_a.H	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/modules/reflect-1_a.H	Sun Feb  1 22:32:10 2026
***************
*** 0 ****
--- 1,11 ----
+ // PR c++/122785
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-fmodule-header -freflection" }
+ // { dg-module-cmi {} }
+ 
+ struct S {
+   friend S foo();
+   S bar(int);
+ };
+ inline S s;
+ template <typename T> decltype(s.bar(T{})) foo(T);
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/modules/reflect-1_b.C gcc-16-20260201/gcc/testsuite/g++.dg/modules/reflect-1_b.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/modules/reflect-1_b.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/modules/reflect-1_b.C	Sun Feb  1 22:32:10 2026
***************
*** 0 ****
--- 1,6 ----
+ // PR c++/122785
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-fmodules -freflection" }
+ 
+ import "reflect-1_a.H";
+ using ::S;
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/modules/splice-scope-tree_a.C gcc-16-20260201/gcc/testsuite/g++.dg/modules/splice-scope-tree_a.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/modules/splice-scope-tree_a.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/modules/splice-scope-tree_a.C	Sun Feb  1 22:32:10 2026
***************
*** 0 ****
--- 1,12 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-fmodules -freflection" }
+ 
+ export module exporting_splice_scope;
+ // { dg-module-cmi exporting_splice_scope }
+ 
+ export template <typename T>
+ using dependent_splice_type = typename [: ^^T :];
+ 
+ export template <bool Cond, typename T, typename U>
+ using somehow_more_complicated_dependent_splice_type =
+     typename [: Cond ? ^^T : ^^U :];
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/modules/splice-scope-tree_b.C gcc-16-20260201/gcc/testsuite/g++.dg/modules/splice-scope-tree_b.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/modules/splice-scope-tree_b.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/modules/splice-scope-tree_b.C	Sun Feb  1 22:32:10 2026
***************
*** 0 ****
--- 1,16 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-fmodules -freflection" }
+ 
+ import exporting_splice_scope;
+ 
+ #include <meta>
+ 
+ int
+ main ()
+ {
+   static_assert (std::meta::dealias (^^dependent_splice_type<int>) == ^^int);
+   static_assert (std::meta::dealias (
+       ^^somehow_more_complicated_dependent_splice_type<true, int, double>) == ^^int);
+   static_assert (std::meta::dealias (
+       ^^somehow_more_complicated_dependent_splice_type<false, int, double>) == ^^double);
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/pr123575.C gcc-16-20260201/gcc/testsuite/g++.dg/pr123575.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/pr123575.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/pr123575.C	Sun Feb  1 22:32:10 2026
***************
*** 0 ****
--- 1,12 ----
+ // { dg-do compile }
+ // { dg-options "-O -Wno-psabi" }
+ 
+ typedef int __attribute__((vector_size(sizeof(int)*2))) v2i;
+ typedef long __attribute__((vector_size(sizeof(long)*2))) v2l;
+ 
+ v2l f(v2i a)
+ {
+   v2l  t = __builtin_convertvector(a, v2l);
+   t = t > 0 ? t : -t;
+   return t;
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/reflect/annotations10.C gcc-16-20260201/gcc/testsuite/g++.dg/reflect/annotations10.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/reflect/annotations10.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/reflect/annotations10.C	Sun Feb  1 22:32:10 2026
***************
*** 0 ****
--- 1,12 ----
+ // PR c++/123866
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ #include <meta>
+ 
+ struct A
+ {
+   [[=1, =2]] void foo () {}
+ };
+ 
+ static_assert (annotations_of (^^A::foo).size () == 2);
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/reflect/annotations9.C gcc-16-20260201/gcc/testsuite/g++.dg/reflect/annotations9.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/reflect/annotations9.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/reflect/annotations9.C	Sun Feb  1 22:32:10 2026
***************
*** 0 ****
--- 1,14 ----
+ // PR c++/123837
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // { dg-additional-options "-flto" { target lto } }
+ 
+ struct A {};
+ [[=A {}]] int a {};
+ struct [[=A {}]] B { int b; };
+ B b {};
+ 
+ int
+ main ()
+ {
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/reflect/cwg3153.C gcc-16-20260201/gcc/testsuite/g++.dg/reflect/cwg3153.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/reflect/cwg3153.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/reflect/cwg3153.C	Sun Feb  1 22:32:10 2026
***************
*** 0 ****
--- 1,51 ----
+ // CWG3153
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ #include <compare>
+ 
+ struct A {
+   decltype (^^::) a = ^^::;
+   consteval A () {}
+   bool operator== (const A &) const = default;	// { dg-bogus "function of consteval-only type must be declared 'consteval'" }
+ };
+ 
+ template <typename T, T V>
+ struct B
+ {
+   T b = V;
+   consteval B () {}
+   bool operator== (const B &) const = default;
+ };
+ 
+ struct C {
+   decltype (^^::) c= ^^::;
+   int d = 0;
+   consteval C () {}
+   consteval bool operator== (const C &x) const { return d == x.d; }
+   consteval auto operator<=> (const C &x) const { return d <=> x.d; }
+ };
+ 
+ struct D : public C {
+   int e = 0;
+   consteval D () {}
+   auto operator<=> (const D &) const = default;
+ };
+ 
+ consteval
+ {
+   A a;
+   A b;
+   if (a != b) throw 1;
+   B <decltype (^^::), ^^::> c;
+   B <decltype (^^::), ^^::> d;
+   if (c != d) throw 2;
+   D e;
+   D f;
+   if (e != f) throw 3;
+   f.d = 2;
+   if (e >= f) throw 4;
+   f.d = 0;
+   f.e = -1;
+   if (e <= f) throw 5;
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/reflect/define_aggregate3.C gcc-16-20260201/gcc/testsuite/g++.dg/reflect/define_aggregate3.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/reflect/define_aggregate3.C	Sun Jan 25 22:32:10 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/reflect/define_aggregate3.C	Sun Feb  1 22:32:10 2026
*************** consteval bool foo () { return define_ag
*** 15,22 ****
  const bool a = foo ();					// { dg-error "call to consteval function 'foo\\\(\\\)' is not a constant expression" }
  
  struct S3 {
!   consteval {						// { dg-message "'consteval' block defined here" }
!     define_aggregate (^^S3, {});			// { dg-error "'define_aggregate' evaluated from 'consteval' block enclosed by 'S3' being defined" }
    }
  };
  
--- 15,22 ----
  const bool a = foo ();					// { dg-error "call to consteval function 'foo\\\(\\\)' is not a constant expression" }
  
  struct S3 {
!   consteval {
!     define_aggregate (^^S3, {});			// { dg-error "first 'define_aggregate' argument is a reflection of a class type .S3. being defined" }
    }
  };
  
*************** consteval {
*** 33,58 ****
  
  template <typename T>
  struct S5 {
!   consteval {						// { dg-message "'consteval' block defined here" }
!     define_aggregate (^^S5 <T>, {});			// { dg-error "'define_aggregate' evaluated from 'consteval' block enclosed by 'S5<int>' being defined" }
    }
  };
  
  S5 <int> s5;
  
! consteval bool bar (info x) { return define_aggregate (x, {}) == x; }	// { dg-error "'define_aggregate' evaluated from 'consteval' block enclosed by 'S6' being defined" }
  
  struct S6 {
!   consteval {						// { dg-message "'consteval' block defined here" }
      bar (^^S6);
    }
  };
  
! consteval bool baz (info x) { return define_aggregate (x, {}) == x; }	// { dg-error "'define_aggregate' evaluated from 'consteval' block enclosed by 'S7<char>' being defined" }
  
  template <typename T>
  struct S7 {
!   consteval {						// { dg-message "'consteval' block defined here" }
      baz (^^S7 <T>);
    }
  };
--- 33,58 ----
  
  template <typename T>
  struct S5 {
!   consteval {
!     define_aggregate (^^S5 <T>, {});			// { dg-error "first 'define_aggregate' argument is a reflection of a class type .S5<int>. being defined" }
    }
  };
  
  S5 <int> s5;
  
! consteval bool bar (info x) { return define_aggregate (x, {}) == x; }	// { dg-error "first 'define_aggregate' argument is a reflection of a class type .S6. being defined" }
  
  struct S6 {
!   consteval {
      bar (^^S6);
    }
  };
  
! consteval bool baz (info x) { return define_aggregate (x, {}) == x; }	// { dg-error "first 'define_aggregate' argument is a reflection of a class type .S7<char>. being defined" }
  
  template <typename T>
  struct S7 {
!   consteval {
      baz (^^S7 <T>);
    }
  };
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/reflect/error11.C gcc-16-20260201/gcc/testsuite/g++.dg/reflect/error11.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/reflect/error11.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/reflect/error11.C	Sun Feb  1 22:32:10 2026
***************
*** 0 ****
--- 1,22 ----
+ // PR c++/123871
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ #include <meta>
+ 
+ template<class T>
+ consteval auto
+ test ()
+ {
+   auto lambda = [](this auto){
+       constexpr std::meta::info array[1] = {^^T};
+       using X = [: array[100] :];  // { dg-error "splice argument must be" }
+       sizeof(X);
+   };
+ }
+ 
+ void
+ g ()
+ {
+   test<int>();
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/reflect/expr15.C gcc-16-20260201/gcc/testsuite/g++.dg/reflect/expr15.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/reflect/expr15.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/reflect/expr15.C	Sun Feb  1 22:32:10 2026
***************
*** 0 ****
--- 1,22 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ void
+ f1 ()
+ {
+   int x = 1; // { dg-message ".x. declared here" }
+   constexpr auto r = ^^x;
+   [=] -> decltype(x) {
+     return [:r:]; // { dg-error "use of local variable" }
+   };
+ }
+ 
+ void
+ f2 ()
+ {
+   int x = 1; // { dg-message ".x. declared here" }
+   constexpr auto r = ^^x;
+   [&] -> decltype(x) {
+     return [:r:]; // { dg-error "use of local variable" }
+   };
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/reflect/extract1.C gcc-16-20260201/gcc/testsuite/g++.dg/reflect/extract1.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/reflect/extract1.C	Sun Jan 25 22:32:10 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/reflect/extract1.C	Sun Feb  1 22:32:10 2026
*************** constexpr auto a4 = extract<int (*)() no
*** 171,183 ****
  constexpr auto a5 = extract<int (*)(B)>(^^B::fn5);
  constexpr auto a6 = extract<int (B::*)(int) &>(^^B::fn6);
  constexpr auto a7 = extract<int (B::*)(int) &&>(^^B::fn7);
- 
  constexpr auto a8 = extract<int B::*>(^^B::m);
  constexpr auto a9 = extract<int const B::*>(^^B::m);
  constexpr auto a10 = extract<int* B::*>(^^B::p);
  constexpr auto a11 = extract<int* const B::*>(^^B::p);
  constexpr auto a12 = extract<int const* const B::*>(^^B::p);
! 
! // FIXME removing noexcept should be allowed
! // constexpr auto a13 = extract<int (*)()>(^^B::fn4);
! // constexpr auto a14 = extract<int (B::*)()>(^^B::fn2);
--- 171,180 ----
  constexpr auto a5 = extract<int (*)(B)>(^^B::fn5);
  constexpr auto a6 = extract<int (B::*)(int) &>(^^B::fn6);
  constexpr auto a7 = extract<int (B::*)(int) &&>(^^B::fn7);
  constexpr auto a8 = extract<int B::*>(^^B::m);
  constexpr auto a9 = extract<int const B::*>(^^B::m);
  constexpr auto a10 = extract<int* B::*>(^^B::p);
  constexpr auto a11 = extract<int* const B::*>(^^B::p);
  constexpr auto a12 = extract<int const* const B::*>(^^B::p);
! constexpr auto a13 = extract<int (*)()>(^^B::fn4);
! constexpr auto a14 = extract<int (B::*)()>(^^B::fn2);
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/reflect/extract2.C gcc-16-20260201/gcc/testsuite/g++.dg/reflect/extract2.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/reflect/extract2.C	Sun Jan 25 22:32:10 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/reflect/extract2.C	Sun Feb  1 22:32:10 2026
*************** struct C {
*** 130,140 ****
  };
  static_assert (!can_extract<void (C::*)()>(^^C::fn));
  static_assert (!can_extract<int (C::*)() noexcept>(^^C::fn));
! static_assert (!can_extract<int (C::*)()>(^^C::fn2));
  static_assert (!can_extract<int (C::*)()>(^^C::fn3));
  static_assert (!can_extract<int (C::*)()>(^^C::fn4));
  static_assert (!can_extract<int (*)() noexcept>(^^C::fn3));
! static_assert (!can_extract<int (*)()>(^^C::fn4));
  static_assert (!can_extract<int (*)()>(^^C::fn5));
  static_assert (!can_extract<int (C::*)(int) &&>(^^C::fn6));
  static_assert (!can_extract<int (C::*)(int) &>(^^C::fn7));
--- 130,140 ----
  };
  static_assert (!can_extract<void (C::*)()>(^^C::fn));
  static_assert (!can_extract<int (C::*)() noexcept>(^^C::fn));
! static_assert (can_extract<int (C::*)()>(^^C::fn2));
  static_assert (!can_extract<int (C::*)()>(^^C::fn3));
  static_assert (!can_extract<int (C::*)()>(^^C::fn4));
  static_assert (!can_extract<int (*)() noexcept>(^^C::fn3));
! static_assert (can_extract<int (*)()>(^^C::fn4));
  static_assert (!can_extract<int (*)()>(^^C::fn5));
  static_assert (!can_extract<int (C::*)(int) &&>(^^C::fn6));
  static_assert (!can_extract<int (C::*)(int) &>(^^C::fn7));
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/reflect/has_identifier3.C gcc-16-20260201/gcc/testsuite/g++.dg/reflect/has_identifier3.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/reflect/has_identifier3.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/reflect/has_identifier3.C	Sun Feb  1 22:32:10 2026
***************
*** 0 ****
--- 1,23 ----
+ // PR c++/123825
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::has_identifier.
+ 
+ #include <meta>
+ 
+ void fun (int);
+ constexpr std::meta::info r = parameters_of (^^fun)[0];
+ static_assert (!has_identifier (r));
+ 
+ void fun (int x);
+ static_assert (has_identifier (r));
+ 
+ void fun (int x);
+ static_assert (has_identifier (r));
+ 
+ void
+ poison ()
+ {
+   void fun (int y);
+ }
+ static_assert (!has_identifier (r));
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/reflect/identifier_of3.C gcc-16-20260201/gcc/testsuite/g++.dg/reflect/identifier_of3.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/reflect/identifier_of3.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/reflect/identifier_of3.C	Sun Feb  1 22:32:10 2026
***************
*** 0 ****
--- 1,73 ----
+ // PR c++/123825
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::identifier_of.
+ 
+ #include <meta>
+ 
+ void foo (int, int x, int y, int z);
+ 
+ int
+ bar (int, int x, int y, int z, int)
+ {
+   return x + y + z;
+ }
+ 
+ constexpr auto foo1 = parameters_of (^^foo)[0];
+ constexpr auto foo2 = parameters_of (^^foo)[1];
+ constexpr auto foo3 = parameters_of (^^foo)[2];
+ constexpr auto foo4 = parameters_of (^^foo)[3];
+ constexpr auto bar1 = parameters_of (^^bar)[0];
+ constexpr auto bar2 = parameters_of (^^bar)[1];
+ constexpr auto bar3 = parameters_of (^^bar)[2];
+ constexpr auto bar4 = parameters_of (^^bar)[3];
+ constexpr auto bar5 = parameters_of (^^bar)[4];
+ static_assert (!has_identifier (foo1));
+ static_assert (identifier_of (foo2) == std::string_view ("x"));
+ static_assert (identifier_of (foo3) == std::string_view ("y"));
+ static_assert (identifier_of (foo4) == std::string_view ("z"));
+ static_assert (!has_identifier (bar1));
+ static_assert (identifier_of (bar2) == std::string_view ("x"));
+ static_assert (identifier_of (bar3) == std::string_view ("y"));
+ static_assert (identifier_of (bar4) == std::string_view ("z"));
+ static_assert (!has_identifier (bar5));
+ 
+ void
+ baz ()
+ {
+   void foo (int w, int, int v, int z);
+   int bar (int, int, int v, int z, int u);
+   void qux (int, int x, int y, int z);
+   constexpr auto qux1 = parameters_of (^^qux)[0];
+   constexpr auto qux2 = parameters_of (^^qux)[1];
+   constexpr auto qux3 = parameters_of (^^qux)[2];
+   constexpr auto qux4 = parameters_of (^^qux)[3];
+   static_assert (!has_identifier (qux1));
+   static_assert (identifier_of (qux2) == std::string_view ("x"));
+   static_assert (identifier_of (qux3) == std::string_view ("y"));
+   static_assert (identifier_of (qux4) == std::string_view ("z"));
+ }
+ 
+ static_assert (identifier_of (foo1) == std::string_view ("w"));
+ static_assert (identifier_of (foo2) == std::string_view ("x"));
+ static_assert (!has_identifier (foo3));
+ static_assert (identifier_of (foo4) == std::string_view ("z"));
+ static_assert (!has_identifier (bar1));
+ static_assert (identifier_of (bar2) == std::string_view ("x"));
+ static_assert (!has_identifier (bar3));
+ static_assert (identifier_of (bar4) == std::string_view ("z"));
+ static_assert (identifier_of (bar5) == std::string_view ("u"));
+ 
+ void
+ fred ()
+ {
+   void qux (int w, int, int v, int z);
+   constexpr auto qux1 = parameters_of (^^qux)[0];
+   constexpr auto qux2 = parameters_of (^^qux)[1];
+   constexpr auto qux3 = parameters_of (^^qux)[2];
+   constexpr auto qux4 = parameters_of (^^qux)[3];
+   static_assert (identifier_of (qux1) == std::string_view ("w"));
+   static_assert (identifier_of (qux2) == std::string_view ("x"));
+   static_assert (!has_identifier (qux3));
+   static_assert (identifier_of (qux4) == std::string_view ("z"));
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/reflect/p2996-21.C gcc-16-20260201/gcc/testsuite/g++.dg/reflect/p2996-21.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/reflect/p2996-21.C	Sun Jan 25 22:32:10 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/reflect/p2996-21.C	Sun Feb  1 22:32:10 2026
***************
*** 7,15 ****
  using namespace std::meta;
  
  struct S0 {
!   consteval {						// { dg-message "'consteval' block defined here" }
      std::meta::define_aggregate(^^S0, {});		// error: scope associated with S0 encloses the consteval block
!   }							// { dg-error "'define_aggregate' evaluated from 'consteval' block enclosed by 'S0' being defined" "" { target *-*-* } .-1 }
  };
  
  struct S1;
--- 7,15 ----
  using namespace std::meta;
  
  struct S0 {
!   consteval {
      std::meta::define_aggregate(^^S0, {});		// error: scope associated with S0 encloses the consteval block
!   }							// { dg-error "first 'define_aggregate' argument is a reflection of a class type .S0. being defined" "" { target *-*-* } .-1 }
  };
  
  struct S1;
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/reflect/p3491-2.C gcc-16-20260201/gcc/testsuite/g++.dg/reflect/p3491-2.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/reflect/p3491-2.C	Sun Jan 25 22:32:10 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/reflect/p3491-2.C	Sun Feb  1 22:32:10 2026
*************** constexpr auto foo() -> std::vector<int>
*** 12,33 ****
  consteval void bar() {
      template for (constexpr int I : foo()) {
          // doesn't work
!     }		// { dg-error "modification of '<temporary>' from outside current evaluation is not a constant expression" }
  }
  
  consteval int baz() {
      int r = 0;
- #if 0
-     // TODO: This doesn't work yet.
      template for (constexpr int I : std::define_static_array(foo())) {
  	r += I;
      }
- #else
-     // Ugly workaround for that.
-     template for (constexpr int I : (const std::span<const int>)std::define_static_array(foo())) {
- 	r += I;
-     }
- #endif
      return r;
  }
  
--- 12,25 ----
  consteval void bar() {
      template for (constexpr int I : foo()) {
          // doesn't work
!     }		// { dg-error "'foo\\\(\\\)' is not a constant expression because it refers to a result of 'operator new'" }
  }
  
  consteval int baz() {
      int r = 0;
      template for (constexpr int I : std::define_static_array(foo())) {
  	r += I;
      }
      return r;
  }
  
*************** consteval int fred() {
*** 45,50 ****
--- 37,51 ----
      return (... + m);
  }
  
+ consteval int garply() {
+     int r = 0;
+     template for (constexpr int I : (const std::span<const int>)std::define_static_array(foo())) {
+ 	r += I;
+     }
+     return r;
+ }
+ 
  static_assert (baz() == 6);
  static_assert (qux() == 6);
  static_assert (fred<int>() == 6);
+ static_assert (garply() == 6);
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/reflect/pr123404.C gcc-16-20260201/gcc/testsuite/g++.dg/reflect/pr123404.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/reflect/pr123404.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/reflect/pr123404.C	Sun Feb  1 22:32:10 2026
***************
*** 0 ****
--- 1,39 ----
+ // PR c++/123404
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ struct S {
+   decltype (^^::) a = ^^::;
+   consteval S () {}
+   S (const S &) = default;			// { dg-bogus "function of consteval-only type must be declared 'consteval'" }
+   S (S &&) = default;				// { dg-bogus "function of consteval-only type must be declared 'consteval'" }
+   S &operator= (const S &) = default;		// { dg-bogus "function of consteval-only type must be declared 'consteval'" }
+   S &operator= (S &&) = default;		// { dg-bogus "function of consteval-only type must be declared 'consteval'" }
+   consteval const char *what () { return "what"; }
+ };
+ 
+ template <typename T, T V>
+ struct U
+ {
+   T a = V;
+   consteval U () {}
+   U (const U &) = default;			// { dg-bogus "function of consteval-only type must be declared 'consteval'" }
+   U (U &&) = default;				// { dg-bogus "function of consteval-only type must be declared 'consteval'" }
+   U &operator= (const U &) = default;		// { dg-bogus "function of consteval-only type must be declared 'consteval'" }
+   U &operator= (U &&) = default;		// { dg-bogus "function of consteval-only type must be declared 'consteval'" }
+   consteval const char *what () { return "what"; }
+ };
+ 
+ consteval
+ {
+   S s;
+   S t;
+   t = s;
+   S u = t;
+   u.what ();
+   U <decltype (^^::), ^^::> v;
+   U <decltype (^^::), ^^::> w;
+   w = v;
+   U <decltype (^^::), ^^::> x = w;
+   x.what ();
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/reflect/substitute3.C gcc-16-20260201/gcc/testsuite/g++.dg/reflect/substitute3.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/reflect/substitute3.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/reflect/substitute3.C	Sun Feb  1 22:32:10 2026
***************
*** 0 ****
--- 1,22 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::substitute.  Test the case when undeduced_auto_decl
+ // is true after resolve_nondeduced_context.
+ 
+ #include <meta>
+ 
+ template<typename>
+ auto
+ f ()
+ {
+ }
+ 
+ consteval bool
+ g ()
+ {
+   try { substitute (^^f, { ^^int }); }
+   catch (std::meta::exception &) { return false; }
+   return true;
+ }
+ 
+ static_assert (!g ());
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/template/pr123354.C gcc-16-20260201/gcc/testsuite/g++.dg/template/pr123354.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/template/pr123354.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/template/pr123354.C	Sun Feb  1 22:32:10 2026
***************
*** 0 ****
--- 1,18 ----
+ // PR c++/123354
+ // { dg-do compile { target c++11 } }
+ // ICE with static local var referenced in NSDMI of local class
+ 
+ template<typename T>
+ void foo() {
+     static constexpr int value = 42;
+     struct s1_t {
+         struct s2_t {
+             int dummy { 0 };
+             char* ptr { static_cast<char*>(::operator new(sizeof(value)))};
+         } s2;
+     } object;
+ }
+ 
+ int main() {
+     foo<void>();
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/torture/pr123596.C gcc-16-20260201/gcc/testsuite/g++.dg/torture/pr123596.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/torture/pr123596.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/torture/pr123596.C	Sun Feb  1 22:32:10 2026
***************
*** 0 ****
--- 1,18 ----
+ // { dg-do compile }
+ 
+ struct b {
+   ~b() {}
+ };
+ struct c {
+   c(long, const int &, b = b());
+ };
+ int _setjmp();
+ long d;
+ void e(int *);
+ int a;
+ int main()
+ {
+   auto f = [](int *data) { e(data); };
+   f(&a);
+   c(d, _setjmp());
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/torture/pr123820-1.C gcc-16-20260201/gcc/testsuite/g++.dg/torture/pr123820-1.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/torture/pr123820-1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/torture/pr123820-1.C	Sun Feb  1 22:32:10 2026
***************
*** 0 ****
--- 1,41 ----
+ /* { dg-do run } */
+ /* PR tree-optimization/123820 */
+ 
+ struct Trit { char value; };
+ 
+ struct Matrix {
+     int width;
+     Trit* data;
+ 
+     Trit& at(int x, int y) {
+         if (!(x >= y)) __builtin_abort ();
+         return data[y * width];
+     }
+ };
+ 
+ 
+ Trit set_value;
+ [[gnu::used]]
+ int EmbedPositionDetectionPattern_yStart;
+ 
+ [[gnu::used,gnu::noipa]]
+ void EmbedPositionDetectionPattern(Matrix& m) {
+     for (int y = 0; y < 7; ++y)
+         for (int x = 0; x < 7; ++x)
+             m.at(x, EmbedPositionDetectionPattern_yStart + y) = {0};
+ 
+     for (int i = 1; i < 8; ++i) {
+         if (i < m.width)
+             m.at(i, 7) = {0};
+ 
+         int y = EmbedPositionDetectionPattern_yStart + i;
+         if (7 < m.width && y)
+             m.at(7, y) = {0};
+     }
+ }
+ 
+ int main()
+ {
+   return 0;
+ }
+ 
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/warn/Wkeyword-macro-1.C gcc-16-20260201/gcc/testsuite/g++.dg/warn/Wkeyword-macro-1.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/warn/Wkeyword-macro-1.C	Sun Jan 25 22:32:12 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/warn/Wkeyword-macro-1.C	Sun Feb  1 22:32:10 2026
***************
*** 26,32 ****
  #define constexpr 1			// { dg-error "keyword 'constexpr' defined as macro" "" { target c++26 } }
  #define constinit 1			// { dg-error "keyword 'constinit' defined as macro" "" { target c++26 } }
  #define continue 1			// { dg-error "keyword 'continue' defined as macro" "" { target c++26 } }
! #define contract_assert 1
  #define co_return 1			// { dg-error "keyword 'co_return' defined as macro" "" { target c++26 } }
  #define co_yield 1			// { dg-error "keyword 'co_yield' defined as macro" "" { target c++26 } }
  #define decltype 1			// { dg-error "keyword 'decltype' defined as macro" "" { target c++26 } }
--- 26,32 ----
  #define constexpr 1			// { dg-error "keyword 'constexpr' defined as macro" "" { target c++26 } }
  #define constinit 1			// { dg-error "keyword 'constinit' defined as macro" "" { target c++26 } }
  #define continue 1			// { dg-error "keyword 'continue' defined as macro" "" { target c++26 } }
! #define contract_assert 1		// { dg-error "keyword 'contract_assert' defined as macro" "" { target c++26 } }
  #define co_return 1			// { dg-error "keyword 'co_return' defined as macro" "" { target c++26 } }
  #define co_yield 1			// { dg-error "keyword 'co_yield' defined as macro" "" { target c++26 } }
  #define decltype 1			// { dg-error "keyword 'decltype' defined as macro" "" { target c++26 } }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/warn/Wkeyword-macro-2.C gcc-16-20260201/gcc/testsuite/g++.dg/warn/Wkeyword-macro-2.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/warn/Wkeyword-macro-2.C	Sun Jan 25 22:32:12 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/warn/Wkeyword-macro-2.C	Sun Feb  1 22:32:10 2026
***************
*** 26,32 ****
  #define constexpr 1			// { dg-warning "keyword 'constexpr' defined as macro" "" { target c++26 } }
  #define constinit 1			// { dg-warning "keyword 'constinit' defined as macro" "" { target c++26 } }
  #define continue 1			// { dg-warning "keyword 'continue' defined as macro" "" { target c++26 } }
! #define contract_assert 1
  #define co_return 1			// { dg-warning "keyword 'co_return' defined as macro" "" { target c++26 } }
  #define co_yield 1			// { dg-warning "keyword 'co_yield' defined as macro" "" { target c++26 } }
  #define decltype 1			// { dg-warning "keyword 'decltype' defined as macro" "" { target c++26 } }
--- 26,32 ----
  #define constexpr 1			// { dg-warning "keyword 'constexpr' defined as macro" "" { target c++26 } }
  #define constinit 1			// { dg-warning "keyword 'constinit' defined as macro" "" { target c++26 } }
  #define continue 1			// { dg-warning "keyword 'continue' defined as macro" "" { target c++26 } }
! #define contract_assert 1		// { dg-warning "keyword 'contract_assert' defined as macro" "" { target c++26 } }
  #define co_return 1			// { dg-warning "keyword 'co_return' defined as macro" "" { target c++26 } }
  #define co_yield 1			// { dg-warning "keyword 'co_yield' defined as macro" "" { target c++26 } }
  #define decltype 1			// { dg-warning "keyword 'decltype' defined as macro" "" { target c++26 } }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/warn/Wkeyword-macro-4.C gcc-16-20260201/gcc/testsuite/g++.dg/warn/Wkeyword-macro-4.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/warn/Wkeyword-macro-4.C	Sun Jan 25 22:32:12 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/warn/Wkeyword-macro-4.C	Sun Feb  1 22:32:10 2026
***************
*** 26,32 ****
  #undef constexpr 			// { dg-error "undefining keyword 'constexpr'" "" { target c++26 } }
  #undef constinit 			// { dg-error "undefining keyword 'constinit'" "" { target c++26 } }
  #undef continue 			// { dg-error "undefining keyword 'continue'" "" { target c++26 } }
! #undef contract_assert
  #undef co_return 			// { dg-error "undefining keyword 'co_return'" "" { target c++26 } }
  #undef co_yield 			// { dg-error "undefining keyword 'co_yield'" "" { target c++26 } }
  #undef decltype 			// { dg-error "undefining keyword 'decltype'" "" { target c++26 } }
--- 26,32 ----
  #undef constexpr 			// { dg-error "undefining keyword 'constexpr'" "" { target c++26 } }
  #undef constinit 			// { dg-error "undefining keyword 'constinit'" "" { target c++26 } }
  #undef continue 			// { dg-error "undefining keyword 'continue'" "" { target c++26 } }
! #undef contract_assert			// { dg-error "undefining keyword 'contract_assert'" "" { target c++26 } }
  #undef co_return 			// { dg-error "undefining keyword 'co_return'" "" { target c++26 } }
  #undef co_yield 			// { dg-error "undefining keyword 'co_yield'" "" { target c++26 } }
  #undef decltype 			// { dg-error "undefining keyword 'decltype'" "" { target c++26 } }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/warn/Wkeyword-macro-5.C gcc-16-20260201/gcc/testsuite/g++.dg/warn/Wkeyword-macro-5.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/warn/Wkeyword-macro-5.C	Sun Jan 25 22:32:12 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/warn/Wkeyword-macro-5.C	Sun Feb  1 22:32:10 2026
***************
*** 26,32 ****
  #undef constexpr 			// { dg-warning "undefining keyword 'constexpr'" "" { target c++26 } }
  #undef constinit 			// { dg-warning "undefining keyword 'constinit'" "" { target c++26 } }
  #undef continue 			// { dg-warning "undefining keyword 'continue'" "" { target c++26 } }
! #undef contract_assert
  #undef co_return 			// { dg-warning "undefining keyword 'co_return'" "" { target c++26 } }
  #undef co_yield 			// { dg-warning "undefining keyword 'co_yield'" "" { target c++26 } }
  #undef decltype 			// { dg-warning "undefining keyword 'decltype'" "" { target c++26 } }
--- 26,32 ----
  #undef constexpr 			// { dg-warning "undefining keyword 'constexpr'" "" { target c++26 } }
  #undef constinit 			// { dg-warning "undefining keyword 'constinit'" "" { target c++26 } }
  #undef continue 			// { dg-warning "undefining keyword 'continue'" "" { target c++26 } }
! #undef contract_assert			// { dg-warning "undefining keyword 'contract_assert'" "" { target c++26 } }
  #undef co_return 			// { dg-warning "undefining keyword 'co_return'" "" { target c++26 } }
  #undef co_yield 			// { dg-warning "undefining keyword 'co_yield'" "" { target c++26 } }
  #undef decltype 			// { dg-warning "undefining keyword 'decltype'" "" { target c++26 } }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/warn/Wkeyword-macro-7.C gcc-16-20260201/gcc/testsuite/g++.dg/warn/Wkeyword-macro-7.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/warn/Wkeyword-macro-7.C	Sun Jan 25 22:32:12 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/warn/Wkeyword-macro-7.C	Sun Feb  1 22:32:10 2026
***************
*** 3,8 ****
--- 3,9 ----
  // { dg-do preprocess }
  // { dg-options "-Wkeyword-macro" }
  // { dg-additional-options "-fmodules" { target c++20 } }
+ // { dg-additional-options "-fcontracts" { target c++26 } }
  
  // [lex.key]
  #define alignas 1			// { dg-warning "keyword 'alignas' defined as macro" "" { target c++11 } }
***************
*** 26,32 ****
  #define constexpr 1			// { dg-warning "keyword 'constexpr' defined as macro" "" { target c++11 } }
  #define constinit 1			// { dg-warning "keyword 'constinit' defined as macro" "" { target c++20 } }
  #define continue 1			// { dg-warning "keyword 'continue' defined as macro" }
! #define contract_assert 1
  #define co_return 1			// { dg-warning "keyword 'co_return' defined as macro" "" { target c++20 } }
  #define co_yield 1			// { dg-warning "keyword 'co_yield' defined as macro" "" { target c++20 } }
  #define decltype 1			// { dg-warning "keyword 'decltype' defined as macro" "" { target c++11 } }
--- 27,33 ----
  #define constexpr 1			// { dg-warning "keyword 'constexpr' defined as macro" "" { target c++11 } }
  #define constinit 1			// { dg-warning "keyword 'constinit' defined as macro" "" { target c++20 } }
  #define continue 1			// { dg-warning "keyword 'continue' defined as macro" }
! #define contract_assert 1		// { dg-warning "keyword 'contract_assert' defined as macro" "" { target c++26 } }
  #define co_return 1			// { dg-warning "keyword 'co_return' defined as macro" "" { target c++20 } }
  #define co_yield 1			// { dg-warning "keyword 'co_yield' defined as macro" "" { target c++20 } }
  #define decltype 1			// { dg-warning "keyword 'decltype' defined as macro" "" { target c++11 } }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/warn/Wkeyword-macro-8.C gcc-16-20260201/gcc/testsuite/g++.dg/warn/Wkeyword-macro-8.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/warn/Wkeyword-macro-8.C	Sun Jan 25 22:32:12 2026
--- gcc-16-20260201/gcc/testsuite/g++.dg/warn/Wkeyword-macro-8.C	Sun Feb  1 22:32:10 2026
***************
*** 3,8 ****
--- 3,9 ----
  // { dg-do preprocess }
  // { dg-options "-Wkeyword-macro" }
  // { dg-additional-options "-fmodules" { target c++20 } }
+ // { dg-additional-options "-fcontracts" { target c++26 } }
  
  // [lex.key]
  #undef alignas				// { dg-warning "undefining keyword 'alignas'" "" { target c++11 } }
***************
*** 26,32 ****
  #undef constexpr			// { dg-warning "undefining keyword 'constexpr'" "" { target c++11 } }
  #undef constinit			// { dg-warning "undefining keyword 'constinit'" "" { target c++20 } }
  #undef continue				// { dg-warning "undefining keyword 'continue'" }
! #undef contract_assert
  #undef co_return			// { dg-warning "undefining keyword 'co_return'" "" { target c++20 } }
  #undef co_yield				// { dg-warning "undefining keyword 'co_yield'" "" { target c++20 } }
  #undef decltype				// { dg-warning "undefining keyword 'decltype'" "" { target c++11 } }
--- 27,33 ----
  #undef constexpr			// { dg-warning "undefining keyword 'constexpr'" "" { target c++11 } }
  #undef constinit			// { dg-warning "undefining keyword 'constinit'" "" { target c++20 } }
  #undef continue				// { dg-warning "undefining keyword 'continue'" }
! #undef contract_assert			// { dg-warning "undefining keyword 'contract_assert'" "" { target c++26 } }
  #undef co_return			// { dg-warning "undefining keyword 'co_return'" "" { target c++20 } }
  #undef co_yield				// { dg-warning "undefining keyword 'co_yield'" "" { target c++20 } }
  #undef decltype				// { dg-warning "undefining keyword 'decltype'" "" { target c++11 } }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/warn/Wmismatched-new-delete-11.C gcc-16-20260201/gcc/testsuite/g++.dg/warn/Wmismatched-new-delete-11.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/warn/Wmismatched-new-delete-11.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/warn/Wmismatched-new-delete-11.C	Sun Feb  1 22:32:10 2026
***************
*** 0 ****
--- 1,45 ----
+ // PR tree-optimization/123849
+ // { dg-do compile { target c++11 } }
+ // { dg-options "-Wall" }
+ // { dg-add-options float16 }
+ // { dg-require-effective-target float16 }
+ 
+ #include <new>
+ 
+ template<typename Derived> class MatrixBase
+ {
+ public:
+   MatrixBase();
+ };
+ 
+ template<typename Derived>
+ class PlainObjectBase : public MatrixBase<Derived>
+ {
+ public:
+   void *operator new(std::size_t size);
+   void operator delete(void * ptr);
+ };
+ 
+ template<typename _Scalar>
+ class Matrix
+   : public PlainObjectBase<Matrix<_Scalar> >
+ {
+ };
+ 
+ template<typename T>
+ struct resource
+ {
+   T& makeref() const
+   {
+     T* ret = new T;
+     return *ret;
+   }
+ };
+ 
+ 
+ using T = Matrix<_Float16>;
+ 
+ void func(resource<T>& A)
+ {
+   (void)A.makeref();
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/warn/Wunused-value-2.C gcc-16-20260201/gcc/testsuite/g++.dg/warn/Wunused-value-2.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/warn/Wunused-value-2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/warn/Wunused-value-2.C	Sun Feb  1 22:32:10 2026
***************
*** 0 ****
--- 1,18 ----
+ // { dg-do compile }
+ // { dg-options "-Wall" }
+ 
+ static int index() { return 0; }
+ 
+ volatile int global;
+ static int index_with_side_effect() {
+     global += 1;
+     return 0;
+ }
+ 
+ int main(int argc, char **argv)
+ {
+ 	const bool cond = argc == 10;
+ 	(void)(cond ? "" : "")[index()];
+ 	(void)(cond ? "" : "")[index_with_side_effect()];
+ 	(void)(cond ? "" : "")[(1, 0)]; // { dg-warning "left operand of comma operator has no effect" }
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.dg/warn/Wunused-var-42.C gcc-16-20260201/gcc/testsuite/g++.dg/warn/Wunused-var-42.C
*** gcc-16-20260125/gcc/testsuite/g++.dg/warn/Wunused-var-42.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.dg/warn/Wunused-var-42.C	Sun Feb  1 22:32:10 2026
***************
*** 0 ****
--- 1,33 ----
+ // { dg-do compile { target c++14 } }
+ // { dg-options "-Wunused" }
+ 
+ template <typename F>
+ void f (F &&d)
+ {
+   static unsigned context;
+   d(context);
+ }
+ 
+ void g ()
+ {
+   static int b;
+   f([](auto c) { return c <= b; });
+ }
+ 
+ void h ()
+ {
+   static int b = 0; // { dg-warning "unused variable" }
+   f([](auto c) { return c <= 0; });
+ }
+ 
+ void i ()
+ {
+   static int b = 0;
+   [](auto c) { return c <= b; };
+ }
+ 
+ void j ()
+ {
+   static int b = 0; // { dg-warning "unused variable" }
+   [](auto c) { return c <= 0; };
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.target/aarch64/sve/acle/general-c++/mangle_5.C gcc-16-20260201/gcc/testsuite/g++.target/aarch64/sve/acle/general-c++/mangle_5.C
*** gcc-16-20260125/gcc/testsuite/g++.target/aarch64/sve/acle/general-c++/mangle_5.C	Sun Jan 25 22:32:12 2026
--- gcc-16-20260201/gcc/testsuite/g++.target/aarch64/sve/acle/general-c++/mangle_5.C	Sun Feb  1 22:32:11 2026
***************
*** 1,3 ****
--- 1,7 ----
+ // { dg-options "-Wno-volatile" }
+ // Disable warning about volatile qualifier on function arguments as they are
+ // deprecated in C++20.
+ 
  typedef const __SVInt8_t foo;
  typedef volatile foo bar;
  
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.target/i386/pr123779.C gcc-16-20260201/gcc/testsuite/g++.target/i386/pr123779.C
*** gcc-16-20260125/gcc/testsuite/g++.target/i386/pr123779.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.target/i386/pr123779.C	Sun Feb  1 22:32:11 2026
***************
*** 0 ****
--- 1,56 ----
+ /* PR target/123779 */
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -mavx512vl -mavx512bw" } */
+ 
+ typedef char __v16qi __attribute__((__vector_size__(16)));
+ typedef short __v8hi __attribute__((__vector_size__(16)));
+ typedef int __v4si __attribute__((__vector_size__(16)));
+ typedef long long __v2di __attribute__((__vector_size__(16)));
+ 
+ typedef int __v8si __attribute__((__vector_size__(32)));
+ typedef long long __v4di __attribute__((__vector_size__(32)));
+ typedef long long __v8di __attribute__((__vector_size__(64)));
+ typedef unsigned char __mmask8;
+ 
+ long long g_mem;
+ 
+ #define MAKE_TEST_BLEND(NAME, DEST_T, SRC_INIT_T, PMOV_INPUT_CAST_T, \
+ 			PMOV_FUNC, BLEND_FUNC, BLEND_CAST_T, LOAD_VAL_TYPE, ...) \
+     DEST_T dest_##NAME, mask_src1_##NAME, mask_src2_##NAME, mask_##NAME, res_##NAME; \
+     void test_##NAME() \
+       { \
+         mask_##NAME = mask_src1_##NAME < mask_src2_##NAME; \
+         LOAD_VAL_TYPE val = (LOAD_VAL_TYPE)g_mem; \
+         SRC_INIT_T src_vec = { __VA_ARGS__ }; \
+         DEST_T extended = (DEST_T)PMOV_FUNC ((PMOV_INPUT_CAST_T)src_vec); \
+         res_##NAME = (DEST_T)BLEND_FUNC ( \
+             (BLEND_CAST_T)dest_##NAME, \
+             (BLEND_CAST_T)extended, \
+             (BLEND_CAST_T)mask_##NAME); \
+       }
+ 
+ #define MAKE_TEST_MASK(NAME, DEST_T, SRC_INIT_T, PMOV_INPUT_CAST_T, \
+ 		       PMOV_MASK_FUNC, LOAD_VAL_TYPE, ...) \
+     DEST_T dest_##NAME, res_##NAME; \
+     __mmask8 mask_##NAME; \
+     void test_##NAME() \
+       { \
+ 	LOAD_VAL_TYPE val = (LOAD_VAL_TYPE) g_mem; \
+ 	SRC_INIT_T src_vec = { __VA_ARGS__ }; \
+ 	res_##NAME = PMOV_MASK_FUNC ((PMOV_INPUT_CAST_T)src_vec, \
+ 				     dest_##NAME, \
+ 				     mask_##NAME);\
+       }  
+ 
+ 
+ MAKE_TEST_BLEND(v8qi_v8hi, __v8hi, __v2di, __v16qi, __builtin_ia32_pmovzxbw128, __builtin_ia32_pblendvb128, __v16qi, long long, val, 0)
+ MAKE_TEST_BLEND(v4qi_v4si, __v4si, __v4si, __v16qi, __builtin_ia32_pmovzxbd128, __builtin_ia32_pblendvb128, __v16qi, int, val, 0, 0, 0)
+ MAKE_TEST_BLEND(v4hi_v4si, __v4si, __v2di, __v8hi, __builtin_ia32_pmovzxwd128, __builtin_ia32_pblendvb128, __v16qi, long long, val, 0)
+ MAKE_TEST_BLEND(v2hi_v2di, __v2di, __v4si, __v8hi, __builtin_ia32_pmovzxwq128, __builtin_ia32_pblendvb128, __v16qi, int, val, 0, 0, 0)
+ MAKE_TEST_BLEND(v2si_v2di, __v2di, __v2di, __v4si, __builtin_ia32_pmovzxdq128, __builtin_ia32_pblendvb128, __v16qi, long long, val, 0)
+ 
+ 
+ MAKE_TEST_MASK(v8qi_v8si, __v8si, __v2di, __v16qi, __builtin_ia32_pmovzxbd256_mask, long long, val, 0)
+ MAKE_TEST_MASK(v4qi_v4di, __v4di, __v4si, __v16qi, __builtin_ia32_pmovzxbq256_mask, int, val, 0, 0, 0)
+ MAKE_TEST_MASK(v4hi_v4di, __v4di, __v2di, __v8hi, __builtin_ia32_pmovzxwq256_mask, long long, val, 0)
+ MAKE_TEST_MASK(v8qi_v8di, __v8di, __v2di, __v16qi, __builtin_ia32_pmovzxbq512_mask, long long, val, 0)
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.target/riscv/rvv/base/pr123806.C gcc-16-20260201/gcc/testsuite/g++.target/riscv/rvv/base/pr123806.C
*** gcc-16-20260125/gcc/testsuite/g++.target/riscv/rvv/base/pr123806.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.target/riscv/rvv/base/pr123806.C	Sun Feb  1 22:32:11 2026
***************
*** 0 ****
--- 1,25 ----
+ /* { dg-do run */
+ /* { dg-require-effective-target riscv_v_ok } */
+ /* { dg-add-options riscv_v } */
+ 
+ #include <riscv_vector.h>
+ #include <vector>
+ 
+ int8_t a[5], d[5], c[5], b[5];
+ int main() {
+   for (size_t e = 0, avl = 1; avl > 0;) {
+     size_t f = __riscv_vsetvl_e8m1(avl);
+     vint8m1_t g = __riscv_vle8_v_i8m1(&a[e], f);
+     vint8mf2_t i = __riscv_vle8ff(
+         __riscv_vlm_v_b16(std::vector<uint8_t>((f + 7) / 8, 5).data(), f),
+         &b[e], &f, f);
+     vint8m1_t j = __riscv_vle8_v_i8m1(&c[e], f);
+     vint8m1_t k = __riscv_vredxor_tu(g, i, j, f);
+     __riscv_vse8_v_i8m1(&d[e], k, f);
+     avl -= f;
+ 
+     if (f != 1 && avl != 0)
+       __builtin_abort ();
+     break;
+   }
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.target/riscv/rvv/base/pr123808-2.C gcc-16-20260201/gcc/testsuite/g++.target/riscv/rvv/base/pr123808-2.C
*** gcc-16-20260125/gcc/testsuite/g++.target/riscv/rvv/base/pr123808-2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.target/riscv/rvv/base/pr123808-2.C	Sun Feb  1 22:32:11 2026
***************
*** 0 ****
--- 1,51 ----
+ /* { dg-do run } */
+ /* { dg-require-effective-target riscv_v_ok } */
+ /* { dg-add-options riscv_v } */
+ /* { dg-additional-options "-O0" } */
+ 
+ #include <riscv_vector.h>
+ #include <vector>
+ #define a 36
+ 
+ uint8_t e[a], x[a];
+ int64_t f[a], g[a], l[a];
+ float j[a], k[a], m[a];
+ 
+ int main() {
+   for (int i = 0; i < a; ++i) { e[i]=1; g[i] = 86; x[i] = 86; }
+   for (size_t n = 0, avl = a; avl;) {
+     size_t o = __riscv_vsetvl_e64m8(avl);
+     vuint8m1_t p = __riscv_vle8_v_u8m1(&e[n], o);
+     vbool8_t q = __riscv_vmseq_vx_u8m1_b8(p, 1, o);
+     vuint64m8_t r = __riscv_vsll_vx_u64m8(__riscv_vid_v_u64m8(o), 3, o);
+     vint64m8_t s = __riscv_vluxei64_v_i64m8_tum(
+         __riscv_vlm_v_b8(std::vector<uint8_t>(o + 7).data(), o),
+         __riscv_vmv_v_x_i64m8(0, __riscv_vsetvlmax_e16m2()), &f[n], r, o);
+     vuint32m4_t t = __riscv_vsll_vx_u32m4(__riscv_vid_v_u32m4(o), 3, o);
+     vint64m8_t u = __riscv_vluxei32(&g[n], t, o);
+     vbool8_t v = __riscv_vlm_v_b8(&x[n], o);
+     __riscv_vle32ff_v_f32m4_mu(q, __riscv_vfmv_v_f_f32m4(0, __riscv_vsetvlmax_e8m1()), &j[n], &o, o);
+     vfloat32m1_t w = __riscv_vfmv_v_f_f32m1(0, __riscv_vsetvlmax_e32m1());
+     vfloat32m1_t aa = __riscv_vle32_v_f32m1_tu(w, &k[n], o);
+     s = __riscv_vcompress_vm_i64m8_tu(s, u, v, o);
+     vfloat32mf2_t ab = __riscv_vlmul_trunc_v_f32m1_f32mf2(aa);
+     vuint64m8_t ac = __riscv_vsll_vx_u64m8(__riscv_vid_v_u64m8(o), 3, o);
+     __riscv_vsuxei64_v_i64m8(&l[n], ac, s, o);
+     __riscv_vse32_v_f32mf2(&m[n], ab, o);
+     avl -= o;
+   }
+ 
+   /* Results are inconsistent between different VLENs.
+      "n" never changes so we will always store into l[0...] with a length of
+      "o".  What differs is "s".
+      At zvl128b and zvl256b we have more than one loop iteration and
+      "s" will be {86, 86, -1, -1} or {86, 86, 0, 0} depending on the
+      tail/mask policy.
+      At zvl512b there is only one iteration and s = {86, 86, 86, ...}.
+      I cross checked with clang and this seems correct.
+      Therefore only check l's fifth element.
+      The actual PR is about fault-only-first loads and the wrong code
+      caused element 5 to be incorrect as well.  */
+   if (l[5] != 86)
+     __builtin_abort ();
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/g++.target/riscv/rvv/base/pr123808.C gcc-16-20260201/gcc/testsuite/g++.target/riscv/rvv/base/pr123808.C
*** gcc-16-20260125/gcc/testsuite/g++.target/riscv/rvv/base/pr123808.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/g++.target/riscv/rvv/base/pr123808.C	Sun Feb  1 22:32:11 2026
***************
*** 0 ****
--- 1,50 ----
+ /* { dg-do run } */
+ /* { dg-require-effective-target riscv_v_ok } */
+ /* { dg-add-options riscv_v } */
+ 
+ #include <riscv_vector.h>
+ #include <vector>
+ #define a 36
+ 
+ uint8_t e[a], x[a];
+ int64_t f[a], g[a], l[a];
+ float j[a], k[a], m[a];
+ 
+ int main() {
+   for (int i = 0; i < a; ++i) { e[i]=1; g[i] = 86; x[i] = 86; }
+   for (size_t n = 0, avl = a; avl;) {
+     size_t o = __riscv_vsetvl_e64m8(avl);
+     vuint8m1_t p = __riscv_vle8_v_u8m1(&e[n], o);
+     vbool8_t q = __riscv_vmseq_vx_u8m1_b8(p, 1, o);
+     vuint64m8_t r = __riscv_vsll_vx_u64m8(__riscv_vid_v_u64m8(o), 3, o);
+     vint64m8_t s = __riscv_vluxei64_v_i64m8_tum(
+         __riscv_vlm_v_b8(std::vector<uint8_t>(o + 7).data(), o),
+         __riscv_vmv_v_x_i64m8(0, __riscv_vsetvlmax_e16m2()), &f[n], r, o);
+     vuint32m4_t t = __riscv_vsll_vx_u32m4(__riscv_vid_v_u32m4(o), 3, o);
+     vint64m8_t u = __riscv_vluxei32(&g[n], t, o);
+     vbool8_t v = __riscv_vlm_v_b8(&x[n], o);
+     __riscv_vle32ff_v_f32m4_mu(q, __riscv_vfmv_v_f_f32m4(0, __riscv_vsetvlmax_e8m1()), &j[n], &o, o);
+     vfloat32m1_t w = __riscv_vfmv_v_f_f32m1(0, __riscv_vsetvlmax_e32m1());
+     vfloat32m1_t aa = __riscv_vle32_v_f32m1_tu(w, &k[n], o);
+     s = __riscv_vcompress_vm_i64m8_tu(s, u, v, o);
+     vfloat32mf2_t ab = __riscv_vlmul_trunc_v_f32m1_f32mf2(aa);
+     vuint64m8_t ac = __riscv_vsll_vx_u64m8(__riscv_vid_v_u64m8(o), 3, o);
+     __riscv_vsuxei64_v_i64m8(&l[n], ac, s, o);
+     __riscv_vse32_v_f32mf2(&m[n], ab, o);
+     avl -= o;
+   }
+ 
+   /* Results are inconsistent between different VLENs.
+      "n" never changes so we will always store into l[0...] with a length of
+      "o".  What differs is "s".
+      At zvl128b and zvl256b we have more than one loop iteration and
+      "s" will be {86, 86, -1, -1} or {86, 86, 0, 0} depending on the
+      tail/mask policy.
+      At zvl512b there is only one iteration and s = {86, 86, 86, ...}.
+      I cross checked with clang and this seems correct.
+      Therefore only check l's fifth element.
+      The actual PR is about fault-only-first loads and the wrong code
+      caused element 5 to be incorrect as well.  */
+   if (l[5] != 86)
+     __builtin_abort ();
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.c-torture/execute/pr123864.c gcc-16-20260201/gcc/testsuite/gcc.c-torture/execute/pr123864.c
*** gcc-16-20260125/gcc/testsuite/gcc.c-torture/execute/pr123864.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gcc.c-torture/execute/pr123864.c	Sun Feb  1 22:32:11 2026
***************
*** 0 ****
--- 1,24 ----
+ /* PR tree-optimization/123864 */
+ 
+ [[gnu::noipa]] static int
+ foo (long long x)
+ {
+   return __builtin_mul_overflow_p (x, ~0U, x);
+ }
+ 
+ int
+ main ()
+ {
+   if (foo (0))
+     __builtin_abort ();
+ #if __SIZEOF_INT__ == 4 && __SIZEOF_LONG_LONG__ == 8 && __CHAR_BIT__ == 8
+   if (foo (__INT_MAX__ + 1LL))
+     __builtin_abort ();
+   if (!foo (__INT_MAX__ + 2LL))
+     __builtin_abort ();
+   if (foo (-__INT_MAX__ - 1LL))
+     __builtin_abort ();
+   if (!foo (-__INT_MAX__ - 2LL))
+     __builtin_abort ();
+ #endif
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.dg/analyzer/fexceptions-1.c gcc-16-20260201/gcc/testsuite/gcc.dg/analyzer/fexceptions-1.c
*** gcc-16-20260125/gcc/testsuite/gcc.dg/analyzer/fexceptions-1.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gcc.dg/analyzer/fexceptions-1.c	Sun Feb  1 22:32:11 2026
***************
*** 0 ****
--- 1,23 ----
+ /* { dg-additional-options "-fexceptions" } */
+ 
+ extern void do_something ();
+ extern void do_something_nothrow () __attribute__ ((nothrow));
+ 
+ void test ()
+ {
+   void *p = __builtin_malloc (1024);
+ 
+   do_something (); /* { dg-warning "leak of 'p'" } */
+   /* { dg-message "if 'do_something' throws an exception\.\.\." "exception event" { target *-*-* } .-1 } */
+ 
+   __builtin_free (p);
+ }
+ 
+ void test_nothrow ()
+ {
+   void *p = __builtin_malloc (1024);
+ 
+   do_something_nothrow (); /* { dg-bogus "leak of 'p'" } */
+ 
+   __builtin_free (p);
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.dg/analyzer/fexceptions-2.c gcc-16-20260201/gcc/testsuite/gcc.dg/analyzer/fexceptions-2.c
*** gcc-16-20260125/gcc/testsuite/gcc.dg/analyzer/fexceptions-2.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gcc.dg/analyzer/fexceptions-2.c	Sun Feb  1 22:32:11 2026
***************
*** 0 ****
--- 1,26 ----
+ /* Verify that -fanalyzer-assume-nothrow suppresses warnings about
+    exceptions being thrown in called function, even those not
+    marked with "nothrow".  */
+ 
+ /* { dg-additional-options "-fexceptions -fanalyzer-assume-nothrow" } */
+ 
+ extern void do_something ();
+ extern void do_something_nothrow () __attribute__ ((nothrow));
+ 
+ void test ()
+ {
+   void *p = __builtin_malloc (1024);
+ 
+   do_something (); /* { dg-bogus "leak of 'p'" } */
+ 
+   __builtin_free (p);
+ }
+ 
+ void test_nothrow ()
+ {
+   void *p = __builtin_malloc (1024);
+ 
+   do_something_nothrow (); /* { dg-bogus "leak of 'p'" } */
+ 
+   __builtin_free (p);
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.dg/gomp/pr123876.c gcc-16-20260201/gcc/testsuite/gcc.dg/gomp/pr123876.c
*** gcc-16-20260125/gcc/testsuite/gcc.dg/gomp/pr123876.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gcc.dg/gomp/pr123876.c	Sun Feb  1 22:32:11 2026
***************
*** 0 ****
--- 1,69 ----
+ /* PR middle-end/123876 */
+ 
+ void
+ foo ()
+ {
+ lab:
+ #pragma omp simd
+   for (int i = 0; i < 4; i++)
+     asm goto ("" : : : : lab);			/* { dg-error "invalid branch to/from OpenMP structured block" } */
+ #pragma omp for
+   for (int i = 0; i < 4; i++)
+    asm goto ("" : : : : lab);			/* { dg-error "invalid branch to/from OpenMP structured block" } */
+ #pragma omp parallel
+   asm goto ("" : : : : lab);			/* { dg-error "invalid branch to/from OpenMP structured block" } */
+ }
+ 
+ void
+ bar ()
+ {
+ lab3:
+ #pragma omp simd
+   for (int i = 0; i < 4; i++)
+     {
+     lab1:
+     lab2:
+       asm goto ("" : : : : lab1, lab2, lab3);	/* { dg-error "invalid branch to/from OpenMP structured block" } */
+     }
+ #pragma omp for
+   for (int i = 0; i < 4; i++)
+     {
+     lab4:
+     lab5:
+       asm goto ("" : : : : lab4, lab5, lab3);	/* { dg-error "invalid branch to/from OpenMP structured block" } */
+     }
+ #pragma omp parallel
+   {
+   lab6:
+   lab7:
+     asm goto ("" : : : : lab6, lab7, lab3);	/* { dg-error "invalid branch to/from OpenMP structured block" } */
+   }
+ }
+ 
+ void
+ baz ()
+ {
+ #pragma omp simd
+   for (int i = 0; i < 4; i++)
+     {
+     lab1:
+     lab2:
+       asm goto ("" : : : : lab1, lab2, lab3);
+     lab3:;
+     }
+ #pragma omp for
+   for (int i = 0; i < 4; i++)
+     {
+     lab4:
+     lab5:
+       asm goto ("" : : : : lab4, lab5, lab6);
+     lab6:;
+     }
+ #pragma omp parallel
+   {
+   lab7:
+   lab8:
+     asm goto ("" : : : : lab7, lab8, lab9);
+   lab9:;
+   }
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.dg/guality/guality.exp gcc-16-20260201/gcc/testsuite/gcc.dg/guality/guality.exp
*** gcc-16-20260125/gcc/testsuite/gcc.dg/guality/guality.exp	Sun Jan 25 22:32:13 2026
--- gcc-16-20260201/gcc/testsuite/gcc.dg/guality/guality.exp	Sun Feb  1 22:32:11 2026
*************** if {[check_guality "
*** 108,117 ****
  
      gcc-dg-runtest [lsort [glob $srcdir/$subdir/*.c]] "" ""
      gcc-dg-runtest $general "" "-Wc++-compat"
      set-torture-options \
  	[list "-O0" "-Og"] \
  	[list {}] \
! 	[list "-Og -flto"]
      gcc-dg-runtest $Og "" "-Wc++-compat"
  }
  
--- 108,124 ----
  
      gcc-dg-runtest [lsort [glob $srcdir/$subdir/*.c]] "" ""
      gcc-dg-runtest $general "" "-Wc++-compat"
+ 
+     if [check_effective_target_lto] {
+         set lto_option_list [list "-Og -flto"]
+     } else {
+         set lto_option_list ""  
+     }
+ 
      set-torture-options \
  	[list "-O0" "-Og"] \
  	[list {}] \
! 	$lto_option_list
      gcc-dg-runtest $Og "" "-Wc++-compat"
  }
  
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.dg/pointer-counted-by-pr123500.c gcc-16-20260201/gcc/testsuite/gcc.dg/pointer-counted-by-pr123500.c
*** gcc-16-20260125/gcc/testsuite/gcc.dg/pointer-counted-by-pr123500.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gcc.dg/pointer-counted-by-pr123500.c	Sun Feb  1 22:32:11 2026
***************
*** 0 ****
--- 1,13 ----
+ /* PR c/123500 */
+ /* { dg-do compile } */
+ /* { dg-options "-Wbad-function-cast" } */
+ 
+ #include <stdint.h>
+ struct buffer {
+   uint8_t * ptr __attribute__((counted_by(len)));
+   int len;
+ };
+ 
+ uintptr_t foo(struct buffer * b) {
+   return (uintptr_t)b->ptr;
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.dg/pr109410-2.c gcc-16-20260201/gcc/testsuite/gcc.dg/pr109410-2.c
*** gcc-16-20260125/gcc/testsuite/gcc.dg/pr109410-2.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gcc.dg/pr109410-2.c	Sun Feb  1 22:32:11 2026
***************
*** 0 ****
--- 1,5 ----
+ /* PR tree-optimization/109410 */
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -g" } */
+ 
+ #include "pr109410.c"
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.dg/pr123447.c gcc-16-20260201/gcc/testsuite/gcc.dg/pr123447.c
*** gcc-16-20260125/gcc/testsuite/gcc.dg/pr123447.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gcc.dg/pr123447.c	Sun Feb  1 22:32:11 2026
***************
*** 0 ****
--- 1,19 ----
+ /* PR middle-end/123447 */
+ /* { dg-do compile { target aarch64*-*-* } } */
+ /* { dg-options "-O2 -mstrict-align" } */
+ 
+ typedef __attribute__((__vector_size__(32))) _Decimal64 D;
+ typedef __attribute__((__vector_size__(64))) int V;
+ typedef __attribute__((__vector_size__(64))) _Decimal64 D64;
+ 
+ D d;
+ 
+ void foo1 () {
+   D _4;
+   D64 _5;
+   V _1;
+   _1 = (V) { 9, -64497, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
+   _5 = (D64) _1;
+   _4 = __builtin_shufflevector (_5, _5, 0, 1, 2, 3);
+   d = _4;
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.dg/pr123537.c gcc-16-20260201/gcc/testsuite/gcc.dg/pr123537.c
*** gcc-16-20260125/gcc/testsuite/gcc.dg/pr123537.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gcc.dg/pr123537.c	Sun Feb  1 22:32:11 2026
***************
*** 0 ****
--- 1,20 ----
+ /* { dg-do compile } */
+ /* { dg-require-effective-target int128 } */
+ /* { dg-options "-O2" } */
+ 
+ typedef __attribute__((__vector_size__(16))) __int128 V;
+ 
+ union {
+   _Complex long c;
+   V v;
+ } u;
+ 
+ __int128 j;
+ int i;
+ 
+ void
+ foo()
+ {
+   u.v &= 4;
+   i %= u.c ? 3 : j;
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.dg/pr90838-2.c gcc-16-20260201/gcc/testsuite/gcc.dg/pr90838-2.c
*** gcc-16-20260125/gcc/testsuite/gcc.dg/pr90838-2.c	Sun Jan 25 22:32:13 2026
--- gcc-16-20260201/gcc/testsuite/gcc.dg/pr90838-2.c	Sun Feb  1 22:32:11 2026
*************** int ctz4 (unsigned long long x)
*** 35,39 ****
  /* { dg-final { scan-tree-dump {= \.CTZ} "forwprop2" { target { { i?86-*-* x86_64-*-* } && { ! { ia32 } } } } } } */
  /* { dg-final { scan-tree-dump {= \.CTZ} "forwprop2" { target aarch64*-*-* } } } */
  /* { dg-final { scan-tree-dump {= \.CTZ} "forwprop2" { target { rv64 } } } } */
- /* { dg-final { scan-tree-dump {= \.CTZ} "forwprop2" { target { rv32 } } } } */
  /* { dg-final { scan-tree-dump {= \.CTZ} "forwprop2" { target { loongarch64*-*-* } } } } */
--- 35,38 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.dg/torture/pr110043.c gcc-16-20260201/gcc/testsuite/gcc.dg/torture/pr110043.c
*** gcc-16-20260125/gcc/testsuite/gcc.dg/torture/pr110043.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gcc.dg/torture/pr110043.c	Sun Feb  1 22:32:12 2026
***************
*** 0 ****
--- 1,9 ----
+ /* { dg-do compile } */
+ /* { dg-require-effective-target int128 } */
+ 
+ __int128 g_116_1;
+ extern char g_521[][8];
+ void func_24() {
+   for (; g_116_1 >= 0;)
+     g_521[g_116_1][g_116_1] &= 0;
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.dg/torture/pr111036.c gcc-16-20260201/gcc/testsuite/gcc.dg/torture/pr111036.c
*** gcc-16-20260125/gcc/testsuite/gcc.dg/torture/pr111036.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gcc.dg/torture/pr111036.c	Sun Feb  1 22:32:12 2026
***************
*** 0 ****
--- 1,24 ----
+ /* { dg-do run } */
+ 
+ #include <stdlib.h>
+ 
+ __attribute__((aligned(32))) static struct
+ {
+   unsigned long long available_cmd_ids_per_core[2];
+ } _rl2c_cmd_id_data;
+ 
+ static inline void __attribute__((always_inline))
+ foo (void *base, size_t length)
+ {
+   unsigned long int p = (unsigned long int) base;
+   if (__builtin_constant_p(p) && (p & 31) == 0) { exit (0); } 
+   else if (__builtin_constant_p(length)) { exit (0); } 
+   else { exit (0); }
+ }
+ 
+ int main(int argc, char **argv)
+ {
+   foo(&_rl2c_cmd_id_data, sizeof(*(&_rl2c_cmd_id_data)));
+   return 0;
+ }
+ 
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.dg/torture/pr116296.c gcc-16-20260201/gcc/testsuite/gcc.dg/torture/pr116296.c
*** gcc-16-20260125/gcc/testsuite/gcc.dg/torture/pr116296.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gcc.dg/torture/pr116296.c	Sun Feb  1 22:32:12 2026
***************
*** 0 ****
--- 1,9 ----
+ /* { dg-do compile } */
+ /* { dg-require-effective-target int32plus } */
+ 
+ short g(unsigned long h, int i[11][11], short c)
+ {
+   for (unsigned long j = 0; j < h; j -= 0x105f000000000000ull)
+     c = c > i[j][j];
+   return c;
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.dg/torture/pr116353.c gcc-16-20260201/gcc/testsuite/gcc.dg/torture/pr116353.c
*** gcc-16-20260125/gcc/testsuite/gcc.dg/torture/pr116353.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gcc.dg/torture/pr116353.c	Sun Feb  1 22:32:12 2026
***************
*** 0 ****
--- 1,54 ----
+ /* PR tree-optimization/116353 */
+ /* { dg-do compile } */
+ 
+ enum desmode { C };
+ struct {
+   unsigned char des_ivec[];
+ } _des_crypt_desp;
+ int des_SPtrans_6_0, des_SPtrans_4_0, des_encrypt_encrypt, des_encrypt_i;
+ long des_encrypt_s_0, _des_crypt_tin1, _des_crypt_tout0, _des_crypt_tout1,
+     _des_crypt_tin0;
+ enum desmode _des_crypt_desp_0;
+ unsigned long _des_crypt_tbuf[2];
+ char _des_crypt_out;
+ void des_encrypt(unsigned long *buf) {
+   long l, r, t;
+   l = buf[0];
+   r = buf[1];
+   t = r;
+   r ^= l ^= t < 6;
+   if (des_encrypt_encrypt)
+     for (;; des_encrypt_i += 4)
+       des_encrypt_s_0 ^= des_SPtrans_4_0 | des_SPtrans_6_0;
+   buf[1] = r;
+ }
+ void _des_crypt() {
+   long xor0, xor1;
+   unsigned char *in;
+   int cbc_mode = _des_crypt_desp_0;
+   in = _des_crypt_desp.des_ivec;
+   xor0 = xor1 = 0;
+   for (;;) {
+     _des_crypt_tin0 = *in++;
+     _des_crypt_tin0 |= *in++ << 8;
+     _des_crypt_tin0 |= *in++ << 16;
+     _des_crypt_tin0 |= (long)*in << 24;
+     _des_crypt_tin1 = *in++;
+     _des_crypt_tin1 |= *in++ << 8;
+     _des_crypt_tin1 |= *in++ << 16;
+     _des_crypt_tin1 |= (long)*in << 24;
+     _des_crypt_tbuf[0] = _des_crypt_tin0;
+     _des_crypt_tbuf[1] = _des_crypt_tin1;
+     des_encrypt(_des_crypt_tbuf);
+     if (cbc_mode) {
+       _des_crypt_tout0 = xor0;
+       _des_crypt_tout1 = _des_crypt_tbuf[1] ^ xor1;
+       xor0 = _des_crypt_tin0;
+       xor1 = _des_crypt_tin1;
+     } else {
+       _des_crypt_tout0 = _des_crypt_tbuf[0];
+       _des_crypt_tout1 = _des_crypt_tbuf[1];
+     }
+     _des_crypt_out = _des_crypt_tout0 * _des_crypt_tout1;
+   }
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.dg/torture/pr120347.c gcc-16-20260201/gcc/testsuite/gcc.dg/torture/pr120347.c
*** gcc-16-20260125/gcc/testsuite/gcc.dg/torture/pr120347.c	Sun Jan 25 22:32:13 2026
--- gcc-16-20260201/gcc/testsuite/gcc.dg/torture/pr120347.c	Sun Feb  1 22:32:12 2026
***************
*** 1,5 ****
  /* { dg-do assemble } */
! /* { dg-additional-options "-march=armv7-a -mthumb" { target { arm_arch_v7a_ok && arm_thumb2_ok } } } */
  
  void *end;
  void **start;
--- 1,5 ----
  /* { dg-do assemble } */
! /* { dg-additional-options "-mcpu=unset -march=armv7-a+fp -mthumb" { target { arm_arch_v7a_ok && arm_thumb2_ok } } } */
  
  void *end;
  void **start;
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.dg/torture/pr122537.c gcc-16-20260201/gcc/testsuite/gcc.dg/torture/pr122537.c
*** gcc-16-20260125/gcc/testsuite/gcc.dg/torture/pr122537.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gcc.dg/torture/pr122537.c	Sun Feb  1 22:32:12 2026
***************
*** 0 ****
--- 1,18 ----
+ /* { dg-do run } */
+ /* { dg-additional-options "-fwrapv" } */
+ 
+ void abort ();
+ int a, b;
+ int main()
+ {
+   int c = 61;
+   int d = 61;
+   c += 8;
+   while (c + a - 80 >= d + a - 80) {
+     c -= d;
+     b++;
+   }
+   if (b != 1)
+     abort ();
+   return 0;
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.dg/torture/pr123799.c gcc-16-20260201/gcc/testsuite/gcc.dg/torture/pr123799.c
*** gcc-16-20260125/gcc/testsuite/gcc.dg/torture/pr123799.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gcc.dg/torture/pr123799.c	Sun Feb  1 22:32:12 2026
***************
*** 0 ****
--- 1,26 ----
+ /* { dg-do compile { target bitint } } */
+ /* { dg-additional-options "-O3" } */
+ /* { dg-additional-options "-mavx10.1" { target x86_64-*-* i?86-*-* } } */
+ 
+ union {
+   _Complex long a[3];
+   _BitInt (64) b[5];
+   unsigned _BitInt (512) c;
+ } u;
+ int g;
+ 
+ void
+ bar (int j)
+ {
+   __builtin_add_overflow (1, j, &g);
+   u.c /= g;
+   int __z;
+   __builtin_sub_overflow (0, u.b[4], &__z);
+   u.a[2] *= (_Complex double) __z;
+ }
+ 
+ void
+ foo ()
+ {
+   bar (1);
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.dg/torture/pr123864.c gcc-16-20260201/gcc/testsuite/gcc.dg/torture/pr123864.c
*** gcc-16-20260125/gcc/testsuite/gcc.dg/torture/pr123864.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gcc.dg/torture/pr123864.c	Sun Feb  1 22:32:12 2026
***************
*** 0 ****
--- 1,28 ----
+ /* PR tree-optimization/123864 */
+ /* { dg-do run { target int128 } } */
+ 
+ int u, v, x;
+ 
+ [[gnu::noipa]] static void
+ foo ()
+ {
+   __int128 c = (__int128) 0xa5ee4bc88ULL << 64;
+   long long b = 0x207b8a7f7LL;
+   int a = 4;
+   long long y;
+   __builtin_add_overflow (a, v, &y);
+   c *= y;
+   
+   unsigned z;
+   if (__builtin_add_overflow (b, u, &z))
+     z = 0xffffffffU;
+   x = __builtin_mul_overflow_p (z, c, c);
+ }
+ 
+ int
+ main ()
+ {
+   foo ();
+   if (!x)
+     __builtin_abort ();
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.dg/torture/pr123887-2.c gcc-16-20260201/gcc/testsuite/gcc.dg/torture/pr123887-2.c
*** gcc-16-20260125/gcc/testsuite/gcc.dg/torture/pr123887-2.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gcc.dg/torture/pr123887-2.c	Sun Feb  1 22:32:12 2026
***************
*** 0 ****
--- 1,12 ----
+ /* { dg-do run } */
+ 
+ [[gnu::noipa]]
+ int f(int a, int b, int *x)
+ {
+   return (a ? *x : 0) != (b ? *x : 0);
+ }
+ int main()
+ {
+   f(0, 0, 0);
+   return 0;
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.dg/torture/pr123887.c gcc-16-20260201/gcc/testsuite/gcc.dg/torture/pr123887.c
*** gcc-16-20260125/gcc/testsuite/gcc.dg/torture/pr123887.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gcc.dg/torture/pr123887.c	Sun Feb  1 22:32:12 2026
***************
*** 0 ****
--- 1,14 ----
+ /* { dg-do run } */
+ 
+ typedef struct {
+     unsigned s;
+ } struct_t;
+ 
+ struct_t *p;
+ bool cond;
+ int v = 1;
+ int main()
+ {
+   int u = 1 + (cond ? p->s : 0);
+   return u - v;
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.dg/tree-ssa/cselim-4.c gcc-16-20260201/gcc/testsuite/gcc.dg/tree-ssa/cselim-4.c
*** gcc-16-20260125/gcc/testsuite/gcc.dg/tree-ssa/cselim-4.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gcc.dg/tree-ssa/cselim-4.c	Sun Feb  1 22:32:12 2026
***************
*** 0 ****
--- 1,32 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O3 -fno-expensive-optimizations -fno-tree-dse -fgimple" } */
+ 
+ /* We're testing the CSELIM pass but we need VRP to compute the range
+    for b_4 to make the array1[] accesses out-of-bound.  */
+ 
+ int array1[1];
+ int __GIMPLE (ssa,startwith("vrp"),guessed_local(1073741824))
+ f1 (int a, short unsigned int b1, int c)
+ {
+   int b;
+ 
+   __BB(2,guessed_local(1073741824)):
+   b_3 = (int) b1_2(D);
+   b_4 = b_3 + 1;
+   if (a_5(D) != 0)
+     goto __BB3(guessed(67108864));
+   else
+     goto __BB4(guessed(67108864));
+ 
+   __BB(3,guessed_local(536870912)):
+   array1[b_4] = c_7(D);
+   array1[b_4] = c_7(D);
+   goto __BB5(precise(134217728));
+ 
+   __BB(4,guessed_local(536870912)):
+   array1[b_4] = c_7(D);
+   goto __BB5(precise(134217728));
+ 
+   __BB(5,guessed_local(1073741824)):
+   return;
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.dg/tree-ssa/pr83403-1.c gcc-16-20260201/gcc/testsuite/gcc.dg/tree-ssa/pr83403-1.c
*** gcc-16-20260125/gcc/testsuite/gcc.dg/tree-ssa/pr83403-1.c	Sun Jan 25 22:32:14 2026
--- gcc-16-20260201/gcc/testsuite/gcc.dg/tree-ssa/pr83403-1.c	Sun Feb  1 22:32:12 2026
***************
*** 1,7 ****
  /* { dg-do compile } */
  /* { dg-options "-O3 -funroll-loops -fdump-tree-lim2-details" } */
  /* { dg-additional-options "--param max-completely-peeled-insns=200" { target { s390*-*-* } } } */
! /* { dg-additional-options "--param max-completely-peeled-insns=300" { target { arm*-*-* cris-*-* loongarch32-*-* m68k*-*-* } } } */
  
  #define TYPE unsigned int
  
--- 1,7 ----
  /* { dg-do compile } */
  /* { dg-options "-O3 -funroll-loops -fdump-tree-lim2-details" } */
  /* { dg-additional-options "--param max-completely-peeled-insns=200" { target { s390*-*-* } } } */
! /* { dg-additional-options "--param max-completely-peeled-insns=300" { target { { arm*-*-* cris-*-* loongarch32-*-* m68k*-*-* } || rv32 } } } */
  
  #define TYPE unsigned int
  
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.dg/tree-ssa/pr83403-2.c gcc-16-20260201/gcc/testsuite/gcc.dg/tree-ssa/pr83403-2.c
*** gcc-16-20260125/gcc/testsuite/gcc.dg/tree-ssa/pr83403-2.c	Sun Jan 25 22:32:14 2026
--- gcc-16-20260201/gcc/testsuite/gcc.dg/tree-ssa/pr83403-2.c	Sun Feb  1 22:32:12 2026
***************
*** 1,7 ****
  /* { dg-do compile } */
  /* { dg-options "-O3 -funroll-loops -fdump-tree-lim2-details" } */
  /* { dg-additional-options "--param max-completely-peeled-insns=200" { target { s390*-*-* } } } */
! /* { dg-additional-options "--param max-completely-peeled-insns=300" { target { arm*-*-* cris-*-* loongarch32*-*-* m68k*-*-* } } } */
  
  #define TYPE int
  
--- 1,7 ----
  /* { dg-do compile } */
  /* { dg-options "-O3 -funroll-loops -fdump-tree-lim2-details" } */
  /* { dg-additional-options "--param max-completely-peeled-insns=200" { target { s390*-*-* } } } */
! /* { dg-additional-options "--param max-completely-peeled-insns=300" { target { { arm*-*-* cris-*-* loongarch32*-*-* m68k*-*-* } || rv32 } } } */
  
  #define TYPE int
  
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.dg/vect/complex/fast-math-bb-slp-complex-add-half-float.c gcc-16-20260201/gcc/testsuite/gcc.dg/vect/complex/fast-math-bb-slp-complex-add-half-float.c
*** gcc-16-20260125/gcc/testsuite/gcc.dg/vect/complex/fast-math-bb-slp-complex-add-half-float.c	Sun Jan 25 22:32:14 2026
--- gcc-16-20260201/gcc/testsuite/gcc.dg/vect/complex/fast-math-bb-slp-complex-add-half-float.c	Sun Feb  1 22:32:12 2026
***************
*** 1,6 ****
  /* { dg-do compile } */
  /* { dg-require-effective-target vect_complex_add_half } */
! /* { dg-require-effective-target float16 } */
  /* { dg-additional-options "-ffast-math -fno-tree-loop-vectorize" } */
  /* { dg-add-options arm_v8_3a_fp16_complex_neon } */
  
--- 1,6 ----
  /* { dg-do compile } */
  /* { dg-require-effective-target vect_complex_add_half } */
! /* { dg-require-effective-target arm_v8_3a_fp16_complex_neon_ok } */
  /* { dg-additional-options "-ffast-math -fno-tree-loop-vectorize" } */
  /* { dg-add-options arm_v8_3a_fp16_complex_neon } */
  
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.dg/vect/complex/fast-math-bb-slp-complex-add-pattern-half-float.c gcc-16-20260201/gcc/testsuite/gcc.dg/vect/complex/fast-math-bb-slp-complex-add-pattern-half-float.c
*** gcc-16-20260125/gcc/testsuite/gcc.dg/vect/complex/fast-math-bb-slp-complex-add-pattern-half-float.c	Sun Jan 25 22:32:14 2026
--- gcc-16-20260201/gcc/testsuite/gcc.dg/vect/complex/fast-math-bb-slp-complex-add-pattern-half-float.c	Sun Feb  1 22:32:12 2026
***************
*** 1,6 ****
  /* { dg-do compile } */
  /* { dg-require-effective-target vect_complex_add_half } */
! /* { dg-require-effective-target float16 } */
  /* { dg-add-options arm_v8_3a_fp16_complex_neon } */
  /* { dg-additional-options "-ffast-math -fno-tree-loop-vectorize" } */
  
--- 1,6 ----
  /* { dg-do compile } */
  /* { dg-require-effective-target vect_complex_add_half } */
! /* { dg-require-effective-target arm_v8_3a_fp16_complex_neon_ok } */
  /* { dg-add-options arm_v8_3a_fp16_complex_neon } */
  /* { dg-additional-options "-ffast-math -fno-tree-loop-vectorize" } */
  
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.dg/vect/complex/fast-math-bb-slp-complex-mla-half-float.c gcc-16-20260201/gcc/testsuite/gcc.dg/vect/complex/fast-math-bb-slp-complex-mla-half-float.c
*** gcc-16-20260125/gcc/testsuite/gcc.dg/vect/complex/fast-math-bb-slp-complex-mla-half-float.c	Sun Jan 25 22:32:14 2026
--- gcc-16-20260201/gcc/testsuite/gcc.dg/vect/complex/fast-math-bb-slp-complex-mla-half-float.c	Sun Feb  1 22:32:12 2026
***************
*** 1,6 ****
  /* { dg-do compile } */
  /* { dg-require-effective-target vect_complex_add_half } */
! /* { dg-require-effective-target float16 } */
  /* { dg-additional-options "-ffast-math -fno-tree-loop-vectorize" } */
  /* { dg-add-options arm_v8_3a_fp16_complex_neon } */
  
--- 1,6 ----
  /* { dg-do compile } */
  /* { dg-require-effective-target vect_complex_add_half } */
! /* { dg-require-effective-target arm_v8_3a_fp16_complex_neon_ok } */
  /* { dg-additional-options "-ffast-math -fno-tree-loop-vectorize" } */
  /* { dg-add-options arm_v8_3a_fp16_complex_neon } */
  
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.dg/vect/complex/fast-math-bb-slp-complex-mls-half-float.c gcc-16-20260201/gcc/testsuite/gcc.dg/vect/complex/fast-math-bb-slp-complex-mls-half-float.c
*** gcc-16-20260125/gcc/testsuite/gcc.dg/vect/complex/fast-math-bb-slp-complex-mls-half-float.c	Sun Jan 25 22:32:14 2026
--- gcc-16-20260201/gcc/testsuite/gcc.dg/vect/complex/fast-math-bb-slp-complex-mls-half-float.c	Sun Feb  1 22:32:12 2026
***************
*** 1,6 ****
  /* { dg-do compile } */
  /* { dg-require-effective-target vect_complex_add_half } */
! /* { dg-require-effective-target float16 } */
  /* { dg-additional-options "-ffast-math -fno-tree-loop-vectorize" } */
  /* { dg-add-options arm_v8_3a_fp16_complex_neon } */
  
--- 1,6 ----
  /* { dg-do compile } */
  /* { dg-require-effective-target vect_complex_add_half } */
! /* { dg-require-effective-target arm_v8_3a_fp16_complex_neon_ok } */
  /* { dg-additional-options "-ffast-math -fno-tree-loop-vectorize" } */
  /* { dg-add-options arm_v8_3a_fp16_complex_neon } */
  
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.dg/vect/complex/fast-math-bb-slp-complex-mul-half-float.c gcc-16-20260201/gcc/testsuite/gcc.dg/vect/complex/fast-math-bb-slp-complex-mul-half-float.c
*** gcc-16-20260125/gcc/testsuite/gcc.dg/vect/complex/fast-math-bb-slp-complex-mul-half-float.c	Sun Jan 25 22:32:14 2026
--- gcc-16-20260201/gcc/testsuite/gcc.dg/vect/complex/fast-math-bb-slp-complex-mul-half-float.c	Sun Feb  1 22:32:12 2026
***************
*** 1,6 ****
  /* { dg-do compile } */
  /* { dg-require-effective-target vect_complex_add_half } */
! /* { dg-require-effective-target float16 } */
  /* { dg-additional-options "-ffast-math -fno-tree-loop-vectorize" } */
  /* { dg-add-options arm_v8_3a_fp16_complex_neon } */
  
--- 1,6 ----
  /* { dg-do compile } */
  /* { dg-require-effective-target vect_complex_add_half } */
! /* { dg-require-effective-target arm_v8_3a_fp16_complex_neon_ok } */
  /* { dg-additional-options "-ffast-math -fno-tree-loop-vectorize" } */
  /* { dg-add-options arm_v8_3a_fp16_complex_neon } */
  
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.dg/vect/complex/fast-math-complex-add-half-float.c gcc-16-20260201/gcc/testsuite/gcc.dg/vect/complex/fast-math-complex-add-half-float.c
*** gcc-16-20260125/gcc/testsuite/gcc.dg/vect/complex/fast-math-complex-add-half-float.c	Sun Jan 25 22:32:14 2026
--- gcc-16-20260201/gcc/testsuite/gcc.dg/vect/complex/fast-math-complex-add-half-float.c	Sun Feb  1 22:32:12 2026
***************
*** 1,7 ****
  /* { dg-do compile } */
  /* { dg-additional-options "-ffast-math --param vect-epilogues-nomask=0" } */
  /* { dg-require-effective-target vect_complex_add_half } */
! /* { dg-require-effective-target float16 } */
  /* { dg-add-options arm_v8_3a_fp16_complex_neon } */
  
  #define TYPE _Float16
--- 1,7 ----
  /* { dg-do compile } */
  /* { dg-additional-options "-ffast-math --param vect-epilogues-nomask=0" } */
  /* { dg-require-effective-target vect_complex_add_half } */
! /* { dg-require-effective-target arm_v8_3a_fp16_complex_neon_ok } */
  /* { dg-add-options arm_v8_3a_fp16_complex_neon } */
  
  #define TYPE _Float16
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.dg/vect/complex/fast-math-complex-add-pattern-half-float.c gcc-16-20260201/gcc/testsuite/gcc.dg/vect/complex/fast-math-complex-add-pattern-half-float.c
*** gcc-16-20260125/gcc/testsuite/gcc.dg/vect/complex/fast-math-complex-add-pattern-half-float.c	Sun Jan 25 22:32:14 2026
--- gcc-16-20260201/gcc/testsuite/gcc.dg/vect/complex/fast-math-complex-add-pattern-half-float.c	Sun Feb  1 22:32:12 2026
***************
*** 1,7 ****
  /* { dg-do compile } */
  /* { dg-additional-options "-ffast-math" } */
  /* { dg-require-effective-target vect_complex_add_half } */
! /* { dg-require-effective-target float16 } */
  /* { dg-add-options arm_v8_3a_fp16_complex_neon } */
  
  #define TYPE _Float16
--- 1,7 ----
  /* { dg-do compile } */
  /* { dg-additional-options "-ffast-math" } */
  /* { dg-require-effective-target vect_complex_add_half } */
! /* { dg-require-effective-target arm_v8_3a_fp16_complex_neon_ok } */
  /* { dg-add-options arm_v8_3a_fp16_complex_neon } */
  
  #define TYPE _Float16
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.dg/vect/complex/fast-math-complex-mla-half-float.c gcc-16-20260201/gcc/testsuite/gcc.dg/vect/complex/fast-math-complex-mla-half-float.c
*** gcc-16-20260125/gcc/testsuite/gcc.dg/vect/complex/fast-math-complex-mla-half-float.c	Sun Jan 25 22:32:14 2026
--- gcc-16-20260201/gcc/testsuite/gcc.dg/vect/complex/fast-math-complex-mla-half-float.c	Sun Feb  1 22:32:12 2026
***************
*** 1,8 ****
  /* { dg-do compile } */
  /* { dg-additional-options "-ffast-math" } */
- /* { dg-add-options arm_v8_3a_fp16_complex_neon } */
  /* { dg-require-effective-target vect_complex_add_half } */
! /* { dg-require-effective-target float16 } */
  
  #define TYPE _Float16
  #define N 200
--- 1,8 ----
  /* { dg-do compile } */
  /* { dg-additional-options "-ffast-math" } */
  /* { dg-require-effective-target vect_complex_add_half } */
! /* { dg-require-effective-target arm_v8_3a_fp16_complex_neon_ok } */
! /* { dg-add-options arm_v8_3a_fp16_complex_neon } */
  
  #define TYPE _Float16
  #define N 200
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.dg/vect/complex/fast-math-complex-mls-half-float.c gcc-16-20260201/gcc/testsuite/gcc.dg/vect/complex/fast-math-complex-mls-half-float.c
*** gcc-16-20260125/gcc/testsuite/gcc.dg/vect/complex/fast-math-complex-mls-half-float.c	Sun Jan 25 22:32:14 2026
--- gcc-16-20260201/gcc/testsuite/gcc.dg/vect/complex/fast-math-complex-mls-half-float.c	Sun Feb  1 22:32:12 2026
***************
*** 1,12 ****
  /* { dg-do compile } */
  /* { dg-additional-options "-ffast-math" } */
  /* { dg-require-effective-target vect_complex_add_half } */
! /* { dg-require-effective-target float16 } */
  /* { dg-add-options arm_v8_3a_fp16_complex_neon } */
  
  #define TYPE _Float16
  #define N 200
  #include "complex-mls-template.c"
! /* { dg-final { scan-tree-dump "Found COMPLEX_ADD_ROT270" "vect" } } */
  /* { dg-final { scan-tree-dump "Found COMPLEX_FMS_CONJ" "vect" } } */
  /* { dg-final { scan-tree-dump "Found COMPLEX_FMS" "vect" } } */
--- 1,16 ----
  /* { dg-do compile } */
  /* { dg-additional-options "-ffast-math" } */
  /* { dg-require-effective-target vect_complex_add_half } */
! /* { dg-require-effective-target arm_v8_3a_fp16_complex_neon_ok } */
  /* { dg-add-options arm_v8_3a_fp16_complex_neon } */
  
  #define TYPE _Float16
  #define N 200
  #include "complex-mls-template.c"
! /* COMPLEX_ADD_ROT270 is no longer recognized in fms_elemconjsnd.
!    The COMPLEX_EXPR that prevented reassoc from changing X - (Y + Z)
!    into (X + (-Y)) + (-Z) has been removed since the introduction of
!    DCE at the end of cplxlower1.  */
! /* { dg-final { scan-tree-dump "Found COMPLEX_ADD_ROT270" "vect" { xfail *-*-* } } } */
  /* { dg-final { scan-tree-dump "Found COMPLEX_FMS_CONJ" "vect" } } */
  /* { dg-final { scan-tree-dump "Found COMPLEX_FMS" "vect" } } */
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.dg/vect/complex/fast-math-complex-mul-half-float.c gcc-16-20260201/gcc/testsuite/gcc.dg/vect/complex/fast-math-complex-mul-half-float.c
*** gcc-16-20260125/gcc/testsuite/gcc.dg/vect/complex/fast-math-complex-mul-half-float.c	Sun Jan 25 22:32:14 2026
--- gcc-16-20260201/gcc/testsuite/gcc.dg/vect/complex/fast-math-complex-mul-half-float.c	Sun Feb  1 22:32:12 2026
***************
*** 1,7 ****
  /* { dg-do compile } */
  /* { dg-additional-options "-ffast-math" } */
  /* { dg-require-effective-target vect_complex_add_half } */
! /* { dg-require-effective-target float16 } */
  /* { dg-add-options arm_v8_3a_fp16_complex_neon } */
  
  #define TYPE _Float16
--- 1,7 ----
  /* { dg-do compile } */
  /* { dg-additional-options "-ffast-math" } */
  /* { dg-require-effective-target vect_complex_add_half } */
! /* { dg-require-effective-target arm_v8_3a_fp16_complex_neon_ok } */
  /* { dg-add-options arm_v8_3a_fp16_complex_neon } */
  
  #define TYPE _Float16
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-3.c gcc-16-20260201/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-3.c
*** gcc-16-20260125/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-3.c	Sun Jan 25 22:32:14 2026
--- gcc-16-20260201/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-3.c	Sun Feb  1 22:32:12 2026
*************** void foo2 (int64_t *__restrict a,
*** 45,48 ****
  /* { dg-final { scan-tree-dump-not "Preferring smaller LMUL loop because it has unexpected spills" "vect" } } */
  /* { dg-final { scan-tree-dump-times "Maximum lmul = 8" 1 "vect" } } */
  /* { dg-final { scan-tree-dump-times "Maximum lmul = 4" 1 "vect" } } */
! /* { dg-final { scan-tree-dump-times "Maximum lmul = 2" 3 "vect" } } */
--- 45,48 ----
  /* { dg-final { scan-tree-dump-not "Preferring smaller LMUL loop because it has unexpected spills" "vect" } } */
  /* { dg-final { scan-tree-dump-times "Maximum lmul = 8" 1 "vect" } } */
  /* { dg-final { scan-tree-dump-times "Maximum lmul = 4" 1 "vect" } } */
! /* { dg-final { scan-tree-dump-times "Maximum lmul = 2" 1 "vect" } } */
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-5.c gcc-16-20260201/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-5.c
*** gcc-16-20260125/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-5.c	Sun Jan 25 22:32:14 2026
--- gcc-16-20260201/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-5.c	Sun Feb  1 22:32:12 2026
*************** void foo2 (int16_t *__restrict a,
*** 39,49 ****
      }
  }
  
! /* { dg-final { scan-assembler {e16,m2} } } */
  /* { dg-final { scan-assembler-not {csrr} } } */
! /* { dg-final { scan-tree-dump-times "Preferring smaller LMUL loop because it has unexpected spills" 1 "vect" } } */
  /* { dg-final { scan-tree-dump-times "Maximum lmul = 8" 1 "vect" } } */
  /* { dg-final { scan-tree-dump-times "Maximum lmul = 4" 1 "vect" } } */
  /* { dg-final { scan-tree-dump-times "Maximum lmul = 2" 1 "vect" } } */
- /* { dg-final { scan-tree-dump "start = 8, end = 10" "vect" } } */
- /* { dg-final { scan-tree-dump "2: type = unsigned short, start = 0, end = 34" "vect" } } */
--- 39,47 ----
      }
  }
  
! /* { dg-final { scan-assembler {e16,m2} { xfail *-*-* } } } */
  /* { dg-final { scan-assembler-not {csrr} } } */
! /* { dg-final { scan-tree-dump-times "Preferring smaller LMUL loop because it has unexpected spills" 1 "vect" { xfail *-*-* } } } */
  /* { dg-final { scan-tree-dump-times "Maximum lmul = 8" 1 "vect" } } */
  /* { dg-final { scan-tree-dump-times "Maximum lmul = 4" 1 "vect" } } */
  /* { dg-final { scan-tree-dump-times "Maximum lmul = 2" 1 "vect" } } */
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-6.c gcc-16-20260201/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-6.c
*** gcc-16-20260125/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-6.c	Sun Jan 25 22:32:14 2026
--- gcc-16-20260201/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-6.c	Sun Feb  1 22:32:12 2026
*************** foo (uint8_t *restrict a, uint8_t *restr
*** 25,29 ****
  /* Since we don't support VLA SLP for LMUL = 8, dynamic LMUL cost model start from LMUL = 4.  */
  /* { dg-final { scan-tree-dump-not "Preferring smaller LMUL loop because it has unexpected spills" "vect" } } */
  /* { dg-final { scan-tree-dump-not "Maximum lmul = 8" "vect" } } */
! /* { dg-final { scan-tree-dump-times "Maximum lmul = 4" 1 "vect" } } */
! /* { dg-final { scan-tree-dump-times "Maximum lmul = 2" 1 "vect" } } */
--- 25,29 ----
  /* Since we don't support VLA SLP for LMUL = 8, dynamic LMUL cost model start from LMUL = 4.  */
  /* { dg-final { scan-tree-dump-not "Preferring smaller LMUL loop because it has unexpected spills" "vect" } } */
  /* { dg-final { scan-tree-dump-not "Maximum lmul = 8" "vect" } } */
! /* { dg-final { scan-tree-dump-times "Maximum lmul = 4" 1 "vect" { xfail *-*-* } } } */
! /* { dg-final { scan-tree-dump-times "Maximum lmul = 2" 1 "vect" { xfail *-*-* } } } */
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-7.c gcc-16-20260201/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-7.c
*** gcc-16-20260125/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-7.c	Sun Jan 25 22:32:14 2026
--- gcc-16-20260201/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-7.c	Sun Feb  1 22:32:12 2026
*************** void foo2 (int8_t *__restrict a,
*** 39,47 ****
      }
  }
  
! /* { dg-final { scan-assembler {e64,m4} } } */
  /* { dg-final { scan-assembler-not {csrr} } } */
! /* { dg-final { scan-tree-dump-times "Preferring smaller LMUL loop because it has unexpected spills" 1 "vect" } } */
  /* { dg-final { scan-tree-dump-times "Maximum lmul = 8" 1 "vect" } } */
  /* { dg-final { scan-tree-dump-times "Maximum lmul = 4" 1 "vect" } } */
  /* { dg-final { scan-tree-dump-times "Maximum lmul = 2" 1 "vect" } } */
--- 39,47 ----
      }
  }
  
! /* { dg-final { scan-assembler {e64,m4} { xfail *-*-* } } } */
  /* { dg-final { scan-assembler-not {csrr} } } */
! /* { dg-final { scan-tree-dump-times "Preferring smaller LMUL loop because it has unexpected spills" 1 "vect" { xfail *-*-* } } } */
  /* { dg-final { scan-tree-dump-times "Maximum lmul = 8" 1 "vect" } } */
  /* { dg-final { scan-tree-dump-times "Maximum lmul = 4" 1 "vect" } } */
  /* { dg-final { scan-tree-dump-times "Maximum lmul = 2" 1 "vect" } } */
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-8.c gcc-16-20260201/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-8.c
*** gcc-16-20260125/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-8.c	Sun Jan 25 22:32:14 2026
--- gcc-16-20260201/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-8.c	Sun Feb  1 22:32:12 2026
*************** foo (uint8_t *restrict a, uint8_t *restr
*** 34,38 ****
  /* Since we don't support VLA SLP for LMUL = 8, dynamic LMUL cost model start from LMUL = 4.  */
  /* { dg-final { scan-tree-dump-not "Preferring smaller LMUL loop because it has unexpected spills" "vect" } } */
  /* { dg-final { scan-tree-dump-not "Maximum lmul = 8" "vect" } } */
! /* { dg-final { scan-tree-dump-times "Maximum lmul = 4" 1 "vect" } } */
! /* { dg-final { scan-tree-dump-times "Maximum lmul = 2" 1 "vect" } } */
--- 34,38 ----
  /* Since we don't support VLA SLP for LMUL = 8, dynamic LMUL cost model start from LMUL = 4.  */
  /* { dg-final { scan-tree-dump-not "Preferring smaller LMUL loop because it has unexpected spills" "vect" } } */
  /* { dg-final { scan-tree-dump-not "Maximum lmul = 8" "vect" } } */
! /* { dg-final { scan-tree-dump-times "Maximum lmul = 4" 1 "vect" { xfail *-*-* } } } */
! /* { dg-final { scan-tree-dump-times "Maximum lmul = 2" 1 "vect" { xfail *-*-* } } } */
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-10.c gcc-16-20260201/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-10.c
*** gcc-16-20260125/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-10.c	Sun Jan 25 22:32:14 2026
--- gcc-16-20260201/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-10.c	Sun Feb  1 22:32:12 2026
*************** foo (int *x, int n, int res)
*** 17,22 ****
  /* { dg-final { scan-assembler {e32,m8} } } */
  /* { dg-final { scan-assembler-times {csrr} 1 } } */
  /* { dg-final { scan-tree-dump-not "Preferring smaller LMUL loop because it has unexpected spills" "vect" } } */
- /* { dg-final { scan-tree-dump-times "Maximum lmul = 8" 1 "vect" } } */
  /* { dg-final { scan-tree-dump-times "Maximum lmul = 4" 1 "vect" } } */
  /* { dg-final { scan-tree-dump-times "Maximum lmul = 2" 1 "vect" } } */
--- 17,21 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-12.c gcc-16-20260201/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-12.c
*** gcc-16-20260125/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-12.c	Sun Jan 25 22:32:14 2026
--- gcc-16-20260201/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-12.c	Sun Feb  1 22:32:12 2026
*************** foo (int *restrict a, int *restrict b, i
*** 20,25 ****
  /* { dg-final { scan-assembler {e32,m8} } } */
  /* { dg-final { scan-assembler-times {csrr} 1 } } */
  /* { dg-final { scan-tree-dump-not "Preferring smaller LMUL loop because it has unexpected spills" "vect" } } */
! /* { dg-final { scan-tree-dump-times "Maximum lmul = 8" 1 "vect" } } */
! /* { dg-final { scan-tree-dump-times "Maximum lmul = 4" 1 "vect" } } */
! /* { dg-final { scan-tree-dump-times "Maximum lmul = 2" 1 "vect" } } */
--- 20,24 ----
  /* { dg-final { scan-assembler {e32,m8} } } */
  /* { dg-final { scan-assembler-times {csrr} 1 } } */
  /* { dg-final { scan-tree-dump-not "Preferring smaller LMUL loop because it has unexpected spills" "vect" } } */
! /* { dg-final { scan-tree-dump-times "Maximum lmul = 4" 1 "vect" { xfail *-*-* } } } */
! /* { dg-final { scan-tree-dump-times "Maximum lmul = 2" 1 "vect" { xfail *-*-* } } } */
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/pr113112-3.c gcc-16-20260201/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/pr113112-3.c
*** gcc-16-20260125/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/pr113112-3.c	Sun Jan 25 22:32:14 2026
--- gcc-16-20260201/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/pr113112-3.c	Sun Feb  1 22:32:12 2026
*************** void bad1(int v1, int v2)
*** 15,20 ****
      }
  }
  
! /* { dg-final { scan-assembler {e32,m2} } } */
! /* { dg-final { scan-assembler-not {jr} } } */
! /* { dg-final { scan-assembler-times {ret} 1 } } */
--- 15,20 ----
      }
  }
  
! /* { dg-final { scan-assembler {e32,m2} { xfail *-*-* } } } */
! /* { dg-final { scan-assembler-not {jr} { xfail *-*-* } } } */
! /* { dg-final { scan-assembler-times {ret} 1 { xfail *-*-* } } } */
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/pr113112-4.c gcc-16-20260201/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/pr113112-4.c
*** gcc-16-20260125/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/pr113112-4.c	Sun Jan 25 22:32:14 2026
--- gcc-16-20260201/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/pr113112-4.c	Sun Feb  1 22:32:12 2026
*************** void move_replacements (rtx *x, rtx *y,
*** 21,28 ****
        }
  }
  
! /* { dg-final { scan-assembler-not {e64,m2} } } */
! /* { dg-final { scan-assembler {e64,m4} } } */
  /* { dg-final { scan-assembler-not {jr} } } */
  /* { dg-final { scan-assembler {ret} } } */
  /* { dg-final { scan-assembler-not {sp} } } */
--- 21,28 ----
        }
  }
  
! /* { dg-final { scan-assembler-not {e64,m2} { xfail *-*-* } } } */
! /* { dg-final { scan-assembler {e64,m4} { xfail *-*-* } } } */
  /* { dg-final { scan-assembler-not {jr} } } */
  /* { dg-final { scan-assembler {ret} } } */
  /* { dg-final { scan-assembler-not {sp} } } */
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.dg/vect/costmodel/x86_64/costmodel-vect-epil-1.c gcc-16-20260201/gcc/testsuite/gcc.dg/vect/costmodel/x86_64/costmodel-vect-epil-1.c
*** gcc-16-20260125/gcc/testsuite/gcc.dg/vect/costmodel/x86_64/costmodel-vect-epil-1.c	Sun Jan 25 22:32:14 2026
--- gcc-16-20260201/gcc/testsuite/gcc.dg/vect/costmodel/x86_64/costmodel-vect-epil-1.c	Sun Feb  1 22:32:12 2026
***************
*** 1,5 ****
  /* { dg-do compile } */
! /* { dg-additional-options "-mavx512bw -mtune-ctrl=avx512_masked_epilogues" } */
  
  void test (const unsigned char * __restrict__ pi,
  	   const float * __restrict__ blk,
--- 1,5 ----
  /* { dg-do compile } */
! /* { dg-additional-options "-mavx512bw -mtune-ctrl=avx512_masked_epilogues -mprefer-vector-width=512" } */
  
  void test (const unsigned char * __restrict__ pi,
  	   const float * __restrict__ blk,
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.dg/vect/vect-pr123755-2.c gcc-16-20260201/gcc/testsuite/gcc.dg/vect/vect-pr123755-2.c
*** gcc-16-20260125/gcc/testsuite/gcc.dg/vect/vect-pr123755-2.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gcc.dg/vect/vect-pr123755-2.c	Sun Feb  1 22:32:12 2026
***************
*** 0 ****
--- 1,10 ----
+ /* { dg-do compile } */
+ /* { dg-additional-options "-ffast-math" } */
+ 
+ double foo (double *a, double *b, double *c)
+ {
+   double result = 0.0;
+   for (int i = 0; i < 1024; ++i)
+     result += i & 1 ? __builtin_fma (a[i], b[i], c[i]) : 0.0;
+   return result;
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.dg/vect/vect-simd-clone-pr123794.c gcc-16-20260201/gcc/testsuite/gcc.dg/vect/vect-simd-clone-pr123794.c
*** gcc-16-20260125/gcc/testsuite/gcc.dg/vect/vect-simd-clone-pr123794.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gcc.dg/vect/vect-simd-clone-pr123794.c	Sun Feb  1 22:32:12 2026
***************
*** 0 ****
--- 1,13 ----
+ /* { dg-do compile } */
+ /* { dg-require-effective-target vect_simd_clones } */
+ /* { dg-additional-options "-fopenmp-simd" } */
+ 
+ extern long a[];
+ #pragma omp declare simd
+ long my_fun(long);
+ long foo_i;
+ void foo() {
+ #pragma omp simd
+   for (foo_i = 0; foo_i < 3; foo_i += 1)
+     a[foo_i] = my_fun(foo_i);
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.dg/vect/vect-uncounted-run_4.c gcc-16-20260201/gcc/testsuite/gcc.dg/vect/vect-uncounted-run_4.c
*** gcc-16-20260125/gcc/testsuite/gcc.dg/vect/vect-uncounted-run_4.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gcc.dg/vect/vect-uncounted-run_4.c	Sun Feb  1 22:32:12 2026
***************
*** 0 ****
--- 1,17 ----
+ /* Ensure we don't vectorize outer loops when the inner loop is uncounted.  */
+ /* { dg-add-options vect_early_break } */
+ /* { dg-require-effective-target vect_early_break_hw } */
+ /* { dg-require-effective-target vect_int } */
+ /* { dg-additional-options "-O3" } */
+ 
+ int a;
+ int main() {
+   for (int b = 0; b < 21; b++) {
+     int c = b;
+     while (c)
+       a = c >>= 1;
+   }
+   if (a != 0) __builtin_abort();
+ }
+ 
+ /* { dg-final { scan-tree-dump "missed:   not vectorized: inner-loop count not invariant." "vect" } } */
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.misc-tests/gcov-19.c gcc-16-20260201/gcc/testsuite/gcc.misc-tests/gcov-19.c
*** gcc-16-20260125/gcc/testsuite/gcc.misc-tests/gcov-19.c	Sun Jan 25 22:32:14 2026
--- gcc-16-20260201/gcc/testsuite/gcc.misc-tests/gcov-19.c	Sun Feb  1 22:32:12 2026
***************
*** 1,4 ****
! /* { dg-options "-fcondition-coverage -ftest-coverage" } */
  /* { dg-do run } */
  
  /* Some side effect to stop branches from being pruned.  */
--- 1,4 ----
! /* { dg-options "-fcondition-coverage" } */
  /* { dg-do run } */
  
  /* Some side effect to stop branches from being pruned.  */
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.misc-tests/gcov-29.c gcc-16-20260201/gcc/testsuite/gcc.misc-tests/gcov-29.c
*** gcc-16-20260125/gcc/testsuite/gcc.misc-tests/gcov-29.c	Sun Jan 25 22:32:14 2026
--- gcc-16-20260201/gcc/testsuite/gcc.misc-tests/gcov-29.c	Sun Feb  1 22:32:12 2026
***************
*** 1,4 ****
! /* { dg-options "--coverage -fpath-coverage" } */
  /* { dg-do run } */
  
  void
--- 1,4 ----
! /* { dg-options "-fpath-coverage" } */
  /* { dg-do run } */
  
  void
*************** void *gnu_getcwd()
*** 823,829 ****
  }
  
  /* BEGIN paths
!    summary: 0/5  */
  void pathcov007a (int a)
  /* END */
  {
--- 823,829 ----
  }
  
  /* BEGIN paths
!    summary: 0/6  */
  void pathcov007a (int a)
  /* END */
  {
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.misc-tests/gcov-30.c gcc-16-20260201/gcc/testsuite/gcc.misc-tests/gcov-30.c
*** gcc-16-20260125/gcc/testsuite/gcc.misc-tests/gcov-30.c	Sun Jan 25 22:32:14 2026
--- gcc-16-20260201/gcc/testsuite/gcc.misc-tests/gcov-30.c	Sun Feb  1 22:32:12 2026
*************** void *gnu_getcwd()
*** 823,829 ****
  }
  
  /* BEGIN paths
!    summary: 0/5  */
  void pathcov007a (int a)
  /* END */
  {
--- 823,829 ----
  }
  
  /* BEGIN paths
!    summary: 0/6  */
  void pathcov007a (int a)
  /* END */
  {
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.misc-tests/gcov-pr123855.c gcc-16-20260201/gcc/testsuite/gcc.misc-tests/gcov-pr123855.c
*** gcc-16-20260125/gcc/testsuite/gcc.misc-tests/gcov-pr123855.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gcc.misc-tests/gcov-pr123855.c	Sun Feb  1 22:32:12 2026
***************
*** 0 ****
--- 1,13 ----
+ /* { dg-options "--coverage -fpath-coverage" } */
+ 
+ __attribute__((__returns_twice__)) void
+ foo ()
+ {
+   foo ();
+   for (;;)
+     ;
+ }
+ 
+ int main () {}
+ 
+ /* { dg-final { run-gcov prime-paths gcov-pr123855.c } } */
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.target/aarch64/advsimd-intrinsics/vector-complex_f16.c gcc-16-20260201/gcc/testsuite/gcc.target/aarch64/advsimd-intrinsics/vector-complex_f16.c
*** gcc-16-20260125/gcc/testsuite/gcc.target/aarch64/advsimd-intrinsics/vector-complex_f16.c	Sun Jan 25 22:32:14 2026
--- gcc-16-20260201/gcc/testsuite/gcc.target/aarch64/advsimd-intrinsics/vector-complex_f16.c	Sun Feb  1 22:32:12 2026
***************
*** 1,9 ****
  /* { dg-do compile } */
! /* { dg-require-effective-target arm_v8_3a_complex_neon_ok } */
! /* { dg-require-effective-target arm_v8_2a_fp16_neon_ok } */
! /* { dg-add-options arm_v8_3a_complex_neon } */
! /* { dg-add-options arm_v8_2a_fp16_neon } */
! /* { dg-additional-options "-O2 -march=armv8.3-a+fp16 -save-temps" } */
  
  #include <arm_neon.h>
  
--- 1,7 ----
  /* { dg-do compile } */
! /* { dg-require-effective-target arm_v8_3a_fp16_complex_neon_ok } */
! /* { dg-add-options arm_v8_3a_fp16_complex_neon } */
! /* { dg-additional-options "-O2 -save-temps" } */
  
  #include <arm_neon.h>
  
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.target/aarch64/pr122749_1.c gcc-16-20260201/gcc/testsuite/gcc.target/aarch64/pr122749_1.c
*** gcc-16-20260125/gcc/testsuite/gcc.target/aarch64/pr122749_1.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gcc.target/aarch64/pr122749_1.c	Sun Feb  1 22:32:12 2026
***************
*** 0 ****
--- 1,48 ----
+ /* { dg-do run { target arm_v8_neon_hw } } */
+ /* { dg-additional-options "-Ofast -std=gnu99 --param vect-epilogues-nomask=0 -fdump-tree-vect-details -fdump-tree-widening_mul" } */
+ 
+ #include <limits.h>
+ #include <stdint.h>
+ 
+ typedef int8_t elem_t;
+ 
+ __attribute__ ((noipa))
+ elem_t
+ foo2 (elem_t *buf, int len)
+ {
+   elem_t x = 0;
+ 
+   for (int i = 0; i < len; i++)
+     x += (elem_t) i * buf[i];
+ 
+   return x;
+ }
+ 
+ static elem_t
+ reference (elem_t *buf, int len)
+ {
+   elem_t x = 0;
+ 
+ #pragma GCC novector
+   for (int i = 0; i < len; i++)
+     x += (elem_t) i * buf[i];
+ 
+   return x;
+ }
+ 
+ int
+ main (void)
+ {
+   elem_t buf[] = { 1, -2, INT8_MAX, INT8_MIN, 5, -7, 3, -4 };
+   int len = sizeof (buf) / sizeof (buf[0]);
+   elem_t want = reference (buf, len);
+   elem_t got = foo2 (buf, len);
+ 
+   if (want != got)
+     __builtin_abort ();
+ 
+   return 0;
+ }
+ 
+ /* { dg-final { scan-tree-dump-times "\.FMA" 1 "widening_mul" { xfail *-*-* } } } */
+ /* { dg-final { scan-tree-dump-times "vectorized 1 loop" 1 "vect" } } */
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.target/aarch64/pr122749_2.c gcc-16-20260201/gcc/testsuite/gcc.target/aarch64/pr122749_2.c
*** gcc-16-20260125/gcc/testsuite/gcc.target/aarch64/pr122749_2.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gcc.target/aarch64/pr122749_2.c	Sun Feb  1 22:32:12 2026
***************
*** 0 ****
--- 1,48 ----
+ /* { dg-do run { target arm_v8_neon_hw } } */
+ /* { dg-additional-options "-Ofast -std=gnu99 --param vect-epilogues-nomask=0 -fdump-tree-vect-details -fdump-tree-widening_mul" } */
+ 
+ #include <limits.h>
+ #include <stdint.h>
+ 
+ typedef int16_t elem_t;
+ 
+ __attribute__ ((noipa))
+ elem_t
+ foo2 (elem_t *buf, int len)
+ {
+   elem_t x = 0;
+ 
+   for (int i = 0; i < len; i++)
+     x += (elem_t) i * buf[i];
+ 
+   return x;
+ }
+ 
+ static elem_t
+ reference (elem_t *buf, int len)
+ {
+   elem_t x = 0;
+ 
+ #pragma GCC novector
+   for (int i = 0; i < len; i++)
+     x += (elem_t) i * buf[i];
+ 
+   return x;
+ }
+ 
+ int
+ main (void)
+ {
+   elem_t buf[] = { 1, -2, INT16_MAX, INT16_MIN, 5, -7, 3, -4 };
+   int len = sizeof (buf) / sizeof (buf[0]);
+   elem_t want = reference (buf, len);
+   elem_t got = foo2 (buf, len);
+ 
+   if (want != got)
+     __builtin_abort ();
+ 
+   return 0;
+ }
+ 
+ /* { dg-final { scan-tree-dump-times "\.FMA" 1 "widening_mul" { xfail *-*-* } } } */
+ /* { dg-final { scan-tree-dump-times "vectorized 1 loop" 1 "vect" } } */
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.target/aarch64/pr122749_3.c gcc-16-20260201/gcc/testsuite/gcc.target/aarch64/pr122749_3.c
*** gcc-16-20260125/gcc/testsuite/gcc.target/aarch64/pr122749_3.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gcc.target/aarch64/pr122749_3.c	Sun Feb  1 22:32:12 2026
***************
*** 0 ****
--- 1,48 ----
+ /* { dg-do run { target arm_v8_neon_hw } } */
+ /* { dg-additional-options "-Ofast -std=gnu99 --param vect-epilogues-nomask=0 -fdump-tree-vect-details -fdump-tree-widening_mul" } */
+ 
+ #include <limits.h>
+ #include <stdint.h>
+ 
+ typedef int32_t elem_t;
+ 
+ __attribute__ ((noipa))
+ elem_t
+ foo2 (elem_t *buf, int len)
+ {
+   elem_t x = 0;
+ 
+   for (int i = 0; i < len; i++)
+     x += (elem_t) i * buf[i];
+ 
+   return x;
+ }
+ 
+ static elem_t
+ reference (elem_t *buf, int len)
+ {
+   elem_t x = 0;
+ 
+ #pragma GCC novector
+   for (int i = 0; i < len; i++)
+     x += (elem_t) i * buf[i];
+ 
+   return x;
+ }
+ 
+ int
+ main (void)
+ {
+   elem_t buf[] = { 1, -2, INT32_MAX, INT32_MIN, 5, -7, 3, -4 };
+   int len = sizeof (buf) / sizeof (buf[0]);
+   elem_t want = reference (buf, len);
+   elem_t got = foo2 (buf, len);
+ 
+   if (want != got)
+     __builtin_abort ();
+ 
+   return 0;
+ }
+ 
+ /* { dg-final { scan-tree-dump-times "\.FMA" 1 "widening_mul" { xfail *-*-* } } } */
+ /* { dg-final { scan-tree-dump-times "vectorized 1 loop" 1 "vect" } } */
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.target/aarch64/pr122749_4.c gcc-16-20260201/gcc/testsuite/gcc.target/aarch64/pr122749_4.c
*** gcc-16-20260125/gcc/testsuite/gcc.target/aarch64/pr122749_4.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gcc.target/aarch64/pr122749_4.c	Sun Feb  1 22:32:12 2026
***************
*** 0 ****
--- 1,45 ----
+ /* { dg-do run { target arm_v8_neon_hw } } */
+ /* { dg-additional-options "-Ofast -std=gnu99 --param vect-epilogues-nomask=0 -fdump-tree-vect-details -fdump-tree-widening_mul" } */
+ 
+ typedef float elem_t;
+ 
+ __attribute__ ((noipa))
+ elem_t
+ foo2 (elem_t *buf, int len)
+ {
+   elem_t x = 0;
+ 
+   for (int i = 0; i < len; i++)
+     x += (elem_t) i * buf[i];
+ 
+   return x;
+ }
+ 
+ static elem_t
+ reference (elem_t *buf, int len)
+ {
+   elem_t x = 0;
+ 
+ #pragma GCC novector
+   for (int i = 0; i < len; i++)
+     x += (elem_t) i * buf[i];
+ 
+   return x;
+ }
+ 
+ int
+ main (void)
+ {
+   elem_t buf[] = { 1.0f, 2.0f, 1.0f, 2.0f, 1.0f, 2.0f };
+   int len = sizeof (buf) / sizeof (buf[0]);
+   elem_t want = reference (buf, len);
+   elem_t got = foo2 (buf, len);
+ 
+   if (want != got)
+     __builtin_abort ();
+ 
+   return 0;
+ }
+ 
+ /* { dg-final { scan-tree-dump-times "\\.FMA" 4 "widening_mul" } } */
+ /* { dg-final { scan-tree-dump-times "vectorized 1 loop" 1 "vect" } } */
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.target/aarch64/pr122749_5.c gcc-16-20260201/gcc/testsuite/gcc.target/aarch64/pr122749_5.c
*** gcc-16-20260125/gcc/testsuite/gcc.target/aarch64/pr122749_5.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gcc.target/aarch64/pr122749_5.c	Sun Feb  1 22:32:12 2026
***************
*** 0 ****
--- 1,45 ----
+ /* { dg-do run { target arm_v8_neon_hw } } */
+ /* { dg-additional-options "-Ofast -std=gnu99 --param vect-epilogues-nomask=0 -fdump-tree-vect-details -fdump-tree-widening_mul" } */
+ 
+ typedef double elem_t;
+ 
+ __attribute__ ((noipa))
+ elem_t
+ foo2 (elem_t *buf, int len)
+ {
+   elem_t x = 0;
+ 
+   for (int i = 0; i < len; i++)
+     x += (elem_t) i * buf[i];
+ 
+   return x;
+ }
+ 
+ static elem_t
+ reference (elem_t *buf, int len)
+ {
+   elem_t x = 0;
+ 
+ #pragma GCC novector
+   for (int i = 0; i < len; i++)
+     x += (elem_t) i * buf[i];
+ 
+   return x;
+ }
+ 
+ int
+ main (void)
+ {
+   elem_t buf[] = { 1.0, 2.0, 1.0, 2.0, 1.0, 2.0 };
+   int len = sizeof (buf) / sizeof (buf[0]);
+   elem_t want = reference (buf, len);
+   elem_t got = foo2 (buf, len);
+ 
+   if (want != got)
+     __builtin_abort ();
+ 
+   return 0;
+ }
+ 
+ /* { dg-final { scan-tree-dump-times "\\.FMA" 2 "widening_mul" } } */
+ /* { dg-final { scan-tree-dump-times "vectorized 1 loop" 1 "vect" } } */
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.target/aarch64/pr122749_6.c gcc-16-20260201/gcc/testsuite/gcc.target/aarch64/pr122749_6.c
*** gcc-16-20260125/gcc/testsuite/gcc.target/aarch64/pr122749_6.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gcc.target/aarch64/pr122749_6.c	Sun Feb  1 22:32:12 2026
***************
*** 0 ****
--- 1,45 ----
+ /* { dg-do run { target arm_v8_neon_hw } } */
+ /* { dg-additional-options "-Ofast -std=gnu99 --param vect-epilogues-nomask=0 -fwrapv -fdump-tree-vect-details -fdump-tree-widening_mul" } */
+ 
+ typedef float elem_t;
+ 
+ __attribute__ ((noipa))
+ elem_t
+ foo2 (elem_t *buf, int len)
+ {
+   elem_t x = 0;
+ 
+   for (int i = 0; i < len; i++)
+     x += (elem_t) i * buf[i];
+ 
+   return x;
+ }
+ 
+ static elem_t
+ reference (elem_t *buf, int len)
+ {
+   elem_t x = 0;
+ 
+ #pragma GCC novector
+   for (int i = 0; i < len; i++)
+     x += (elem_t) i * buf[i];
+ 
+   return x;
+ }
+ 
+ int
+ main (void)
+ {
+   elem_t buf[] = { 1.0f, 2.0f, 1.0f, 2.0f, 1.0f, 2.0f };
+   int len = sizeof (buf) / sizeof (buf[0]);
+   elem_t want = reference (buf, len);
+   elem_t got = foo2 (buf, len);
+ 
+   if (want != got)
+     __builtin_abort ();
+ 
+   return 0;
+ }
+ 
+ /* { dg-final { scan-tree-dump-times "\\.FMA" 4 "widening_mul" } } */
+ /* { dg-final { scan-tree-dump-times "vectorized 1 loop" 1 "vect" } } */
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.target/aarch64/pr122749_8.c gcc-16-20260201/gcc/testsuite/gcc.target/aarch64/pr122749_8.c
*** gcc-16-20260125/gcc/testsuite/gcc.target/aarch64/pr122749_8.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gcc.target/aarch64/pr122749_8.c	Sun Feb  1 22:32:12 2026
***************
*** 0 ****
--- 1,48 ----
+ /* { dg-do run { target arm_v8_neon_hw } } */
+ /* { dg-additional-options "-Ofast -std=gnu99 --param vect-epilogues-nomask=0 -fdump-tree-vect-details -fdump-tree-widening_mul" } */
+ 
+ #include <limits.h>
+ #include <stdint.h>
+ 
+ typedef uint8_t elem_t;
+ 
+ __attribute__ ((noipa))
+ elem_t
+ foo2 (elem_t *buf, int len)
+ {
+   elem_t x = 0;
+ 
+   for (int i = 0; i < len; i++)
+     x += (elem_t) i * buf[i];
+ 
+   return x;
+ }
+ 
+ static elem_t
+ reference (elem_t *buf, int len)
+ {
+   elem_t x = 0;
+ 
+ #pragma GCC novector
+   for (int i = 0; i < len; i++)
+     x += (elem_t) i * buf[i];
+ 
+   return x;
+ }
+ 
+ int
+ main (void)
+ {
+   elem_t buf[] = { 1, 2, UINT8_MAX, 7, 0, UINT8_MAX, 5, 9 };
+   int len = sizeof (buf) / sizeof (buf[0]);
+   elem_t want = reference (buf, len);
+   elem_t got = foo2 (buf, len);
+ 
+   if (want != got)
+     __builtin_abort ();
+ 
+   return 0;
+ }
+ 
+ /* { dg-final { scan-tree-dump-times "\.FMA" 1 "widening_mul" { xfail *-*-* } } } */
+ /* { dg-final { scan-tree-dump-times "vectorized 1 loop" 1 "vect" } } */
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.target/aarch64/pr122749_9.c gcc-16-20260201/gcc/testsuite/gcc.target/aarch64/pr122749_9.c
*** gcc-16-20260125/gcc/testsuite/gcc.target/aarch64/pr122749_9.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gcc.target/aarch64/pr122749_9.c	Sun Feb  1 22:32:12 2026
***************
*** 0 ****
--- 1,48 ----
+ /* { dg-do run { target arm_v8_neon_hw } } */
+ /* { dg-additional-options "-Ofast -std=gnu99 --param vect-epilogues-nomask=0 -fdump-tree-vect-details -fdump-tree-widening_mul" } */
+ 
+ #include <limits.h>
+ #include <stdint.h>
+ 
+ typedef uint16_t elem_t;
+ 
+ __attribute__ ((noipa))
+ elem_t
+ foo2 (elem_t *buf, int len)
+ {
+   elem_t x = 0;
+ 
+   for (int i = 0; i < len; i++)
+     x += (elem_t) i * buf[i];
+ 
+   return x;
+ }
+ 
+ static elem_t
+ reference (elem_t *buf, int len)
+ {
+   elem_t x = 0;
+ 
+ #pragma GCC novector
+   for (int i = 0; i < len; i++)
+     x += (elem_t) i * buf[i];
+ 
+   return x;
+ }
+ 
+ int
+ main (void)
+ {
+   elem_t buf[] = { 1, 2, UINT16_MAX, 7, 0, UINT16_MAX, 5, 9 };
+   int len = sizeof (buf) / sizeof (buf[0]);
+   elem_t want = reference (buf, len);
+   elem_t got = foo2 (buf, len);
+ 
+   if (want != got)
+     __builtin_abort ();
+ 
+   return 0;
+ }
+ 
+ /* { dg-final { scan-tree-dump-times "\.FMA" 1 "widening_mul" { xfail *-*-* } } } */
+ /* { dg-final { scan-tree-dump-times "vectorized 1 loop" 1 "vect" } } */
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.target/aarch64/pr123206.c gcc-16-20260201/gcc/testsuite/gcc.target/aarch64/pr123206.c
*** gcc-16-20260125/gcc/testsuite/gcc.target/aarch64/pr123206.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gcc.target/aarch64/pr123206.c	Sun Feb  1 22:32:12 2026
***************
*** 0 ****
--- 1,7 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -march=armv8-a+nosimd" } */
+ #include <arm_neon.h>
+ mfloat8x8_t foo(uint8x8_t a, mfloat8x8_t b, mfloat8x8_t c)
+ {
+   return vbsl_mf8(a,b,c); /* { dg-error "ACLE function 'vbsl_mf8' requires ISA extension 'simd'" } */
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.target/aarch64/pr123791.c gcc-16-20260201/gcc/testsuite/gcc.target/aarch64/pr123791.c
*** gcc-16-20260125/gcc/testsuite/gcc.target/aarch64/pr123791.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gcc.target/aarch64/pr123791.c	Sun Feb  1 22:32:12 2026
***************
*** 0 ****
--- 1,10 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -mpc-relative-literal-loads" } */
+ 
+ char *
+ foo ()
+ {
+   return (char *) (__UINTPTR_TYPE__) foo + 7483647;
+ }
+ 
+ /* { dg-final { scan-assembler-not "\\.(word|xword)\tfoo" { xfail aarch64_large } } } */
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.target/aarch64/pr123792.c gcc-16-20260201/gcc/testsuite/gcc.target/aarch64/pr123792.c
*** gcc-16-20260125/gcc/testsuite/gcc.target/aarch64/pr123792.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gcc.target/aarch64/pr123792.c	Sun Feb  1 22:32:12 2026
***************
*** 0 ****
--- 1,53 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2" } */
+ /* { dg-final { check-function-bodies "**" "" "" } } */
+ 
+ #include <stdint.h>
+ 
+ /*
+ ** f1:
+ **	mvn	w1, w1
+ **	lsl	w0, w0, w1
+ **	ret
+ */
+ 
+ int f1 (int x, int n)
+ {
+   return x << (31 - n);
+ }
+ 
+ /*
+ ** f2:
+ **	mvn	w1, w1
+ **	asr	w0, w0, w1
+ **	ret
+ */
+ 
+ int f2 (int x, int n)
+ {
+   return x >> (31 - n);
+ }
+ 
+ /*
+ ** f3:
+ **	mvn	w1, w1
+ **	lsr	x0, x0, x1
+ **	ret
+ */
+ 
+ unsigned long f3 (unsigned long long x, int n)
+ {
+   return x >> (63 - n);
+ }
+ 
+ /*
+ ** f4:
+ **	mvn	w1, w1
+ **	lsl	x0, x0, x1
+ **	ret
+ */
+ 
+ long f4 (long x, int n)
+ {
+   return x << (63 - n);
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.target/aarch64/pragma_cpp_predefs_4.c gcc-16-20260201/gcc/testsuite/gcc.target/aarch64/pragma_cpp_predefs_4.c
*** gcc-16-20260125/gcc/testsuite/gcc.target/aarch64/pragma_cpp_predefs_4.c	Sun Jan 25 22:32:14 2026
--- gcc-16-20260201/gcc/testsuite/gcc.target/aarch64/pragma_cpp_predefs_4.c	Sun Feb  1 22:32:12 2026
***************
*** 111,116 ****
--- 111,121 ----
  #error Foo
  #endif
  
+ #pragma GCC target "+nothing+sve-bfscale"
+ #ifndef __ARM_FEATURE_SVE_BFSCALE
+ #error "__ARM_FEATURE_SVE_BFSCALE should be defined but isn't"
+ #endif
+ 
  #pragma GCC target "+nothing+sve2+sme-f8f16"
  #ifndef __ARM_FEATURE_SME_F8F16
  #error Foo
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.target/aarch64/rotate_xar_1.c gcc-16-20260201/gcc/testsuite/gcc.target/aarch64/rotate_xar_1.c
*** gcc-16-20260125/gcc/testsuite/gcc.target/aarch64/rotate_xar_1.c	Sun Jan 25 22:32:14 2026
--- gcc-16-20260201/gcc/testsuite/gcc.target/aarch64/rotate_xar_1.c	Sun Feb  1 22:32:12 2026
*************** typedef unsigned int __attribute__ ((vec
*** 15,21 ****
  /*
  ** G1:
  **	movi?	[vdz][0-9]+\.?(?:[0-9]*[bhsd])?, #?0
! ** 	xar	v0\.2d, v[0-9]+\.2d, v[0-9]+\.2d, 39
  **      ret
  */
  v2di
--- 15,21 ----
  /*
  ** G1:
  **	movi?	[vdz][0-9]+\.?(?:[0-9]*[bhsd])?, #?0
! ** 	xar	v0\.2d, v[0-9]+\.2d, v[0-9]+\.2d, #39
  **      ret
  */
  v2di
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.target/aarch64/sha3_1.c gcc-16-20260201/gcc/testsuite/gcc.target/aarch64/sha3_1.c
*** gcc-16-20260125/gcc/testsuite/gcc.target/aarch64/sha3_1.c	Sun Jan 25 22:32:14 2026
--- gcc-16-20260201/gcc/testsuite/gcc.target/aarch64/sha3_1.c	Sun Feb  1 22:32:12 2026
***************
*** 6,10 ****
  
  /* { dg-final { scan-assembler-times "eor3\\tv\[0-9\]+\.16b, v\[0-9\]+\.16b, v\[0-9\]+\.16b, v\[0-9\]+\.16b" 8 } } */
  /* { dg-final { scan-assembler-times "rax1\\tv\[0-9\]+\.2d, v\[0-9\]+\.2d, v\[0-9\]+\.2d" 1 } } */
! /* { dg-final { scan-assembler-times "xar\\tv\[0-9\]+\.2d, v\[0-9\]+\.2d, v\[0-9\]+\.2d, 15" 1 } } */
  /* { dg-final { scan-assembler-times "bcax\\tv\[0-9\]+\.16b, v\[0-9\]+\.16b, v\[0-9\]+\.16b, v\[0-9\]+\.16b" 8 } } */
--- 6,10 ----
  
  /* { dg-final { scan-assembler-times "eor3\\tv\[0-9\]+\.16b, v\[0-9\]+\.16b, v\[0-9\]+\.16b, v\[0-9\]+\.16b" 8 } } */
  /* { dg-final { scan-assembler-times "rax1\\tv\[0-9\]+\.2d, v\[0-9\]+\.2d, v\[0-9\]+\.2d" 1 } } */
! /* { dg-final { scan-assembler-times "xar\\tv\[0-9\]+\.2d, v\[0-9\]+\.2d, v\[0-9\]+\.2d, #?15" 1 } } */
  /* { dg-final { scan-assembler-times "bcax\\tv\[0-9\]+\.16b, v\[0-9\]+\.16b, v\[0-9\]+\.16b, v\[0-9\]+\.16b" 8 } } */
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.target/aarch64/sha3_2.c gcc-16-20260201/gcc/testsuite/gcc.target/aarch64/sha3_2.c
*** gcc-16-20260125/gcc/testsuite/gcc.target/aarch64/sha3_2.c	Sun Jan 25 22:32:14 2026
--- gcc-16-20260201/gcc/testsuite/gcc.target/aarch64/sha3_2.c	Sun Feb  1 22:32:12 2026
***************
*** 5,9 ****
  
  /* { dg-final { scan-assembler-times "eor3\\tv\[0-9\]+\.16b, v\[0-9\]+\.16b, v\[0-9\]+\.16b, v\[0-9\]+\.16b" 8 } } */
  /* { dg-final { scan-assembler-times "rax1\\tv\[0-9\]+\.2d, v\[0-9\]+\.2d, v\[0-9\]+\.2d" 1 } } */
! /* { dg-final { scan-assembler-times "xar\\tv\[0-9\]+\.2d, v\[0-9\]+\.2d, v\[0-9\]+\.2d, 15" 1 } } */
  /* { dg-final { scan-assembler-times "bcax\\tv\[0-9\]+\.16b, v\[0-9\]+\.16b, v\[0-9\]+\.16b, v\[0-9\]+\.16b" 8 } } */
--- 5,9 ----
  
  /* { dg-final { scan-assembler-times "eor3\\tv\[0-9\]+\.16b, v\[0-9\]+\.16b, v\[0-9\]+\.16b, v\[0-9\]+\.16b" 8 } } */
  /* { dg-final { scan-assembler-times "rax1\\tv\[0-9\]+\.2d, v\[0-9\]+\.2d, v\[0-9\]+\.2d" 1 } } */
! /* { dg-final { scan-assembler-times "xar\\tv\[0-9\]+\.2d, v\[0-9\]+\.2d, v\[0-9\]+\.2d, #?15" 1 } } */
  /* { dg-final { scan-assembler-times "bcax\\tv\[0-9\]+\.16b, v\[0-9\]+\.16b, v\[0-9\]+\.16b, v\[0-9\]+\.16b" 8 } } */
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.target/aarch64/sha3_3.c gcc-16-20260201/gcc/testsuite/gcc.target/aarch64/sha3_3.c
*** gcc-16-20260125/gcc/testsuite/gcc.target/aarch64/sha3_3.c	Sun Jan 25 22:32:14 2026
--- gcc-16-20260201/gcc/testsuite/gcc.target/aarch64/sha3_3.c	Sun Feb  1 22:32:12 2026
***************
*** 5,9 ****
  
  /* { dg-final { scan-assembler-times "eor3\\tv\[0-9\]+\.16b, v\[0-9\]+\.16b, v\[0-9\]+\.16b, v\[0-9\]+\.16b" 8 } } */
  /* { dg-final { scan-assembler-times "rax1\\tv\[0-9\]+\.2d, v\[0-9\]+\.2d, v\[0-9\]+\.2d" 1 } } */
! /* { dg-final { scan-assembler-times "xar\\tv\[0-9\]+\.2d, v\[0-9\]+\.2d, v\[0-9\]+\.2d, 15" 1 } } */
  /* { dg-final { scan-assembler-times "bcax\\tv\[0-9\]+\.16b, v\[0-9\]+\.16b, v\[0-9\]+\.16b, v\[0-9\]+\.16b" 8 } } */
--- 5,9 ----
  
  /* { dg-final { scan-assembler-times "eor3\\tv\[0-9\]+\.16b, v\[0-9\]+\.16b, v\[0-9\]+\.16b, v\[0-9\]+\.16b" 8 } } */
  /* { dg-final { scan-assembler-times "rax1\\tv\[0-9\]+\.2d, v\[0-9\]+\.2d, v\[0-9\]+\.2d" 1 } } */
! /* { dg-final { scan-assembler-times "xar\\tv\[0-9\]+\.2d, v\[0-9\]+\.2d, v\[0-9\]+\.2d, #?15" 1 } } */
  /* { dg-final { scan-assembler-times "bcax\\tv\[0-9\]+\.16b, v\[0-9\]+\.16b, v\[0-9\]+\.16b, v\[0-9\]+\.16b" 8 } } */
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mul_bf16_x2.c gcc-16-20260201/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mul_bf16_x2.c
*** gcc-16-20260125/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mul_bf16_x2.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mul_bf16_x2.c	Sun Feb  1 22:32:12 2026
***************
*** 0 ****
--- 1,193 ----
+ /* { dg-do assemble { target aarch64_asm_sve-bfscale_ok } } */
+ /* { dg-do compile { target { ! aarch64_asm_sve-bfscale_ok } } } */
+ /* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+ 
+ #include "test_sme2_acle.h"
+ #pragma GCC target "+sve-bfscale"
+ 
+ /*
+ ** mul_z0_z0_z4:
+ **	bfmul	{z0\.h - z1\.h}, {z0\.h - z1\.h}, {z4\.h - z5\.h}
+ **	ret
+ */
+ TEST_XN (mul_z0_z0_z4, svbfloat16x2_t, z0,
+ 	 svmul_bf16_x2 (z0, z4),
+ 	 svmul (z0, z4))
+ 
+ /*
+ ** mul_z0_z4_z0:
+ **	bfmul	{z0\.h - z1\.h}, {z4\.h - z5\.h}, {z0\.h - z1\.h}
+ **	ret
+ */
+ TEST_XN (mul_z0_z4_z0, svbfloat16x2_t, z0,
+ 	 svmul_bf16_x2 (z4, z0),
+ 	 svmul (z4, z0))
+ 
+ /*
+ ** mul_z0_z4_z28:
+ **	bfmul	{z0\.h - z1\.h}, {z4\.h - z5\.h}, {z28\.h - z29\.h}
+ **	ret
+ */
+ TEST_XN (mul_z0_z4_z28, svbfloat16x2_t, z0,
+ 	 svmul_bf16_x2 (z4, z28),
+ 	 svmul (z4, z28))
+ 
+ /*
+ ** mul_z18_z18_z4:
+ **	bfmul	{z18\.h - z19\.h}, {z18\.h - z19\.h}, {z4\.h - z5\.h}
+ **	ret
+ */
+ TEST_XN (mul_z18_z18_z4, svbfloat16x2_t, z18,
+ 	 svmul_bf16_x2 (z18, z4),
+ 	 svmul (z18, z4))
+ 
+ /*
+ ** mul_z23_z23_z18:
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	bfmul	[^\n]+, {z18\.h - z19\.h}
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	ret
+ */
+ TEST_XN (mul_z23_z23_z18, svbfloat16x2_t, z23,
+ 	 svmul_bf16_x2 (z23, z18),
+ 	 svmul (z23, z18))
+ 
+ /*
+ ** mul_z28_z28_z0:
+ **	bfmul	{z28\.h - z29\.h}, {z28\.h - z29\.h}, {z0\.h - z1\.h}
+ **	ret
+ */
+ TEST_XN (mul_z28_z28_z0, svbfloat16x2_t, z28,
+ 	 svmul_bf16_x2 (z28, z0),
+ 	 svmul (z28, z0))
+ 
+ /*
+ ** mul_z0_z0_z18:
+ **	bfmul	{z0\.h - z1\.h}, {z0\.h - z1\.h}, {z18\.h - z19\.h}
+ **	ret
+ */
+ TEST_XN (mul_z0_z0_z18, svbfloat16x2_t, z0,
+ 	 svmul_bf16_x2 (z0, z18),
+ 	 svmul (z0, z18))
+ 
+ /*
+ ** mul_z4_z4_z23:
+ ** (
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	bfmul	{z4\.h - z5\.h}, {z4\.h - z5\.h}, [^\n]+
+ ** |
+ **	bfmul	{z4\.h - z5\.h}, {z4\.h - z5\.h}, [^\n]+
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ ** )
+ **	ret
+ */
+ TEST_XN (mul_z4_z4_z23, svbfloat16x2_t, z4,
+ 	 svmul_bf16_x2 (z4, z23),
+ 	 svmul (z4, z23))
+ 
+ /*
+ ** mul_single_z24_z24_z0:
+ **	bfmul	{z24\.h - z25\.h}, {z24\.h - z25\.h}, z0\.h
+ **	ret
+ */
+ TEST_XN_SINGLE (mul_single_z24_z24_z0, svbfloat16x2_t, svbfloat16_t, z24,
+ 		svmul_single_bf16_x2 (z24, z0),
+ 		svmul (z24, z0))
+ 
+ /*
+ ** mul_single_z24_z28_z0:
+ **	bfmul	{z24\.h - z25\.h}, {z28\.h - z29\.h}, z0\.h
+ **	ret
+ */
+ TEST_XN_SINGLE (mul_single_z24_z28_z0, svbfloat16x2_t, svbfloat16_t, z24,
+ 		svmul_single_bf16_x2 (z28, z0),
+ 		svmul (z28, z0))
+ 
+ /*
+ ** mul_single_z24_z1_z0:
+ ** (
+ **	mov	z30\.d, z1\.d
+ **	mov	z31\.d, z2\.d
+ ** |
+ **	mov	z31\.d, z2\.d
+ **	mov	z30\.d, z1\.d
+ ** )
+ **	bfmul	{z24\.h - z25\.h}, {z30\.h - z31\.h}, z0\.h
+ **	ret
+ */
+ TEST_XN_SINGLE (mul_single_z24_z1_z0, svbfloat16x2_t, svbfloat16_t, z24,
+ 		svmul_single_bf16_x2 (z1, z0),
+ 		svmul (z1, z0))
+ 
+ /*
+ ** mul_single_z1_z24_z0:
+ **	bfmul	{z30\.h - z31\.h}, {z24\.h - z25\.h}, z0\.h
+ ** (
+ **	mov	z2\.d, z31\.d
+ **	mov	z1\.d, z30\.d
+ ** |
+ **	mov	z1\.d, z30\.d
+ **	mov	z2\.d, z31\.d
+ ** )
+ **	ret
+ */
+ TEST_XN_SINGLE (mul_single_z1_z24_z0, svbfloat16x2_t, svbfloat16_t, z1,
+ 		svmul_single_bf16_x2 (z24, z0),
+ 		svmul (z24, z0))
+ 
+ /*
+ ** mul_single_z1_z1_z0:
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	bfmul	({z[0-9]+\.h - z[0-9]+\.h}), \1, z0\.h
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	ret
+ */
+ TEST_XN_SINGLE (mul_single_z1_z1_z0, svbfloat16x2_t, svbfloat16_t, z1,
+ 		svmul_single_bf16_x2 (z1, z0),
+ 		svmul (z1, z0))
+ 
+ /*
+ ** mul_single_z18_z18_z0:
+ **	bfmul	{z18\.h - z19\.h}, {z18\.h - z19\.h}, z0\.h
+ **	ret
+ */
+ TEST_XN_SINGLE (mul_single_z18_z18_z0, svbfloat16x2_t, svbfloat16_t, z18,
+ 		svmul_single_bf16_x2 (z18, z0),
+ 		svmul (z18, z0))
+ 
+ /*
+ ** mul_single_awkward:
+ **	...
+ **	bfmul	{z0\.h - z1\.h}, {z30\.h - z31\.h}, z[0-9]+\.h
+ **	ret
+ */
+ TEST_XN_SINGLE_AWKWARD (mul_single_awkward, svbfloat16x2_t, svbfloat16_t,
+ 			z0_res = svmul_single_bf16_x2 (z1, z0),
+ 			z0_res = svmul (z1, z0))
+ 
+ /*
+ ** mul_single_z0_z0_z15:
+ **	...
+ **	bfmul	{z0\.h - z1\.h}, {z0\.h - z1\.h}, z15\.h
+ **	...
+ **	ret
+ */
+ TEST_XN_SINGLE_Z15 (mul_single_z0_z0_z15, svbfloat16x2_t, svbfloat16_t,
+ 		    z0 = svmul_single_bf16_x2 (z0, z15),
+ 		    z0 = svmul (z0, z15))
+ 
+ /*
+ ** mul_single_z24_z24_z16:
+ **	mov	(z[0-7])\.d, z16\.d
+ **	bfmul	{z24\.h - z25\.h}, {z24\.h - z25\.h}, \1\.h
+ **	ret
+ */
+ TEST_XN_SINGLE (mul_single_z24_z24_z16, svbfloat16x2_t, svbfloat16_t, z24,
+ 		svmul_single_bf16_x2 (z24, z16),
+ 		svmul (z24, z16))
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mul_bf16_x4.c gcc-16-20260201/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mul_bf16_x4.c
*** gcc-16-20260125/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mul_bf16_x4.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mul_bf16_x4.c	Sun Feb  1 22:32:12 2026
***************
*** 0 ****
--- 1,227 ----
+ /* { dg-do assemble { target aarch64_asm_sve-bfscale_ok } } */
+ /* { dg-do compile { target { ! aarch64_asm_sve-bfscale_ok } } } */
+ /* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+ 
+ #include "test_sme2_acle.h"
+ #pragma GCC target "+sve-bfscale"
+ 
+ /*
+ ** mul_z0_z0_z4:
+ **	bfmul	{z0\.h - z3\.h}, {z0\.h - z3\.h}, {z4\.h - z7\.h}
+ **	ret
+ */
+ TEST_XN (mul_z0_z0_z4, svbfloat16x4_t, z0,
+ 	 svmul_bf16_x4 (z0, z4),
+ 	 svmul (z0, z4))
+ 
+ /*
+ ** mul_z0_z4_z0:
+ **	bfmul	{z0\.h - z3\.h}, {z4\.h - z7\.h}, {z0\.h - z3\.h}
+ **	ret
+ */
+ TEST_XN (mul_z0_z4_z0, svbfloat16x4_t, z0,
+ 	 svmul_bf16_x4 (z4, z0),
+ 	 svmul (z4, z0))
+ 
+ /*
+ ** mul_z0_z4_z28:
+ **	bfmul	{z0\.h - z3\.h}, {z4\.h - z7\.h}, {z28\.h - z31\.h}
+ **	ret
+ */
+ TEST_XN (mul_z0_z4_z28, svbfloat16x4_t, z0,
+ 	 svmul_bf16_x4 (z4, z28),
+ 	 svmul (z4, z28))
+ 
+ /*
+ ** mul_z18_z18_z4:
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	bfmul	[^\n]+, {z4\.h - z7\.h}
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	ret
+ */
+ TEST_XN (mul_z18_z18_z4, svbfloat16x4_t, z18,
+ 	 svmul_bf16_x4 (z18, z4),
+ 	 svmul (z18, z4))
+ 
+ /*
+ ** mul_z23_z23_z28:
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	bfmul	[^\n]+, {z28\.h - z31\.h}
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	ret
+ */
+ TEST_XN (mul_z23_z23_z28, svbfloat16x4_t, z23,
+ 	 svmul_bf16_x4 (z23, z28),
+ 	 svmul (z23, z28))
+ 
+ /*
+ ** mul_z28_z28_z0:
+ **	bfmul	{z28\.h - z31\.h}, {z28\.h - z31\.h}, {z0\.h - z3\.h}
+ **	ret
+ */
+ TEST_XN (mul_z28_z28_z0, svbfloat16x4_t, z28,
+ 	 svmul_bf16_x4 (z28, z0),
+ 	 svmul (z28, z0))
+ 
+ /*
+ ** mul_z0_z0_z18:
+ ** (
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	bfmul	{z0\.h - z3\.h}, {z0\.h - z3\.h}, [^\n]+
+ ** |
+ **	bfmul	{z0\.h - z3\.h}, {z0\.h - z3\.h}, [^\n]+
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ ** )
+ **	ret
+ */
+ TEST_XN (mul_z0_z0_z18, svbfloat16x4_t, z0,
+ 	 svmul_bf16_x4 (z0, z18),
+ 	 svmul (z0, z18))
+ 
+ /*
+ ** mul_z4_z4_z23:
+ ** (
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	bfmul	{z4\.h - z7\.h}, {z4\.h - z7\.h}, [^\n]+
+ ** |
+ **	bfmul	{z4\.h - z7\.h}, {z4\.h - z7\.h}, [^\n]+
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ ** )
+ **	ret
+ */
+ TEST_XN (mul_z4_z4_z23, svbfloat16x4_t, z4,
+ 	 svmul_bf16_x4 (z4, z23),
+ 	 svmul (z4, z23))
+ 
+ /*
+ ** mul_single_z24_z24_z0:
+ **	bfmul	{z24\.h - z27\.h}, {z24\.h - z27\.h}, z0\.h
+ **	ret
+ */
+ TEST_XN_SINGLE (mul_single_z24_z24_z0, svbfloat16x4_t, svbfloat16_t, z24,
+ 		svmul_single_bf16_x4 (z24, z0),
+ 		svmul (z24, z0))
+ 
+ /*
+ ** mul_single_z24_z28_z0:
+ **	bfmul	{z24\.h - z27\.h}, {z28\.h - z31\.h}, z0\.h
+ **	ret
+ */
+ TEST_XN_SINGLE (mul_single_z24_z28_z0, svbfloat16x4_t, svbfloat16_t, z24,
+ 		svmul_single_bf16_x4 (z28, z0),
+ 		svmul (z28, z0))
+ 
+ /*
+ ** mul_single_z24_z1_z0:
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	bfmul	{z24\.h - z27\.h}, {z28\.h - z31\.h}, z0\.h
+ **	ret
+ */
+ TEST_XN_SINGLE (mul_single_z24_z1_z0, svbfloat16x4_t, svbfloat16_t, z24,
+ 		svmul_single_bf16_x4 (z1, z0),
+ 		svmul (z1, z0))
+ 
+ /*
+ ** mul_single_z1_z24_z0:
+ **	bfmul	{z28\.h - z31\.h}, {z24\.h - z27\.h}, z0\.h
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	ret
+ */
+ TEST_XN_SINGLE (mul_single_z1_z24_z0, svbfloat16x4_t, svbfloat16_t, z1,
+ 		svmul_single_bf16_x4 (z24, z0),
+ 		svmul (z24, z0))
+ 
+ /*
+ ** mul_single_z1_z1_z0:
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	bfmul	({z[0-9]+\.h - z[0-9]+\.h}), \1, z0\.h
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	ret
+ */
+ TEST_XN_SINGLE (mul_single_z1_z1_z0, svbfloat16x4_t, svbfloat16_t, z1,
+ 		svmul_single_bf16_x4 (z1, z0),
+ 		svmul (z1, z0))
+ 
+ /*
+ ** mul_single_z18_z18_z0:
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	bfmul	[^\n]+, z0\.h
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	ret
+ */
+ TEST_XN_SINGLE (mul_single_z18_z18_z0, svbfloat16x4_t, svbfloat16_t, z18,
+ 		svmul_single_bf16_x4 (z18, z0),
+ 		svmul (z18, z0))
+ 
+ /*
+ ** mul_single_awkward:
+ **	...
+ **	bfmul	{z0\.h - z3\.h}, {z[0-9]+\.h - z[0-9]+\.h}, z[0-9]+\.h
+ **	ret
+ */
+ TEST_XN_SINGLE_AWKWARD (mul_single_awkward, svbfloat16x4_t, svbfloat16_t,
+ 			z0_res = svmul_single_bf16_x4 (z1, z0),
+ 			z0_res = svmul (z1, z0))
+ 
+ /*
+ ** mul_single_z0_z0_z15:
+ **	...
+ **	bfmul	{z0\.h - z3\.h}, {z0\.h - z3\.h}, z15\.h
+ **	...
+ **	ret
+ */
+ TEST_XN_SINGLE_Z15 (mul_single_z0_z0_z15, svbfloat16x4_t, svbfloat16_t,
+ 		    z0 = svmul_single_bf16_x4 (z0, z15),
+ 		    z0 = svmul (z0, z15))
+ 
+ /*
+ ** mul_single_z24_z24_z16:
+ **	mov	(z[0-7])\.d, z16\.d
+ **	bfmul	{z24\.h - z27\.h}, {z24\.h - z27\.h}, \1\.h
+ **	ret
+ */
+ TEST_XN_SINGLE (mul_single_z24_z24_z16, svbfloat16x4_t, svbfloat16_t, z24,
+ 		svmul_single_bf16_x4 (z24, z16),
+ 		svmul (z24, z16))
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/scale_bf16_x2.c gcc-16-20260201/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/scale_bf16_x2.c
*** gcc-16-20260125/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/scale_bf16_x2.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/scale_bf16_x2.c	Sun Feb  1 22:32:12 2026
***************
*** 0 ****
--- 1,194 ----
+ /* { dg-do assemble { target aarch64_asm_sve-bfscale_ok } } */
+ /* { dg-do compile { target { ! aarch64_asm_sve-bfscale_ok } } } */
+ /* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+ 
+ #include "test_sme2_acle.h"
+ #pragma GCC target "+sve-bfscale"
+ 
+ /*
+ ** bfscale_z0_z0_z4:
+ **	bfscale	{z0\.h - z1\.h}, {z0\.h - z1\.h}, {z4\.h - z5\.h}
+ **	ret
+ */
+ TEST_DUAL_XN (bfscale_z0_z0_z4, svbfloat16x2_t, svint16x2_t, z0,
+ 	 svscale_bf16_x2 (z0, z4),
+ 	 svscale (z0, z4))
+ 
+ /*
+ ** bfscale_z4_z4_z0:
+ **	bfscale	{z4\.h - z5\.h}, {z4\.h - z5\.h}, {z0\.h - z1\.h}
+ **	ret
+ */
+ TEST_DUAL_XN (bfscale_z4_z4_z0, svint16x2_t, svbfloat16x2_t, z4,
+ 	 svscale_bf16_x2 (z4, z0),
+ 	 svscale (z4, z0))
+ 
+ /*
+ ** bfscale_z18_z18_z4:
+ **	bfscale	{z18\.h - z19\.h}, {z18\.h - z19\.h}, {z4\.h - z5\.h}
+ **	ret
+ */
+ TEST_DUAL_XN (bfscale_z18_z18_z4, svbfloat16x2_t, svint16x2_t, z18,
+ 	 svscale_bf16_x2 (z18, z4),
+ 	 svscale (z18, z4))
+ 
+ /*
+ ** bfscale_z23_z23_z18:
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	bfscale	[^\n]+, {z18\.h - z19\.h}
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	ret
+ */
+ TEST_DUAL_XN (bfscale_z23_z23_z18, svint16x2_t, svbfloat16x2_t, z23,
+ 	 svscale_bf16_x2 (z23, z18),
+ 	 svscale (z23, z18))
+ 
+ 
+ /*
+ ** bfscale_z28_z28_z4:
+ **	bfscale	{z28\.h - z29\.h}, {z28\.h - z29\.h}, {z4\.h - z5\.h}
+ **	ret
+ */
+ TEST_DUAL_XN (bfscale_z28_z28_z4, svbfloat16x2_t, svint16x2_t, z28,
+ 	 svscale_bf16_x2 (z28, z4),
+ 	 svscale (z28, z4))
+ 
+ /*
+ ** bfscale_z4_z4_z18:
+ **	bfscale	{z4\.h - z5\.h}, {z4\.h - z5\.h}, {z18\.h - z19\.h}
+ **	ret
+ */
+ TEST_DUAL_XN (bfscale_z4_z4_z18, svint16x2_t, svbfloat16x2_t, z4,
+ 	 svscale_bf16_x2 (z4, z18),
+ 	 svscale (z4, z18))
+ 
+ /*
+ ** bfscale_z28_28_z23:
+ ** (
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	bfscale	{z28\.h - z29\.h}, {z28\.h - z29\.h}, [^\n]+
+ ** |
+ **	bfscale	{z28\.h - z29\.h}, {z28\.h - z29\.h}, [^\n]+
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ ** )
+ **	ret
+ */
+ TEST_DUAL_XN (bfscale_z28_28_z23, svbfloat16x2_t, svint16x2_t, z28,
+ 	 svscale_bf16_x2 (z28, z23),
+ 	 svscale (z28, z23))
+ 
+ /*
+ ** bfscale_single_z24_z24_z0:
+ **	bfscale	{z24\.h - z25\.h}, {z24\.h - z25\.h}, z0\.h
+ **	ret
+ */
+ TEST_XN_SINGLE (bfscale_single_z24_z24_z0, svbfloat16x2_t, svint16_t, z24,
+ 		svscale_single_bf16_x2 (z24, z0),
+ 		svscale (z24, z0))
+ 
+ /*
+ ** bfscale_single_z24_z28_z0:
+ ** (
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	bfscale	{z24\.h - z25\.h}, {z24\.h - z25\.h}, z0\.h
+ ** |
+ **	bfscale	{z28\.h - z29\.h}, {z28\.h - z29\.h}, z0\.h
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ ** )
+ **	ret
+ */
+ TEST_XN_SINGLE (bfscale_single_z24_z28_z0, svbfloat16x2_t, svint16_t, z24,
+ 		svscale_single_bf16_x2 (z28, z0),
+ 		svscale (z28, z0))
+ 
+ /*
+ ** bfscale_single_z24_z1_z0:
+ ** (
+ **	mov	z24\.d, z1\.d
+ **	mov	z25\.d, z2\.d
+ ** |
+ **	mov	z25\.d, z2\.d
+ **	mov	z24\.d, z1\.d
+ ** )
+ **	bfscale	{z24\.h - z25\.h}, {z24\.h - z25\.h}, z0\.h
+ **	ret
+ */
+ TEST_XN_SINGLE (bfscale_single_z24_z1_z0, svbfloat16x2_t, svint16_t, z24,
+ 		svscale_single_bf16_x2 (z1, z0),
+ 		svscale (z1, z0))
+ 
+ /*
+ ** bfscale_single_z1_z24_z0:
+ **	bfscale	{z24\.h - z25\.h}, {z24\.h - z25\.h}, z0\.h
+ ** (
+ **	mov	z1\.d, z24\.d
+ **	mov	z2\.d, z25\.d
+ ** |
+ **	mov	z2\.d, z25\.d
+ **	mov	z1\.d, z24\.d
+ ** )
+ **	ret
+ */
+ TEST_XN_SINGLE (bfscale_single_z1_z24_z0, svbfloat16x2_t, svint16_t, z1,
+ 		svscale_single_bf16_x2 (z24, z0),
+ 		svscale (z24, z0))
+ 
+ /*
+ ** bfscale_single_z1_z1_z0:
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	bfscale	({z[0-9]+\.h - z[0-9]+\.h}), \1, z0\.h
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	ret
+ */
+ TEST_XN_SINGLE (bfscale_single_z1_z1_z0, svbfloat16x2_t, svint16_t, z1,
+ 		svscale_single_bf16_x2 (z1, z0),
+ 		svscale (z1, z0))
+ 
+ /*
+ ** bfscale_single_z18_z18_z0:
+ **	bfscale	{z18\.h - z19\.h}, {z18\.h - z19\.h}, z0\.h
+ **	ret
+ */
+ TEST_XN_SINGLE (bfscale_single_z18_z18_z0, svbfloat16x2_t, svint16_t, z18,
+ 		svscale_single_bf16_x2 (z18, z0),
+ 		svscale (z18, z0))
+ 
+ /*
+ ** bfscale_single_awkward:
+ **	...
+ **	bfscale	({z[0-9]+\.h - z[0-9]+\.h}), \1, z[0-9]+\.h
+ **	...
+ **	ret
+ */
+ TEST_XN_SINGLE_AWKWARD (bfscale_single_awkward, svbfloat16x2_t, svint16_t,
+ 			z0_res = svscale_single_bf16_x2 (z1, z0),
+ 			z0_res = svscale (z1, z0))
+ 
+ /*
+ ** bfscale_single_z0_z0_z15:
+ **	...
+ **	bfscale	{z0\.h - z1\.h}, {z0\.h - z1\.h}, z15\.h
+ **	...
+ **	ret
+ */
+ TEST_XN_SINGLE_Z15 (bfscale_single_z0_z0_z15, svbfloat16x2_t, svint16_t,
+ 		    z0 = svscale_single_bf16_x2 (z0, z15),
+ 		    z0 = svscale (z0, z15))
+ 
+ /*
+ ** bfscale_single_z24_z24_z16:
+ **	mov	(z[0-7])\.d, z16\.d
+ **	bfscale	{z24\.h - z25\.h}, {z24\.h - z25\.h}, \1\.h
+ **	ret
+ */
+ TEST_XN_SINGLE (bfscale_single_z24_z24_z16, svbfloat16x2_t, svint16_t, z24,
+ 		svscale_single_bf16_x2 (z24, z16),
+ 		svscale (z24, z16))
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/scale_bf16_x4.c gcc-16-20260201/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/scale_bf16_x4.c
*** gcc-16-20260125/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/scale_bf16_x4.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/scale_bf16_x4.c	Sun Feb  1 22:32:12 2026
***************
*** 0 ****
--- 1,231 ----
+ /* { dg-do assemble { target aarch64_asm_sve-bfscale_ok } } */
+ /* { dg-do compile { target { ! aarch64_asm_sve-bfscale_ok } } } */
+ /* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+ 
+ #include "test_sme2_acle.h"
+ #pragma GCC target "+sve-bfscale"
+ 
+ /*
+ ** bfscale_z0_z0_z4:
+ **	bfscale	{z0\.h - z3\.h}, {z0\.h - z3\.h}, {z4\.h - z7\.h}
+ **	ret
+ */
+ TEST_DUAL_XN (bfscale_z0_z0_z4, svbfloat16x4_t, svint16x4_t, z0,
+ 	      svscale_bf16_x4 (z0, z4),
+ 	      svscale (z0, z4))
+ 
+ /*
+ ** bfscale_z4_z4_z0:
+ **	bfscale	{z4\.h - z7\.h}, {z4\.h - z7\.h}, {z0\.h - z3\.h}
+ **	ret
+ */
+ TEST_DUAL_XN (bfscale_z4_z4_z0, svint16x4_t, svbfloat16x4_t, z4,
+ 	      svscale_bf16_x4 (z4, z0),
+ 	      svscale (z4, z0))
+ 
+ /*
+ ** bfscale_z18_z18_z4:
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	bfscale	[^\n]+, {z4\.h - z7\.h}
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	ret
+ */
+ TEST_DUAL_XN (bfscale_z18_z18_z4, svbfloat16x4_t, svint16x4_t, z18,
+ 	      svscale_bf16_x4 (z18, z4),
+ 	      svscale (z18, z4))
+ 
+ /*
+ ** bfscale_z23_z23_z28:
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	bfscale	[^\n]+, {z28\.h - z31\.h}
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	ret
+ */
+ TEST_DUAL_XN (bfscale_z23_z23_z28, svint16x4_t, svbfloat16x4_t, z23,
+ 	      svscale_bf16_x4 (z23, z28),
+ 	      svscale (z23, z28))
+ 
+ /*
+ ** bfscale_z28_z28_z4:
+ **	bfscale	{z28\.h - z31\.h}, {z28\.h - z31\.h}, {z4\.h - z7\.h}
+ **	ret
+ */
+ TEST_DUAL_XN (bfscale_z28_z28_z4, svbfloat16x4_t, svint16x4_t, z28,
+ 	      svscale_bf16_x4 (z28, z4),
+ 	      svscale (z28, z4))
+ 
+ /*
+ ** bfscale_z4_z4_z18:
+ ** (
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	bfscale	{z4\.h - z7\.h}, {z4\.h - z7\.h}, [^\n]+
+ ** |
+ **	bfscale	{z4\.h - z7\.h}, {z4\.h - z7\.h}, [^\n]+
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ ** )
+ **	ret
+ */
+ TEST_DUAL_XN (bfscale_z4_z4_z18, svint16x4_t, svbfloat16x4_t, z4,
+ 	      svscale_bf16_x4 (z4, z18),
+ 	      svscale (z4, z18))
+ 
+ /*
+ ** bfscale_z0_z0_z23:
+ ** (
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	bfscale	{z0\.h - z3\.h}, {z0\.h - z3\.h}, [^\n]+
+ ** |
+ **	bfscale	{z0\.h - z3\.h}, {z0\.h - z3\.h}, [^\n]+
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ ** )
+ **	ret
+ */
+ TEST_DUAL_XN (bfscale_z0_z0_z23, svbfloat16x4_t, svint16x4_t, z0,
+ 	      svscale_bf16_x4 (z0, z23),
+ 	      svscale (z0, z23))
+ 
+ /*
+ ** bfscale_single_z24_z24_z0:
+ **	bfscale	{z24\.h - z27\.h}, {z24\.h - z27\.h}, z0\.h
+ **	ret
+ */
+ TEST_XN_SINGLE (bfscale_single_z24_z24_z0, svbfloat16x4_t, svint16_t, z24,
+ 		svscale_single_bf16_x4 (z24, z0),
+ 		svscale (z24, z0))
+ 
+ /*
+ ** bfscale_single_z24_z28_z0:
+ ** (
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	bfscale	{z24\.h - z27\.h}, {z24\.h - z27\.h}, z0\.h
+ ** |
+ **	bfscale	{z28\.h - z31\.h}, {z28\.h - z31\.h}, z0\.h
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ ** )
+ **	ret
+ */
+ TEST_XN_SINGLE (bfscale_single_z24_z28_z0, svbfloat16x4_t, svint16_t, z24,
+ 		svscale_single_bf16_x4 (z28, z0),
+ 		svscale (z28, z0))
+ 
+ /*
+ ** bfscale_single_z24_z1_z0:
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	bfscale	{z24\.h - z27\.h}, {z24\.h - z27\.h}, z0\.h
+ **	ret
+ */
+ TEST_XN_SINGLE (bfscale_single_z24_z1_z0, svbfloat16x4_t, svint16_t, z24,
+ 		svscale_single_bf16_x4 (z1, z0),
+ 		svscale (z1, z0))
+ 
+ /*
+ ** bfscale_single_z1_z24_z0:
+ **	bfscale	{z24\.h - z27\.h}, {z24\.h - z27\.h}, z0\.h
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	ret
+ */
+ TEST_XN_SINGLE (bfscale_single_z1_z24_z0, svbfloat16x4_t, svint16_t, z1,
+ 		svscale_single_bf16_x4 (z24, z0),
+ 		svscale (z24, z0))
+ 
+ /*
+ ** bfscale_single_z1_z1_z0:
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	bfscale	({z[0-9]+\.h - z[0-9]+\.h}), \1, z0\.h
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	ret
+ */
+ TEST_XN_SINGLE (bfscale_single_z1_z1_z0, svbfloat16x4_t, svint16_t, z1,
+ 		svscale_single_bf16_x4 (z1, z0),
+ 		svscale (z1, z0))
+ 
+ /*
+ ** bfscale_single_z18_z18_z0:
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	bfscale	[^\n]+, z0\.h
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	mov	[^\n]+
+ **	ret
+ */
+ TEST_XN_SINGLE (bfscale_single_z18_z18_z0, svbfloat16x4_t, svint16_t, z18,
+ 		svscale_single_bf16_x4 (z18, z0),
+ 		svscale (z18, z0))
+ 
+ /*
+ ** bfscale_single_awkward:
+ **	...
+ **	bfscale	({z[0-9]+\.h - z[0-9]+\.h}), \1, z[0-9]+\.h
+ **	...
+ **	ret
+ */
+ TEST_XN_SINGLE_AWKWARD (bfscale_single_awkward, svbfloat16x4_t, svint16_t,
+ 			z0_res = svscale_single_bf16_x4 (z1, z0),
+ 			z0_res = svscale (z1, z0))
+ 
+ /*
+ ** bfscale_single_z0_z0_z15:
+ **	...
+ **	bfscale	{z0\.h - z3\.h}, {z0\.h - z3\.h}, z15\.h
+ **	...
+ **	ret
+ */
+ TEST_XN_SINGLE_Z15 (bfscale_single_z0_z0_z15, svbfloat16x4_t, svint16_t,
+ 		    z0 = svscale_single_bf16_x4 (z0, z15),
+ 		    z0 = svscale (z0, z15))
+ 
+ /*
+ ** bfscale_single_z24_z24_z16:
+ **	mov	(z[0-7])\.d, z16\.d
+ **	bfscale	{z24\.h - z27\.h}, {z24\.h - z27\.h}, \1\.h
+ **	ret
+ */
+ TEST_XN_SINGLE (bfscale_single_z24_z24_z16, svbfloat16x4_t, svint16_t, z24,
+ 		svscale_single_bf16_x4 (z24, z16),
+ 		svscale (z24, z16))
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/scale_bf16.c gcc-16-20260201/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/scale_bf16.c
*** gcc-16-20260125/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/scale_bf16.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/scale_bf16.c	Sun Feb  1 22:32:12 2026
***************
*** 0 ****
--- 1,337 ----
+ /* { dg-do assemble { target aarch64_asm_sve-bfscale_ok } } */
+ /* { dg-do compile { target { ! aarch64_asm_sve-bfscale_ok } } } */
+ /* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+ 
+ #include "test_sve_acle.h"
+ #pragma GCC target "+sve2,+sve-bfscale"
+ #ifdef STREAMING_COMPATIBLE
+ #pragma GCC target "+sme2"
+ #endif
+ 
+ /*
+ ** scale_bf16_m_tied1:
+ **	bfscale	z0\.h, p0/m, z0\.h, z4\.h
+ **	ret
+ */
+ TEST_DUAL_Z (scale_bf16_m_tied1, svbfloat16_t, svint16_t,
+ 	     z0 = svscale_bf16_m (p0, z0, z4),
+ 	     z0 = svscale_m (p0, z0, z4))
+ 
+ /*
+ ** scale_bf16_m_tied2:
+ **	mov	(z[0-9]+)\.d, z0\.d
+ **	movprfx	z0, z4
+ **	bfscale	z0\.h, p0/m, z0\.h, \1\.h
+ **	ret
+ */
+ TEST_DUAL_Z_REV (scale_bf16_m_tied2, svbfloat16_t, svint16_t,
+ 		 z0_res = svscale_bf16_m (p0, z4, z0),
+ 		 z0_res = svscale_m (p0, z4, z0))
+ 
+ /*
+ ** scale_bf16_m_untied:
+ **	movprfx	z0, z1
+ **	bfscale	z0\.h, p0/m, z0\.h, z4\.h
+ **	ret
+ */
+ TEST_DUAL_Z (scale_bf16_m_untied, svbfloat16_t, svint16_t,
+ 	     z0 = svscale_bf16_m (p0, z1, z4),
+ 	     z0 = svscale_m (p0, z1, z4))
+ 
+ /*
+ ** scale_w0_bf16_m_tied1:
+ **	mov	(z[0-9]+\.h), w0
+ **	bfscale	z0\.h, p0/m, z0\.h, \1
+ **	ret
+ */
+ TEST_UNIFORM_ZX (scale_w0_bf16_m_tied1, svbfloat16_t, int16_t,
+ 		 z0 = svscale_n_bf16_m (p0, z0, x0),
+ 		 z0 = svscale_m (p0, z0, x0))
+ 
+ /*
+ ** scale_w0_bf16_m_untied:
+ **	mov	(z[0-9]+\.h), w0
+ **	movprfx	z0, z1
+ **	bfscale	z0\.h, p0/m, z0\.h, \1
+ **	ret
+ */
+ TEST_UNIFORM_ZX (scale_w0_bf16_m_untied, svbfloat16_t, int16_t,
+ 		 z0 = svscale_n_bf16_m (p0, z1, x0),
+ 		 z0 = svscale_m (p0, z1, x0))
+ 
+ /*
+ ** scale_3_bf16_m_tied1:
+ **	mov	(z[0-9]+\.h), #3
+ **	bfscale	z0\.h, p0/m, z0\.h, \1
+ **	ret
+ */
+ TEST_UNIFORM_Z (scale_3_bf16_m_tied1, svbfloat16_t,
+ 		z0 = svscale_n_bf16_m (p0, z0, 3),
+ 		z0 = svscale_m (p0, z0, 3))
+ 
+ /*
+ ** scale_3_bf16_m_untied:
+ **	mov	(z[0-9]+\.h), #3
+ **	movprfx	z0, z1
+ **	bfscale	z0\.h, p0/m, z0\.h, \1
+ **	ret
+ */
+ TEST_UNIFORM_Z (scale_3_bf16_m_untied, svbfloat16_t,
+ 		z0 = svscale_n_bf16_m (p0, z1, 3),
+ 		z0 = svscale_m (p0, z1, 3))
+ 
+ /*
+ ** scale_m3_bf16_m:
+ **	mov	(z[0-9]+\.h), #-3
+ **	bfscale	z0\.h, p0/m, z0\.h, \1
+ **	ret
+ */
+ TEST_UNIFORM_Z (scale_m3_bf16_m, svbfloat16_t,
+ 		z0 = svscale_n_bf16_m (p0, z0, -3),
+ 		z0 = svscale_m (p0, z0, -3))
+ 
+ /*
+ ** scale_bf16_z_tied1:
+ **	movprfx	z0\.h, p0/z, z0\.h
+ **	bfscale	z0\.h, p0/m, z0\.h, z4\.h
+ **	ret
+ */
+ TEST_DUAL_Z (scale_bf16_z_tied1, svbfloat16_t, svint16_t,
+ 	     z0 = svscale_bf16_z (p0, z0, z4),
+ 	     z0 = svscale_z (p0, z0, z4))
+ 
+ /*
+ ** scale_bf16_z_tied2:
+ **	mov	(z[0-9]+)\.d, z0\.d
+ **	movprfx	z0\.h, p0/z, z4\.h
+ **	bfscale	z0\.h, p0/m, z0\.h, \1\.h
+ **	ret
+ */
+ TEST_DUAL_Z_REV (scale_bf16_z_tied2, svbfloat16_t, svint16_t,
+ 		 z0_res = svscale_bf16_z (p0, z4, z0),
+ 		 z0_res = svscale_z (p0, z4, z0))
+ 
+ /*
+ ** scale_bf16_z_untied:
+ **	movprfx	z0\.h, p0/z, z1\.h
+ **	bfscale	z0\.h, p0/m, z0\.h, z4\.h
+ **	ret
+ */
+ TEST_DUAL_Z (scale_bf16_z_untied, svbfloat16_t, svint16_t,
+ 	     z0 = svscale_bf16_z (p0, z1, z4),
+ 	     z0 = svscale_z (p0, z1, z4))
+ 
+ /*
+ ** scale_w0_bf16_z_tied1:
+ **	mov	(z[0-9]+\.h), w0
+ **	movprfx	z0\.h, p0/z, z0\.h
+ **	bfscale	z0\.h, p0/m, z0\.h, \1
+ **	ret
+ */
+ TEST_UNIFORM_ZX (scale_w0_bf16_z_tied1, svbfloat16_t, int16_t,
+ 		 z0 = svscale_n_bf16_z (p0, z0, x0),
+ 		 z0 = svscale_z (p0, z0, x0))
+ 
+ /*
+ ** scale_w0_bf16_z_untied:
+ **	mov	(z[0-9]+\.h), w0
+ **	movprfx	z0\.h, p0/z, z1\.h
+ **	bfscale	z0\.h, p0/m, z0\.h, \1
+ **	ret
+ */
+ TEST_UNIFORM_ZX (scale_w0_bf16_z_untied, svbfloat16_t, int16_t,
+ 		 z0 = svscale_n_bf16_z (p0, z1, x0),
+ 		 z0 = svscale_z (p0, z1, x0))
+ 
+ /*
+ ** scale_3_bf16_z_tied1:
+ **	mov	(z[0-9]+\.h), #3
+ **	movprfx	z0\.h, p0/z, z0\.h
+ **	bfscale	z0\.h, p0/m, z0\.h, \1
+ **	ret
+ */
+ TEST_UNIFORM_Z (scale_3_bf16_z_tied1, svbfloat16_t,
+ 		z0 = svscale_n_bf16_z (p0, z0, 3),
+ 		z0 = svscale_z (p0, z0, 3))
+ 
+ /*
+ ** scale_3_bf16_z_untied:
+ **	mov	(z[0-9]+\.h), #3
+ **	movprfx	z0\.h, p0/z, z1\.h
+ **	bfscale	z0\.h, p0/m, z0\.h, \1
+ **	ret
+ */
+ TEST_UNIFORM_Z (scale_3_bf16_z_untied, svbfloat16_t,
+ 		z0 = svscale_n_bf16_z (p0, z1, 3),
+ 		z0 = svscale_z (p0, z1, 3))
+ 
+ /*
+ ** scale_m3_bf16_z:
+ **	mov	(z[0-9]+\.h), #-3
+ **	movprfx	z0\.h, p0/z, z0\.h
+ **	bfscale	z0\.h, p0/m, z0\.h, \1
+ **	ret
+ */
+ TEST_UNIFORM_Z (scale_m3_bf16_z, svbfloat16_t,
+ 		z0 = svscale_n_bf16_z (p0, z0, -3),
+ 		z0 = svscale_z (p0, z0, -3))
+ 
+ /*
+ ** scale_bf16_x_tied1:
+ **	bfscale	z0\.h, p0/m, z0\.h, z4\.h
+ **	ret
+ */
+ TEST_DUAL_Z (scale_bf16_x_tied1, svbfloat16_t, svint16_t,
+ 	     z0 = svscale_bf16_x (p0, z0, z4),
+ 	     z0 = svscale_x (p0, z0, z4))
+ 
+ /*
+ ** scale_bf16_x_tied2:
+ **	mov	(z[0-9]+)\.d, z0\.d
+ **	movprfx	z0, z4
+ **	bfscale	z0\.h, p0/m, z0\.h, \1\.h
+ **	ret
+ */
+ TEST_DUAL_Z_REV (scale_bf16_x_tied2, svbfloat16_t, svint16_t,
+ 		 z0_res = svscale_bf16_x (p0, z4, z0),
+ 		 z0_res = svscale_x (p0, z4, z0))
+ 
+ /*
+ ** scale_bf16_x_untied:
+ **	movprfx	z0, z1
+ **	bfscale	z0\.h, p0/m, z0\.h, z4\.h
+ **	ret
+ */
+ TEST_DUAL_Z (scale_bf16_x_untied, svbfloat16_t, svint16_t,
+ 	     z0 = svscale_bf16_x (p0, z1, z4),
+ 	     z0 = svscale_x (p0, z1, z4))
+ 
+ /*
+ ** scale_w0_bf16_x_tied1:
+ **	mov	(z[0-9]+\.h), w0
+ **	bfscale	z0\.h, p0/m, z0\.h, \1
+ **	ret
+ */
+ TEST_UNIFORM_ZX (scale_w0_bf16_x_tied1, svbfloat16_t, int16_t,
+ 		 z0 = svscale_n_bf16_x (p0, z0, x0),
+ 		 z0 = svscale_x (p0, z0, x0))
+ 
+ /*
+ ** scale_w0_bf16_x_untied:
+ **	mov	(z[0-9]+\.h), w0
+ **	movprfx	z0, z1
+ **	bfscale	z0\.h, p0/m, z0\.h, \1
+ **	ret
+ */
+ TEST_UNIFORM_ZX (scale_w0_bf16_x_untied, svbfloat16_t, int16_t,
+ 		 z0 = svscale_n_bf16_x (p0, z1, x0),
+ 		 z0 = svscale_x (p0, z1, x0))
+ 
+ /*
+ ** scale_3_bf16_x_tied1:
+ **	mov	(z[0-9]+\.h), #3
+ **	bfscale	z0\.h, p0/m, z0\.h, \1
+ **	ret
+ */
+ TEST_UNIFORM_Z (scale_3_bf16_x_tied1, svbfloat16_t,
+ 		z0 = svscale_n_bf16_x (p0, z0, 3),
+ 		z0 = svscale_x (p0, z0, 3))
+ 
+ /*
+ ** scale_3_bf16_x_untied:
+ **	mov	(z[0-9]+\.h), #3
+ **	movprfx	z0, z1
+ **	bfscale	z0\.h, p0/m, z0\.h, \1
+ **	ret
+ */
+ TEST_UNIFORM_Z (scale_3_bf16_x_untied, svbfloat16_t,
+ 		z0 = svscale_n_bf16_x (p0, z1, 3),
+ 		z0 = svscale_x (p0, z1, 3))
+ 
+ /*
+ ** scale_m3_bf16_x:
+ **	mov	(z[0-9]+\.h), #-3
+ **	bfscale	z0\.h, p0/m, z0\.h, \1
+ **	ret
+ */
+ TEST_UNIFORM_Z (scale_m3_bf16_x, svbfloat16_t,
+ 		z0 = svscale_n_bf16_x (p0, z0, -3),
+ 		z0 = svscale_x (p0, z0, -3))
+ 
+ /*
+ ** ptrue_scale_bf16_x_tied1:
+ **	...
+ **	ptrue	p[0-9]+\.b[^\n]*
+ **	...
+ **	ret
+ */
+ TEST_DUAL_Z (ptrue_scale_bf16_x_tied1, svbfloat16_t, svint16_t,
+ 	     z0 = svscale_bf16_x (svptrue_b16 (), z0, z4),
+ 	     z0 = svscale_x (svptrue_b16 (), z0, z4))
+ 
+ /*
+ ** ptrue_scale_bf16_x_tied2:
+ **	...
+ **	ptrue	p[0-9]+\.b[^\n]*
+ **	...
+ **	ret
+ */
+ TEST_DUAL_Z_REV (ptrue_scale_bf16_x_tied2, svbfloat16_t, svint16_t,
+ 		 z0_res = svscale_bf16_x (svptrue_b16 (), z4, z0),
+ 		 z0_res = svscale_x (svptrue_b16 (), z4, z0))
+ 
+ /*
+ ** ptrue_scale_bf16_x_untied:
+ **	...
+ **	ptrue	p[0-9]+\.b[^\n]*
+ **	...
+ **	ret
+ */
+ TEST_DUAL_Z (ptrue_scale_bf16_x_untied, svbfloat16_t, svint16_t,
+ 	     z0 = svscale_bf16_x (svptrue_b16 (), z1, z4),
+ 	     z0 = svscale_x (svptrue_b16 (), z1, z4))
+ 
+ /*
+ ** ptrue_scale_3_bf16_x_tied1:
+ **	...
+ **	ptrue	p[0-9]+\.b[^\n]*
+ **	...
+ **	ret
+ */
+ TEST_UNIFORM_Z (ptrue_scale_3_bf16_x_tied1, svbfloat16_t,
+ 		z0 = svscale_n_bf16_x (svptrue_b16 (), z0, 3),
+ 		z0 = svscale_x (svptrue_b16 (), z0, 3))
+ 
+ /*
+ ** ptrue_scale_3_bf16_x_untied:
+ **	...
+ **	ptrue	p[0-9]+\.b[^\n]*
+ **	...
+ **	ret
+ */
+ TEST_UNIFORM_Z (ptrue_scale_3_bf16_x_untied, svbfloat16_t,
+ 		z0 = svscale_n_bf16_x (svptrue_b16 (), z1, 3),
+ 		z0 = svscale_x (svptrue_b16 (), z1, 3))
+ 
+ /*
+ ** ptrue_scale_m3_bf16_x_tied1:
+ **	...
+ **	ptrue	p[0-9]+\.b[^\n]*
+ **	...
+ **	ret
+ */
+ TEST_UNIFORM_Z (ptrue_scale_m3_bf16_x_tied1, svbfloat16_t,
+ 		z0 = svscale_n_bf16_x (svptrue_b16 (), z0, -3),
+ 		z0 = svscale_x (svptrue_b16 (), z0, -3))
+ 
+ /*
+ ** ptrue_scale_m3_bf16_x_untied:
+ **	...
+ **	ptrue	p[0-9]+\.b[^\n]*
+ **	...
+ **	ret
+ */
+ TEST_UNIFORM_Z (ptrue_scale_m3_bf16_x_untied, svbfloat16_t,
+ 		z0 = svscale_n_bf16_x (svptrue_b16 (), z1, -3),
+ 		z0 = svscale_x (svptrue_b16 (), z1, -3))
+ 
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/bfscale.c gcc-16-20260201/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/bfscale.c
*** gcc-16-20260125/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/bfscale.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/bfscale.c	Sun Feb  1 22:32:12 2026
***************
*** 0 ****
--- 1,114 ----
+ // { dg-options "-std=c23 -fsyntax-only" }
+ // { dg-do compile }
+ 
+ #pragma GCC target "+sve,+sve2,+sme,+sme2,+sve-bfscale"
+ static_assert (__ARM_FEATURE_SVE2 == 1);
+ static_assert (__ARM_FEATURE_SME2 == 1);
+ static_assert (__ARM_FEATURE_SVE_BFSCALE == 1);
+ #include <arm_sve.h>
+ #include <arm_sme.h>
+ 
+ /*
+ - BFSCALE (predicated)
+   // Only if __ARM_FEATURE_SVE_BFSCALE != 0 && __ARM_FEATURE_SVE2 != 0
+   svbfloat16_t svscale[_bf16]_m (svbool_t pg, svbfloat16_t zdn, svint16_t zm);
+   svbfloat16_t svscale[_bf16]_x (svbool_t pg, svbfloat16_t zdn, svint16_t zm);
+   svbfloat16_t svscale[_bf16]_z (svbool_t pg, svbfloat16_t zdn, svint16_t zm);
+   svbfloat16_t svscale[_n_bf16]_m (svbool_t pg, svbfloat16_t zdn, int16_t zm);
+   svbfloat16_t svscale[_n_bf16]_x (svbool_t pg, svbfloat16_t zdn, int16_t zm);
+   svbfloat16_t svscale[_n_bf16]_z (svbool_t pg, svbfloat16_t zdn, int16_t zm);  */
+ 
+ void
+ svscale_predicated_explicit_ok (svbool_t p, svbfloat16_t bf16x1,
+ 				svint16_t i16x1, int16_t i16)
+ {
+   bf16x1 = svscale_bf16_m (p, bf16x1, i16x1);
+   bf16x1 = svscale_bf16_x (p, bf16x1, i16x1);
+   bf16x1 = svscale_bf16_z (p, bf16x1, i16x1);
+ 
+   bf16x1 = svscale_n_bf16_m (p, bf16x1, i16);
+   bf16x1 = svscale_n_bf16_x (p, bf16x1, i16);
+   bf16x1 = svscale_n_bf16_z (p, bf16x1, i16);
+ }
+ 
+ void
+ svscale_predicated_inferred_ok (svbool_t p, svbfloat16_t bf16x1,
+ 				svbfloat16x4_t bf16x4, svint16_t i16x1,
+ 				int16_t i16)
+ {
+   bf16x1 = svscale_m (p, bf16x1, i16x1);
+   bf16x1 = svscale_x (p, bf16x1, i16x1);
+   bf16x1 = svscale_z (p, bf16x1, i16x1);
+ 
+   bf16x1 = svscale_m (p, bf16x1, i16);
+   bf16x1 = svscale_x (p, bf16x1, i16);
+   bf16x1 = svscale_z (p, bf16x1, i16);
+ }
+ 
+ /*
+ - BFSCALE (multiple vectors)
+   // Only if __ARM_FEATURE_SVE_BFSCALE != 0 && __ARM_FEATURE_SME2 != 0
+   svbfloat16x2_t svscale[_bf16_x2] (svbfloat16x2_t zdn, svint16x2_t zm) __arm_streaming;
+   svbfloat16x4_t svscale[_bf16_x4] (svbfloat16x4_t zdn, svint16x4_t zm) __arm_streaming;
+ 
+ - BFSCALE (multiple and single vector)
+   // Only if __ARM_FEATURE_SVE_BFSCALE != 0 && __ARM_FEATURE_SME2 != 0
+   svbfloat16x2_t svscale[_single_bf16_x2] (svbfloat16x2_t zn, svint16_t zm) __arm_streaming;
+   svbfloat16x4_t svscale[_single_bf16_x4] (svbfloat16x4_t zn, svint16_t zm) __arm_streaming;  */
+ 
+ void
+ svscale_explicit_ok (svbfloat16_t bf16x1, svbfloat16x2_t bf16x2,
+ 		     svbfloat16x4_t bf16x4, svint16_t i16x1, svint16x2_t i16x2,
+ 		     svint16x4_t i16x4) __arm_streaming
+ {
+   bf16x2 = svscale_bf16_x2 (bf16x2, i16x2);
+   bf16x4 = svscale_bf16_x4 (bf16x4, i16x4);
+ 
+   bf16x2 = svscale_single_bf16_x2 (bf16x2, i16x1);
+   bf16x4 = svscale_single_bf16_x4 (bf16x4, i16x1);
+ }
+ 
+ void
+ svscale_inferred_ok (svbfloat16x2_t bf16x2, svbfloat16x4_t bf16x4,
+ 		     svint16_t i16x1, svint16x2_t i16x2,
+ 		     svint16x4_t i16x4) __arm_streaming
+ {
+   bf16x2 = svscale_bf16_x2 (bf16x2, i16x2);
+   bf16x4 = svscale_bf16_x4 (bf16x4, i16x4);
+ 
+   bf16x2 = svscale_single_bf16_x2 (bf16x2, i16x1);
+   bf16x4 = svscale_single_bf16_x4 (bf16x4, i16x1);
+ }
+ 
+ /*
+ - BFMUL (multiple vectors)
+   // Only if __ARM_FEATURE_SVE_BFSCALE != 0 && __ARM_FEATURE_SME2 != 0
+   svbfloat16x2_t svmul[_bf16_x2] (svbfloat16x2_t zdn, svbfloat16x2_t zm) __arm_streaming;
+   svbfloat16x4_t svmul[_bf16_x4] (svbfloat16x4_t zdn, svbfloat16x4_t zm) __arm_streaming;
+ 
+ - BFMUL (multiple and single vector)
+   // Only if __ARM_FEATURE_SVE_BFSCALE != 0 && __ARM_FEATURE_SME2 != 0
+   svbfloat16x2_t svmul[_single_bf16_x2] (svbfloat16x2_t zn, svbfloat16x2_t zm) __arm_streaming;
+   svbfloat16x4_t svmul[_single_bf16_x4] (svbfloat16x4_t zn, svbfloat16x4_t zm) __arm_streaming;  */
+ 
+ void
+ svmul_explicit_ok (svbfloat16_t bf16x1, svbfloat16x2_t bf16x2,
+ 		   svbfloat16x4_t bf16x4) __arm_streaming
+ {
+   svmul_bf16_x2 (bf16x2, bf16x2);
+   svmul_bf16_x4 (bf16x4, bf16x4);
+ 
+   svmul_single_bf16_x2 (bf16x2, bf16x1);
+   svmul_single_bf16_x4 (bf16x4, bf16x1);
+ }
+ 
+ void
+ svmul_inferred_ok (svbfloat16_t bf16x1, svbfloat16x2_t bf16x2,
+ 		   svbfloat16x4_t bf16x4) __arm_streaming
+ {
+   svmul (bf16x2, bf16x2);
+   svmul (bf16x4, bf16x4);
+ 
+   svmul (bf16x2, bf16x1);
+   svmul (bf16x4, bf16x1);
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.target/aarch64/sve/pcs/asm_1.c gcc-16-20260201/gcc/testsuite/gcc.target/aarch64/sve/pcs/asm_1.c
*** gcc-16-20260125/gcc/testsuite/gcc.target/aarch64/sve/pcs/asm_1.c	Sun Jan 25 22:32:14 2026
--- gcc-16-20260201/gcc/testsuite/gcc.target/aarch64/sve/pcs/asm_1.c	Sun Feb  1 22:32:12 2026
***************
*** 6,16 ****
  #define ASM_FUNCTION(NAME, RET_TYPE, ARG_TYPE, INSN) \
  extern RET_TYPE NAME (svbool_t, ARG_TYPE);	\
    asm(						\
! "	.type	" #NAME ", %function\n"		\
! #NAME ":\n"					\
  "	" INSN "\n"				\
  "	ret\n"					\
! "	.size	" #NAME ", .-" #NAME "\n"	\
  )
  
  ASM_FUNCTION (u8_callee, uint64_t, svuint8_t,
--- 6,18 ----
  #define ASM_FUNCTION(NAME, RET_TYPE, ARG_TYPE, INSN) \
  extern RET_TYPE NAME (svbool_t, ARG_TYPE);	\
    asm(						\
! "	.type	%cc0,	%%function\n"		\
! "	.globl	%cc0\n"				\
! "%cc0:\n"					\
  "	" INSN "\n"				\
  "	ret\n"					\
! "	.size   %cc0, .-%cc0\n"			\
! : :":"(NAME ) \
  )
  
  ASM_FUNCTION (u8_callee, uint64_t, svuint8_t,
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.target/aarch64/sve/pcs/asm_3.c gcc-16-20260201/gcc/testsuite/gcc.target/aarch64/sve/pcs/asm_3.c
*** gcc-16-20260125/gcc/testsuite/gcc.target/aarch64/sve/pcs/asm_3.c	Sun Jan 25 22:32:14 2026
--- gcc-16-20260201/gcc/testsuite/gcc.target/aarch64/sve/pcs/asm_3.c	Sun Feb  1 22:32:12 2026
***************
*** 6,16 ****
  #define ASM_FUNCTION(NAME, RET_TYPE, ARG_TYPE, INSN) \
  extern RET_TYPE NAME (svbool_t, ARG_TYPE);	\
    asm(						\
! "	.type	" #NAME ", %function\n"		\
! #NAME ":\n"					\
  "	" INSN "\n"				\
  "	ret\n"					\
! "	.size	" #NAME ", .-" #NAME "\n"	\
  )
  
  ASM_FUNCTION (u8_callee, svuint8_t, svuint8x2_t,
--- 6,18 ----
  #define ASM_FUNCTION(NAME, RET_TYPE, ARG_TYPE, INSN) \
  extern RET_TYPE NAME (svbool_t, ARG_TYPE);	\
    asm(						\
! "	.type	%cc0,	%%function\n"		\
! "	.globl	%cc0\n"				\
! "%cc0:\n"					\
  "	" INSN "\n"				\
  "	ret\n"					\
! "	.size   %cc0, .-%cc0\n"			\
! : :":"(NAME ) \
  )
  
  ASM_FUNCTION (u8_callee, svuint8_t, svuint8x2_t,
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.target/aarch64/sve/pr122749_1.c gcc-16-20260201/gcc/testsuite/gcc.target/aarch64/sve/pr122749_1.c
*** gcc-16-20260125/gcc/testsuite/gcc.target/aarch64/sve/pr122749_1.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gcc.target/aarch64/sve/pr122749_1.c	Sun Feb  1 22:32:12 2026
***************
*** 0 ****
--- 1,48 ----
+ /* { dg-do run { target aarch64_sve_hw } } */
+ /* { dg-additional-options "-Ofast -std=gnu99 -fdump-tree-vect-details -fdump-tree-widening_mul" } */
+ 
+ #include <limits.h>
+ #include <stdint.h>
+ 
+ typedef int8_t elem_t;
+ 
+ __attribute__ ((noipa))
+ elem_t
+ foo2 (elem_t *buf, int len)
+ {
+   elem_t x = 0;
+ 
+   for (int i = 0; i < len; i++)
+     x += (elem_t) i * buf[i];
+ 
+   return x;
+ }
+ 
+ static elem_t
+ reference (elem_t *buf, int len)
+ {
+   elem_t x = 0;
+ 
+ #pragma GCC novector
+   for (int i = 0; i < len; i++)
+     x += (elem_t) i * buf[i];
+ 
+   return x;
+ }
+ 
+ int
+ main (void)
+ {
+   elem_t buf[] = { 1, -2, INT8_MAX, INT8_MIN, 5, -7, 3, -4 };
+   int len = sizeof (buf) / sizeof (buf[0]);
+   elem_t want = reference (buf, len);
+   elem_t got = foo2 (buf, len);
+ 
+   if (want != got)
+     __builtin_abort ();
+ 
+   return 0;
+ }
+ 
+ /* { dg-final { scan-tree-dump-times "\\.COND_FMA" 1 "widening_mul" } } */
+ /* { dg-final { scan-tree-dump-times "vectorized 1 loop" 1 "vect" } } */
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.target/aarch64/sve/pr122749_11.c gcc-16-20260201/gcc/testsuite/gcc.target/aarch64/sve/pr122749_11.c
*** gcc-16-20260125/gcc/testsuite/gcc.target/aarch64/sve/pr122749_11.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gcc.target/aarch64/sve/pr122749_11.c	Sun Feb  1 22:32:12 2026
***************
*** 0 ****
--- 1,48 ----
+ /* { dg-do run { target aarch64_sve_hw } } */
+ /* { dg-additional-options "-Ofast -std=gnu99 -fdump-tree-vect-details -fdump-tree-widening_mul" } */
+ 
+ #include <limits.h>
+ #include <stdint.h>
+ 
+ typedef uint8_t elem_t;
+ 
+ __attribute__ ((noipa))
+ elem_t
+ foo2 (elem_t *buf, int len)
+ {
+   elem_t x = 0;
+ 
+   for (int i = 0; i < len; i++)
+     x += (elem_t) i * buf[i];
+ 
+   return x;
+ }
+ 
+ static elem_t
+ reference (elem_t *buf, int len)
+ {
+   elem_t x = 0;
+ 
+ #pragma GCC novector
+   for (int i = 0; i < len; i++)
+     x += (elem_t) i * buf[i];
+ 
+   return x;
+ }
+ 
+ int
+ main (void)
+ {
+   elem_t buf[] = { 1, 2, UINT8_MAX, 7, 0, UINT8_MAX, 5, 9 };
+   int len = sizeof (buf) / sizeof (buf[0]);
+   elem_t want = reference (buf, len);
+   elem_t got = foo2 (buf, len);
+ 
+   if (want != got)
+     __builtin_abort ();
+ 
+   return 0;
+ }
+ 
+ /* { dg-final { scan-tree-dump-times "\\.COND_FMA" 1 "widening_mul" } } */
+ /* { dg-final { scan-tree-dump-times "vectorized 1 loop" 1 "vect" } } */
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.target/aarch64/sve/pr122749_12.c gcc-16-20260201/gcc/testsuite/gcc.target/aarch64/sve/pr122749_12.c
*** gcc-16-20260125/gcc/testsuite/gcc.target/aarch64/sve/pr122749_12.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gcc.target/aarch64/sve/pr122749_12.c	Sun Feb  1 22:32:12 2026
***************
*** 0 ****
--- 1,48 ----
+ /* { dg-do run { target aarch64_sve_hw } } */
+ /* { dg-additional-options "-Ofast -std=gnu99 -fdump-tree-vect-details -fdump-tree-widening_mul" } */
+ 
+ #include <limits.h>
+ #include <stdint.h>
+ 
+ typedef uint16_t elem_t;
+ 
+ __attribute__ ((noipa))
+ elem_t
+ foo2 (elem_t *buf, int len)
+ {
+   elem_t x = 0;
+ 
+   for (int i = 0; i < len; i++)
+     x += (elem_t) i * buf[i];
+ 
+   return x;
+ }
+ 
+ static elem_t
+ reference (elem_t *buf, int len)
+ {
+   elem_t x = 0;
+ 
+ #pragma GCC novector
+   for (int i = 0; i < len; i++)
+     x += (elem_t) i * buf[i];
+ 
+   return x;
+ }
+ 
+ int
+ main (void)
+ {
+   elem_t buf[] = { 1, 2, UINT16_MAX, 7, 0, UINT16_MAX, 5, 9 };
+   int len = sizeof (buf) / sizeof (buf[0]);
+   elem_t want = reference (buf, len);
+   elem_t got = foo2 (buf, len);
+ 
+   if (want != got)
+     __builtin_abort ();
+ 
+   return 0;
+ }
+ 
+ /* { dg-final { scan-tree-dump-times "\\.COND_FMA" 1 "widening_mul" } } */
+ /* { dg-final { scan-tree-dump-times "vectorized 1 loop" 1 "vect" } } */
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.target/aarch64/sve/pr122749_13.c gcc-16-20260201/gcc/testsuite/gcc.target/aarch64/sve/pr122749_13.c
*** gcc-16-20260125/gcc/testsuite/gcc.target/aarch64/sve/pr122749_13.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gcc.target/aarch64/sve/pr122749_13.c	Sun Feb  1 22:32:12 2026
***************
*** 0 ****
--- 1,48 ----
+ /* { dg-do run { target aarch64_sve_hw } } */
+ /* { dg-additional-options "-Ofast -std=gnu99 -fdump-tree-vect-details -fdump-tree-widening_mul" } */
+ 
+ #include <limits.h>
+ #include <stdint.h>
+ 
+ typedef uint32_t elem_t;
+ 
+ __attribute__ ((noipa))
+ elem_t
+ foo2 (elem_t *buf, int len)
+ {
+   elem_t x = 0;
+ 
+   for (int i = 0; i < len; i++)
+     x += (elem_t) i * buf[i];
+ 
+   return x;
+ }
+ 
+ static elem_t
+ reference (elem_t *buf, int len)
+ {
+   elem_t x = 0;
+ 
+ #pragma GCC novector
+   for (int i = 0; i < len; i++)
+     x += (elem_t) i * buf[i];
+ 
+   return x;
+ }
+ 
+ int
+ main (void)
+ {
+   elem_t buf[] = { 1, 2, UINT32_MAX, 7, 0, UINT32_MAX, 5, 9 };
+   int len = sizeof (buf) / sizeof (buf[0]);
+   elem_t want = reference (buf, len);
+   elem_t got = foo2 (buf, len);
+ 
+   if (want != got)
+     __builtin_abort ();
+ 
+   return 0;
+ }
+ 
+ /* { dg-final { scan-tree-dump-times "\\.COND_FMA" 1 "widening_mul" } } */
+ /* { dg-final { scan-tree-dump-times "vectorized 1 loop" 1 "vect" } } */
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.target/aarch64/sve/pr122749_14.c gcc-16-20260201/gcc/testsuite/gcc.target/aarch64/sve/pr122749_14.c
*** gcc-16-20260125/gcc/testsuite/gcc.target/aarch64/sve/pr122749_14.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gcc.target/aarch64/sve/pr122749_14.c	Sun Feb  1 22:32:12 2026
***************
*** 0 ****
--- 1,48 ----
+ /* { dg-do run { target aarch64_sve_hw } } */
+ /* { dg-additional-options "-Ofast -std=gnu99 -fdump-tree-vect-details -fdump-tree-widening_mul" } */
+ 
+ #include <limits.h>
+ #include <stdint.h>
+ 
+ typedef uint64_t elem_t;
+ 
+ __attribute__ ((noipa))
+ elem_t
+ foo2 (elem_t *buf, int len)
+ {
+   elem_t x = 0;
+ 
+   for (int i = 0; i < len; i++)
+     x += (elem_t) i * buf[i];
+ 
+   return x;
+ }
+ 
+ static elem_t
+ reference (elem_t *buf, int len)
+ {
+   elem_t x = 0;
+ 
+ #pragma GCC novector
+   for (int i = 0; i < len; i++)
+     x += (elem_t) i * buf[i];
+ 
+   return x;
+ }
+ 
+ int
+ main (void)
+ {
+   elem_t buf[] = { 1, 2, UINT64_MAX, 7, 0, UINT64_MAX, 5, 9 };
+   int len = sizeof (buf) / sizeof (buf[0]);
+   elem_t want = reference (buf, len);
+   elem_t got = foo2 (buf, len);
+ 
+   if (want != got)
+     __builtin_abort ();
+ 
+   return 0;
+ }
+ 
+ /* { dg-final { scan-tree-dump-times "\\.COND_FMA" 1 "widening_mul" } } */
+ /* { dg-final { scan-tree-dump-times "vectorized 1 loop" 1 "vect" } } */
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.target/aarch64/sve/pr122749_2.c gcc-16-20260201/gcc/testsuite/gcc.target/aarch64/sve/pr122749_2.c
*** gcc-16-20260125/gcc/testsuite/gcc.target/aarch64/sve/pr122749_2.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gcc.target/aarch64/sve/pr122749_2.c	Sun Feb  1 22:32:12 2026
***************
*** 0 ****
--- 1,48 ----
+ /* { dg-do run { target aarch64_sve_hw } } */
+ /* { dg-additional-options "-Ofast -std=gnu99 -fdump-tree-vect-details -fdump-tree-widening_mul" } */
+ 
+ #include <limits.h>
+ #include <stdint.h>
+ 
+ typedef int16_t elem_t;
+ 
+ __attribute__ ((noipa))
+ elem_t
+ foo2 (elem_t *buf, int len)
+ {
+   elem_t x = 0;
+ 
+   for (int i = 0; i < len; i++)
+     x += (elem_t) i * buf[i];
+ 
+   return x;
+ }
+ 
+ static elem_t
+ reference (elem_t *buf, int len)
+ {
+   elem_t x = 0;
+ 
+ #pragma GCC novector
+   for (int i = 0; i < len; i++)
+     x += (elem_t) i * buf[i];
+ 
+   return x;
+ }
+ 
+ int
+ main (void)
+ {
+   elem_t buf[] = { 1, -2, INT16_MAX, INT16_MIN, 5, -7, 3, -4 };
+   int len = sizeof (buf) / sizeof (buf[0]);
+   elem_t want = reference (buf, len);
+   elem_t got = foo2 (buf, len);
+ 
+   if (want != got)
+     __builtin_abort ();
+ 
+   return 0;
+ }
+ 
+ /* { dg-final { scan-tree-dump-times "\\.COND_FMA" 1 "widening_mul" } } */
+ /* { dg-final { scan-tree-dump-times "vectorized 1 loop" 1 "vect" } } */
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.target/aarch64/sve/pr122749_3.c gcc-16-20260201/gcc/testsuite/gcc.target/aarch64/sve/pr122749_3.c
*** gcc-16-20260125/gcc/testsuite/gcc.target/aarch64/sve/pr122749_3.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gcc.target/aarch64/sve/pr122749_3.c	Sun Feb  1 22:32:12 2026
***************
*** 0 ****
--- 1,48 ----
+ /* { dg-do run { target aarch64_sve_hw } } */
+ /* { dg-additional-options "-Ofast -std=gnu99 -fdump-tree-vect-details -fdump-tree-widening_mul" } */
+ 
+ #include <limits.h>
+ #include <stdint.h>
+ 
+ typedef int32_t elem_t;
+ 
+ __attribute__ ((noipa))
+ elem_t
+ foo2 (elem_t *buf, int len)
+ {
+   elem_t x = 0;
+ 
+   for (int i = 0; i < len; i++)
+     x += (elem_t) i * buf[i];
+ 
+   return x;
+ }
+ 
+ static elem_t
+ reference (elem_t *buf, int len)
+ {
+   elem_t x = 0;
+ 
+ #pragma GCC novector
+   for (int i = 0; i < len; i++)
+     x += (elem_t) i * buf[i];
+ 
+   return x;
+ }
+ 
+ int
+ main (void)
+ {
+   elem_t buf[] = { 1, -2, INT32_MAX, INT32_MIN, 5, -7, 3, -4 };
+   int len = sizeof (buf) / sizeof (buf[0]);
+   elem_t want = reference (buf, len);
+   elem_t got = foo2 (buf, len);
+ 
+   if (want != got)
+     __builtin_abort ();
+ 
+   return 0;
+ }
+ 
+ /* { dg-final { scan-tree-dump-times "\\.COND_FMA" 1 "widening_mul" } } */
+ /* { dg-final { scan-tree-dump-times "vectorized 1 loop" 1 "vect" } } */
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.target/aarch64/sve/pr122749_4.c gcc-16-20260201/gcc/testsuite/gcc.target/aarch64/sve/pr122749_4.c
*** gcc-16-20260125/gcc/testsuite/gcc.target/aarch64/sve/pr122749_4.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gcc.target/aarch64/sve/pr122749_4.c	Sun Feb  1 22:32:12 2026
***************
*** 0 ****
--- 1,48 ----
+ /* { dg-do run { target aarch64_sve_hw } } */
+ /* { dg-additional-options "-Ofast -std=gnu99 -fdump-tree-vect-details -fdump-tree-widening_mul" } */
+ 
+ #include <limits.h>
+ #include <stdint.h>
+ 
+ typedef int64_t elem_t;
+ 
+ __attribute__ ((noipa))
+ elem_t
+ foo2 (elem_t *buf, int len)
+ {
+   elem_t x = 0;
+ 
+   for (int i = 0; i < len; i++)
+     x += (elem_t) i * buf[i];
+ 
+   return x;
+ }
+ 
+ static elem_t
+ reference (elem_t *buf, int len)
+ {
+   elem_t x = 0;
+ 
+ #pragma GCC novector
+   for (int i = 0; i < len; i++)
+     x += (elem_t) i * buf[i];
+ 
+   return x;
+ }
+ 
+ int
+ main (void)
+ {
+   elem_t buf[] = { 1, -2, INT64_MAX, INT64_MIN, 5, -7, 3, -4 };
+   int len = sizeof (buf) / sizeof (buf[0]);
+   elem_t want = reference (buf, len);
+   elem_t got = foo2 (buf, len);
+ 
+   if (want != got)
+     __builtin_abort ();
+ 
+   return 0;
+ }
+ 
+ /* { dg-final { scan-tree-dump-times "\\.COND_FMA" 1 "widening_mul" } } */
+ /* { dg-final { scan-tree-dump-times "vectorized 1 loop" 1 "vect" } } */
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.target/aarch64/sve/pr122749_5.c gcc-16-20260201/gcc/testsuite/gcc.target/aarch64/sve/pr122749_5.c
*** gcc-16-20260125/gcc/testsuite/gcc.target/aarch64/sve/pr122749_5.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gcc.target/aarch64/sve/pr122749_5.c	Sun Feb  1 22:32:12 2026
***************
*** 0 ****
--- 1,45 ----
+ /* { dg-do run { target aarch64_sve_hw } } */
+ /* { dg-additional-options "-Ofast -std=gnu99 -fdump-tree-vect-details -fdump-tree-widening_mul" } */
+ 
+ typedef float elem_t;
+ 
+ __attribute__ ((noipa))
+ elem_t
+ foo2 (elem_t *buf, int len)
+ {
+   elem_t x = 0;
+ 
+   for (int i = 0; i < len; i++)
+     x += (elem_t) i * buf[i];
+ 
+   return x;
+ }
+ 
+ static elem_t
+ reference (elem_t *buf, int len)
+ {
+   elem_t x = 0;
+ 
+ #pragma GCC novector
+   for (int i = 0; i < len; i++)
+     x += (elem_t) i * buf[i];
+ 
+   return x;
+ }
+ 
+ int
+ main (void)
+ {
+   elem_t buf[] = { 1.0f, 2.0f, 1.0f, 2.0f, 1.0f, 2.0f };
+   int len = sizeof (buf) / sizeof (buf[0]);
+   elem_t want = reference (buf, len);
+   elem_t got = foo2 (buf, len);
+ 
+   if (want != got)
+     __builtin_abort ();
+ 
+   return 0;
+ }
+ 
+ /* { dg-final { scan-tree-dump-times "\\.COND_FMA" 1 "widening_mul" } } */
+ /* { dg-final { scan-tree-dump-times "vectorized 1 loop" 1 "vect" } } */
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.target/aarch64/sve/pr122749_6.c gcc-16-20260201/gcc/testsuite/gcc.target/aarch64/sve/pr122749_6.c
*** gcc-16-20260125/gcc/testsuite/gcc.target/aarch64/sve/pr122749_6.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gcc.target/aarch64/sve/pr122749_6.c	Sun Feb  1 22:32:12 2026
***************
*** 0 ****
--- 1,45 ----
+ /* { dg-do run { target aarch64_sve_hw } } */
+ /* { dg-additional-options "-Ofast -std=gnu99 -fdump-tree-vect-details -fdump-tree-widening_mul" } */
+ 
+ typedef double elem_t;
+ 
+ __attribute__ ((noipa))
+ elem_t
+ foo2 (elem_t *buf, int len)
+ {
+   elem_t x = 0;
+ 
+   for (int i = 0; i < len; i++)
+     x += (elem_t) i * buf[i];
+ 
+   return x;
+ }
+ 
+ static elem_t
+ reference (elem_t *buf, int len)
+ {
+   elem_t x = 0;
+ 
+ #pragma GCC novector
+   for (int i = 0; i < len; i++)
+     x += (elem_t) i * buf[i];
+ 
+   return x;
+ }
+ 
+ int
+ main (void)
+ {
+   elem_t buf[] = { 1.0, 2.0, 1.0, 2.0, 1.0, 2.0 };
+   int len = sizeof (buf) / sizeof (buf[0]);
+   elem_t want = reference (buf, len);
+   elem_t got = foo2 (buf, len);
+ 
+   if (want != got)
+     __builtin_abort ();
+ 
+   return 0;
+ }
+ 
+ /* { dg-final { scan-tree-dump-times "\\.COND_FMA" 1 "widening_mul" } } */
+ /* { dg-final { scan-tree-dump-times "vectorized 1 loop" 1 "vect" } } */
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.target/aarch64/sve/pr122749_8.c gcc-16-20260201/gcc/testsuite/gcc.target/aarch64/sve/pr122749_8.c
*** gcc-16-20260125/gcc/testsuite/gcc.target/aarch64/sve/pr122749_8.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gcc.target/aarch64/sve/pr122749_8.c	Sun Feb  1 22:32:12 2026
***************
*** 0 ****
--- 1,45 ----
+ /* { dg-do run { target aarch64_sve_hw } } */
+ /* { dg-additional-options "-Ofast -std=gnu99 -fwrapv -fdump-tree-vect-details -fdump-tree-widening_mul" } */
+ 
+ typedef float elem_t;
+ 
+ __attribute__ ((noipa))
+ elem_t
+ foo2 (elem_t *buf, int len)
+ {
+   elem_t x = 0;
+ 
+   for (int i = 0; i < len; i++)
+     x += (elem_t) i * buf[i];
+ 
+   return x;
+ }
+ 
+ static elem_t
+ reference (elem_t *buf, int len)
+ {
+   elem_t x = 0;
+ 
+ #pragma GCC novector
+   for (int i = 0; i < len; i++)
+     x += (elem_t) i * buf[i];
+ 
+   return x;
+ }
+ 
+ int
+ main (void)
+ {
+   elem_t buf[] = { 1.0f, 2.0f, 1.0f, 2.0f, 1.0f, 2.0f };
+   int len = sizeof (buf) / sizeof (buf[0]);
+   elem_t want = reference (buf, len);
+   elem_t got = foo2 (buf, len);
+ 
+   if (want != got)
+     __builtin_abort ();
+ 
+   return 0;
+ }
+ 
+ /* { dg-final { scan-tree-dump-times "\\.COND_FMA" 1 "widening_mul" } } */
+ /* { dg-final { scan-tree-dump-times "vectorized 1 loop" 1 "vect" } } */
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.target/aarch64/sve/pr122749_9.c gcc-16-20260201/gcc/testsuite/gcc.target/aarch64/sve/pr122749_9.c
*** gcc-16-20260125/gcc/testsuite/gcc.target/aarch64/sve/pr122749_9.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gcc.target/aarch64/sve/pr122749_9.c	Sun Feb  1 22:32:12 2026
***************
*** 0 ****
--- 1,45 ----
+ /* { dg-do run { target aarch64_sve_hw } } */
+ /* { dg-additional-options "-Ofast -std=gnu99 -fwrapv -fdump-tree-vect-details -fdump-tree-widening_mul" } */
+ 
+ typedef double elem_t;
+ 
+ __attribute__ ((noipa))
+ elem_t
+ foo2 (elem_t *buf, int len)
+ {
+   elem_t x = 0;
+ 
+   for (int i = 0; i < len; i++)
+     x += (elem_t) i * buf[i];
+ 
+   return x;
+ }
+ 
+ static elem_t
+ reference (elem_t *buf, int len)
+ {
+   elem_t x = 0;
+ 
+ #pragma GCC novector
+   for (int i = 0; i < len; i++)
+     x += (elem_t) i * buf[i];
+ 
+   return x;
+ }
+ 
+ int
+ main (void)
+ {
+   elem_t buf[] = { 1.0, 2.0, 1.0, 2.0, 1.0, 2.0 };
+   int len = sizeof (buf) / sizeof (buf[0]);
+   elem_t want = reference (buf, len);
+   elem_t got = foo2 (buf, len);
+ 
+   if (want != got)
+     __builtin_abort ();
+ 
+   return 0;
+ }
+ 
+ /* { dg-final { scan-tree-dump-times "\\.COND_FMA" 1 "widening_mul" } } */
+ /* { dg-final { scan-tree-dump-times "vectorized 1 loop" 1 "vect" } } */
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.target/aarch64/sve2/pr123053.c gcc-16-20260201/gcc/testsuite/gcc.target/aarch64/sve2/pr123053.c
*** gcc-16-20260125/gcc/testsuite/gcc.target/aarch64/sve2/pr123053.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gcc.target/aarch64/sve2/pr123053.c	Sun Feb  1 22:32:12 2026
***************
*** 0 ****
--- 1,25 ----
+ /* { dg-do compile } */
+ /* { dg-additional-options "-O2 -march=armv9-a" } */
+ 
+ #include <stdint.h>
+ 
+ struct
+ {
+     int32_t f3;
+     int64_t f4;
+ } g_137, g_138;
+ struct
+ {
+     int8_t f0;
+ } g_174;
+ int32_t g_67;
+ extern uint32_t g_179[];
+ uint16_t func_71()
+ {
+     for (; g_174.f0; g_174.f0 -= 1)
+     {
+         g_137.f3 = 0;
+         for (; g_137.f3 <= 4; g_137.f3 += 1)
+             for (g_67 = 3; g_67; g_67 -= 1) g_179[g_67] || (g_138.f4 = 0);
+     }
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.target/aarch64/xar_v2di_nonsve.c gcc-16-20260201/gcc/testsuite/gcc.target/aarch64/xar_v2di_nonsve.c
*** gcc-16-20260125/gcc/testsuite/gcc.target/aarch64/xar_v2di_nonsve.c	Sun Jan 25 22:32:14 2026
--- gcc-16-20260201/gcc/testsuite/gcc.target/aarch64/xar_v2di_nonsve.c	Sun Feb  1 22:32:12 2026
*************** xar_v2di (v2di a, v2di b) {
*** 12,16 ****
    v2di c = a ^ b;
    return (c << 22) ^ (c >> 42);
  }
! /* { dg-final { scan-assembler {\txar\tv0.2d, v[0-9]+.2d, v[0-9]+.2d, 42} } } */
  
--- 12,16 ----
    v2di c = a ^ b;
    return (c << 22) ^ (c >> 42);
  }
! /* { dg-final { scan-assembler {\txar\tv0.2d, v[0-9]+.2d, v[0-9]+.2d, #?42} } } */
  
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.target/arm/bfloat16_simd_1_2.c gcc-16-20260201/gcc/testsuite/gcc.target/arm/bfloat16_simd_1_2.c
*** gcc-16-20260125/gcc/testsuite/gcc.target/arm/bfloat16_simd_1_2.c	Sun Jan 25 22:32:14 2026
--- gcc-16-20260201/gcc/testsuite/gcc.target/arm/bfloat16_simd_1_2.c	Sun Feb  1 22:32:12 2026
***************
*** 2,8 ****
  /* { dg-require-effective-target arm_softfp_ok } */
  /* { dg-require-effective-target arm_v8_neon_ok } */
  /* { dg-require-effective-target arm_v8_2a_bf16_neon_ok } */
! /* { dg-additional-options "-march=armv8.2-a+bf16 -mfloat-abi=softfp -mfpu=auto" } */
  /* { dg-additional-options "-O3 --save-temps -std=gnu90" } */
  /* { dg-final { check-function-bodies "**" "" } } */
  
--- 2,8 ----
  /* { dg-require-effective-target arm_softfp_ok } */
  /* { dg-require-effective-target arm_v8_neon_ok } */
  /* { dg-require-effective-target arm_v8_2a_bf16_neon_ok } */
! /* { dg-additional-options "-mcpu=unset -march=armv8.2-a+bf16 -mfloat-abi=softfp -mfpu=auto" } */
  /* { dg-additional-options "-O3 --save-temps -std=gnu90" } */
  /* { dg-final { check-function-bodies "**" "" } } */
  
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.target/arm/bfloat16_simd_2_2.c gcc-16-20260201/gcc/testsuite/gcc.target/arm/bfloat16_simd_2_2.c
*** gcc-16-20260125/gcc/testsuite/gcc.target/arm/bfloat16_simd_2_2.c	Sun Jan 25 22:32:14 2026
--- gcc-16-20260201/gcc/testsuite/gcc.target/arm/bfloat16_simd_2_2.c	Sun Feb  1 22:32:12 2026
***************
*** 2,8 ****
  /* { dg-require-effective-target arm_softfp_ok } */
  /* { dg-require-effective-target arm_v8_neon_ok } */
  /* { dg-require-effective-target arm_v8_2a_bf16_neon_ok } */
! /* { dg-additional-options "-march=armv8.2-a -mfloat-abi=softfp -mfpu=neon-fp-armv8" } */
  /* { dg-additional-options "-O3 --save-temps -std=gnu90" } */
  /* { dg-final { check-function-bodies "**" "" } } */
  
--- 2,8 ----
  /* { dg-require-effective-target arm_softfp_ok } */
  /* { dg-require-effective-target arm_v8_neon_ok } */
  /* { dg-require-effective-target arm_v8_2a_bf16_neon_ok } */
! /* { dg-additional-options "-mcpu=unset -march=armv8.2-a -mfloat-abi=softfp -mfpu=neon-fp-armv8" } */
  /* { dg-additional-options "-O3 --save-temps -std=gnu90" } */
  /* { dg-final { check-function-bodies "**" "" } } */
  
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.target/arm/bfloat16_simd_3_2.c gcc-16-20260201/gcc/testsuite/gcc.target/arm/bfloat16_simd_3_2.c
*** gcc-16-20260125/gcc/testsuite/gcc.target/arm/bfloat16_simd_3_2.c	Sun Jan 25 22:32:14 2026
--- gcc-16-20260201/gcc/testsuite/gcc.target/arm/bfloat16_simd_3_2.c	Sun Feb  1 22:32:12 2026
***************
*** 2,8 ****
  /* { dg-require-effective-target arm_softfp_ok } */
  /* { dg-require-effective-target arm_v8_neon_ok } */
  /* { dg-require-effective-target arm_v8_2a_bf16_neon_ok } */
! /* { dg-additional-options "-march=armv8.2-a -mfloat-abi=softfp -mfpu=neon-fp-armv8" } */
  /* { dg-additional-options "-O3 --save-temps -std=gnu90" } */
  /* { dg-final { check-function-bodies "**" "" } } */
  
--- 2,8 ----
  /* { dg-require-effective-target arm_softfp_ok } */
  /* { dg-require-effective-target arm_v8_neon_ok } */
  /* { dg-require-effective-target arm_v8_2a_bf16_neon_ok } */
! /* { dg-additional-options "-mcpu=unset -march=armv8.2-a -mfloat-abi=softfp -mfpu=neon-fp-armv8" } */
  /* { dg-additional-options "-O3 --save-temps -std=gnu90" } */
  /* { dg-final { check-function-bodies "**" "" } } */
  
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.target/arm/crypto-vsha1cq_u32.c gcc-16-20260201/gcc/testsuite/gcc.target/arm/crypto-vsha1cq_u32.c
*** gcc-16-20260125/gcc/testsuite/gcc.target/arm/crypto-vsha1cq_u32.c	Sun Jan 25 22:32:14 2026
--- gcc-16-20260201/gcc/testsuite/gcc.target/arm/crypto-vsha1cq_u32.c	Sun Feb  1 22:32:12 2026
*************** uint32_t foo (void)
*** 31,35 ****
  TEST_SHA1C_VEC_SELECT (GET_LANE)
  
  /* { dg-final { scan-assembler-times {sha1c.32\tq[0-9]+, q[0-9]+} 5 } } */
! /* { dg-final { scan-assembler-times {vdup.32\tq[0-9]+, r[0-9]+} 4 } } */
! /* { dg-final { scan-assembler-times {vmov.32\tr[0-9]+, d[0-9]+\[[0-9]+\]+} 3 } } */
--- 31,35 ----
  TEST_SHA1C_VEC_SELECT (GET_LANE)
  
  /* { dg-final { scan-assembler-times {sha1c.32\tq[0-9]+, q[0-9]+} 5 } } */
! /* { dg-final { scan-assembler-times {vdup.32\tq[0-9]+, (?:r[0-9]+|d[0-9]+\[[0-9]+\])} 4 } } */
! /* { dg-final { scan-assembler-times {vmov.32\tr[0-9]+, d[0-9]+\[[0-9]+\]} 3 } } */
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.target/arm/crypto-vsha1h_u32.c gcc-16-20260201/gcc/testsuite/gcc.target/arm/crypto-vsha1h_u32.c
*** gcc-16-20260125/gcc/testsuite/gcc.target/arm/crypto-vsha1h_u32.c	Sun Jan 25 22:32:14 2026
--- gcc-16-20260201/gcc/testsuite/gcc.target/arm/crypto-vsha1h_u32.c	Sun Feb  1 22:32:12 2026
*************** uint32_t foo (void)
*** 27,31 ****
  TEST_SHA1H_VEC_SELECT (GET_LANE)
  
  /* { dg-final { scan-assembler-times {sha1h.32\tq[0-9]+, q[0-9]+} 5 } } */
! /* { dg-final { scan-assembler-times {vdup.32\tq[0-9]+, r[0-9]+} 4 } } */
! /* { dg-final { scan-assembler-times {vmov.32\tr[0-9]+, d[0-9]+\[[0-9]+\]+} 3 } } */
--- 27,31 ----
  TEST_SHA1H_VEC_SELECT (GET_LANE)
  
  /* { dg-final { scan-assembler-times {sha1h.32\tq[0-9]+, q[0-9]+} 5 } } */
! /* { dg-final { scan-assembler-times {vdup.32\tq[0-9]+, (?:r[0-9]+|d[0-9]+\[[0-9]+\])} 4 } } */
! /* { dg-final { scan-assembler-times {vmov.32\tr[0-9]+, d[0-9]+\[[0-9]+\]} 3 } } */
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.target/arm/crypto-vsha1mq_u32.c gcc-16-20260201/gcc/testsuite/gcc.target/arm/crypto-vsha1mq_u32.c
*** gcc-16-20260125/gcc/testsuite/gcc.target/arm/crypto-vsha1mq_u32.c	Sun Jan 25 22:32:14 2026
--- gcc-16-20260201/gcc/testsuite/gcc.target/arm/crypto-vsha1mq_u32.c	Sun Feb  1 22:32:12 2026
*************** uint32_t foo (void)
*** 31,35 ****
  TEST_SHA1M_VEC_SELECT (GET_LANE)
  
  /* { dg-final { scan-assembler-times {sha1m.32\tq[0-9]+, q[0-9]+} 5 } } */
! /* { dg-final { scan-assembler-times {vdup.32\tq[0-9]+, r[0-9]+} 4 } } */
! /* { dg-final { scan-assembler-times {vmov.32\tr[0-9]+, d[0-9]+\[[0-9]+\]+} 3 } } */
--- 31,35 ----
  TEST_SHA1M_VEC_SELECT (GET_LANE)
  
  /* { dg-final { scan-assembler-times {sha1m.32\tq[0-9]+, q[0-9]+} 5 } } */
! /* { dg-final { scan-assembler-times {vdup.32\tq[0-9]+, (?:r[0-9]+|d[0-9]+\[[0-9]+\])} 4 } } */
! /* { dg-final { scan-assembler-times {vmov.32\tr[0-9]+, d[0-9]+\[[0-9]+\]} 3 } } */
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.target/arm/crypto-vsha1pq_u32.c gcc-16-20260201/gcc/testsuite/gcc.target/arm/crypto-vsha1pq_u32.c
*** gcc-16-20260125/gcc/testsuite/gcc.target/arm/crypto-vsha1pq_u32.c	Sun Jan 25 22:32:14 2026
--- gcc-16-20260201/gcc/testsuite/gcc.target/arm/crypto-vsha1pq_u32.c	Sun Feb  1 22:32:12 2026
*************** uint32_t foo (void)
*** 31,35 ****
  TEST_SHA1P_VEC_SELECT (GET_LANE)
  
  /* { dg-final { scan-assembler-times {sha1p.32\tq[0-9]+, q[0-9]+} 5 } } */
! /* { dg-final { scan-assembler-times {vdup.32\tq[0-9]+, r[0-9]+} 4 } } */
! /* { dg-final { scan-assembler-times {vmov.32\tr[0-9]+, d[0-9]+\[[0-9]+\]+} 3 } } */
--- 31,35 ----
  TEST_SHA1P_VEC_SELECT (GET_LANE)
  
  /* { dg-final { scan-assembler-times {sha1p.32\tq[0-9]+, q[0-9]+} 5 } } */
! /* { dg-final { scan-assembler-times {vdup.32\tq[0-9]+, (?:r[0-9]+|d[0-9]+\[[0-9]+\])} 4 } } */
! /* { dg-final { scan-assembler-times {vmov.32\tr[0-9]+, d[0-9]+\[[0-9]+\]} 3 } } */
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.target/arm/mve/intrinsics/vdupq_n_f32.c gcc-16-20260201/gcc/testsuite/gcc.target/arm/mve/intrinsics/vdupq_n_f32.c
*** gcc-16-20260125/gcc/testsuite/gcc.target/arm/mve/intrinsics/vdupq_n_f32.c	Sun Jan 25 22:32:14 2026
--- gcc-16-20260201/gcc/testsuite/gcc.target/arm/mve/intrinsics/vdupq_n_f32.c	Sun Feb  1 22:32:13 2026
*************** foo (float32_t a)
*** 24,30 ****
--- 24,35 ----
  /*
  **foo1:
  **	...
+ ** (
  **	ldr	r[0-9]+, .L.*
+ ** |
+ **	movw	(r[0-9]+), #52429
+ **	movt	\1, 16268
+ ** )
  **	vdup.32	q[0-9]+, r[0-9]+
  **	...
  */
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.target/arm/stack-protector-7.c gcc-16-20260201/gcc/testsuite/gcc.target/arm/stack-protector-7.c
*** gcc-16-20260125/gcc/testsuite/gcc.target/arm/stack-protector-7.c	Sun Jan 25 22:32:14 2026
--- gcc-16-20260201/gcc/testsuite/gcc.target/arm/stack-protector-7.c	Sun Feb  1 22:32:13 2026
***************
*** 1,7 ****
  /* { dg-do compile } */
! /* { dg-require-effective-target arm_hard_vfp_ok }  */
! /* { dg-require-effective-target arm_arch_v7a_ok } */
! /* { dg-options "-march=armv7-a -mfpu=vfp -fstack-protector-all -Os -mstack-protector-guard=tls -mstack-protector-guard-offset=1296 -mtp=cp15" } */
  
  #include "stack-protector-5.c"
  
--- 1,7 ----
  /* { dg-do compile } */
! /* { dg-require-effective-target arm_arch_v7a_fp_hard_ok } */
! /* { dg-options "-fstack-protector-all -Os -mstack-protector-guard=tls -mstack-protector-guard-offset=1296 -mtp=cp15" } */
! /* { dg-add-options arm_arch_v7a_fp_hard } */
  
  #include "stack-protector-5.c"
  
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.target/avr/pr123583.c gcc-16-20260201/gcc/testsuite/gcc.target/avr/pr123583.c
*** gcc-16-20260125/gcc/testsuite/gcc.target/avr/pr123583.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gcc.target/avr/pr123583.c	Sun Feb  1 22:32:13 2026
***************
*** 0 ****
--- 1,9 ----
+ /* { dg-do compile { target { ! avr_tiny } } } */
+ /* { dg-additional-options "-std=gnu99 -w" } */
+ 
+ void h() {
+     if(1)
+       ;
+   __memx const int *x = 0;
+ }
+ 
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.target/i386/pr116353.c gcc-16-20260201/gcc/testsuite/gcc.target/i386/pr116353.c
*** gcc-16-20260125/gcc/testsuite/gcc.target/i386/pr116353.c	Sun Jan 25 22:32:15 2026
--- gcc-16-20260201/gcc/testsuite/gcc.target/i386/pr116353.c	Thu Jan  1 00:00:00 1970
***************
*** 1,55 ****
- /* PR tree-optimization/116353 */
- /* { dg-do compile } */
- /* { dg-options "-O2" } */
- 
- enum desmode { C };
- struct {
-   unsigned char des_ivec[];
- } _des_crypt_desp;
- int des_SPtrans_6_0, des_SPtrans_4_0, des_encrypt_encrypt, des_encrypt_i;
- long des_encrypt_s_0, _des_crypt_tin1, _des_crypt_tout0, _des_crypt_tout1,
-     _des_crypt_tin0;
- enum desmode _des_crypt_desp_0;
- unsigned long _des_crypt_tbuf[2];
- char _des_crypt_out;
- void des_encrypt(unsigned long *buf) {
-   long l, r, t;
-   l = buf[0];
-   r = buf[1];
-   t = r;
-   r ^= l ^= t < 6;
-   if (des_encrypt_encrypt)
-     for (;; des_encrypt_i += 4)
-       des_encrypt_s_0 ^= des_SPtrans_4_0 | des_SPtrans_6_0;
-   buf[1] = r;
- }
- void _des_crypt() {
-   long xor0, xor1;
-   unsigned char *in;
-   int cbc_mode = _des_crypt_desp_0;
-   in = _des_crypt_desp.des_ivec;
-   xor0 = xor1 = 0;
-   for (;;) {
-     _des_crypt_tin0 = *in++;
-     _des_crypt_tin0 |= *in++ << 8;
-     _des_crypt_tin0 |= *in++ << 16;
-     _des_crypt_tin0 |= (long)*in << 24;
-     _des_crypt_tin1 = *in++;
-     _des_crypt_tin1 |= *in++ << 8;
-     _des_crypt_tin1 |= *in++ << 16;
-     _des_crypt_tin1 |= (long)*in << 24;
-     _des_crypt_tbuf[0] = _des_crypt_tin0;
-     _des_crypt_tbuf[1] = _des_crypt_tin1;
-     des_encrypt(_des_crypt_tbuf);
-     if (cbc_mode) {
-       _des_crypt_tout0 = xor0;
-       _des_crypt_tout1 = _des_crypt_tbuf[1] ^ xor1;
-       xor0 = _des_crypt_tin0;
-       xor1 = _des_crypt_tin1;
-     } else {
-       _des_crypt_tout0 = _des_crypt_tbuf[0];
-       _des_crypt_tout1 = _des_crypt_tbuf[1];
-     }
-     _des_crypt_out = _des_crypt_tout0 * _des_crypt_tout1;
-   }
- }
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.target/i386/pr121571.c gcc-16-20260201/gcc/testsuite/gcc.target/i386/pr121571.c
*** gcc-16-20260125/gcc/testsuite/gcc.target/i386/pr121571.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gcc.target/i386/pr121571.c	Sun Feb  1 22:32:13 2026
***************
*** 0 ****
--- 1,14 ----
+ /* { dg-do compile } */
+ /* { dg-options "-march=skylake-avx512 -Os" } */
+ 
+ int a, b, c, d, e, f;
+ 
+ void
+ foo ()
+ {
+   int g[2] = { e, f };
+   if ((g[0] | g[1]) != 0)
+     __asm__ (""
+              : "=r" (d), "=&r" (c), "=&r" (b), "=&r" (a)
+              : "0" (0), "g" (g), "g" (g[1]), "g" (g[0]));
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.target/i386/pr123583.c gcc-16-20260201/gcc/testsuite/gcc.target/i386/pr123583.c
*** gcc-16-20260125/gcc/testsuite/gcc.target/i386/pr123583.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gcc.target/i386/pr123583.c	Sun Feb  1 22:32:13 2026
***************
*** 0 ****
--- 1,8 ----
+ /* { dg-do compile } */
+ /* { dg-additional-options "-std=gnu99 -w" } */
+ 
+ void h() {
+     if(1)
+       ;
+   __seg_gs const int *x = 0;
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.target/i386/pr36503-5.c gcc-16-20260201/gcc/testsuite/gcc.target/i386/pr36503-5.c
*** gcc-16-20260125/gcc/testsuite/gcc.target/i386/pr36503-5.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gcc.target/i386/pr36503-5.c	Sun Feb  1 22:32:13 2026
***************
*** 0 ****
--- 1,20 ----
+ /* PR target/36503 */
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -masm=att" } */
+ /* { dg-additional-options "-mregparm=3" { target ia32 } } */
+ /* { dg-final { scan-assembler-not "movl\[ \\t\]+\\\$31" } } */
+ 
+ int foo (int i, int n)
+ {
+   return i << (31 - n);
+ }
+ 
+ int bar (int i, int n)
+ {
+   return i >> (31 - n);
+ }
+ 
+ unsigned int baz (unsigned int i, int n)
+ {
+   return i >> (31 - n);
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.target/i386/pr36503-6.c gcc-16-20260201/gcc/testsuite/gcc.target/i386/pr36503-6.c
*** gcc-16-20260125/gcc/testsuite/gcc.target/i386/pr36503-6.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gcc.target/i386/pr36503-6.c	Sun Feb  1 22:32:13 2026
***************
*** 0 ****
--- 1,19 ----
+ /* PR target/36503 */
+ /* { dg-do compile { target { ! ia32 } } } */
+ /* { dg-options "-O2 -masm=att" } */
+ /* { dg-final { scan-assembler-not "movl\[ \\t\]+\\\$63" } } */
+ 
+ long long foo (long long i, int n)
+ {
+   return i << (63 - n);
+ }
+ 
+ long long bar (long long i, int n)
+ {
+   return i >> (63 - n);
+ }
+ 
+ unsigned long long baz (unsigned long long i, int n)
+ {
+   return i >> (63 - n);
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.target/loongarch/la64/movsf.c gcc-16-20260201/gcc/testsuite/gcc.target/loongarch/la64/movsf.c
*** gcc-16-20260125/gcc/testsuite/gcc.target/loongarch/la64/movsf.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gcc.target/loongarch/la64/movsf.c	Sun Feb  1 22:32:13 2026
***************
*** 0 ****
--- 1,16 ----
+ /* { dg-do compile } */
+ /* { dg-options "-mabi=lp64s" } */
+ 
+ float
+ __powisf2 (float x, int m)                                                      
+ {                                                                                
+   unsigned int n = m < 0 ? -(unsigned int) m : (unsigned int) m;                 
+   float y = n % 2 ? x : 1;                                                      
+   while (n >>= 1)                                                                
+     {                                                                            
+       x = x * x;                                                                 
+       if (n % 2)                                                                 
+ 	y = y * x;                                                                      
+     }                                                                            
+   return m < 0 ? 1/y : y;                                                        
+ }   
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.target/loongarch/vector/lasx/pr123766.c gcc-16-20260201/gcc/testsuite/gcc.target/loongarch/vector/lasx/pr123766.c
*** gcc-16-20260125/gcc/testsuite/gcc.target/loongarch/vector/lasx/pr123766.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gcc.target/loongarch/vector/lasx/pr123766.c	Sun Feb  1 22:32:13 2026
***************
*** 0 ****
--- 1,28 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -mlasx  -Werror -Wextra" } */
+ 
+ #include <lasxintrin.h>
+ 
+ __m256i v = {0, 0, 0, 0};
+ 
+ #define TEST(NAME)			  \
+   void test_##NAME (void)		  \
+   {					  \
+     long long r[4];			  \
+     __lasx_##NAME (v, r, 0);		  \
+   }
+ 
+ TEST (xvst);
+ TEST (xvstx);
+ 
+ #define TEST1(NAME, TYPE, NUM)		  \
+   void test_##NAME (void)		  \
+   {					  \
+     TYPE r[NUM];			  \
+     __lasx_##NAME (v, r, 0, 0);		  \
+   }
+ 
+ TEST1 (xvstelm_b, char, 32);
+ TEST1 (xvstelm_h, short, 16);
+ TEST1 (xvstelm_w, int, 8);
+ TEST1 (xvstelm_d, long long, 4);
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.target/loongarch/vector/lsx/pr123766.c gcc-16-20260201/gcc/testsuite/gcc.target/loongarch/vector/lsx/pr123766.c
*** gcc-16-20260125/gcc/testsuite/gcc.target/loongarch/vector/lsx/pr123766.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gcc.target/loongarch/vector/lsx/pr123766.c	Sun Feb  1 22:32:13 2026
***************
*** 0 ****
--- 1,28 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -mlsx  -Werror -Wextra" } */
+ 
+ #include <lsxintrin.h>
+ 
+ __m128i v = {0, 0};
+ 
+ #define TEST(NAME)			  \
+   void test_##NAME (void)		  \
+   {					  \
+     long long r[2];			  \
+     __lsx_##NAME (v, r, 0);		  \
+   }
+ 
+ TEST (vst);
+ TEST (vstx);
+ 
+ #define TEST1(NAME, TYPE, NUM)		  \
+   void test_##NAME (void)		  \
+   {					  \
+     TYPE r[NUM];			  \
+     __lsx_##NAME (v, r, 0, 0);		  \
+   }
+ 
+ TEST1 (vstelm_b, char, 16);
+ TEST1 (vstelm_h, short, 8);
+ TEST1 (vstelm_w, int, 4);
+ TEST1 (vstelm_d, long long, 2);
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.target/loongarch/vector/lsx/pr123807.c gcc-16-20260201/gcc/testsuite/gcc.target/loongarch/vector/lsx/pr123807.c
*** gcc-16-20260125/gcc/testsuite/gcc.target/loongarch/vector/lsx/pr123807.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gcc.target/loongarch/vector/lsx/pr123807.c	Sun Feb  1 22:32:13 2026
***************
*** 0 ****
--- 1,10 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O0 -msimd=lsx" } */
+ 
+ typedef long long v2i64 __attribute__ ((__vector_size__ (16)));
+ v2i64 a, b;
+ void
+ test (int imm8)
+ {
+   b = a << imm8;
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.target/riscv/abi/vls-gpr-1.c gcc-16-20260201/gcc/testsuite/gcc.target/riscv/abi/vls-gpr-1.c
*** gcc-16-20260125/gcc/testsuite/gcc.target/riscv/abi/vls-gpr-1.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gcc.target/riscv/abi/vls-gpr-1.c	Sun Feb  1 22:32:13 2026
***************
*** 0 ****
--- 1,15 ----
+ /* { dg-do compile } */
+ /* { dg-options "-march=rv64gcv -mabi=lp64d -O2" } */
+ 
+ /* Test that small VLS types (<= 2*XLEN = 128 bits) are passed in GPRs
+    per the psABI, not by reference.  */
+ 
+ typedef int __attribute__((vector_size(8))) v2si;
+ 
+ v2si test_vls_in_gpr (int a0, int a1, v2si a2)
+ {
+   return a2;
+ }
+ 
+ /* The 8-byte VLS vector should be passed in a2 and returned in a0.  */
+ /* { dg-final { scan-assembler-times "mv\ta0,a2" 1 } } */
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.target/riscv/abi/vls-gpr-10.c gcc-16-20260201/gcc/testsuite/gcc.target/riscv/abi/vls-gpr-10.c
*** gcc-16-20260125/gcc/testsuite/gcc.target/riscv/abi/vls-gpr-10.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gcc.target/riscv/abi/vls-gpr-10.c	Sun Feb  1 22:32:13 2026
***************
*** 0 ****
--- 1,17 ----
+ /* { dg-do compile } */
+ /* { dg-options "-march=rv32gcv -mabi=ilp32d -O2" } */
+ 
+ /* Test that VLS types > 2*XLEN (> 64 bits for rv32) are passed
+    by reference, not in GPRs.  */
+ 
+ typedef int __attribute__((vector_size(16))) v4si;
+ 
+ v4si test_vls_by_reference_rv32 (int a0, v4si a1)
+ {
+   return a1;
+ }
+ 
+ /* The 16-byte VLS vector should be passed by reference on rv32
+    (since 16 bytes > 2*4 = 8 bytes).  */
+ /* { dg-final { scan-assembler "vle32.v\tv\[0-9\]+,0\\(a2\\)" } } */
+ /* { dg-final { scan-assembler "vse32.v\tv\[0-9\]+,0\\(a0\\)" } } */
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.target/riscv/abi/vls-gpr-11.c gcc-16-20260201/gcc/testsuite/gcc.target/riscv/abi/vls-gpr-11.c
*** gcc-16-20260125/gcc/testsuite/gcc.target/riscv/abi/vls-gpr-11.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gcc.target/riscv/abi/vls-gpr-11.c	Sun Feb  1 22:32:13 2026
***************
*** 0 ****
--- 1,15 ----
+ /* { dg-do compile } */
+ /* { dg-options "-march=rv64gcv -mabi=lp64d -O2" } */
+ 
+ /* Test return value: small VLS types should be returned in GPRs.  */
+ 
+ typedef int __attribute__((vector_size(8))) v2si;
+ 
+ v2si make_vls (void)
+ {
+   v2si v = {1, 2};
+   return v;
+ }
+ 
+ /* The return value should use a0.  */
+ /* { dg-final { scan-assembler "ld\ta0," } } */
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.target/riscv/abi/vls-gpr-12.c gcc-16-20260201/gcc/testsuite/gcc.target/riscv/abi/vls-gpr-12.c
*** gcc-16-20260125/gcc/testsuite/gcc.target/riscv/abi/vls-gpr-12.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gcc.target/riscv/abi/vls-gpr-12.c	Sun Feb  1 22:32:13 2026
***************
*** 0 ****
--- 1,19 ----
+ /* { dg-do compile } */
+ /* { dg-options "-march=rv32gcv -mabi=ilp32d -O2" } */
+ 
+ /* Test that 8-byte VLS is split between GPR and stack when only
+    one GPR is available on rv32.  Per the psABI: "if only one register
+    is available, the first XLEN bits are passed in a register and the
+    remaining bits are passed on the stack."  */
+ 
+ typedef int __attribute__((vector_size(8))) v2si;
+ 
+ v2si test_vls_gpr_stack_split_rv32 (int a0, int a1, int a2, int a3,
+ 				    int a4, int a5, int a6, v2si a7)
+ {
+   return a7;
+ }
+ 
+ /* a0-a6 use 7 GPRs, leaving only a7.  The 8-byte VLS should be
+    split: first 4 bytes in a7, remaining 4 bytes on stack.  */
+ /* { dg-final { scan-assembler "sw\ta7," } } */
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.target/riscv/abi/vls-gpr-13.c gcc-16-20260201/gcc/testsuite/gcc.target/riscv/abi/vls-gpr-13.c
*** gcc-16-20260125/gcc/testsuite/gcc.target/riscv/abi/vls-gpr-13.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gcc.target/riscv/abi/vls-gpr-13.c	Sun Feb  1 22:32:13 2026
***************
*** 0 ****
--- 1,19 ----
+ /* { dg-do compile } */
+ /* { dg-options "-march=rv32gcv -mabi=ilp32d -O2" } */
+ 
+ /* Test stack split with two 8-byte VLS arguments on rv32.
+    First VLS splits between a7 and stack, second is fully on stack.  */
+ 
+ typedef int __attribute__((vector_size(8))) v2si;
+ 
+ v2si test_vls_gpr_stack_split2_rv32 (int a0, int a1, int a2, int a3,
+ 				     int a4, int a5, int a6, v2si a7,
+ 				     v2si a8)
+ {
+   v2si res = a7 + a8;
+   return res;
+ }
+ 
+ /* a7 splits (4 bytes in a7, 4 on stack), a8 fully on stack.  */
+ /* { dg-final { scan-assembler "sw\ta7," } } */
+ /* { dg-final { scan-assembler "lw\t\[at\]\[0-9\]+,\[0-9\]+\\(sp\\)" } } */
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.target/riscv/abi/vls-gpr-14.c gcc-16-20260201/gcc/testsuite/gcc.target/riscv/abi/vls-gpr-14.c
*** gcc-16-20260125/gcc/testsuite/gcc.target/riscv/abi/vls-gpr-14.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gcc.target/riscv/abi/vls-gpr-14.c	Sun Feb  1 22:32:13 2026
***************
*** 0 ****
--- 1,12 ----
+ /* { dg-do compile } */
+ /* { dg-options "-march=rv32gcv -mabi=ilp32d -O2" } */
+ 
+ typedef int v2si __attribute__ ((vector_size (8)));
+ int test (int accumulator, int dummy, v2si v1, v2si v2, v2si v3, v2si v4)
+ {
+   accumulator &= v4[0] & v4[1];
+   return accumulator;
+ }
+ 
+ /* v4 should be passed on the stack.  */
+ /* { dg-final { scan-assembler "vle32.v\tv\[0-9\]+,0\\(sp\\)" } } */
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.target/riscv/abi/vls-gpr-2.c gcc-16-20260201/gcc/testsuite/gcc.target/riscv/abi/vls-gpr-2.c
*** gcc-16-20260125/gcc/testsuite/gcc.target/riscv/abi/vls-gpr-2.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gcc.target/riscv/abi/vls-gpr-2.c	Sun Feb  1 22:32:13 2026
***************
*** 0 ****
--- 1,15 ----
+ /* { dg-do compile } */
+ /* { dg-options "-march=rv64gcv -mabi=lp64d -O2" } */
+ 
+ /* Test that 16-byte VLS types (= 2*XLEN for rv64) are passed in 2 GPRs.  */
+ 
+ typedef long __attribute__((vector_size(16))) v2di;
+ 
+ v2di test_vls_two_gprs (int a0, v2di a1)
+ {
+   return a1;
+ }
+ 
+ /* The 16-byte VLS vector is passed in a1,a2 and returned in a0,a1.  */
+ /* { dg-final { scan-assembler "sd\ta1," } } */
+ /* { dg-final { scan-assembler "sd\ta2," } } */
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.target/riscv/abi/vls-gpr-3.c gcc-16-20260201/gcc/testsuite/gcc.target/riscv/abi/vls-gpr-3.c
*** gcc-16-20260125/gcc/testsuite/gcc.target/riscv/abi/vls-gpr-3.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gcc.target/riscv/abi/vls-gpr-3.c	Sun Feb  1 22:32:13 2026
***************
*** 0 ****
--- 1,16 ----
+ /* { dg-do compile } */
+ /* { dg-options "-march=rv64gcv -mabi=lp64d -O2" } */
+ 
+ /* Test that small VLS types are passed in GPRs even when filling
+    the argument registers.  */
+ 
+ typedef int __attribute__((vector_size(8))) v2si;
+ 
+ v2si test_vls_multiple_gprs (int a0, int a1, int a2, int a3,
+ 			     int a4, int a5, v2si a6)
+ {
+   return a6;
+ }
+ 
+ /* a0-a5 are used by ints, the 8-byte VLS should use a6.  */
+ /* { dg-final { scan-assembler-times "mv\ta0,a6" 1 } } */
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.target/riscv/abi/vls-gpr-4.c gcc-16-20260201/gcc/testsuite/gcc.target/riscv/abi/vls-gpr-4.c
*** gcc-16-20260125/gcc/testsuite/gcc.target/riscv/abi/vls-gpr-4.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gcc.target/riscv/abi/vls-gpr-4.c	Sun Feb  1 22:32:13 2026
***************
*** 0 ****
--- 1,19 ----
+ /* { dg-do compile } */
+ /* { dg-options "-march=rv64gcv -mabi=lp64d -O2" } */
+ 
+ /* Test that 16-byte VLS is split between GPR and stack when only
+    one GPR is available.  Per the psABI: "if only one register is
+    available, the first XLEN bits are passed in a register and the
+    remaining bits are passed on the stack."  */
+ 
+ typedef long __attribute__((vector_size(16))) v2di;
+ 
+ v2di test_vls_gpr_stack_split (int a0, int a1, int a2, int a3,
+ 			       int a4, int a5, int a6, v2di a7)
+ {
+   return a7;
+ }
+ 
+ /* a0-a6 use 7 GPRs, leaving only a7.  The 16-byte VLS should be
+    split: first 8 bytes in a7, remaining 8 bytes on stack.  */
+ /* { dg-final { scan-assembler "sd\ta7," } } */
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.target/riscv/abi/vls-gpr-5.c gcc-16-20260201/gcc/testsuite/gcc.target/riscv/abi/vls-gpr-5.c
*** gcc-16-20260125/gcc/testsuite/gcc.target/riscv/abi/vls-gpr-5.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gcc.target/riscv/abi/vls-gpr-5.c	Sun Feb  1 22:32:13 2026
***************
*** 0 ****
--- 1,21 ----
+ /* { dg-do compile } */
+ /* { dg-options "-march=rv64gcv -mabi=lp64d -O2" } */
+ 
+ /* Test that 16-byte VLS is split between GPR and stack when only
+    one GPR is available.  Per the psABI: "if only one register is
+    available, the first XLEN bits are passed in a register and the
+    remaining bits are passed on the stack."  */
+ 
+ typedef long __attribute__((vector_size(16))) v2di;
+ 
+ v2di test_vls_gpr_stack_split2 (int a0, int a1, int a2, int a3,
+ 				int a4, int a5, int a6, v2di a7,
+ 				v2di a8)
+ {
+   v2di res = a7 + a8;
+   return res;
+ }
+ 
+ /* a0-a6 use 7 GPRs, leaving only a7.  The 16-byte VLS should be
+    split: first 8 bytes in a7, remaining 8 bytes on stack.  */
+ /* { dg-final { scan-assembler "sd\ta7," } } */
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.target/riscv/abi/vls-gpr-6.c gcc-16-20260201/gcc/testsuite/gcc.target/riscv/abi/vls-gpr-6.c
*** gcc-16-20260125/gcc/testsuite/gcc.target/riscv/abi/vls-gpr-6.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gcc.target/riscv/abi/vls-gpr-6.c	Sun Feb  1 22:32:13 2026
***************
*** 0 ****
--- 1,12 ----
+ /* { dg-do compile } */
+ /* { dg-options "-march=rv64gcv -mabi=lp64d -O2" } */
+ 
+ typedef int v4si __attribute__ ((vector_size (16)));
+ int test (int accumulator, int dummy, v4si v1, v4si v2, v4si v3, v4si v4)
+ {
+   accumulator &= v4[0] & v4[1] & v4[2] & v4[3];
+   return accumulator;
+ }
+ 
+ /* v4 should be passed on the stack.  */
+ /* { dg-final { scan-assembler "vle32.v\tv\[0-9\]+,0\\(sp\\)" } } */
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.target/riscv/abi/vls-gpr-7.c gcc-16-20260201/gcc/testsuite/gcc.target/riscv/abi/vls-gpr-7.c
*** gcc-16-20260125/gcc/testsuite/gcc.target/riscv/abi/vls-gpr-7.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gcc.target/riscv/abi/vls-gpr-7.c	Sun Feb  1 22:32:13 2026
***************
*** 0 ****
--- 1,14 ----
+ /* { dg-do compile } */
+ /* { dg-options "-march=rv64gcv -mabi=lp64d -O2" } */
+ 
+ /* Test that 4-byte VLS types (< XLEN) are passed in a single GPR.  */
+ 
+ typedef short __attribute__((vector_size(4))) v2hi;
+ 
+ v2hi test_vls_small (int a0, v2hi a1)
+ {
+   return a1;
+ }
+ 
+ /* The 4-byte VLS vector should be passed in a1.  */
+ /* { dg-final { scan-assembler-times "mv\ta0,a1" 1 } } */
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.target/riscv/abi/vls-gpr-8.c gcc-16-20260201/gcc/testsuite/gcc.target/riscv/abi/vls-gpr-8.c
*** gcc-16-20260125/gcc/testsuite/gcc.target/riscv/abi/vls-gpr-8.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gcc.target/riscv/abi/vls-gpr-8.c	Sun Feb  1 22:32:13 2026
***************
*** 0 ****
--- 1,15 ----
+ /* { dg-do compile } */
+ /* { dg-options "-march=rv32gcv -mabi=ilp32d -O2" } */
+ 
+ /* Test that 8-byte VLS types (= 2*XLEN for rv32) are passed in 2 GPRs.  */
+ 
+ typedef int __attribute__((vector_size(8))) v2si;
+ 
+ v2si test_vls_two_gprs_rv32 (int a0, v2si a1)
+ {
+   return a1;
+ }
+ 
+ /* The 8-byte VLS vector is passed in a1,a2 and returned in a0,a1 on rv32.  */
+ /* { dg-final { scan-assembler "mv\ta0,a1" } } */
+ /* { dg-final { scan-assembler "mv\ta1,a2" } } */
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.target/riscv/abi/vls-gpr-9.c gcc-16-20260201/gcc/testsuite/gcc.target/riscv/abi/vls-gpr-9.c
*** gcc-16-20260125/gcc/testsuite/gcc.target/riscv/abi/vls-gpr-9.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gcc.target/riscv/abi/vls-gpr-9.c	Sun Feb  1 22:32:13 2026
***************
*** 0 ****
--- 1,17 ----
+ /* { dg-do compile } */
+ /* { dg-options "-march=rv64gcv -mabi=lp64d -O2" } */
+ 
+ /* Test that VLS types > 2*XLEN (> 128 bits for rv64) are passed
+    by reference, not in GPRs.  */
+ 
+ typedef long __attribute__((vector_size(32))) v4di;
+ 
+ v4di test_vls_by_reference (int a0, v4di a1)
+ {
+   return a1;
+ }
+ 
+ /* The 32-byte VLS vector should be passed by reference.
+    Return value pointer in a0, argument pointer in a2 (a1 holds a0).  */
+ /* { dg-final { scan-assembler "vle64.v\tv\[0-9\]+,0\\(a2\\)" } } */
+ /* { dg-final { scan-assembler "vse64.v\tv\[0-9\]+,0\\(a0\\)" } } */
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.target/riscv/lto/pr110812_0.c gcc-16-20260201/gcc/testsuite/gcc.target/riscv/lto/pr110812_0.c
*** gcc-16-20260125/gcc/testsuite/gcc.target/riscv/lto/pr110812_0.c	Sun Jan 25 22:32:15 2026
--- gcc-16-20260201/gcc/testsuite/gcc.target/riscv/lto/pr110812_0.c	Sun Feb  1 22:32:13 2026
***************
*** 1,5 ****
  /* { dg-lto-do link } */
! /* { dg-lto-options { { -flto -march=rv64gc -mabi=lp64d } } } */
  /* { dg-extra-ld-options "-nostdlib" } */
  
  void foo();
--- 1,5 ----
  /* { dg-lto-do link } */
! /* { dg-lto-options { { -flto -march=rv64gc -mabi=lp64d -mcmodel=medany } } } */
  /* { dg-extra-ld-options "-nostdlib" } */
  
  void foo();
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.target/riscv/lto/pr110812_1.c gcc-16-20260201/gcc/testsuite/gcc.target/riscv/lto/pr110812_1.c
*** gcc-16-20260125/gcc/testsuite/gcc.target/riscv/lto/pr110812_1.c	Sun Jan 25 22:32:15 2026
--- gcc-16-20260201/gcc/testsuite/gcc.target/riscv/lto/pr110812_1.c	Sun Feb  1 22:32:13 2026
***************
*** 1,4 ****
! /* { dg-options { -flto -march=rv64gcv -mabi=lp64d } } */
  
  #include "riscv_vector.h"
  uint8_t *x, *y;
--- 1,4 ----
! /* { dg-options { -flto -march=rv64gcv -mabi=lp64d -mcmodel=medany } } */
  
  #include "riscv_vector.h"
  uint8_t *x, *y;
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.target/riscv/pr114139.c gcc-16-20260201/gcc/testsuite/gcc.target/riscv/pr114139.c
*** gcc-16-20260125/gcc/testsuite/gcc.target/riscv/pr114139.c	Sun Jan 25 22:32:15 2026
--- gcc-16-20260201/gcc/testsuite/gcc.target/riscv/pr114139.c	Sun Feb  1 22:32:13 2026
***************
*** 1,5 ****
  /* { dg-do compile { target { ! riscv_abi_e } } } */
! /* { dg-options "-O2 -fpic -mexplicit-relocs -mcpu=sifive-p450" } */
  
  static void *p;
  extern void *a[];
--- 1,5 ----
  /* { dg-do compile { target { ! riscv_abi_e } } } */
! /* { dg-options "-O2 -fpic -mexplicit-relocs -mcpu=sifive-p450 -mabi=lp64d" } */
  
  static void *p;
  extern void *a[];
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.target/riscv/pr118170.c gcc-16-20260201/gcc/testsuite/gcc.target/riscv/pr118170.c
*** gcc-16-20260125/gcc/testsuite/gcc.target/riscv/pr118170.c	Sun Jan 25 22:32:15 2026
--- gcc-16-20260201/gcc/testsuite/gcc.target/riscv/pr118170.c	Sun Feb  1 22:32:13 2026
***************
*** 1,5 ****
  /* { dg-do "compile" { target { ! riscv_abi_e } } } */
! /* { dg-options "-O2 -mcpu=tt-ascalon-d8" } */
  _Float16 f;
  
  void
--- 1,5 ----
  /* { dg-do "compile" { target { ! riscv_abi_e } } } */
! /* { dg-options "-O2 -mcpu=tt-ascalon-d8 -mabi=lp64d" } */
  _Float16 f;
  
  void
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.target/riscv/pr122215.c gcc-16-20260201/gcc/testsuite/gcc.target/riscv/pr122215.c
*** gcc-16-20260125/gcc/testsuite/gcc.target/riscv/pr122215.c	Sun Jan 25 22:32:15 2026
--- gcc-16-20260201/gcc/testsuite/gcc.target/riscv/pr122215.c	Sun Feb  1 22:32:13 2026
***************
*** 2,7 ****
--- 2,8 ----
  /* { dg-require-effective-target valgrind } */
  /* { dg-additional-files "sparseset.supp" } */
  /* { dg-options "-wrapper valgrind,-q,--exit-on-first-error=yes,--error-exitcode=1,--suppressions=${srcdir}/sparseset.supp" } */
+ /* { dg-prune-output ".*(WARNING: unhandled.*syscall|own handler|README_MISSING_SYSCALL|Please report|valgrind.org).*" } */
  
  typedef signed int int32_t;
  typedef signed long int int64_t;
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.target/riscv/rvv/autovec/binop/vadd-rv32gcv-nofm.c gcc-16-20260201/gcc/testsuite/gcc.target/riscv/rvv/autovec/binop/vadd-rv32gcv-nofm.c
*** gcc-16-20260125/gcc/testsuite/gcc.target/riscv/rvv/autovec/binop/vadd-rv32gcv-nofm.c	Sun Jan 25 22:32:15 2026
--- gcc-16-20260201/gcc/testsuite/gcc.target/riscv/rvv/autovec/binop/vadd-rv32gcv-nofm.c	Sun Feb  1 22:32:13 2026
***************
*** 1,5 ****
  /* { dg-do compile } */
! /* { dg-additional-options "-std=c99 -fno-vect-cost-model -march=rv32gcv_zvfh -mabi=ilp32d -mrvv-vector-bits=scalable -fdump-tree-optimized-details -fno-pie" } */
  
  #include "vadd-template.h"
  
--- 1,5 ----
  /* { dg-do compile } */
! /* { dg-additional-options "-std=c99 -fno-vect-cost-model -march=rv32gcv_zvfh -mabi=ilp32d -mcmodel=medlow -mrvv-vector-bits=scalable -fdump-tree-optimized-details -fno-pie" } */
  
  #include "vadd-template.h"
  
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.target/riscv/rvv/autovec/binop/vadd-rv64gcv-nofm.c gcc-16-20260201/gcc/testsuite/gcc.target/riscv/rvv/autovec/binop/vadd-rv64gcv-nofm.c
*** gcc-16-20260125/gcc/testsuite/gcc.target/riscv/rvv/autovec/binop/vadd-rv64gcv-nofm.c	Sun Jan 25 22:32:15 2026
--- gcc-16-20260201/gcc/testsuite/gcc.target/riscv/rvv/autovec/binop/vadd-rv64gcv-nofm.c	Sun Feb  1 22:32:13 2026
***************
*** 1,5 ****
  /* { dg-do compile } */
! /* { dg-additional-options "-std=c99 -fno-vect-cost-model -march=rv64gcv_zvfh -mabi=lp64d -mrvv-vector-bits=scalable -fdump-tree-optimized-details -fno-pie" } */
  
  #include "vadd-template.h"
  
--- 1,5 ----
  /* { dg-do compile } */
! /* { dg-additional-options "-std=c99 -fno-vect-cost-model -march=rv64gcv_zvfh -mabi=lp64d -mcmodel=medlow -mrvv-vector-bits=scalable -fdump-tree-optimized-details -fno-pie" } */
  
  #include "vadd-template.h"
  
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.target/riscv/rvv/autovec/binop/vsub-rv32gcv-nofm.c gcc-16-20260201/gcc/testsuite/gcc.target/riscv/rvv/autovec/binop/vsub-rv32gcv-nofm.c
*** gcc-16-20260125/gcc/testsuite/gcc.target/riscv/rvv/autovec/binop/vsub-rv32gcv-nofm.c	Sun Jan 25 22:32:15 2026
--- gcc-16-20260201/gcc/testsuite/gcc.target/riscv/rvv/autovec/binop/vsub-rv32gcv-nofm.c	Sun Feb  1 22:32:13 2026
***************
*** 1,5 ****
  /* { dg-do compile } */
! /* { dg-additional-options "-std=c99 -fno-vect-cost-model -march=rv32gcv_zvfh -mabi=ilp32d -mrvv-vector-bits=scalable -fdump-tree-optimized-details -fno-pie" } */
  
  #include "vsub-template.h"
  
--- 1,5 ----
  /* { dg-do compile } */
! /* { dg-additional-options "-std=c99 -fno-vect-cost-model -march=rv32gcv_zvfh -mabi=ilp32d -mcmodel=medlow -mrvv-vector-bits=scalable -fdump-tree-optimized-details -fno-pie" } */
  
  #include "vsub-template.h"
  
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.target/riscv/rvv/autovec/binop/vsub-rv64gcv-nofm.c gcc-16-20260201/gcc/testsuite/gcc.target/riscv/rvv/autovec/binop/vsub-rv64gcv-nofm.c
*** gcc-16-20260125/gcc/testsuite/gcc.target/riscv/rvv/autovec/binop/vsub-rv64gcv-nofm.c	Sun Jan 25 22:32:15 2026
--- gcc-16-20260201/gcc/testsuite/gcc.target/riscv/rvv/autovec/binop/vsub-rv64gcv-nofm.c	Sun Feb  1 22:32:13 2026
***************
*** 1,5 ****
  /* { dg-do compile } */
! /* { dg-additional-options "-std=c99 -fno-vect-cost-model -march=rv64gcv_zvfh -mabi=lp64d -mrvv-vector-bits=scalable -fdump-tree-optimized-details -fno-pie" } */
  
  #include "vsub-template.h"
  
--- 1,5 ----
  /* { dg-do compile } */
! /* { dg-additional-options "-std=c99 -fno-vect-cost-model -march=rv64gcv_zvfh -mabi=lp64d -mcmodel=medlow -mrvv-vector-bits=scalable -fdump-tree-optimized-details -fno-pie" } */
  
  #include "vsub-template.h"
  
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.target/riscv/rvv/autovec/bug-3.c gcc-16-20260201/gcc/testsuite/gcc.target/riscv/rvv/autovec/bug-3.c
*** gcc-16-20260125/gcc/testsuite/gcc.target/riscv/rvv/autovec/bug-3.c	Sun Jan 25 22:32:15 2026
--- gcc-16-20260201/gcc/testsuite/gcc.target/riscv/rvv/autovec/bug-3.c	Sun Feb  1 22:32:13 2026
***************
*** 1,5 ****
  /* { dg-do compile } */
! /* { dg-options "-march=rv64gcv_zvl512b -mabi=lp64d -mrvv-max-lmul=m8 -mrvv-vector-bits=scalable -fno-vect-cost-model -O2 -ffast-math" } */
  /* { dg-final { check-function-bodies "**" "" } } */
  
  #define N 16
--- 1,5 ----
  /* { dg-do compile } */
! /* { dg-options "-march=rv64gcv_zvl512b -mabi=lp64d -mrvv-max-lmul=m8 -mrvv-vector-bits=scalable -fno-vect-cost-model -O2 -ffast-math -fno-schedule-insns -fno-schedule-insns2" } */
  /* { dg-final { check-function-bodies "**" "" } } */
  
  #define N 16
*************** _Complex float res[N] =
*** 31,38 ****
  ** ...
  ** csrr\s+[atx][0-9]+,\s*vlenb
  ** slli\s+[atx][0-9]+,\s*[atx][0-9],\s*1
! ** ...
! ** slli\s+[atx][0-9]+,\s*[atx][0-9],\s*32
  ** ...
  */
  void
--- 31,37 ----
  ** ...
  ** csrr\s+[atx][0-9]+,\s*vlenb
  ** slli\s+[atx][0-9]+,\s*[atx][0-9],\s*1
! ** slli\s+[atx][0-9]+,\s*[atx][0-9],\s*33
  ** ...
  */
  void
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr113206-2.c gcc-16-20260201/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr113206-2.c
*** gcc-16-20260125/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr113206-2.c	Sun Jan 25 22:32:15 2026
--- gcc-16-20260201/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr113206-2.c	Sun Feb  1 22:32:13 2026
***************
*** 1,5 ****
  /* { dg-do compile } */
! /* { dg-options "-march=rv64gcv -mabi=lp64d -O3 -frename-registers -mrvv-max-lmul=m8" } */
  
  signed char e;
  short f = 8;
--- 1,5 ----
  /* { dg-do compile } */
! /* { dg-options "-march=rv64gcv -mabi=lp64d -mcmodel=medlow -O3 -frename-registers -mrvv-max-lmul=m8" } */
  
  signed char e;
  short f = 8;
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls-vlmax/shuffle-slide.c gcc-16-20260201/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls-vlmax/shuffle-slide.c
*** gcc-16-20260125/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls-vlmax/shuffle-slide.c	Sun Jan 25 22:32:15 2026
--- gcc-16-20260201/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls-vlmax/shuffle-slide.c	Sun Feb  1 22:32:14 2026
***************
*** 1,5 ****
  /* { dg-do compile { target { ! riscv_abi_e } } } */
! /* { dg-options "-O3 -march=rv64gcv -mrvv-max-lmul=m8 -Wno-overflow" } */
  
  #include "perm.h"
  
--- 1,5 ----
  /* { dg-do compile { target { ! riscv_abi_e } } } */
! /* { dg-options "-O3 -march=rv64gcv -mabi=lp64d -mrvv-max-lmul=m8 -Wno-overflow" } */
  
  #include "perm.h"
  
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.target/riscv/rvv/base/pr123626.c gcc-16-20260201/gcc/testsuite/gcc.target/riscv/rvv/base/pr123626.c
*** gcc-16-20260125/gcc/testsuite/gcc.target/riscv/rvv/base/pr123626.c	Sun Jan 25 22:32:15 2026
--- gcc-16-20260201/gcc/testsuite/gcc.target/riscv/rvv/base/pr123626.c	Sun Feb  1 22:32:14 2026
***************
*** 1,6 ****
--- 1,8 ----
  /* { dg-do run } */
  /* { dg-options "-march=rv64gcv_zvl256b -mabi=lp64d -O3 -fsigned-char -fno-strict-aliasing -fwrapv -std=gnu99" { target rv64 } } */
  /* { dg-options "-march=rv32gcv_zvl256b -mabi=ilp32 -O3 -fsigned-char -fno-strict-aliasing -fwrapv -std=gnu99" { target rv32 } } */
+ /* { dg-require-effective-target rvv_zvl_ge_256b_ok } */
+ 
  short a;
  long long b;
  char c[3][3][17];
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gcc.target/riscv/rvv/pr122474.c gcc-16-20260201/gcc/testsuite/gcc.target/riscv/rvv/pr122474.c
*** gcc-16-20260125/gcc/testsuite/gcc.target/riscv/rvv/pr122474.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gcc.target/riscv/rvv/pr122474.c	Sun Feb  1 22:32:14 2026
***************
*** 0 ****
--- 1,15 ----
+ /* { dg-do compile } */
+ /* { dg-options "-march=rv64gcv_zvl256b -O3 -fwrapv -w" } */
+ 
+ _Bool a;
+ void b(unsigned c[][8][8][8][8][8]) {
+   for (int d = 1; d; d += 3)
+     for (int e = 0; e < 11; e += 2)
+       for (short f = 0; f < 1; f = 30482)
+         for (short g = 0; g < 014; g++)
+           a = ({
+             int h = a;
+             int i = c[2][f][d][d][d][d] ^ c[g][g][1][2][g][g];
+             i ? h : i;
+           });
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.dg/asm1.d gcc-16-20260201/gcc/testsuite/gdc.dg/asm1.d
*** gcc-16-20260125/gcc/testsuite/gdc.dg/asm1.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.dg/asm1.d	Sun Feb  1 22:32:14 2026
*************** void parse1()
*** 5,32 ****
  {
      asm
      {
!         ""h;    // { dg-error "found 'h' when expecting ':'" }
      }
  }
  
  void parse2()
  {
!     asm 
      {
          "" : : "g" (1 ? 2 : 3);
          "" : : "g" (1 ? 2 : :) 3;
          // { dg-error "expression expected, not ':'" "" { target *-*-* } .-1 }
!         // { dg-error "expected constant string constraint for operand" "" { target *-*-* } .-2 }
      }
  }
  
  void parse3()
  {
!     asm { "" [; }
!     // { dg-error "expression expected, not ';'" "" { target *-*-* } .-1 }
!     // { dg-error "found 'End of File' when expecting ','" "" { target *-*-* } .-2 }
!     // { dg-error "found 'End of File' when expecting ']'" "" { target *-*-* } .-3 }
!     // { dg-error "found 'End of File' when expecting ';'" "" { target *-*-* } .-4 }
  }
  
  void parse4()
--- 5,28 ----
  {
      asm
      {
!         ""h;    // { dg-error "found 'h' when expecting ';'" }
      }
  }
  
  void parse2()
  {
!     asm
      {
          "" : : "g" (1 ? 2 : 3);
          "" : : "g" (1 ? 2 : :) 3;
          // { dg-error "expression expected, not ':'" "" { target *-*-* } .-1 }
!         // { dg-error "found '3' when expecting ';'" "" { target *-*-* } .-2 }
      }
  }
  
  void parse3()
  {
!     asm { "" [; } // { dg-error "found '\\\[' when expecting ';'" }
  }
  
  void parse4()
*************** void parse4()
*** 34,40 ****
      int expr;
      asm
      {
!         "%name" : [name] string (expr); // { dg-error "expected constant string constraint for operand, not 'string'" }
      }
  }
  
--- 30,36 ----
      int expr;
      asm
      {
!         "%name" : [name] string (expr); // { dg-error "expected string literal or expression in parentheses" }
      }
  }
  
*************** void semantic2()
*** 68,76 ****
  
  void semantic3()
  {
!     asm 
      {
!         unknown;        // { dg-error "undefined identifier 'unknown'" }
      }
  }
  
--- 64,72 ----
  
  void semantic3()
  {
!     asm
      {
!         unknown;        // { dg-error "expected string literal or expression in parentheses" }
      }
  }
  
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.dg/asm5.d gcc-16-20260201/gcc/testsuite/gdc.dg/asm5.d
*** gcc-16-20260125/gcc/testsuite/gdc.dg/asm5.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.dg/asm5.d	Sun Feb  1 22:32:14 2026
*************** void test(int a)
*** 7,12 ****
  {
      asm
      {
!         "cpuid" : : "a" a;  // { dg-error "'a' must be surrounded by parentheses" }
      }
  }
--- 7,12 ----
  {
      asm
      {
!         "cpuid" : : "a" a;  // { dg-error "found 'a' when expecting '\\\('" }
      }
  }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.dg/debug/pr123263.d gcc-16-20260201/gcc/testsuite/gdc.dg/debug/pr123263.d
*** gcc-16-20260125/gcc/testsuite/gdc.dg/debug/pr123263.d	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gdc.dg/debug/pr123263.d	Sun Feb  1 22:32:14 2026
***************
*** 0 ****
--- 1,10 ----
+ // { dg-do compile }
+ void pr123263()
+ {
+     struct UDA(T)
+     {
+         string name;
+         T value;
+     }
+     @UDA!string() int k;
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.dg/driver_debuglib.d gcc-16-20260201/gcc/testsuite/gdc.dg/driver_debuglib.d
*** gcc-16-20260125/gcc/testsuite/gdc.dg/driver_debuglib.d	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gdc.dg/driver_debuglib.d	Sun Feb  1 22:32:14 2026
***************
*** 0 ****
--- 1,2 ----
+ // { dg-do compile }
+ // { dg-additional-options "-debuglib=a -debuglib=b" }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.dg/driver_defaultlib.d gcc-16-20260201/gcc/testsuite/gdc.dg/driver_defaultlib.d
*** gcc-16-20260125/gcc/testsuite/gdc.dg/driver_defaultlib.d	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gdc.dg/driver_defaultlib.d	Sun Feb  1 22:32:14 2026
***************
*** 0 ****
--- 1,2 ----
+ // { dg-do compile }
+ // { dg-additional-options "-defaultlib=a -defaultlib=b" }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.dg/pr100967.d gcc-16-20260201/gcc/testsuite/gdc.dg/pr100967.d
*** gcc-16-20260125/gcc/testsuite/gdc.dg/pr100967.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.dg/pr100967.d	Sun Feb  1 22:32:14 2026
***************
*** 3,11 ****
  
  module object;
  
  extern(C) int main()
  {
!     int[int] aa; // { dg-error ".object.TypeInfo. could not be found" }
!     aa[0] = 1;  // { dg-error ".object.TypeInfo. could not be found, but is implicitly used" }
      return 0;
  }
--- 3,15 ----
  
  module object;
  
+ class Object {}
+ class TypeInfo {}
+ class TypeInfo_AssociativeArray : TypeInfo {} // { dg-note "defined here" }
+ 
  extern(C) int main()
  {
!     int[int] aa; // { dg-error "no property" }
!     aa[0] = 1;  // { dg-error "'object._d_aaGetY' not found" }
      return 0;
  }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.dg/pr121477.d gcc-16-20260201/gcc/testsuite/gdc.dg/pr121477.d
*** gcc-16-20260125/gcc/testsuite/gdc.dg/pr121477.d	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gdc.dg/pr121477.d	Sun Feb  1 22:32:14 2026
***************
*** 0 ****
--- 1,12 ----
+ // { dg-do compile }
+ // { dg-additional-options "-fpreview=bitfields" }
+ struct S121477
+ {
+     int x : 4;
+ }
+ 
+ void f121477(S121477 s)
+ {
+     asm {"%0" :: "m" (s.x); } // { dg-error "cannot take address of bit-field" }
+     asm {"%0" : "=m" (s.x); } // { dg-error "cannot take address of bit-field" }
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.dg/pr122817.d gcc-16-20260201/gcc/testsuite/gdc.dg/pr122817.d
*** gcc-16-20260125/gcc/testsuite/gdc.dg/pr122817.d	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gdc.dg/pr122817.d	Sun Feb  1 22:32:14 2026
***************
*** 0 ****
--- 1,4 ----
+ // { dg-do compile }
+ module pr122817;
+ 
+ struct object {} // { dg-error "conflicts with import 'pr122817.object' at .*pr122817.d" }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.dg/pr123046.d gcc-16-20260201/gcc/testsuite/gdc.dg/pr123046.d
*** gcc-16-20260125/gcc/testsuite/gdc.dg/pr123046.d	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gdc.dg/pr123046.d	Sun Feb  1 22:32:14 2026
***************
*** 0 ****
--- 1,10 ----
+ // { dg-do compile }
+ ulong pure_hashOf(const ref typeof(*null) key)
+ {
+     return hashOf(key);
+ }
+ 
+ ulong hashOf(const typeof(*null) val)
+ {
+     return 0;
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.dg/pr123264.d gcc-16-20260201/gcc/testsuite/gdc.dg/pr123264.d
*** gcc-16-20260125/gcc/testsuite/gdc.dg/pr123264.d	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gdc.dg/pr123264.d	Sun Feb  1 22:32:14 2026
***************
*** 0 ****
--- 1,8 ----
+ // { dg-do compile }
+ // { dg-options "-fdump-tree-original" }
+ struct S123264
+ {
+     void infinite(const S123264) { }
+     auto fn = &infinite;
+ }
+ // { dg-final { scan-tree-dump "const struct S123264" "original" } }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.dg/pr123407a.d gcc-16-20260201/gcc/testsuite/gdc.dg/pr123407a.d
*** gcc-16-20260125/gcc/testsuite/gdc.dg/pr123407a.d	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gdc.dg/pr123407a.d	Sun Feb  1 22:32:14 2026
***************
*** 0 ****
--- 1,4 ----
+ // { dg-do compile }
+ module pr123407;
+ pragma(mangle, "ice") int fun();
+ pragma(mangle, "ice") int var; // { dg-error "matches conflicting symbols" }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.dg/pr123407b.d gcc-16-20260201/gcc/testsuite/gdc.dg/pr123407b.d
*** gcc-16-20260125/gcc/testsuite/gdc.dg/pr123407b.d	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gdc.dg/pr123407b.d	Sun Feb  1 22:32:14 2026
***************
*** 0 ****
--- 1,4 ----
+ // { dg-do compile }
+ module pr123407;
+ int fun();
+ extern(C) int _D8pr1234073funFZi; // { dg-error "matches conflicting symbols" }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.dg/pr123419.d gcc-16-20260201/gcc/testsuite/gdc.dg/pr123419.d
*** gcc-16-20260125/gcc/testsuite/gdc.dg/pr123419.d	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gdc.dg/pr123419.d	Sun Feb  1 22:32:14 2026
***************
*** 0 ****
--- 1,9 ----
+ // { dg-do compile }
+ struct S123419 {}
+ 
+ void t123419(T)(T _) {}
+ 
+ void f123419()
+ {
+     t123419(__traits(initSymbol, S123419));
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.dg/pr123798.d gcc-16-20260201/gcc/testsuite/gdc.dg/pr123798.d
*** gcc-16-20260125/gcc/testsuite/gdc.dg/pr123798.d	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gdc.dg/pr123798.d	Sun Feb  1 22:32:14 2026
***************
*** 0 ****
--- 1,14 ----
+ // { dg-do compile }
+ // { dg-additional-options "-fpreview=bitfields" }
+ class C123798
+ {
+     int a : 4;
+     long b : 8;
+ }
+ 
+ struct S123798
+ {
+     int a = 1;
+     int b : 4;
+     long c : 8;
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.dg/rtti1.d gcc-16-20260201/gcc/testsuite/gdc.dg/rtti1.d
*** gcc-16-20260125/gcc/testsuite/gdc.dg/rtti1.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.dg/rtti1.d	Sun Feb  1 22:32:14 2026
***************
*** 2,13 ****
  // { dg-options "-fno-rtti" }
  // { dg-shouldfail "expressions depend on TypeInfo" }
  
! int* testInExp(int key, int[int] aa)
  {
!     return key in aa; // { dg-error "requires .object.TypeInfo. and cannot be used with .-fno-rtti." }
  }
  
! bool testAAEqual(int[string] aa1, int[string] aa2)
  {
!     return aa1 == aa2; // { dg-error "requires .object.TypeInfo. and cannot be used with .-fno-rtti." }
  }
--- 2,28 ----
  // { dg-options "-fno-rtti" }
  // { dg-shouldfail "expressions depend on TypeInfo" }
  
! module object;
! 
! class Object {}
! class TypeInfo {}
! 
! struct AA(K, V)
  {
!     this(int sz) nothrow
!     {
!         keyTI = typeid(K); // { dg-error "'object.TypeInfo' cannot be used with '-fno-rtti'" }
!     }
!     TypeInfo keyTI;
  }
  
! auto _d_aaIn(T : V[K], K, V, K2)(inout T a, auto ref scope K2 key)
  {
!     auto aa = *(cast(inout(AA!(K, V))*)&a); // { dg-note "instantiated from here" }
!     return null;
! }
! 
! int* testInExp(int key, int[int] aa)
! {
!     return key in aa; // { dg-note "instantiated from here" }
  }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.dg/rtti2.d gcc-16-20260201/gcc/testsuite/gdc.dg/rtti2.d
*** gcc-16-20260125/gcc/testsuite/gdc.dg/rtti2.d	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gdc.dg/rtti2.d	Sun Feb  1 22:32:14 2026
***************
*** 0 ****
--- 1,29 ----
+ // { dg-do compile }
+ // { dg-options "-fno-rtti" }
+ // { dg-shouldfail "expressions depend on TypeInfo" }
+ 
+ module object;
+ 
+ class Object {}
+ class TypeInfo {}
+ class TypeInfo_Array : TypeInfo {}
+ 
+ struct AA(K, V)
+ {
+     this(int sz) nothrow
+     {
+         keyTI = typeid(K); // { dg-error "'object.TypeInfo' cannot be used with '-fno-rtti'" }
+     }
+     TypeInfo keyTI;
+ }
+ 
+ bool _d_aaEqual(K, V)(scope const V[K] a1, scope const V[K] a2)
+ {
+     auto aa1 = *(cast(const(AA!(K, V))*)&a1); // { dg-note "instantiated from here" }
+     return false;
+ }
+ 
+ bool testAAEqual(int[immutable(char)[]] aa1, int[immutable(char)[]] aa2)
+ {
+     return aa1 == aa2; // { dg-note "instantiated from here" }
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.dg/torture/pr120096.d gcc-16-20260201/gcc/testsuite/gdc.dg/torture/pr120096.d
*** gcc-16-20260125/gcc/testsuite/gdc.dg/torture/pr120096.d	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gdc.dg/torture/pr120096.d	Sun Feb  1 22:32:14 2026
***************
*** 0 ****
--- 1,18 ----
+ // { dg-do run }
+ // { dg-additional-options "-fpreview=dip1000" }
+ // { dg-skip-if "needs gcc/config.d" { ! d_runtime } }
+ struct S
+ {
+     this(int p) nothrow @nogc @safe
+     { f = p; }
+     int f;
+ }
+ 
+ int main() nothrow @nogc @safe
+ {
+     scope S[] sa = [S(1), S(2)];
+ 
+     assert(sa[0].f == 1);
+     assert(sa[1].f == 2);
+     return 0;
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.dg/torture/pr123422.d gcc-16-20260201/gcc/testsuite/gdc.dg/torture/pr123422.d
*** gcc-16-20260125/gcc/testsuite/gdc.dg/torture/pr123422.d	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gdc.dg/torture/pr123422.d	Sun Feb  1 22:32:14 2026
***************
*** 0 ****
--- 1,25 ----
+ // { dg-do run }
+ // { dg-skip-if "needs gcc/config.d" { ! d_runtime } }
+ struct S123422
+ {
+     S123422* ptr;
+     this(int) { ptr = &this; }
+     this(ref inout S123422) { ptr = &this; }
+ }
+ 
+ struct V123422
+ {
+     S123422 s;
+     this(int) { s = S123422(1); }
+ }
+ 
+ S123422 foo()
+ {
+     return V123422(1).s;
+ }
+ 
+ void main()
+ {
+     S123422 s = foo();
+     assert(&s == s.ptr);
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/compilable/b1215.d gcc-16-20260201/gcc/testsuite/gdc.test/compilable/b1215.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/compilable/b1215.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/compilable/b1215.d	Sun Feb  1 22:32:14 2026
*************** struct Bar14986
*** 134,140 ****
  
  Bar14986 test14986()
  {
!     Foo14986[] types;
      auto a1 = new void[types[0].tsize];                 // TypeIdentifier::toExpression
      auto a2 = new void[Id14986!types[0].tsize];         // TypeInstance::toExpression
  
--- 134,140 ----
  
  Bar14986 test14986()
  {
!     Foo14986[] types = [Foo14986(1)];
      auto a1 = new void[types[0].tsize];                 // TypeIdentifier::toExpression
      auto a2 = new void[Id14986!types[0].tsize];         // TypeInstance::toExpression
  
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/compilable/extra-files/header1.d gcc-16-20260201/gcc/testsuite/gdc.test/compilable/extra-files/header1.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/compilable/extra-files/header1.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/compilable/extra-files/header1.d	Sun Feb  1 22:32:14 2026
*************** struct SafeS
*** 566,572 ****
  {
      this(int[1] x) scope {}
  	this(int[2] x) return scope {}
! 	this(int[3] x) scope return {}
  	this(int[4] x) return {}
  
  @safe:
--- 566,572 ----
  {
      this(int[1] x) scope {}
  	this(int[2] x) return scope {}
! 	this(int[3] x) return ref scope {}
  	this(int[4] x) return {}
  
  @safe:
*************** interface I12344
*** 627,629 ****
--- 627,631 ----
  {
      int i12344(int x) in(x > 0) out(result) {assert(result > 0);};
  }
+ 
+ debug enum issue21406 = 1;
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/compilable/extra-files/test21331.d gcc-16-20260201/gcc/testsuite/gdc.test/compilable/extra-files/test21331.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/compilable/extra-files/test21331.d	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gdc.test/compilable/extra-files/test21331.d	Sun Feb  1 22:32:14 2026
***************
*** 0 ****
--- 1,17 ----
+ struct S(alias fun) {
+     int foo() {
+         int r = fun(0);
+         static foreach (i; 0..2)
+             r += (x => 2)(0);
+         return r;
+     }
+ }
+ 
+ int bar() {
+     int r;
+     static foreach (i; 0..2)
+         r += S!(x => 1)().foo();
+     return r;
+ }
+ 
+ // nm test21331.o | grep __lambda_L5_C19
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/compilable/extra-files/test21359a.d gcc-16-20260201/gcc/testsuite/gdc.test/compilable/extra-files/test21359a.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/compilable/extra-files/test21359a.d	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gdc.test/compilable/extra-files/test21359a.d	Sun Feb  1 22:32:14 2026
***************
*** 0 ****
--- 1,3 ----
+ void registerAll() {
+     import test21359b;
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/compilable/extra-files/test21359b.d gcc-16-20260201/gcc/testsuite/gdc.test/compilable/extra-files/test21359b.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/compilable/extra-files/test21359b.d	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gdc.test/compilable/extra-files/test21359b.d	Sun Feb  1 22:32:14 2026
***************
*** 0 ****
--- 1,11 ----
+ struct SumType(Types...)
+ {
+     static foreach (T; Types)
+         T values_;
+ }
+ 
+ SumType!(string[int]) convertObserver;
+ 
+ void hackAroundLinkerError() {
+     auto t = typeid(const(immutable(char)[][]));
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/compilable/imports/cstuff3.c gcc-16-20260201/gcc/testsuite/gdc.test/compilable/imports/cstuff3.c
*** gcc-16-20260125/gcc/testsuite/gdc.test/compilable/imports/cstuff3.c	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/compilable/imports/cstuff3.c	Sun Feb  1 22:32:14 2026
*************** int squared(int a)
*** 4,6 ****
--- 4,19 ----
  {
      return a * a;
  }
+ 
+ /* test case for issue #21094 */
+ typedef enum upng_error {
+     UPNG_EOK            = 0, /* success (no error) */
+     UPNG_ENOMEM         = 1, /* memory allocation failed */
+     UPNG_ENOTFOUND      = 2, /* resource not found (file missing) */
+     UPNG_ENOTPNG        = 3, /* image data does not have a PNG header */
+     UPNG_EMALFORMED     = 4, /* image data is not a valid PNG image */
+     UPNG_EUNSUPPORTED   = 5, /* critical PNG chunk type is not supported */
+     UPNG_EUNINTERLACED  = 6, /* image interlacing is not supported */
+     UPNG_EUNFORMAT      = 7, /* image color format is not supported */
+     UPNG_EPARAM         = 8  /* invalid parameter to method call */
+ } upng_error;
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/compilable/imports/h20184.h gcc-16-20260201/gcc/testsuite/gdc.test/compilable/imports/h20184.h
*** gcc-16-20260125/gcc/testsuite/gdc.test/compilable/imports/h20184.h	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gdc.test/compilable/imports/h20184.h	Sun Feb  1 22:32:14 2026
***************
*** 0 ****
--- 1 ----
+ int f20184(void);
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/compilable/imports/imp18127a.c gcc-16-20260201/gcc/testsuite/gdc.test/compilable/imports/imp18127a.c
*** gcc-16-20260125/gcc/testsuite/gdc.test/compilable/imports/imp18127a.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gdc.test/compilable/imports/imp18127a.c	Sun Feb  1 22:32:14 2026
***************
*** 0 ****
--- 1,74 ----
+ // https://github.com/dlang/dmd/issues/18127
+ union struct_or_union {
+     int x;
+ };
+ 
+ struct S_n_fields {
+     int x, y;
+ };
+ 
+ struct S_types {
+     float x;
+ };
+ 
+ struct S_names {
+     float x;
+ };
+ 
+ struct B {
+     int x;
+ };
+ 
+ struct S_b {
+     struct B b;
+ };
+ 
+ struct S_contains_anon_named {
+     struct {
+         int x;
+     } a;
+ };
+ 
+ struct S_contains_anon_unnamed {
+     struct {
+         int x;
+     };
+ };
+ 
+ struct S_bitfields_mismatch1 {
+     unsigned x: 3;
+     unsigned y: 1;
+ };
+ struct S_bitfields_mismatch2 {
+     unsigned x;
+     unsigned y: 1;
+ };
+ 
+ struct S_bitfields_widths {
+     unsigned x: 3;
+     unsigned y: 1;
+ };
+ 
+ struct S_bitfields_anon {
+     unsigned x: 3;
+     unsigned : 1;
+ };
+ 
+ struct S_alignas {
+     _Alignas(8) float x;
+ };
+ struct S_aligned {
+     float x;
+ }__attribute__((aligned(8)));
+ 
+ struct __attribute__((packed)) S_pack_1 {
+     float x;
+     char c;
+ };
+ #pragma pack(push)
+ #pragma pack(1)
+ struct S_pack_2 {
+     float x;
+     char c;
+ };
+ #pragma pack(pop)
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/compilable/imports/imp18127b.c gcc-16-20260201/gcc/testsuite/gdc.test/compilable/imports/imp18127b.c
*** gcc-16-20260125/gcc/testsuite/gdc.test/compilable/imports/imp18127b.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gdc.test/compilable/imports/imp18127b.c	Sun Feb  1 22:32:14 2026
***************
*** 0 ****
--- 1,74 ----
+ // https://github.com/dlang/dmd/issues/18127
+ union struct_or_union {
+     int x;
+ };
+ 
+ struct S_n_fields {
+     int x, y;
+ };
+ 
+ struct S_types {
+     float x;
+ };
+ 
+ struct S_names {
+     float x;
+ };
+ 
+ struct B {
+     int x;
+ };
+ 
+ struct S_b {
+     struct B b;
+ };
+ 
+ struct S_contains_anon_named {
+     struct {
+         int x;
+     } a;
+ };
+ 
+ struct S_contains_anon_unnamed {
+     struct {
+         int x;
+     };
+ };
+ 
+ struct S_bitfields_mismatch1 {
+     unsigned x: 3;
+     unsigned y: 1;
+ };
+ struct S_bitfields_mismatch2 {
+     unsigned x;
+     unsigned y: 1;
+ };
+ 
+ struct S_bitfields_widths {
+     unsigned x: 3;
+     unsigned y: 1;
+ };
+ 
+ struct S_bitfields_anon {
+     unsigned x: 3;
+     unsigned : 1;
+ };
+ 
+ struct S_alignas {
+     _Alignas(8) float x;
+ };
+ struct S_aligned {
+     float x;
+ }__attribute__((aligned(8)));
+ 
+ struct __attribute__((packed)) S_pack_1 {
+     float x;
+     char c;
+ };
+ #pragma pack(push)
+ #pragma pack(1)
+ struct S_pack_2 {
+     float x;
+     char c;
+ };
+ #pragma pack(pop)
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/compilable/imports/imp20344.c gcc-16-20260201/gcc/testsuite/gdc.test/compilable/imports/imp20344.c
*** gcc-16-20260125/gcc/testsuite/gdc.test/compilable/imports/imp20344.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gdc.test/compilable/imports/imp20344.c	Sun Feb  1 22:32:14 2026
***************
*** 0 ****
--- 1,2 ----
+ // https://github.com/dlang/dmd/issues/20334
+ #define X "X"
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/compilable/imports/imp20499.c gcc-16-20260201/gcc/testsuite/gdc.test/compilable/imports/imp20499.c
*** gcc-16-20260125/gcc/testsuite/gdc.test/compilable/imports/imp20499.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gdc.test/compilable/imports/imp20499.c	Sun Feb  1 22:32:14 2026
***************
*** 0 ****
--- 1,8 ----
+ // https://github.com/dlang/dmd/issues/20499
+ typedef struct Foo {
+     int x;
+ } *pFoo;
+ 
+ struct Bar {
+     struct Foo foo;
+ };
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/compilable/interpret4.d gcc-16-20260201/gcc/testsuite/gdc.test/compilable/interpret4.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/compilable/interpret4.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/compilable/interpret4.d	Sun Feb  1 22:32:14 2026
*************** static if (__traits(compiles, int4))
*** 29,31 ****
--- 29,48 ----
      enum int4 F = D * E;
      static assert(F.array == [1, 4, 9, 16]);
  }
+ 
+ // https://github.com/dlang/dmd/issues/20114
+ 
+ int* find(int[] arr, int needle)
+ {
+ 	foreach(ref a; arr)
+ 		if(a == needle)
+ 			return &a;
+ 	return null;
+ }
+ 
+ enum int[int] aa = [0: 0];
+ enum int[] da = [0, 1, 2];
+ static assert(0 in aa);
+ static assert(&da[1]);
+ static assert(find(da, 1));
+ static assert(!find(da, 3));
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/compilable/mixintype.d gcc-16-20260201/gcc/testsuite/gdc.test/compilable/mixintype.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/compilable/mixintype.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/compilable/mixintype.d	Sun Feb  1 22:32:14 2026
*************** alias Lint = mixin("Int");
*** 4,12 ****
  
  int test1(mixin("int")* p)
  {
!     mixin("int")[] a;
!     mixin("int[]") b;
!     mixin("int[] c;");
      mixin("*p = c[0];");
      *p = mixin("c[0]");
      return *p + a[0] + b[0] + c[0];
--- 4,12 ----
  
  int test1(mixin("int")* p)
  {
!     mixin("int")[] a = [1];
!     mixin("int[]") b = [1];
!     mixin("int[] c = [1];");
      mixin("*p = c[0];");
      *p = mixin("c[0]");
      return *p + a[0] + b[0] + c[0];
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/compilable/parens_inc.d gcc-16-20260201/gcc/testsuite/gdc.test/compilable/parens_inc.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/compilable/parens_inc.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/compilable/parens_inc.d	Sun Feb  1 22:32:14 2026
*************** void main(){
*** 6,12 ****
      *(x)++=0;
      (*(x)--)=0;
      (*x++)=0; // ok
!     int*[] z;
      *(z[0])++=0; //ok
      (y[0])--;
      *x++=0;
--- 6,13 ----
      *(x)++=0;
      (*(x)--)=0;
      (*x++)=0; // ok
!     int a = 1, b = 2;
!     int*[] z = [&a, &b];
      *(z[0])++=0; //ok
      (y[0])--;
      *x++=0;
*************** void f()
*** 16,22 ****
  {
      int b;
      (b)++;
!     int[] a;
      b = (a)[0]++; //ok
      (a[0])--;
      b = (int).init; //ok
--- 17,23 ----
  {
      int b;
      (b)++;
!     int[] a = [1];
      b = (a)[0]++; //ok
      (a[0])--;
      b = (int).init; //ok
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/compilable/shared.d gcc-16-20260201/gcc/testsuite/gdc.test/compilable/shared.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/compilable/shared.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/compilable/shared.d	Sun Feb  1 22:32:14 2026
*************** pure nothrow @nogc ref @safe shared(C1)(
*** 5,11 ****
  pure nothrow @nogc ref @safe shared(int)(return ref shared(C3) c)
  ---
  */
! ref shared(int) f(return shared ref int y)
  {
      return y;
  }
--- 5,11 ----
  pure nothrow @nogc ref @safe shared(int)(return ref shared(C3) c)
  ---
  */
! ref shared(int) f(return ref shared int y)
  {
      return y;
  }
*************** shared(C2)* test_dotvarexp_4(return ref
*** 97,103 ****
      return &c.c2;
  }
  
! ref shared(int) test_dotvarexp_5(return shared ref C3 c)
  {
      return c.c1.c1.value;
  }
--- 97,103 ----
      return &c.c2;
  }
  
! ref shared(int) test_dotvarexp_5(return ref shared C3 c)
  {
      return c.c1.c1.value;
  }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/compilable/test14838.d gcc-16-20260201/gcc/testsuite/gdc.test/compilable/test14838.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/compilable/test14838.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/compilable/test14838.d	Sun Feb  1 22:32:14 2026
*************** class C { A!int[1] array; }
*** 5,11 ****
  
  void test14838() pure nothrow @nogc @safe
  {
!     C c;
      c.__xdtor();    // C.~this() will also be inferred to
                      // pure nothrow @nogc @safe
  
--- 5,11 ----
  
  void test14838() pure nothrow @nogc @safe
  {
!     scope C c = new C;
      c.__xdtor();    // C.~this() will also be inferred to
                      // pure nothrow @nogc @safe
  
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/compilable/test17146.d gcc-16-20260201/gcc/testsuite/gdc.test/compilable/test17146.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/compilable/test17146.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/compilable/test17146.d	Sun Feb  1 22:32:14 2026
*************** struct S { int[] a; int b; }
*** 6,12 ****
  
  void foo()
  {
!     S[] s;
      if (s[$-1] == S.init) {}
  }
  
--- 6,12 ----
  
  void foo()
  {
!     S[] s = [S([],0)];
      if (s[$-1] == S.init) {}
  }
  
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/compilable/test18127.d gcc-16-20260201/gcc/testsuite/gdc.test/compilable/test18127.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/compilable/test18127.d	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gdc.test/compilable/test18127.d	Sun Feb  1 22:32:14 2026
***************
*** 0 ****
--- 1,5 ----
+ // https://github.com/dlang/dmd/issues/18127
+ // EXTRA_FILES: imports/imp18127a.c imports/imp18127b.c
+ 
+ import imports.imp18127a;
+ import imports.imp18127b;
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/compilable/test20100.d gcc-16-20260201/gcc/testsuite/gdc.test/compilable/test20100.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/compilable/test20100.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/compilable/test20100.d	Sun Feb  1 22:32:14 2026
*************** void main() {
*** 36,44 ****
   void test20989() @safe
  {
      uint[] arr = [1, 2, 3];
      assert(arr.ptr);
!     assert(!arr.ptr);
      assert(arr.ptr is arr.ptr);
  }
  
  // https://issues.dlang.org/show_bug.cgi?id=21765
--- 36,46 ----
   void test20989() @safe
  {
      uint[] arr = [1, 2, 3];
+     uint[] arr2 = null;
      assert(arr.ptr);
!     assert(!arr2.ptr);
      assert(arr.ptr is arr.ptr);
+     assert(arr2.ptr is arr2.ptr);
  }
  
  // https://issues.dlang.org/show_bug.cgi?id=21765
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/compilable/test20184.d gcc-16-20260201/gcc/testsuite/gdc.test/compilable/test20184.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/compilable/test20184.d	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gdc.test/compilable/test20184.d	Sun Feb  1 22:32:14 2026
***************
*** 0 ****
--- 1,5 ----
+ // EXTRA_FILES: imports/h20184.h
+ import imports.h20184;
+ 
+ alias fun_signature = extern (C) int();
+ static assert(is(typeof(f20184) : fun_signature));
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/compilable/test20344.d gcc-16-20260201/gcc/testsuite/gdc.test/compilable/test20344.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/compilable/test20344.d	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gdc.test/compilable/test20344.d	Sun Feb  1 22:32:14 2026
***************
*** 0 ****
--- 1,14 ----
+ // https://github.com/dlang/dmd/issues/20334
+ // EXTRA_FILES: imports/imp20344.c
+ import imports.imp20344;
+ string s = X;
+ const(char)* p = X;
+ 
+ void takes_string(string){ }
+ void takes_char_star(const(char)*){ }
+ 
+ 
+ void test20344(){
+     takes_string(X);
+     takes_char_star(X);
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/compilable/test20365.d gcc-16-20260201/gcc/testsuite/gdc.test/compilable/test20365.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/compilable/test20365.d	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gdc.test/compilable/test20365.d	Sun Feb  1 22:32:14 2026
***************
*** 0 ****
--- 1,20 ----
+ // REQUIRED_ARGS: -preview=bitfields
+ 
+ struct A { int x : 16, y : 16; }
+ 
+ void autoref_assign(A a)
+ {
+     auto ref int x = a.x;
+ }
+ 
+ void f()(auto ref int);
+ 
+ void autoref_param(A a)
+ {
+     f(a.y);
+ }
+ 
+ auto ref int autoref_return(ref A a)
+ {
+     return a.y;
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/compilable/test20499.d gcc-16-20260201/gcc/testsuite/gdc.test/compilable/test20499.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/compilable/test20499.d	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gdc.test/compilable/test20499.d	Sun Feb  1 22:32:14 2026
***************
*** 0 ****
--- 1,3 ----
+ // https://github.com/dlang/dmd/issues/20499
+ // EXTRA_FILES: imports/imp20499.c
+ import imports.imp20499;
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/compilable/test21331.sh gcc-16-20260201/gcc/testsuite/gdc.test/compilable/test21331.sh
*** gcc-16-20260125/gcc/testsuite/gdc.test/compilable/test21331.sh	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gdc.test/compilable/test21331.sh	Sun Feb  1 22:32:14 2026
***************
*** 0 ****
--- 1,11 ----
+ #!/usr/bin/env bash
+ 
+ objfile="${OUTPUT_BASE}${OBJ}"
+ $DMD -c -m${MODEL} -of${objfile} ${EXTRA_FILES}/${TEST_NAME}.d
+ 
+ nm ${objfile} | grep -E '16__lambda_L13_C17.+15__lambda_L5_C19'
+ nm ${objfile} | grep -E '16__lambda_L13_C17.+17__lambda_L5_C19_1'
+ nm ${objfile} | grep -E '18__lambda_L13_C17_1.+15__lambda_L5_C19'
+ nm ${objfile} | grep -E '18__lambda_L13_C17_1.+17__lambda_L5_C19_1'
+ 
+ rm_retry ${objfile}
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/compilable/test21359.sh gcc-16-20260201/gcc/testsuite/gdc.test/compilable/test21359.sh
*** gcc-16-20260125/gcc/testsuite/gdc.test/compilable/test21359.sh	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gdc.test/compilable/test21359.sh	Sun Feb  1 22:32:14 2026
***************
*** 0 ****
--- 1,15 ----
+ #!/usr/bin/env bash
+ 
+ objfile="${OUTPUT_BASE}${OBJ}"
+ $DMD -c -m${MODEL} -allinst -of${objfile} ${EXTRA_FILES}/${TEST_NAME}a.d -I${EXTRA_FILES}
+ 
+ # This test is brittle and might break in the future.
+ # For now, ensure a specific AA TypeInfo isn't defined multiple times, as happened with DMD v2.111.0.
+ mangled_sym='_D14TypeInfo_HiAya6__initZ'
+ num_typeinfo_syms=$(nm --defined-only ${objfile} | grep -F ${mangled_sym} | wc -l)
+ if [[ "${num_typeinfo_syms}" -ne 1 ]]; then
+     echo "Expected 1 '${mangled_sym}' symbol definition but got: ${num_typeinfo_syms}"
+     exit 1
+ fi
+ 
+ rm_retry ${objfile}
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/compilable/test21416.d gcc-16-20260201/gcc/testsuite/gdc.test/compilable/test21416.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/compilable/test21416.d	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gdc.test/compilable/test21416.d	Sun Feb  1 22:32:14 2026
***************
*** 0 ****
--- 1,17 ----
+ // https://github.com/dlang/dmd/issues/21416
+ 
+ struct S
+ {
+ 	@disable this(ref S);
+ }
+ 
+ ref id(ref S s) => s;
+ 
+ S* p;
+ void foo(S s) { }
+ 
+ void main()
+ {
+ 	S s;
+ 	foo(__rvalue(id(s)));
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/compilable/test21476.d gcc-16-20260201/gcc/testsuite/gdc.test/compilable/test21476.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/compilable/test21476.d	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gdc.test/compilable/test21476.d	Sun Feb  1 22:32:14 2026
***************
*** 0 ****
--- 1,13 ----
+ // https://github.com/dlang/dmd/issues/21476
+ 
+ struct S21476
+ {
+     string field;
+     this(ref return scope S21476);
+     this(return scope S21476);
+ }
+ 
+ void test21476()
+ {
+     auto o = S21476("aoe");
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/compilable/test23169.d gcc-16-20260201/gcc/testsuite/gdc.test/compilable/test23169.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/compilable/test23169.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/compilable/test23169.d	Sun Feb  1 22:32:14 2026
*************** struct Ptr
*** 5,11 ****
  {
  	int* impl;
  	void* fun0() return scope {return impl;}
! 	void* fun1() scope return {return impl;}
  	void* fun2() return {return &this;}
  }
  
--- 5,11 ----
  {
  	int* impl;
  	void* fun0() return scope {return impl;}
! 	void* fun1() scope return ref {return impl;}
  	void* fun2() return {return &this;}
  }
  
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/compilable/test3004.d gcc-16-20260201/gcc/testsuite/gdc.test/compilable/test3004.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/compilable/test3004.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/compilable/test3004.d	Sun Feb  1 22:32:14 2026
***************
*** 1,7 ****
  // https://issues.dlang.org/show_bug.cgi?id=3004
  /*
  REQUIRED_ARGS: -ignore -v
! TRANSFORM_OUTPUT: remove_lines("^(predefs|binary|version|config|DFLAG|parse|import|semantic|entry|library|function  object|function  core|\s*$)")
  TEST_OUTPUT:
  ---
  pragma    GNU_attribute (__error)
--- 1,7 ----
  // https://issues.dlang.org/show_bug.cgi?id=3004
  /*
  REQUIRED_ARGS: -ignore -v
! TRANSFORM_OUTPUT: remove_lines("^(predefs|binary|version|config|DFLAG|parse|inline|.*_d_newarrayU|import|\(imported|semantic|entry|library|function  object|function  core|\s*$)")
  TEST_OUTPUT:
  ---
  pragma    GNU_attribute (__error)
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/compilable/testcstuff3.d gcc-16-20260201/gcc/testsuite/gdc.test/compilable/testcstuff3.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/compilable/testcstuff3.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/compilable/testcstuff3.d	Sun Feb  1 22:32:14 2026
***************
*** 2,4 ****
--- 2,23 ----
  import imports.cstuff3;
  
  static assert(squared(4) == 16);
+ 
+ /* test case for issue #21094 */
+ string enum_to_str(E)(E v) if (is(E == enum))
+ {
+     final switch (v) with(E)
+     {
+         static foreach (m; __traits(allMembers, E))
+         {
+     case mixin(m):
+             return m;
+         }
+     }
+ }
+ 
+ void testEnumSwitch()
+ {
+     auto str = enum_to_str(UPNG_EOK);
+     assert(str == "UPNG_EOK");
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/compilable/testgotoskips.d gcc-16-20260201/gcc/testsuite/gdc.test/compilable/testgotoskips.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/compilable/testgotoskips.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/compilable/testgotoskips.d	Sun Feb  1 22:32:14 2026
*************** class A {
*** 15,17 ****
--- 15,27 ----
                  return;
          }
  }
+ 
+ // https://github.com/dlang/dmd/issues/18018
+ int main ()
+ {
+    string[string] aa;
+    goto A;               // line 4
+    aa["X"] = "Y";        // line 5
+ A:
+    return 0;
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/compilable/testsctreturn.d gcc-16-20260201/gcc/testsuite/gdc.test/compilable/testsctreturn.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/compilable/testsctreturn.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/compilable/testsctreturn.d	Sun Feb  1 22:32:14 2026
*************** struct S
*** 27,33 ****
      int i;
      int* ptr;
  
!     int* wannabeReturnRef() scope return
      {
          return &i;
      }
--- 27,33 ----
      int i;
      int* ptr;
  
!     int* wannabeReturnRef() return ref scope
      {
          return &i;
      }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/compilable/traits_getFunctionAttributes.d gcc-16-20260201/gcc/testsuite/gdc.test/compilable/traits_getFunctionAttributes.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/compilable/traits_getFunctionAttributes.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/compilable/traits_getFunctionAttributes.d	Sun Feb  1 22:32:14 2026
*************** void test_getFunctionAttributes()
*** 44,51 ****
      static assert(__traits(getFunctionAttributes, S.sharedF) == tuple!("shared", "@system"));
      static assert(__traits(getFunctionAttributes, typeof(S.sharedF)) == tuple!("shared", "@system"));
  
!     static assert(__traits(getFunctionAttributes, S.refF) == tuple!("ref", "return", "@system"));
!     static assert(__traits(getFunctionAttributes, typeof(S.refF)) == tuple!("ref", "return", "@system"));
  
      static assert(__traits(getFunctionAttributes, S.propertyF) == tuple!("@property", "@system"));
      static assert(__traits(getFunctionAttributes, typeof(&S.propertyF)) == tuple!("@property", "@system"));
--- 44,51 ----
      static assert(__traits(getFunctionAttributes, S.sharedF) == tuple!("shared", "@system"));
      static assert(__traits(getFunctionAttributes, typeof(S.sharedF)) == tuple!("shared", "@system"));
  
!     static assert(__traits(getFunctionAttributes, S.refF) == tuple!("return", "ref", "@system"));
!     static assert(__traits(getFunctionAttributes, typeof(S.refF)) == tuple!("return", "ref", "@system"));
  
      static assert(__traits(getFunctionAttributes, S.propertyF) == tuple!("@property", "@system"));
      static assert(__traits(getFunctionAttributes, typeof(&S.propertyF)) == tuple!("@property", "@system"));
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/compilable/uda_lambda.d gcc-16-20260201/gcc/testsuite/gdc.test/compilable/uda_lambda.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/compilable/uda_lambda.d	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gdc.test/compilable/uda_lambda.d	Sun Feb  1 22:32:14 2026
***************
*** 0 ****
--- 1,3 ----
+ enum UDA;
+ int fun() @UDA => 7;
+ static assert(fun() == 7);
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/compilable/vcg-ast.d gcc-16-20260201/gcc/testsuite/gdc.test/compilable/vcg-ast.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/compilable/vcg-ast.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/compilable/vcg-ast.d	Sun Feb  1 22:32:14 2026
*************** PERMUTE_ARGS:
*** 4,9 ****
--- 4,11 ----
  OUTPUT_FILES: compilable/vcg-ast.d.cg
  EXTRA_FILES: imports/vcg_ast_import.d
  TEST_OUTPUT_FILE: extra-files/vcg-ast.d.cg
+ // size_t currently must be ulong in this test, not uint
+ DISABLED: freebsd32 openbsd32 linux32 osx32 win32
  */
  
  module vcg;
*************** template imported()
*** 75,77 ****
--- 77,90 ----
  }
  
  alias myImport = imported!();
+ 
+ // https://github.com/dlang/dmd/issues/21105
+ 
+ enum compiles = __traits(compiles,{
+     int[] arr;
+     arr ~= 1;
+ });
+ enum isexp = is(typeof({
+     int[] arr;
+     arr ~= 1;
+ }));
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/compilable/warn3882.d gcc-16-20260201/gcc/testsuite/gdc.test/compilable/warn3882.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/compilable/warn3882.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/compilable/warn3882.d	Sun Feb  1 22:32:14 2026
*************** void test13899()
*** 76,78 ****
--- 76,116 ----
      {
      }
  }
+ 
+ import core.checkedint;
+ 
+ // check inlining of checkedint with -wi
+ T testCheckedSigned(T)(T x, T y)
+ {
+     bool overflow;
+     T z = adds(x, y, overflow);
+     z = subs(z, x, overflow);
+     z = muls(z, x, overflow);
+     z = negs(z, overflow);
+     return z;
+ }
+ 
+ T testCheckedUnsigned(T)(T x, T y)
+ {
+     bool overflow;
+     T z = addu(x, y, overflow);
+     z = subu(z, x, overflow);
+     z = mulu(z, x, overflow);
+     return z;
+ }
+ 
+ void testCkeckedInt()
+ {
+     assert(testCheckedSigned!int(3,4) == -12);
+     assert(testCheckedSigned!long(3,4) == -12);
+     static if (is(cent))
+         assert(testCheckedSigned!cent(3,4) == -12);
+ 
+     bool overflow;
+     assert(mulu(cast(long)3, cast(uint)4, overflow) == 12);
+ 
+     assert(testCheckedUnsigned!uint(3,4) == 12);
+     assert(testCheckedUnsigned!ulong(3,4) == 12);
+     static if (is(ucent))
+         assert(testCheckedUnsigned!ucent(3,4) == 12);
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/aa_assign.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/aa_assign.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/aa_assign.d	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/aa_assign.d	Sun Feb  1 22:32:14 2026
***************
*** 0 ****
--- 1,13 ----
+ /* TEST_OUTPUT:
+ ---
+ fail_compilation\aa_assign.d(11): Error: associative arrays can only be assigned values with immutable keys, not `char[]`
+ ---
+ */
+ 
+ void test_mutable_key()
+ {
+     int[char[]] aa;
+     char[] str = "123".dup;
+     aa[str] = 3;
+     assert(str in aa);
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/aaerrors.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/aaerrors.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/aaerrors.d	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/aaerrors.d	Sun Feb  1 22:32:14 2026
***************
*** 0 ****
--- 1,43 ----
+ /* TEST_OUTPUT:
+ TRANSFORM_OUTPUT: remove_lines(called from here)
+ ---
+ fail_compilation\aaerrors.d-mixin-29(29): Error: `assert(aai[1] == 0)` failed
+ fail_compilation\aaerrors.d-mixin-30(30): Error: `assert((aai[1] = 1) == 0)` failed
+ fail_compilation\aaerrors.d-mixin-31(31): Error: `assert(*(1 in aai) == 3)` failed
+ fail_compilation\aaerrors.d-mixin-32(32): Error: `assert(aai.remove(2))` failed
+ fail_compilation\aaerrors.d-mixin-33(33): Error: `assert(aai != [1:2])` failed
+ fail_compilation\aaerrors.d-mixin-34(34): Error: `assert(aai == [1:3])` failed
+ fail_compilation\aaerrors.d-mixin-41(41): Error: `assert(aas[1].x == 0)` failed
+ fail_compilation\aaerrors.d-mixin-42(42): Error: `assert((aas[1] = 1).x == 0)` failed
+ fail_compilation\aaerrors.d-mixin-43(43): Error: `assert((*(1 in aas)).x == 0)` failed
+ ---
+ */
+ 
+ 
+ struct S
+ {
+     int x;
+     this(int _x){ x = _x; }
+     ref S opAssign(int _x){ x = _x; return this; }
+ }
+ 
+ string gentest_ii(string expr)
+ {
+     return "() { int[int] aai = [ 1 : 2 ]; assert(" ~ expr ~ ");\n return true; }()\n";
+ }
+ 
+ const ii1 = mixin(gentest_ii("aai[1] == 0"));
+ const ii2 = mixin(gentest_ii("(aai[1] = 1) == 0"));
+ const ii3 = mixin(gentest_ii("*(1 in aai) == 3"));
+ const ii4 = mixin(gentest_ii("aai.remove(2)"));
+ const ii5 = mixin(gentest_ii("aai != [1:2]"));
+ const ii6 = mixin(gentest_ii("aai == [1:3]"));
+ 
+ string gentest_is(string expr)
+ {
+     return "() { S[int] aas = [ 1 : S(2) ]; assert(" ~ expr ~ ");\n return true; }()\n";
+ }
+ 
+ const is1 = mixin(gentest_is("aas[1].x == 0"));
+ const is2 = mixin(gentest_is("(aas[1] = 1).x == 0"));
+ const is3 = mixin(gentest_is("(1 in aas).x == 0"));
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/b23686.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/b23686.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/b23686.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/b23686.d	Sun Feb  1 22:32:14 2026
*************** TEST_OUTPUT:
*** 4,10 ****
  fail_compilation/b23686.d(107): Error: undefined identifier `eFN1`, did you mean template `eFN0()()`?
  fail_compilation/b23686.d(107): Error: `mixin(_error_)` does not give a valid type
  fail_compilation/b23686.d(115):        while looking for match for `eload!(int, 1)`
! fail_compilation/b23686.d(121): Error: undefined identifier `FNwtf`
  fail_compilation/b23686.d(121): Error: `mixin(_error_)` does not give a valid type
  fail_compilation/b23686.d(126):        while looking for match for `load!"wtf"`
  ---
--- 4,10 ----
  fail_compilation/b23686.d(107): Error: undefined identifier `eFN1`, did you mean template `eFN0()()`?
  fail_compilation/b23686.d(107): Error: `mixin(_error_)` does not give a valid type
  fail_compilation/b23686.d(115):        while looking for match for `eload!(int, 1)`
! fail_compilation/b23686.d-mixin-121(121): Error: undefined identifier `FNwtf`
  fail_compilation/b23686.d(121): Error: `mixin(_error_)` does not give a valid type
  fail_compilation/b23686.d(126):        while looking for match for `load!"wtf"`
  ---
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/biterrors.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/biterrors.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/biterrors.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/biterrors.d	Sun Feb  1 22:32:14 2026
***************
*** 1,8 ****
  /* REQUIRED_ARGS: -preview=bitfields
   * TEST_OUTPUT:
  ---
! fail_compilation/biterrors.d(103): Error: initializer not allowed for bit-field declaration
! fail_compilation/biterrors.d(104): Error: storage class not allowed for bit-field declaration
  ---
   */
  
--- 1,8 ----
  /* REQUIRED_ARGS: -preview=bitfields
   * TEST_OUTPUT:
  ---
! fail_compilation/biterrors.d(103): Error: initializer not allowed for bitfield declaration
! fail_compilation/biterrors.d(104): Error: storage class not allowed for bitfield declaration
  ---
   */
  
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/biterrors2.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/biterrors2.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/biterrors2.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/biterrors2.d	Sun Feb  1 22:32:14 2026
***************
*** 1,9 ****
  /* REQUIRED_ARGS: -preview=bitfields
   * TEST_OUTPUT:
  ---
! fail_compilation/biterrors2.d(100): Error: variable `biterrors2.a` - bit-field must be member of struct, union, or class
! fail_compilation/biterrors2.d(104): Error: bit-field `b` has zero width
! fail_compilation/biterrors2.d(105): Error: bit-field type `float` is not an integer type
  ---
  */
  
--- 1,9 ----
  /* REQUIRED_ARGS: -preview=bitfields
   * TEST_OUTPUT:
  ---
! fail_compilation/biterrors2.d(100): Error: variable `biterrors2.a` - bitfield must be member of struct, union, or class
! fail_compilation/biterrors2.d(104): Error: bitfield `b` has zero width
! fail_compilation/biterrors2.d(105): Error: bitfield type `float` is not an integer type
  ---
  */
  
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/biterrors3.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/biterrors3.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/biterrors3.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/biterrors3.d	Sun Feb  1 22:32:14 2026
***************
*** 1,7 ****
  /* REQUIRED_ARGS: -preview=bitfields
   * TEST_OUTPUT:
  ---
! fail_compilation/biterrors3.d(103): Error: storage class not allowed for bit-field declaration
  fail_compilation/biterrors3.d(106): Error: expected `,` or `=` after identifier, not `:`
  fail_compilation/biterrors3.d(106): Error: found `:` when expecting `,`
  fail_compilation/biterrors3.d(106): Error: found `3` when expecting `identifier`
--- 1,7 ----
  /* REQUIRED_ARGS: -preview=bitfields
   * TEST_OUTPUT:
  ---
! fail_compilation/biterrors3.d(103): Error: storage class not allowed for bitfield declaration
  fail_compilation/biterrors3.d(106): Error: expected `,` or `=` after identifier, not `:`
  fail_compilation/biterrors3.d(106): Error: found `:` when expecting `,`
  fail_compilation/biterrors3.d(106): Error: found `3` when expecting `identifier`
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/biterrors4.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/biterrors4.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/biterrors4.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/biterrors4.d	Sun Feb  1 22:32:14 2026
***************
*** 1,7 ****
  /* REQUIRED_ARGS: -preview=bitfields
   * TEST_OUTPUT:
  ---
! fail_compilation/biterrors4.d(109): Error: cannot take address of bit-field `a`
  ---
  */
  
--- 1,7 ----
  /* REQUIRED_ARGS: -preview=bitfields
   * TEST_OUTPUT:
  ---
! fail_compilation/biterrors4.d(109): Error: cannot take address of bitfield `s.a`
  ---
  */
  
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/biterrors5.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/biterrors5.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/biterrors5.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/biterrors5.d	Sun Feb  1 22:32:14 2026
***************
*** 1,8 ****
  /* REQUIRED_ARGS: -preview=bitfields
   * TEST_OUTPUT:
  ---
! fail_compilation/biterrors5.d(23): Error: bitfield symbol expected not struct `biterrors5.S`
! fail_compilation/biterrors5.d(24): Error: bitfield symbol expected not variable `biterrors5.test0.i`
  ---
  */
  
--- 1,10 ----
  /* REQUIRED_ARGS: -preview=bitfields
   * TEST_OUTPUT:
  ---
! fail_compilation/biterrors5.d(25): Error: bitfield symbol expected not struct `biterrors5.S`
! fail_compilation/biterrors5.d(26): Error: bitfield symbol expected not variable `biterrors5.test0.i`
! fail_compilation/biterrors5.d(35): Error: cannot take address of bitfield `a.x`
! fail_compilation/biterrors5.d(35): Error: cannot take address of bitfield `a.y`
  ---
  */
  
*************** void test0()
*** 23,25 ****
--- 25,36 ----
      i = __traits(getBitfieldOffset, S);
      i = __traits(getBitfieldOffset, i);
  }
+ 
+ /****************************************/
+ 
+ struct B { int x: 3; int y: 5; }
+ 
+ void test1(int val, int choice, B a)
+ {
+     (choice ? a.x : a.y) = val;
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/checkimports2.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/checkimports2.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/checkimports2.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/checkimports2.d	Sun Feb  1 22:32:14 2026
***************
*** 2,11 ****
  /*
  TEST_OUTPUT:
  ---
! fail_compilation/checkimports2.d(25): Error: no property `X` for type `checkimports2.B`, did you mean `imports.imp2.X`?
! fail_compilation/checkimports2.d(25):        while evaluating: `static assert((B).X == 0)`
! fail_compilation/checkimports2.d(26): Error: no property `Y` for type `checkimports2.B`, did you mean `imports.imp2.Y`?
! fail_compilation/checkimports2.d(26):        while evaluating: `static assert((B).Y == 2)`
  ---
  */
  
--- 2,13 ----
  /*
  TEST_OUTPUT:
  ---
! fail_compilation/checkimports2.d(27): Error: no property `X` for type `checkimports2.B`
! fail_compilation/imports/imp2.d(3):        did you mean `imports.imp2.X`?
! fail_compilation/checkimports2.d(27):        while evaluating: `static assert((B).X == 0)`
! fail_compilation/checkimports2.d(28): Error: no property `Y` for type `checkimports2.B`
! fail_compilation/imports/imp2.d(4):        did you mean `imports.imp2.Y`?
! fail_compilation/checkimports2.d(28):        while evaluating: `static assert((B).Y == 2)`
  ---
  */
  
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/diag10405.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/diag10405.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/diag10405.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/diag10405.d	Thu Jan  1 00:00:00 1970
***************
*** 1,11 ****
- /*
- TEST_OUTPUT:
- ---
- fail_compilation/diag10405.d(10): Error: cannot return non-void from `void` function
- ---
- */
- 
- void main()
- {
-     return 10;
- }
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/diag13320.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/diag13320.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/diag13320.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/diag13320.d	Sun Feb  1 22:32:14 2026
***************
*** 1,15 ****
  /*
  TEST_OUTPUT:
  ---
! fail_compilation/diag13320.d(14): Error: operator `++` not supported for `f` of type `Foo`
! fail_compilation/diag13320.d(9):        perhaps implement `auto opUnary(string op : "++")() {}` or `auto opOpAssign(string op : "+")(int) {}`
  ---
  */
  
  struct Foo {}
  
  void main()
  {
      Foo f;
      ++f;
  }
--- 1,23 ----
  /*
  TEST_OUTPUT:
  ---
! fail_compilation/diag13320.d(20): Error: operator `++` not supported for `f` of type `Foo`
! fail_compilation/diag13320.d(14):        perhaps implement `auto opUnary(string op : "++")() {}` or `auto opOpAssign(string op : "+")(int) {}`
! fail_compilation/diag13320.d(21): Error: expression `f` of type `Foo` does not have a boolean value
! fail_compilation/diag13320.d(14):        perhaps add Cast Operator Overloading with `bool opCast(T : bool)() => ...`
! fail_compilation/diag13320.d(22): Error: expression `Foo()` of type `E` does not have a boolean value
! fail_compilation/diag13320.d(14):        perhaps add Cast Operator Overloading with `bool opCast(T : bool)() => ...`
  ---
  */
  
+ 
  struct Foo {}
+ enum E : Foo { a = Foo.init }
  
  void main()
  {
      Foo f;
      ++f;
+     if (f) {}
+     assert(E.a);
  }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/diag16976.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/diag16976.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/diag16976.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/diag16976.d	Sun Feb  1 22:32:14 2026
***************
*** 1,37 ****
  /* TEST_OUTPUT:
  ---
! fail_compilation/diag16976.d(44): Error: foreach: key cannot be of non-integral type `float`
! fail_compilation/diag16976.d(45): Error: foreach: key cannot be of non-integral type `float`
! fail_compilation/diag16976.d(46): Error: foreach: key cannot be of non-integral type `float`
! fail_compilation/diag16976.d(47): Error: foreach: key cannot be of non-integral type `float`
! fail_compilation/diag16976.d(48): Error: foreach: key cannot be of non-integral type `float`
! fail_compilation/diag16976.d(49): Error: foreach: key cannot be of non-integral type `float`
! fail_compilation/diag16976.d(50): Error: foreach: key cannot be of non-integral type `float`
! fail_compilation/diag16976.d(51): Error: foreach: key cannot be of non-integral type `float`
! fail_compilation/diag16976.d(52): Error: foreach: key cannot be of non-integral type `float`
! fail_compilation/diag16976.d(53): Error: foreach: key cannot be of non-integral type `float`
! fail_compilation/diag16976.d(54): Error: foreach: key cannot be of non-integral type `float`
! fail_compilation/diag16976.d(55): Error: foreach: key cannot be of non-integral type `float`
! fail_compilation/diag16976.d(56): Error: foreach: key cannot be of non-integral type `float`
! fail_compilation/diag16976.d(57): Error: foreach: key cannot be of non-integral type `float`
! fail_compilation/diag16976.d(58): Error: foreach: key cannot be of non-integral type `float`
! fail_compilation/diag16976.d(59): Error: foreach: key cannot be of non-integral type `float`
! fail_compilation/diag16976.d(65): Error: foreach: key cannot be of non-integral type `float`
! fail_compilation/diag16976.d(66): Error: foreach: key cannot be of non-integral type `float`
! fail_compilation/diag16976.d(67): Error: foreach: key cannot be of non-integral type `float`
! fail_compilation/diag16976.d(68): Error: foreach: key cannot be of non-integral type `float`
! fail_compilation/diag16976.d(69): Error: foreach: key cannot be of non-integral type `float`
! fail_compilation/diag16976.d(70): Error: foreach: key cannot be of non-integral type `float`
! fail_compilation/diag16976.d(71): Error: foreach: key cannot be of non-integral type `float`
! fail_compilation/diag16976.d(72): Error: foreach: key cannot be of non-integral type `float`
! fail_compilation/diag16976.d(73): Error: foreach: key cannot be of non-integral type `float`
! fail_compilation/diag16976.d(74): Error: foreach: key cannot be of non-integral type `float`
! fail_compilation/diag16976.d(75): Error: foreach: key cannot be of non-integral type `float`
! fail_compilation/diag16976.d(76): Error: foreach: key cannot be of non-integral type `float`
! fail_compilation/diag16976.d(77): Error: foreach: key cannot be of non-integral type `float`
! fail_compilation/diag16976.d(78): Error: foreach: key cannot be of non-integral type `float`
! fail_compilation/diag16976.d(79): Error: foreach: key cannot be of non-integral type `float`
! fail_compilation/diag16976.d(80): Error: foreach: key cannot be of non-integral type `float`
  ---
  */
  
--- 1,37 ----
  /* TEST_OUTPUT:
  ---
! fail_compilation/diag16976.d(44): Error: foreach: index cannot be of non-integral type `float`
! fail_compilation/diag16976.d(45): Error: foreach: index cannot be of non-integral type `float`
! fail_compilation/diag16976.d(46): Error: foreach: index cannot be of non-integral type `float`
! fail_compilation/diag16976.d(47): Error: foreach: index cannot be of non-integral type `float`
! fail_compilation/diag16976.d(48): Error: foreach: index cannot be of non-integral type `float`
! fail_compilation/diag16976.d(49): Error: foreach: index cannot be of non-integral type `float`
! fail_compilation/diag16976.d(50): Error: foreach: index cannot be of non-integral type `float`
! fail_compilation/diag16976.d(51): Error: foreach: index cannot be of non-integral type `float`
! fail_compilation/diag16976.d(52): Error: foreach: index cannot be of non-integral type `float`
! fail_compilation/diag16976.d(53): Error: foreach: index cannot be of non-integral type `float`
! fail_compilation/diag16976.d(54): Error: foreach: index cannot be of non-integral type `float`
! fail_compilation/diag16976.d(55): Error: foreach: index cannot be of non-integral type `float`
! fail_compilation/diag16976.d(56): Error: foreach: index cannot be of non-integral type `float`
! fail_compilation/diag16976.d(57): Error: foreach: index cannot be of non-integral type `float`
! fail_compilation/diag16976.d(58): Error: foreach: index cannot be of non-integral type `float`
! fail_compilation/diag16976.d(59): Error: foreach: index cannot be of non-integral type `float`
! fail_compilation/diag16976.d(65): Error: foreach: index cannot be of non-integral type `float`
! fail_compilation/diag16976.d(66): Error: foreach: index cannot be of non-integral type `float`
! fail_compilation/diag16976.d(67): Error: foreach: index cannot be of non-integral type `float`
! fail_compilation/diag16976.d(68): Error: foreach: index cannot be of non-integral type `float`
! fail_compilation/diag16976.d(69): Error: foreach: index cannot be of non-integral type `float`
! fail_compilation/diag16976.d(70): Error: foreach: index cannot be of non-integral type `float`
! fail_compilation/diag16976.d(71): Error: foreach: index cannot be of non-integral type `float`
! fail_compilation/diag16976.d(72): Error: foreach: index cannot be of non-integral type `float`
! fail_compilation/diag16976.d(73): Error: foreach: index cannot be of non-integral type `float`
! fail_compilation/diag16976.d(74): Error: foreach: index cannot be of non-integral type `float`
! fail_compilation/diag16976.d(75): Error: foreach: index cannot be of non-integral type `float`
! fail_compilation/diag16976.d(76): Error: foreach: index cannot be of non-integral type `float`
! fail_compilation/diag16976.d(77): Error: foreach: index cannot be of non-integral type `float`
! fail_compilation/diag16976.d(78): Error: foreach: index cannot be of non-integral type `float`
! fail_compilation/diag16976.d(79): Error: foreach: index cannot be of non-integral type `float`
! fail_compilation/diag16976.d(80): Error: foreach: index cannot be of non-integral type `float`
  ---
  */
  
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/diag20888.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/diag20888.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/diag20888.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/diag20888.d	Sun Feb  1 22:32:14 2026
*************** fail_compilation/diag20888.d(49): Error:
*** 13,24 ****
  fail_compilation/diag20888.d(54): Error: return value `() => 3755` of type `int function() pure nothrow @nogc @safe` does not match return type `int`, and cannot be implicitly converted
  fail_compilation/diag20888.d(54):        Did you intend to call the function pointer?
  fail_compilation/diag20888.d(59): Error: `return` expression expected
- fail_compilation/diag20888.d(64): Error: cannot return non-void from `void` function
  fail_compilation/diag20888.d(70): Error: return value `() => i` of type `int delegate() pure nothrow @nogc @safe` does not match return type `int`, and cannot be implicitly converted
  fail_compilation/diag20888.d(70):        Did you intend to call the delegate?
  ---
  */
  
  int alpha(int function() callback)
  {
  	return callback;
--- 13,24 ----
  fail_compilation/diag20888.d(54): Error: return value `() => 3755` of type `int function() pure nothrow @nogc @safe` does not match return type `int`, and cannot be implicitly converted
  fail_compilation/diag20888.d(54):        Did you intend to call the function pointer?
  fail_compilation/diag20888.d(59): Error: `return` expression expected
  fail_compilation/diag20888.d(70): Error: return value `() => i` of type `int delegate() pure nothrow @nogc @safe` does not match return type `int`, and cannot be implicitly converted
  fail_compilation/diag20888.d(70):        Did you intend to call the delegate?
  ---
  */
  
+ 
  int alpha(int function() callback)
  {
  	return callback;
*************** int theta()
*** 59,68 ****
  	return;
  }
  
! void iota()
! {
! 	return 0xEAB;
! }
  
  int kappa()
  {
--- 59,68 ----
  	return;
  }
  
! 
! 
! 
! 
  
  int kappa()
  {
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/diag23384.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/diag23384.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/diag23384.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/diag23384.d	Sun Feb  1 22:32:14 2026
***************
*** 4,11 ****
  TEST_OUTPUT:
  ---
  fail_compilation/diag23384.d(28): Error: function `diag23384.Derived.fun(B b)` is not callable using argument types `(A)`
! fail_compilation/diag23384.d(28):        function `diag23384.Derived.fun` hides base class function `diag23384.Base.fun`
! fail_compilation/diag23384.d(28):        add `alias fun = diag23384.Base.fun` to `diag23384.Derived`'s body to merge the overload sets
  ---
  */
  
--- 4,11 ----
  TEST_OUTPUT:
  ---
  fail_compilation/diag23384.d(28): Error: function `diag23384.Derived.fun(B b)` is not callable using argument types `(A)`
! fail_compilation/diag23384.d(28):        Note: function `diag23384.Derived.fun` hides base class function `diag23384.Base.fun`
! fail_compilation/diag23384.d(28):        Add `alias fun = diag23384.Base.fun;` to `diag23384.Derived`'s body to merge the overload sets
  ---
  */
  
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/diag7420.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/diag7420.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/diag7420.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/diag7420.d	Sun Feb  1 22:32:14 2026
***************
*** 2,18 ****
  /*
  TEST_OUTPUT:
  ---
! fail_compilation/diag7420.d(21): Error: static variable `x` cannot be read at compile time
! fail_compilation/diag7420.d(21):        while evaluating: `static assert(x < 4)`
  fail_compilation/diag7420.d(22): Error: static variable `y` cannot be read at compile time
! fail_compilation/diag7420.d(22):        called from here: `__equals(y, "abc")`
! fail_compilation/diag7420.d(22):        while evaluating: `static assert(y == "abc")`
  fail_compilation/diag7420.d(23): Error: static variable `y` cannot be read at compile time
! fail_compilation/diag7420.d(23):        while evaluating: `static assert(cast(ubyte[])y != null)`
  fail_compilation/diag7420.d(24): Error: static variable `y` cannot be read at compile time
! fail_compilation/diag7420.d(24):        while evaluating: `static assert(cast(int)y[0] == 1)`
! fail_compilation/diag7420.d(25): Error: static variable `y` cannot be read at compile time
! fail_compilation/diag7420.d(25):        while evaluating: `static assert(y[0..1].length == 1u)`
  ---
  */
  
--- 2,17 ----
  /*
  TEST_OUTPUT:
  ---
! fail_compilation/diag7420.d(20): Error: static variable `x` cannot be read at compile time
! fail_compilation/diag7420.d(20):        while evaluating: `static assert(x < 4)`
! fail_compilation/diag7420.d(21): Error: static variable `y` cannot be read at compile time
! fail_compilation/diag7420.d(21):        while evaluating: `static assert(y == "abc")`
  fail_compilation/diag7420.d(22): Error: static variable `y` cannot be read at compile time
! fail_compilation/diag7420.d(22):        while evaluating: `static assert(cast(ubyte[])y != null)`
  fail_compilation/diag7420.d(23): Error: static variable `y` cannot be read at compile time
! fail_compilation/diag7420.d(23):        while evaluating: `static assert(cast(int)y[0] == 1)`
  fail_compilation/diag7420.d(24): Error: static variable `y` cannot be read at compile time
! fail_compilation/diag7420.d(24):        while evaluating: `static assert(y[0..1].length == 1u)`
  ---
  */
  
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/diag9679.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/diag9679.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/diag9679.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/diag9679.d	Sun Feb  1 22:32:14 2026
*************** TEST_OUTPUT:
*** 3,15 ****
  ---
  fail_compilation/diag9679.d(93): Deprecation: `auto` and `ref` storage classes should be adjacent
  fail_compilation/diag9679.d(93): Deprecation: `auto` and `ref` storage classes should be adjacent
! fail_compilation/diag9679.d(15): Error: rvalue `1` cannot be assigned to `ref n`
! fail_compilation/diag9679.d(16): Error: variable `diag9679.main.n` - storage class `auto` has no effect if type is not inferred, did you mean `scope`?
! fail_compilation/diag9679.d(17): Error: variable `diag9679.main.S.a` - field declarations cannot be `ref`
! fail_compilation/diag9679.d(24): Error: returning `r` escapes a reference to local variable `i`
  ---
  */
- 
  void main()
  {
      if (ref n = 1) {}
--- 3,16 ----
  ---
  fail_compilation/diag9679.d(93): Deprecation: `auto` and `ref` storage classes should be adjacent
  fail_compilation/diag9679.d(93): Deprecation: `auto` and `ref` storage classes should be adjacent
! fail_compilation/diag9679.d(94): Deprecation: `auto ref` return type must have `auto` and `ref` adjacent
! fail_compilation/diag9679.d(100): Deprecation: `auto ref` return type must have `auto` and `ref` adjacent
! fail_compilation/diag9679.d(16): Error: rvalue `1` cannot be assigned to `ref n`
! fail_compilation/diag9679.d(17): Error: variable `diag9679.main.n` - storage class `auto` has no effect if type is not inferred, did you mean `scope`?
! fail_compilation/diag9679.d(18): Error: variable `diag9679.main.S.a` - field declarations cannot be `ref`
! fail_compilation/diag9679.d(25): Error: returning `r` escapes a reference to local variable `i`
  ---
  */
  void main()
  {
      if (ref n = 1) {}
*************** fail_compilation/diag9679.d(96): Error:
*** 60,66 ****
  ---
  */
  
- 
  void test5()
  {
      ref int r5;
--- 61,66 ----
*************** void test9()
*** 90,97 ****
      auto ref int y = void;
  }
  
! void testKeywordOrder()(ref auto int x, auto const ref float y) {}
! void testKeywordOrder()
  {
      ref auto int x = 3;
  }
--- 90,100 ----
      auto ref int y = void;
  }
  
! void testKeywordOrder()(ref auto int x, auto const ref float y) {};
! ref auto int testKeywordOrder()
  {
      ref auto int x = 3;
+     return 3;
  }
+ 
+ auto { ref int autoFromScope() => 3; }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/diag_ptr_conversion.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/diag_ptr_conversion.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/diag_ptr_conversion.d	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/diag_ptr_conversion.d	Sun Feb  1 22:32:14 2026
***************
*** 0 ****
--- 1,17 ----
+ /*
+ TEST_OUTPUT:
+ ---
+ fail_compilation/diag_ptr_conversion.d(15): Error: cannot implicitly convert `const(int)*` to `int*`
+ fail_compilation/diag_ptr_conversion.d(15):        Note: Converting const to mutable requires an explicit cast (`cast(int*)`).
+ fail_compilation/diag_ptr_conversion.d(16): Error: cannot implicitly convert `int*` to `float*`
+ fail_compilation/diag_ptr_conversion.d(16):        Note: Pointer types point to different base types (`int` vs `float`)
+ ---
+ */
+ 
+ void testPointerConversions()
+ {
+     int* p;
+     const(int)* cp = p;
+     p = cp;
+     float* f = p;
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/discard_value.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/discard_value.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/discard_value.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/discard_value.d	Sun Feb  1 22:32:14 2026
*************** fail_compilation/discard_value.d(24): Er
*** 5,11 ****
  fail_compilation/discard_value.d(25): Error: the result of the equality expression `null !is null` is discarded
  fail_compilation/discard_value.d(26): Error: the result of the equality expression `v == 0` is discarded
  fail_compilation/discard_value.d(27): Error: the result of the equality expression `v == 0` is discarded
! fail_compilation/discard_value.d(28): Error: `!__equals("", "")` has no effect
  fail_compilation/discard_value.d(29): Error: the result of the equality expression `"" == ""` is discarded
  fail_compilation/discard_value.d(30): Error: the result of the equality expression `fun().i == 4` is discarded
  fail_compilation/discard_value.d(30):        note that `fun().i` may have a side effect
--- 5,11 ----
  fail_compilation/discard_value.d(25): Error: the result of the equality expression `null !is null` is discarded
  fail_compilation/discard_value.d(26): Error: the result of the equality expression `v == 0` is discarded
  fail_compilation/discard_value.d(27): Error: the result of the equality expression `v == 0` is discarded
! fail_compilation/discard_value.d(28): Error: the result of the equality expression `"" != ""` is discarded
  fail_compilation/discard_value.d(29): Error: the result of the equality expression `"" == ""` is discarded
  fail_compilation/discard_value.d(30): Error: the result of the equality expression `fun().i == 4` is discarded
  fail_compilation/discard_value.d(30):        note that `fun().i` may have a side effect
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/enum_auto_increment.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/enum_auto_increment.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/enum_auto_increment.d	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/enum_auto_increment.d	Sun Feb  1 22:32:14 2026
***************
*** 0 ****
--- 1,18 ----
+ /*
+ TEST_OUTPUT:
+ ---
+ fail_compilation\enum_auto_increment.d(17): Error: cannot automatically assign value to enum member `enum_auto_increment.A2.d` because base type `A1` is an enum; provide an explicit value
+ ---
+ */
+ 
+ enum A1 : int
+ {
+     a,
+     b,
+ }
+ 
+ enum A2 : A1
+ {
+     c,
+     d,
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/fail109.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/fail109.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/fail109.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/fail109.d	Sun Feb  1 22:32:14 2026
*************** enum E1 : short
*** 34,42 ****
  /* https://issues.dlang.org/show_bug.cgi?id=14950
  TEST_OUTPUT:
  ---
! fail_compilation/fail109.d(50): Error: cannot check `fail109.B.end` value for overflow
! fail_compilation/fail109.d(50): Error: comparison between different enumeration types `B` and `C`; If this behavior is intended consider using `std.conv.asOriginalType`
! fail_compilation/fail109.d(50): Error: enum member `fail109.B.end` initialization with `B.start+1` causes overflow for type `C`
  ---
  */
  enum C
--- 34,40 ----
  /* https://issues.dlang.org/show_bug.cgi?id=14950
  TEST_OUTPUT:
  ---
! fail_compilation\fail109.d(48): Error: cannot automatically assign value to enum member `fail109.B.end` because base type `C` is an enum; provide an explicit value
  ---
  */
  enum C
*************** enum B
*** 53,62 ****
  /* https://issues.dlang.org/show_bug.cgi?id=11849
  TEST_OUTPUT:
  ---
! fail_compilation/fail109.d(72): Error: enum member `fail109.RegValueType1a.Unknown` is forward referenced looking for `.max`
! fail_compilation/fail109.d(79): Error: enum member `fail109.RegValueType1b.Unknown` is forward referenced looking for `.max`
! fail_compilation/fail109.d(84): Error: enum member `fail109.RegValueType2a.Unknown` is forward referenced looking for `.min`
! fail_compilation/fail109.d(91): Error: enum member `fail109.RegValueType2b.Unknown` is forward referenced looking for `.min`
  ---
  */
  
--- 51,60 ----
  /* https://issues.dlang.org/show_bug.cgi?id=11849
  TEST_OUTPUT:
  ---
! fail_compilation/fail109.d(70): Error: enum member `fail109.RegValueType1a.Unknown` is forward referenced looking for `.max`
! fail_compilation/fail109.d(77): Error: enum member `fail109.RegValueType1b.Unknown` is forward referenced looking for `.max`
! fail_compilation/fail109.d(82): Error: enum member `fail109.RegValueType2a.Unknown` is forward referenced looking for `.min`
! fail_compilation/fail109.d(89): Error: enum member `fail109.RegValueType2b.Unknown` is forward referenced looking for `.min`
  ---
  */
  
*************** enum RegValueType2b : DWORD
*** 94,100 ****
  /*
  TEST_OUTPUT:
  ---
! fail_compilation/fail109.d(107): Error: enum member `fail109.d` initialization with `__anonymous.c+1` causes overflow for type `Q`
  ---
  */
  
--- 92,98 ----
  /*
  TEST_OUTPUT:
  ---
! fail_compilation/fail109.d(105): Error: enum member `fail109.d` initialization with `__anonymous.c+1` causes overflow for type `Q`
  ---
  */
  
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/fail11714.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/fail11714.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/fail11714.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/fail11714.d	Sun Feb  1 22:32:14 2026
***************
*** 1,8 ****
  /*
  TEST_OUTPUT:
  ---
! fail_compilation/fail11714.d(14): Error: variable `fail11714.c` is a thread-local class and cannot have a static initializer. Use `static this()` to initialize instead.
! fail_compilation/fail11714.d(21): Error: variable `fail11714.s` is a thread-local pointer to struct and cannot have a static initializer. Use `static this()` to initialize instead.
  ---
  */
  
--- 1,10 ----
  /*
  TEST_OUTPUT:
  ---
! fail_compilation/fail11714.d(16): Error: variable `fail11714.c` is a thread-local class and cannot have a static initializer
! fail_compilation/fail11714.d(16):        use `static this()` to initialize instead
! fail_compilation/fail11714.d(23): Error: variable `fail11714.s` is a thread-local pointer to struct and cannot have a static initializer
! fail_compilation/fail11714.d(23):        use `static this()` to initialize instead
  ---
  */
  
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/fail13756.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/fail13756.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/fail13756.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/fail13756.d	Sun Feb  1 22:32:14 2026
***************
*** 1,7 ****
  /*
  TEST_OUTPUT:
  ---
! fail_compilation/fail13756.d(11): Error: `foreach`: index must be type `const(int)`, not `int`
  ---
  */
  
--- 1,10 ----
  /*
  TEST_OUTPUT:
  ---
! fail_compilation/fail13756.d(14): Error: `foreach`: index parameter `ref k` must be type `const(int)`, not `int`
! fail_compilation/fail13756.d(17): Error: cannot implicitly convert expression `__applyArg0` of type `int` to `string`
! fail_compilation/fail13756.d(19): Error: cannot implicitly convert expression `__applyArg1` of type `int` to `char`
! fail_compilation/fail13756.d(20): Error: `foreach`: value parameter `ref val` must be type `int`, not `dchar`
  ---
  */
  
*************** void maiin()
*** 11,14 ****
--- 14,21 ----
      foreach (ref int k, v; aa)
      {
      }
+     foreach (string key, val; aa) {}
+ 
+     foreach (key, char val; aa) {}
+     foreach (key, ref dchar val; aa) {}
  }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/fail15361.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/fail15361.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/fail15361.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/fail15361.d	Sun Feb  1 22:32:14 2026
***************
*** 1,7 ****
  /*
  TEST_OUTPUT:
  ---
! fail_compilation/fail15361.d(8): Error: unexpected `(` after `errorize`, inside `is` expression. Try enclosing the contents of `is` with a `typeof` expression
  ---
  */
  
--- 1,8 ----
  /*
  TEST_OUTPUT:
  ---
! fail_compilation/fail15361.d(9): Error: unexpected `(` after `errorize`, inside `is` expression
! fail_compilation/fail15361.d(9):        try enclosing the contents of `is` with a `typeof` expression
  ---
  */
  
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/fail15616b.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/fail15616b.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/fail15616b.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/fail15616b.d	Sun Feb  1 22:32:14 2026
***************
*** 1,6 ****
  /*
  REQUIRED_ARGS: -v
! TRANSFORM_OUTPUT: remove_lines("^(predefs|binary|version|config|DFLAG|parse|import|semantic|entry|\s*$)")
  TEST_OUTPUT:
  ---
  fail_compilation/fail15616b.d(44): Error: none of the overloads of `foo` are callable using argument types `(double)`
--- 1,6 ----
  /*
  REQUIRED_ARGS: -v
! TRANSFORM_OUTPUT: remove_lines("^(predefs|binary|version|config|DFLAG|parse|import|\(imported|semantic|entry|\s*$)")
  TEST_OUTPUT:
  ---
  fail_compilation/fail15616b.d(44): Error: none of the overloads of `foo` are callable using argument types `(double)`
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/fail16.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/fail16.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/fail16.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/fail16.d	Sun Feb  1 22:32:14 2026
***************
*** 2,9 ****
  /*
  TEST_OUTPUT:
  ---
! fail_compilation/fail16.d(19): Error: function declaration without return type. (Note that constructors are always named `this`)
! fail_compilation/fail16.d(19): Error: variable name expected after type `bar!(typeof(X))(X)`, not `;`
  ---
  */
  
--- 2,10 ----
  /*
  TEST_OUTPUT:
  ---
! fail_compilation/fail16.d(20): Error: function declaration without return type
! fail_compilation/fail16.d(20):        Note that constructors are always named `this`
! fail_compilation/fail16.d(20): Error: variable name expected after type `bar!(typeof(X))(X)`, not `;`
  ---
  */
  
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/fail163.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/fail163.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/fail163.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/fail163.d	Sun Feb  1 22:32:14 2026
*************** void test1()
*** 14,20 ****
  /*
  TEST_OUTPUT:
  ---
! fail_compilation/fail163.d(24): Error: cannot implicitly convert expression `p` of type `const(int***)` to `const(int)***`
  ---
  */
  void test2()
--- 14,21 ----
  /*
  TEST_OUTPUT:
  ---
! fail_compilation/fail163.d(25): Error: cannot implicitly convert `const(int***)` to `const(int)***`
! fail_compilation/fail163.d(25):        Note: Converting const to mutable requires an explicit cast (`cast(int*)`).
  ---
  */
  void test2()
*************** void test2()
*** 27,33 ****
  /*
  TEST_OUTPUT:
  ---
! fail_compilation/fail163.d(37): Error: cannot modify `const` expression `p`
  ---
  */
  void test3()
--- 28,34 ----
  /*
  TEST_OUTPUT:
  ---
! fail_compilation/fail163.d(38): Error: cannot modify `const` expression `p`
  ---
  */
  void test3()
*************** void test3()
*** 40,46 ****
  /*
  TEST_OUTPUT:
  ---
! fail_compilation/fail163.d(50): Error: cannot implicitly convert expression `cp` of type `const(int)***[]` to `const(uint***)[]`
  ---
  */
  void test4()
--- 41,47 ----
  /*
  TEST_OUTPUT:
  ---
! fail_compilation/fail163.d(51): Error: cannot implicitly convert expression `cp` of type `const(int)***[]` to `const(uint***)[]`
  ---
  */
  void test4()
*************** void test4()
*** 53,59 ****
  /*
  TEST_OUTPUT:
  ---
! fail_compilation/fail163.d(63): Error: cannot modify `const` expression `*p`
  ---
  */
  void test5()
--- 54,60 ----
  /*
  TEST_OUTPUT:
  ---
! fail_compilation/fail163.d(64): Error: cannot modify `const` expression `*p`
  ---
  */
  void test5()
*************** void test5()
*** 66,73 ****
  /*
  TEST_OUTPUT:
  ---
! fail_compilation/fail163.d(76): Error: cannot implicitly convert expression `& x` of type `int*` to `immutable(int)*`
! fail_compilation/fail163.d(77): Error: cannot modify `immutable` expression `*p`
  ---
  */
  void test6()
--- 67,74 ----
  /*
  TEST_OUTPUT:
  ---
! fail_compilation/fail163.d(77): Error: cannot implicitly convert expression `& x` of type `int*` to `immutable(int)*`
! fail_compilation/fail163.d(78): Error: cannot modify `immutable` expression `*p`
  ---
  */
  void test6()
*************** void test6()
*** 80,86 ****
  /*
  TEST_OUTPUT:
  ---
! fail_compilation/fail163.d(89): Error: cannot implicitly convert expression `& x` of type `const(int)*` to `int*`
  ---
  */
  void test7()
--- 81,88 ----
  /*
  TEST_OUTPUT:
  ---
! fail_compilation/fail163.d(91): Error: cannot implicitly convert `const(int)*` to `int*`
! fail_compilation/fail163.d(91):        Note: Converting const to mutable requires an explicit cast (`cast(int*)`).
  ---
  */
  void test7()
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/fail18219.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/fail18219.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/fail18219.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/fail18219.d	Sun Feb  1 22:32:14 2026
***************
*** 3,13 ****
  /*
  TEST_OUTPUT:
  ---
! fail_compilation/fail18219.d(17): Error: no property `Foobar` for type `AST`, did you mean `b18219.Foobar`?
! fail_compilation/fail18219.d(18): Error: no property `Bar` for type `a18219.AST`
  fail_compilation/imports/a18219.d(3):        struct `AST` defined here
! fail_compilation/fail18219.d(19): Error: no property `fun` for type `AST`, did you mean `b18219.fun`?
! fail_compilation/fail18219.d(20): Error: no property `Foobar` for type `AST`, did you mean `b18219.Foobar`?
  ---
  */
  import imports.a18219;
--- 3,16 ----
  /*
  TEST_OUTPUT:
  ---
! fail_compilation/fail18219.d(20): Error: no property `Foobar` for type `AST`
! fail_compilation/imports/b18219.d(3):        did you mean `b18219.Foobar`?
! fail_compilation/fail18219.d(21): Error: no property `Bar` for type `a18219.AST`
  fail_compilation/imports/a18219.d(3):        struct `AST` defined here
! fail_compilation/fail18219.d(22): Error: no property `fun` for type `AST`
! fail_compilation/imports/b18219.d(15):        did you mean `b18219.fun`?
! fail_compilation/fail18219.d(23): Error: no property `Foobar` for type `AST`
! fail_compilation/imports/b18219.d(3):        did you mean `b18219.Foobar`?
  ---
  */
  import imports.a18219;
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/fail19103.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/fail19103.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/fail19103.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/fail19103.d	Sun Feb  1 22:32:14 2026
*************** fail_compilation/fail19103.d(14): Error:
*** 5,14 ****
  fail_compilation/fail19103.d(26):        class `C` defined here
  fail_compilation/fail19103.d(16): Error: no property `puts` for `s1` of type `fail19103.S1`
  fail_compilation/fail19103.d(30):        struct `S1` defined here
! fail_compilation/fail19103.d(18): Error: no property `puts` for type `S2`, did you mean `core.stdc.stdio.puts`?
  ---
  */
- 
  void main()
  {
      (new C).puts("OK."); // Error: no property puts for type test.C, did you mean core.stdc.stdio.puts(T...)(T args)?
--- 5,14 ----
  fail_compilation/fail19103.d(26):        class `C` defined here
  fail_compilation/fail19103.d(16): Error: no property `puts` for `s1` of type `fail19103.S1`
  fail_compilation/fail19103.d(30):        struct `S1` defined here
! fail_compilation/fail19103.d(18): Error: no property `puts` for type `S2`
! $p:druntime/import/core/stdc/stdio.d$($n$):        did you mean `core.stdc.stdio.puts`?
  ---
  */
  void main()
  {
      (new C).puts("OK."); // Error: no property puts for type test.C, did you mean core.stdc.stdio.puts(T...)(T args)?
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/fail196.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/fail196.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/fail196.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/fail196.d	Sun Feb  1 22:32:14 2026
*************** fail_compilation/fail196.d(44):        e
*** 21,27 ****
  fail_compilation/fail196.d(45): Error: found `}` when expecting `;` following expression
  fail_compilation/fail196.d(45):        expression: `xxx`
  fail_compilation/fail196.d(47): Error: found `<` when expecting `;` following expression
! fail_compilation/fail196.d(45):        expression: `");\n\n    s = q" < foo`
  fail_compilation/fail196.d(48): Error: found `foo` when expecting `;` following expression
  fail_compilation/fail196.d(47):        expression: `xxx >> ";\n    assert(s == "`
  fail_compilation/fail196.d(48): Error: found `<` instead of statement
--- 21,27 ----
  fail_compilation/fail196.d(45): Error: found `}` when expecting `;` following expression
  fail_compilation/fail196.d(45):        expression: `xxx`
  fail_compilation/fail196.d(47): Error: found `<` when expecting `;` following expression
! fail_compilation/fail196.d(47):        expression: `");\n\n    s = q" < foo`
  fail_compilation/fail196.d(48): Error: found `foo` when expecting `;` following expression
  fail_compilation/fail196.d(47):        expression: `xxx >> ";\n    assert(s == "`
  fail_compilation/fail196.d(48): Error: found `<` instead of statement
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/fail20365.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/fail20365.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/fail20365.d	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/fail20365.d	Sun Feb  1 22:32:14 2026
***************
*** 0 ****
--- 1,29 ----
+ /* REQUIRED_ARGS: -preview=bitfields
+ TEST_OUTPUT:
+ ---
+ fail_compilation/fail20365.d(16): Error: bitfield `a.x` cannot be assigned to `ref x`
+ fail_compilation/fail20365.d(23): Error: function `f` is not callable using argument types `(int)`
+ fail_compilation/fail20365.d(23):        cannot pass bitfield argument `a.y` to parameter `ref int`
+ fail_compilation/fail20365.d(19):        `fail20365.f(ref int)` declared here
+ fail_compilation/fail20365.d(28): Error: cannot `ref` return bitfield `a.y`
+ ---
+ */
+ 
+ struct A { int x : 16, y : 16; }
+ 
+ void ref_assign(A a)
+ {
+     ref int x = a.x;
+ }
+ 
+ void f(ref int);
+ 
+ void ref_param(A a)
+ {
+     f(a.y);
+ }
+ 
+ ref int ref_return(ref A a)
+ {
+     return a.y;
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/fail21414.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/fail21414.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/fail21414.d	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/fail21414.d	Sun Feb  1 22:32:14 2026
***************
*** 0 ****
--- 1,47 ----
+ // https://github.com/dlang/dmd/issues/21414
+ 
+ /* REQUIRED_ARGS: -o-
+ TEST_OUTPUT:
+ ---
+ fail_compilation/fail21414.d(42): Error: moving variable `__rvalue(s)` with `__rvalue` is not allowed in a `@safe` function
+ fail_compilation/fail21414.d(42): Error: moving variable `__rvalue(s)` with `__rvalue` is not allowed in a `@safe` function
+ fail_compilation/fail21414.d(44): Error: calling `__rvalue`-annotated function `unsafeMove` is not allowed in a `@safe` function
+ fail_compilation/fail21414.d(44): Error: calling `__rvalue`-annotated function `unsafeMove` is not allowed in a `@safe` function
+ fail_compilation/fail21414.d(46): Error: moving result of `ref` function `id` with `__rvalue` is not allowed in a `@safe` function
+ fail_compilation/fail21414.d(46): Error: moving result of `ref` function `id` with `__rvalue` is not allowed in a `@safe` function
+ ---
+ */
+ 
+ @safe:
+ 
+ struct S
+ {
+     int x;
+     this(int x)
+     {
+         this.x = x;
+     }
+     ~this() { }
+     this(S s) { }
+ }
+ 
+ void foo(S s, immutable(S) t)
+ {
+     assert(t.x == 2);
+     s.x = 3;
+     assert(t.x == 2);
+ }
+ 
+ ref unsafeMove(T)(ref T arg) __rvalue => arg;
+ 
+ ref id(T)(return ref T arg) => arg;
+ 
+ void main()
+ {
+     auto s = S(2);
+     foo(__rvalue(s), __rvalue(s));
+     auto t = S(2);
+     foo(unsafeMove(t), unsafeMove(t));
+     auto u = S(2);
+     foo(__rvalue(id(u)), __rvalue(id(u)));
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/fail21547.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/fail21547.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/fail21547.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/fail21547.d	Sun Feb  1 22:32:14 2026
***************
*** 3,10 ****
  /*
  TEST_OUTPUT:
  ---
! fail_compilation/fail21547.d(32): Error: struct `Bar` has constructors, cannot use `{ initializers }`, use `Bar( initializers )` instead
! fail_compilation/fail21547.d(33): Error: struct `Bar1` has constructors, cannot use `{ initializers }`, use `Bar1( initializers )` instead
  ---
  */
  
--- 3,12 ----
  /*
  TEST_OUTPUT:
  ---
! fail_compilation/fail21547.d(34): Error: Cannot use struct initializer syntax for struct `Bar` because it has a constructor
! fail_compilation/fail21547.d(34):        Use `Bar( arguments )` instead of `{ initializers }`
! fail_compilation/fail21547.d(35): Error: Cannot use struct initializer syntax for struct `Bar1` because it has a constructor
! fail_compilation/fail21547.d(35):        Use `Bar1( arguments )` instead of `{ initializers }`
  ---
  */
  
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/fail21660.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/fail21660.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/fail21660.d	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/fail21660.d	Sun Feb  1 22:32:14 2026
***************
*** 0 ****
--- 1,57 ----
+ // REQUIRED_ARGS: -preview=bitfields
+ /*
+ TEST_OUTPUT:
+ ---
+ fail_compilation/fail21660.d(29): Error: overlapping initialization for field `b` and `c`
+ fail_compilation/fail21660.d(29):        `struct` initializers that contain anonymous unions must initialize only the first member of a `union`. All subsequent non-overlapping fields are default initialized
+ fail_compilation/fail21660.d(30): Error: overlapping initialization for field `b` and `c`
+ fail_compilation/fail21660.d(30):        `struct` initializers that contain anonymous unions must initialize only the first member of a `union`. All subsequent non-overlapping fields are default initialized
+ fail_compilation/fail21660.d(52): Error: overlapping initialization for field `a` and `b`
+ fail_compilation/fail21660.d(52): Error: overlapping initialization for field `a` and `d`
+ fail_compilation/fail21660.d(52): Error: overlapping initialization for field `c` and `d`
+ fail_compilation/fail21660.d(54): Error: overlapping initialization for field `a` and `d`
+ ---
+ */
+ 
+ struct S
+ {
+     uint a : 1;
+     union {
+         uint b : 2;
+         struct {
+             uint c : 3;
+         }
+     }
+ }
+ 
+ void testS()
+ {
+     S s = S(1, 2, 3);       // b + c overlap
+     S t = S(a:1, b:2, c:3); // b + c overlap
+     S u = S(a:1, c:3);      // ok
+ }
+ 
+ union U
+ {
+     union {
+         uint a : 5;
+         uint b : 4;
+     }
+     struct {
+         uint : 5;
+         uint c : 11;
+     }
+     struct {
+         uint : 4;
+         uint d : 12;
+     }
+ }
+ 
+ void testU()
+ {
+     U s = U(1, 2, 3, 4); // a + b, a + d, c + d overlap
+     U t = U(a:1, c:3);   // ok
+     U u = U(a:1, d:2);   // a + d overlap
+     U v = U(b:1, c:3);   // ok
+     U w = U(b:1, d:2);   // ok
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/fail21693.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/fail21693.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/fail21693.d	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/fail21693.d	Sun Feb  1 22:32:14 2026
***************
*** 0 ****
--- 1,17 ----
+ /*
+ TEST_OUTPUT:
+ ---
+ fail_compilation/fail21693.d(15): Error: function `fail` is not callable using argument types `(uint)`
+ fail_compilation/fail21693.d(15):        cannot pass rvalue argument `__rvalue(s.x)` of type `uint` to parameter `ref uint`
+ fail_compilation/fail21693.d(11):        `fail21693.fail(ref uint)` declared here
+ fail_compilation/fail21693.d(16): Error: rvalue `__rvalue(s.x)` cannot be assigned to `ref x`
+ ---
+ */
+ struct S { uint x; }
+ void fail(ref uint);
+ 
+ void test21693(S s)
+ {
+     fail(__rvalue(s.x));
+     ref x = __rvalue(s.x);
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/fail22749.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/fail22749.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/fail22749.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/fail22749.d	Sun Feb  1 22:32:14 2026
***************
*** 1,7 ****
  // EXTRA_FILES: imports/imp22749.c
  /* TEST_OUTPUT:
  ---
! fail_compilation/fail22749.d(12): Error: cannot take address of bit-field `field`
  ---
  */
  import imports.imp22749;
--- 1,7 ----
  // EXTRA_FILES: imports/imp22749.c
  /* TEST_OUTPUT:
  ---
! fail_compilation/fail22749.d(12): Error: cannot take address of bitfield `s.field`
  ---
  */
  import imports.imp22749;
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/fail23439.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/fail23439.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/fail23439.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/fail23439.d	Sun Feb  1 22:32:14 2026
***************
*** 2,8 ****
  // PERMUTE_ARGS: -lowmem
  /* TEST_OUTPUT:
  ---
! fail_compilation/fail23439.d(13): Error: variable `fail23439.ice23439` is a thread-local class and cannot have a static initializer. Use `static this()` to initialize instead.
  ---
  */
  class C23439
--- 2,9 ----
  // PERMUTE_ARGS: -lowmem
  /* TEST_OUTPUT:
  ---
! fail_compilation/fail23439.d(14): Error: variable `fail23439.ice23439` is a thread-local class and cannot have a static initializer
! fail_compilation/fail23439.d(14):        use `static this()` to initialize instead
  ---
  */
  class C23439
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/fail305.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/fail305.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/fail305.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/fail305.d	Thu Jan  1 00:00:00 1970
***************
*** 1,11 ****
- /*
- TEST_OUTPUT:
- ---
- fail_compilation/fail305.d(10): Error: cannot return non-void from `void` function
- ---
- */
- 
- void main()
- {
-     return "a";
- }
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/fail336.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/fail336.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/fail336.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/fail336.d	Sun Feb  1 22:32:14 2026
***************
*** 1,7 ****
  /*
  TEST_OUTPUT:
  ---
! fail_compilation/fail336.d(16): Error: struct `S` has constructors, cannot use `{ initializers }`, use `S( initializers )` instead
  ---
  */
  
--- 1,8 ----
  /*
  TEST_OUTPUT:
  ---
! fail_compilation/fail336.d(17): Error: Cannot use struct initializer syntax for struct `S` because it has a constructor
! fail_compilation/fail336.d(17):        Use `S( arguments )` instead of `{ initializers }`
  ---
  */
  
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/fail347.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/fail347.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/fail347.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/fail347.d	Sun Feb  1 22:32:14 2026
*************** EXTRA_FILES: imports/fail347a.d
*** 3,18 ****
  TEST_OUTPUT:
  ---
  fail_compilation/fail347.d(26): Error: undefined identifier `bbr`, did you mean variable `bar`?
! fail_compilation/fail347.d(27): Error: no property `ofo` for type `S`, did you mean `fail347.S.foo`?
! fail_compilation/fail347.d(29): Error: no property `fool` for `sp` of type `fail347.S*`
! fail_compilation/fail347.d(20):        did you mean variable `foo`?
  fail_compilation/fail347.d(30): Error: undefined identifier `strlenx`, did you mean function `strlen`?
  fail_compilation/fail347.d(31): Error: no property `strlenx` for `"hello"` of type `string`
  fail_compilation/imports/fail347a.d(3):        did you mean function `strlen`?
  ---
  */
  
- //import core.stdc.string;
  import imports.fail347a;
  
  struct S
--- 3,18 ----
  TEST_OUTPUT:
  ---
  fail_compilation/fail347.d(26): Error: undefined identifier `bbr`, did you mean variable `bar`?
! fail_compilation/fail347.d(27): Error: no property `ofo` for type `S`
! fail_compilation/fail347.d(20):        did you mean `foo`?
! fail_compilation/fail347.d(29): Error: no property `fool` for type `S*`
! fail_compilation/fail347.d(20):        did you mean `foo`?
  fail_compilation/fail347.d(30): Error: undefined identifier `strlenx`, did you mean function `strlen`?
  fail_compilation/fail347.d(31): Error: no property `strlenx` for `"hello"` of type `string`
  fail_compilation/imports/fail347a.d(3):        did you mean function `strlen`?
  ---
  */
  
  import imports.fail347a;
  
  struct S
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/fail41.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/fail41.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/fail41.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/fail41.d	Thu Jan  1 00:00:00 1970
***************
*** 1,18 ****
- /*
- TEST_OUTPUT:
- ---
- fail_compilation/fail41.d(17): Error: cannot return non-void from `void` function
- ---
- */
- 
- class MyClass
- {
- }
- 
- MyClass[char[]] myarray;
- 
- void fn()
- {
-     foreach (MyClass mc; myarray)
-         return mc;
- }
--- 0 ----
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/fail6497.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/fail6497.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/fail6497.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/fail6497.d	Sun Feb  1 22:32:14 2026
***************
*** 1,8 ****
  /*
  TEST_OUTPUT:
  ---
! fail_compilation/fail6497.d(12): Error: taking the address of stack-allocated local variable `n` is not allowed in a `@safe` function
! fail_compilation/fail6497.d(12): Error: taking the address of stack-allocated local variable `n` is not allowed in a `@safe` function
  ---
  */
  
--- 1,9 ----
  /*
  TEST_OUTPUT:
  ---
! fail_compilation/fail6497.d(13): Error: taking the address of stack-allocated local variable `n` is not allowed in a `@safe` function
! fail_compilation/fail6497.d(13): Error: taking the address of stack-allocated local variable `n` is not allowed in a `@safe` function
! fail_compilation/fail6497.d(19): Error: taking the address of local variable `i` is not allowed in a `@safe` function
  ---
  */
  
*************** void main() @safe
*** 11,13 ****
--- 12,20 ----
      int n;
      auto b = &(0 ? n : n);
  }
+ 
+ void f() @safe
+ {
+     ref i = *new int;
+     auto b = &i;
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/fail6795.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/fail6795.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/fail6795.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/fail6795.d	Sun Feb  1 22:32:14 2026
*************** fail_compilation/fail6795.d(20): Error:
*** 7,16 ****
  fail_compilation/fail6795.d(22): Error: cannot modify expression `[0][0]` because it is not an lvalue
  fail_compilation/fail6795.d(23): Error: cannot modify expression `[0:0][0]` because it is not an lvalue
  fail_compilation/fail6795.d(25): Error: cannot take address of expression `[0][0]` because it is not an lvalue
- fail_compilation/fail6795.d(26): Error: cannot take address of expression `[0:0][0]` because it is not an lvalue
  fail_compilation/fail6795.d(30): Error: cannot modify expression `Some["zz"]` because it is not an lvalue
  ---
  */
  void test_wrong_line_num()
  {
      enum int[1] sa = [0];
--- 7,16 ----
  fail_compilation/fail6795.d(22): Error: cannot modify expression `[0][0]` because it is not an lvalue
  fail_compilation/fail6795.d(23): Error: cannot modify expression `[0:0][0]` because it is not an lvalue
  fail_compilation/fail6795.d(25): Error: cannot take address of expression `[0][0]` because it is not an lvalue
  fail_compilation/fail6795.d(30): Error: cannot modify expression `Some["zz"]` because it is not an lvalue
  ---
  */
+ 
  void test_wrong_line_num()
  {
      enum int[1] sa = [0];
*************** void test_wrong_line_num()
*** 23,29 ****
      aa[0] /= 3;
  
      auto ps = &sa[0];
!     auto pa = &aa[0];
  
      // https://issues.dlang.org/show_bug.cgi?id=24845
      enum Maps : int[string] { Some = ["aa" : 12], Other = ["bb" : 24] }
--- 23,29 ----
      aa[0] /= 3;
  
      auto ps = &sa[0];
!     auto pa = &aa[0]; // ok with AA lowering, just as `pa = 0 in aa`
  
      // https://issues.dlang.org/show_bug.cgi?id=24845
      enum Maps : int[string] { Some = ["aa" : 12], Other = ["bb" : 24] }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/fail98.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/fail98.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/fail98.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/fail98.d	Sun Feb  1 22:32:14 2026
***************
*** 1,7 ****
  /*
  TEST_OUTPUT:
  ---
! fail_compilation/fail98.d(17): Error: cannot implicitly convert expression `256` of type `int` to `E`
  ---
  */
  
--- 1,10 ----
  /*
  TEST_OUTPUT:
  ---
! fail_compilation/fail98.d(20): Error: cannot implicitly convert expression `256` of type `int` to `E`
! fail_compilation/fail98.d(21): Error: cannot automatically assign value to enum member `fail98.D3DTS_WORLD1` because base type `E` is an enum; provide an explicit value
! fail_compilation/fail98.d(22): Error: cannot automatically assign value to enum member `fail98.D3DTS_WORLD2` because base type `E` is an enum; provide an explicit value
! fail_compilation/fail98.d(23): Error: cannot automatically assign value to enum member `fail98.D3DTS_WORLD3` because base type `E` is an enum; provide an explicit value
  ---
  */
  
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/fail_pretty_errors.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/fail_pretty_errors.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/fail_pretty_errors.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/fail_pretty_errors.d	Sun Feb  1 22:32:14 2026
*************** fail_compilation/fail_pretty_errors.d(44
*** 16,22 ****
      ^
  fail_compilation/fail_pretty_errors.d(50): Error: invalid array operation `"" + ""` (possible missing [])
      auto x = ""+"";
!              ^
  fail_compilation/fail_pretty_errors.d(50):        did you mean to concatenate (`"" ~ ""`) instead ?
  fail_compilation/fail_pretty_errors.d(53): Error: cannot implicitly convert expression `1111` of type `int` to `byte`
          byte ɑ =    1111;
--- 16,22 ----
      ^
  fail_compilation/fail_pretty_errors.d(50): Error: invalid array operation `"" + ""` (possible missing [])
      auto x = ""+"";
!                ^
  fail_compilation/fail_pretty_errors.d(50):        did you mean to concatenate (`"" ~ ""`) instead ?
  fail_compilation/fail_pretty_errors.d(53): Error: cannot implicitly convert expression `1111` of type `int` to `byte`
          byte ɑ =    1111;
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/failcontracts.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/failcontracts.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/failcontracts.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/failcontracts.d	Sun Feb  1 22:32:14 2026
***************
*** 1,14 ****
  /* TEST_OUTPUT:
  ---
! fail_compilation/failcontracts.d(17): Error: missing `{ ... }` for function literal
! fail_compilation/failcontracts.d(17): Error: semicolon expected following auto declaration, not `bode`
! fail_compilation/failcontracts.d(18): Error: function declaration without return type. (Note that constructors are always named `this`)
! fail_compilation/failcontracts.d(18): Error: variable name expected after type `test1()`, not `bode`
! fail_compilation/failcontracts.d(18): Error: semicolon expected following function declaration, not `bode`
  fail_compilation/failcontracts.d(19): Error: semicolon expected following function declaration, not `bode`
! fail_compilation/failcontracts.d(21): Error: unexpected `(` in declarator
! fail_compilation/failcontracts.d(21): Error: found `T` when expecting `)`
! fail_compilation/failcontracts.d(21): Error: expected `{`, not `;` for enum declaration
  ---
  */
  
--- 1,15 ----
  /* TEST_OUTPUT:
  ---
! fail_compilation/failcontracts.d(18): Error: missing `{ ... }` for function literal
! fail_compilation/failcontracts.d(18): Error: semicolon expected following auto declaration, not `bode`
! fail_compilation/failcontracts.d(19): Error: function declaration without return type
! fail_compilation/failcontracts.d(19):        Note that constructors are always named `this`
! fail_compilation/failcontracts.d(19): Error: variable name expected after type `test1()`, not `bode`
  fail_compilation/failcontracts.d(19): Error: semicolon expected following function declaration, not `bode`
! fail_compilation/failcontracts.d(20): Error: semicolon expected following function declaration, not `bode`
! fail_compilation/failcontracts.d(22): Error: unexpected `(` in declarator
! fail_compilation/failcontracts.d(22): Error: found `T` when expecting `)`
! fail_compilation/failcontracts.d(22): Error: expected `{`, not `;` for enum declaration
  ---
  */
  
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/fix19613.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/fix19613.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/fix19613.d	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/fix19613.d	Sun Feb  1 22:32:14 2026
***************
*** 0 ****
--- 1,16 ----
+ /*
+ TEST_OUTPUT:
+ ---
+ fail_compilation/fix19613.d(15): Error: function `fix19613.B.a` cannot override `final` function `fix19613.A.a`
+ fail_compilation/fix19613.d(15): Error: function `fix19613.B.a` does not override any function
+ fail_compilation/fix19613.d(15):        Did you mean to override `void fix19613.A.a(string)`?
+ ---
+ */
+ 
+ class A {
+         final void a(int) {}
+         void a(string) {}
+ }
+ class B : A {
+         override void a(int) {}
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/fix20075.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/fix20075.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/fix20075.d	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/fix20075.d	Sun Feb  1 22:32:14 2026
***************
*** 0 ****
--- 1,21 ----
+ /*
+ TEST_OUTPUT:
+ ---
+ fail_compilation/fix20075.d(15): Error: none of the overloads of `this` can construct an immutable object with argument types `(int*)`. Expected `immutable(int*)`
+ fail_compilation/fix20075.d(11):        Candidate is: `fix20075.Foo.this(immutable(int*) a) immutable`
+ ---
+ */
+ 
+ struct Foo {
+     @disable this();
+     immutable this(immutable int* a) {}
+ }
+ 
+ immutable(Foo) getFoo(int* a) {
+     return immutable Foo(a);
+ }
+ 
+ void main() {
+     int x;
+     auto foo = getFoo(&x);
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/fix20318.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/fix20318.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/fix20318.d	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/fix20318.d	Sun Feb  1 22:32:14 2026
***************
*** 0 ****
--- 1,46 ----
+ /*
+ TEST_OUTPUT:
+ ---
+ fail_compilation/fix20318.d(16): Error: cannot implicitly convert expression `c` of type `const(Bar)` to `Bar` because struct `Bar` contains pointers or references
+ fail_compilation/fix20318.d(20): Error: cannot implicitly convert expression `complex_c` of type `const(ComplexBar)` to `ComplexBar` because struct `ComplexBar` contains pointers or references
+ ---
+ */
+ 
+ void main() {
+     // This should work - struct without pointers
+     const Foo a;
+     Foo b = a; // This is okay
+ 
+     // This should fail with improved diagnostic message
+     const Bar c;
+     Bar d = c; // Error with improved diagnostic message
+ 
+     // Test with a more complex struct with nested pointers
+     const ComplexBar complex_c;
+     ComplexBar complex_d = complex_c; // Give improved error message
+ }
+ 
+ struct Foo {
+     int value;
+ }
+ 
+ struct Bar {
+     void* ptr;
+ }
+ 
+ // Simple struct without pointers
+ struct Simple {
+     int value;
+ }
+ 
+ // Struct with a pointer
+ struct WithPointer {
+     int* ptr;
+ }
+ 
+ // Complex struct that contains another struct with pointers
+ struct ComplexBar {
+     Simple simple;       // This is fine
+     int data;            // This is fine
+     WithPointer nested;  // This field prevents implicit conversion
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/fix20867.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/fix20867.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/fix20867.d	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/fix20867.d	Sun Feb  1 22:32:14 2026
***************
*** 0 ****
--- 1,20 ----
+ /*
+ TEST_OUTPUT:
+ ---
+ fail_compilation/fix20867.d(14): Error: cannot use `final switch` on enum `E` while it is being defined
+ ---
+ */
+ 
+ // Test case from Issue #20867
+ enum E
+ {
+     a = 3,
+     b = () {
+         E e;
+         final switch (e)  // This should error out instead of segfaulting
+         {
+             case E.a: break;
+         }
+         return 4;
+     } ()
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/fix21042.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/fix21042.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/fix21042.d	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/fix21042.d	Sun Feb  1 22:32:14 2026
***************
*** 0 ****
--- 1,15 ----
+ /*
+ TEST_OUTPUT:
+ ---
+ fail_compilation/fix21042.d(14): Error: template `gun` is not callable using argument types `!()(int)`
+ fail_compilation/fix21042.d(14):        no parameter named `x`
+ fail_compilation/fix21042.d(10):        Candidate is: `gun(T)(T a)`
+ ---
+ */
+ 
+ void gun(T)(T a) {}
+ 
+ void main()
+ {
+ 	gun(x: 1); // (no explanation) --> (no parameter named `x`)
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/fix21165.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/fix21165.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/fix21165.d	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/fix21165.d	Sun Feb  1 22:32:14 2026
***************
*** 0 ****
--- 1,30 ----
+ /*
+ TEST_OUTPUT:
+ ---
+ fail_compilation/fix21165.d(12): Error: undefined identifier `foo`
+ fail_compilation/fix21165.d(16): Error: undefined identifier `foo`
+ fail_compilation/fix21165.d(21): Error: undefined identifier `foo`
+ fail_compilation/fix21165.d(30): Error: undefined identifier `foo`
+ ---
+ */
+ 
+ // Test case from Issue #21165
+ foo
+ f() {}
+ 
+ // Test case from Issue #21171
+ foo
+ bar;
+ 
+ // Test case from Issue #21169
+ void fun(
+ 	foo x
+ ) {}
+ 
+ // Test case from Issue #21168
+ enum plusOne(int x) = x + 1;
+ 
+ alias fooPlusOne =
+ 	plusOne
+ 	!
+ 	foo;
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/fix21166.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/fix21166.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/fix21166.d	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/fix21166.d	Sun Feb  1 22:32:14 2026
***************
*** 0 ****
--- 1,13 ----
+ /*
+ TEST_OUTPUT:
+ ---
+ fail_compilation/fix21166.d(12): Error: invalid array operation `"foo" + "bar"` (possible missing [])
+ fail_compilation/fix21166.d(12):        did you mean to concatenate (`"foo" ~ "bar"`) instead ?
+ ---
+ */
+ 
+ // Test case for https://github.com/dlang/dmd/issues/21166
+ auto r =
+ 	"foo"
+ 	+
+ 	"bar";
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/fix22108.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/fix22108.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/fix22108.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/fix22108.d	Sun Feb  1 22:32:14 2026
*************** fail_compilation/fix22108.d(12): Error:
*** 7,13 ****
  
  // https://issues.dlang.org/show_bug.cgi?id=22108
  
! @safe ref int test(ref scope return int* p)
  {
      return *p;
  }
--- 7,13 ----
  
  // https://issues.dlang.org/show_bug.cgi?id=22108
  
! @safe ref int test(return ref scope int* p)
  {
      return *p;
  }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/foreach_seq.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/foreach_seq.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/foreach_seq.d	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/foreach_seq.d	Sun Feb  1 22:32:14 2026
***************
*** 0 ****
--- 1,38 ----
+ /*
+ TEST_OUTPUT:
+ ---
+ fail_compilation/foreach_seq.d(25): Error: only one (element) or two (index, element) arguments allowed for sequence `foreach`, not 3
+ fail_compilation/foreach_seq.d(26): Error: invalid storage class `ref` for index `i`
+ fail_compilation/foreach_seq.d(27): Error: foreach: index cannot be of non-integral type `void`
+ fail_compilation/foreach_seq.d(28): Error: index type `bool` cannot cover index range 0..3
+ fail_compilation/foreach_seq.d(29): Error: `foreach` loop variable cannot be both `enum` and `alias`
+ fail_compilation/foreach_seq.d(30): Error: constant value `1` cannot be `ref`
+ fail_compilation/foreach_seq.d(31): Error: invalid storage class `enum` for index `i`
+ fail_compilation/foreach_seq.d(33): Error: invalid storage class `ref` for element `e`
+ fail_compilation/foreach_seq.d(34): Error: symbol `object` cannot be `ref`
+ fail_compilation/foreach_seq.d(35): Error: cannot specify element type for symbol `e`
+ fail_compilation/foreach_seq.d(36): Error: cannot specify element type for symbol `object`
+ fail_compilation/foreach_seq.d(37): Error: invalid storage class `enum` for element `e`
+ ---
+ */
+ 
+ // test semantic errors on foreach parameters
+ void main()
+ {
+     alias AliasSeq(A...) = A;
+     alias seq = AliasSeq!(1, 2, 3);
+ 
+     foreach (a, b, c; seq) {}
+     foreach (ref i, e; seq) {}
+     foreach (void i, e; seq) {}
+     foreach (bool i, e; seq) {}
+     foreach (enum alias e; seq) {}
+     foreach (ref enum e; seq) {}
+     foreach (ref enum i, e; seq) {}
+ 
+     foreach (ref e; AliasSeq!int) {}
+     foreach (ref e; AliasSeq!object) {}
+     foreach (int e; AliasSeq!int) {}
+     foreach (int e; AliasSeq!object) {}
+     foreach (enum e; AliasSeq!int) {}
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/hidden_ctor.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/hidden_ctor.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/hidden_ctor.d	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/hidden_ctor.d	Sun Feb  1 22:32:14 2026
***************
*** 0 ****
--- 1,27 ----
+ /*
+ TEST_OUTPUT:
+ ---
+ fail_compilation/hidden_ctor.d(25): Error: constructor `hidden_ctor.B.this(string s)` is not callable using argument types `()`
+ fail_compilation/hidden_ctor.d(25):        Note: constructor `hidden_ctor.B.this` hides base class constructor `hidden_ctor.A.this`
+ ---
+ */
+ 
+ class A {
+     int a;
+ 
+     this() {
+         this.a = 1;
+     }
+ }
+ class B : A {
+     string b;
+ 
+     this(string s) {
+         super();
+         this.b = s;
+     }
+ }
+ void main() {
+     auto b = new B();
+     b = new B("Hi, Mom!");
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/ice10938.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/ice10938.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/ice10938.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/ice10938.d	Sun Feb  1 22:32:14 2026
***************
*** 2,8 ****
  TEST_OUTPUT:
  ---
  fail_compilation/ice10938.d(14): Error: no property `opts` for `this` of type `ice10938.C`
! fail_compilation/ice10938.d(19): Error: forward reference to inferred return type of function call `this.opDispatch()`
  fail_compilation/ice10938.d(14): Error: template instance `ice10938.C.opDispatch!"opts"` error instantiating
  ---
  */
--- 2,8 ----
  TEST_OUTPUT:
  ---
  fail_compilation/ice10938.d(14): Error: no property `opts` for `this` of type `ice10938.C`
! fail_compilation/ice10938.d(19): Error: can't infer return type in function `opDispatch`
  fail_compilation/ice10938.d(14): Error: template instance `ice10938.C.opDispatch!"opts"` error instantiating
  ---
  */
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/ice11153.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/ice11153.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/ice11153.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/ice11153.d	Sun Feb  1 22:32:14 2026
***************
*** 1,8 ****
  /*
  TEST_OUTPUT:
  ---
! fail_compilation/ice11153.d(11): Error: function declaration without return type. (Note that constructors are always named `this`)
! fail_compilation/ice11153.d(11): Error: variable name expected after type `foo()`, not `{`
  ---
  */
  
--- 1,9 ----
  /*
  TEST_OUTPUT:
  ---
! fail_compilation/ice11153.d(12): Error: function declaration without return type
! fail_compilation/ice11153.d(12):        Note that constructors are always named `this`
! fail_compilation/ice11153.d(12): Error: variable name expected after type `foo()`, not `{`
  ---
  */
  
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/ice13644.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/ice13644.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/ice13644.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/ice13644.d	Sun Feb  1 22:32:14 2026
***************
*** 1,7 ****
  /*
  TEST_OUTPUT:
  ---
! fail_compilation/ice13644.d(22): Error: foreach: key cannot be of non-integral type `string`
  ---
  */
  
--- 1,7 ----
  /*
  TEST_OUTPUT:
  ---
! fail_compilation/ice13644.d(22): Error: foreach: index cannot be of non-integral type `string`
  ---
  */
  
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/ice19755.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/ice19755.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/ice19755.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/ice19755.d	Sun Feb  1 22:32:14 2026
***************
*** 1,7 ****
  /* TEST_OUTPUT:
  ---
! fail_compilation/ice19755.d(11): Error: no property `x` for `self` of type `ice19755.Thunk!int*`
! fail_compilation/ice19755.d(16): Error: template instance `ice19755.Thunk!int` error instantiating
  ---
  */
  struct Thunk(Dummy) {
--- 1,8 ----
  /* TEST_OUTPUT:
  ---
! fail_compilation/ice19755.d(12): Error: no property `x` for `self` of type `ice19755.Thunk!int*`
! fail_compilation/ice19755.d(8):        struct `Thunk` defined here
! fail_compilation/ice19755.d(17): Error: template instance `ice19755.Thunk!int` error instantiating
  ---
  */
  struct Thunk(Dummy) {
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/imports/imp18127a.c gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/imports/imp18127a.c
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/imports/imp18127a.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/imports/imp18127a.c	Sun Feb  1 22:32:14 2026
***************
*** 0 ****
--- 1,83 ----
+ // https://github.com/dlang/dmd/issues/18127
+ // union in here, struct in other
+ union struct_or_union {
+     int x;
+ };
+ 
+ // mismatching number of fields
+ struct S_n_fields {
+     int x, y;
+ };
+ 
+ // mismatched types
+ struct S_types {
+     float x;
+ };
+ 
+ // mismatched names
+ struct S_names {
+     float x;
+ };
+ 
+ struct B {
+     int x;
+ };
+ 
+ // Contains a struct that is incompatible
+ struct S_b {
+     struct B b;
+ };
+ 
+ // mismatched anonymous struct
+ struct S_contains_anon_named {
+     struct {
+         int x;
+     } a;
+ };
+ 
+ struct S_contains_anon_unnamed {
+     struct {
+         int x;
+     };
+ };
+ 
+ // bitfields
+ struct S_bitfields_mismatch1 {
+     unsigned x: 3;
+     unsigned y: 1;
+ };
+ struct S_bitfields_mismatch2 {
+     unsigned x;
+     unsigned y: 1;
+ };
+ 
+ struct S_bitfields_widths {
+     unsigned x: 3;
+     unsigned y: 1;
+ };
+ 
+ struct S_bitfields_anon {
+     unsigned x: 3;
+     unsigned : 1;
+ };
+ 
+ // mismatched alignment
+ struct S_alignas {
+     _Alignas(8) float x;
+ };
+ struct S_aligned {
+     float x;
+ }__attribute__((aligned(8)));
+ 
+ // mismatched packing
+ struct __attribute__((packed)) S_pack_1 {
+     float x;
+     char c;
+ };
+ #pragma pack(push)
+ #pragma pack(1)
+ struct S_pack_2 {
+     float x;
+     char c;
+ };
+ #pragma pack(pop)
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/imports/imp18127b.c gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/imports/imp18127b.c
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/imports/imp18127b.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/imports/imp18127b.c	Sun Feb  1 22:32:14 2026
***************
*** 0 ****
--- 1,80 ----
+ // https://github.com/dlang/dmd/issues/18127
+ // struct in here, union in other
+ struct struct_or_union {
+     int x;
+ };
+ 
+ // mismatching number of fields
+ struct S_n_fields {
+     int x;
+ };
+ 
+ // mismatched types
+ struct S_types {
+     int x;
+ };
+ 
+ // mismatched names
+ struct S_names {
+     float y;
+ };
+ 
+ struct B {
+     float x;
+ };
+ 
+ // Contains a struct that is incompatible
+ struct S_b {
+     struct B b;
+ };
+ 
+ // mismatched anonymous struct
+ struct S_contains_anon_named {
+     struct {
+         float x;
+     } a;
+ };
+ 
+ struct S_contains_anon_unnamed {
+     struct {
+         float x;
+     };
+ };
+ 
+ // bitfields
+ struct S_bitfields_mismatch1 {
+     unsigned x: 3;
+     unsigned y;
+ };
+ struct S_bitfields_mismatch2 {
+     unsigned x: 3;
+     unsigned y: 1;
+ };
+ 
+ struct S_bitfields_widths {
+     unsigned x: 3;
+     unsigned y: 2;
+ };
+ 
+ struct S_bitfields_anon {
+     unsigned x: 3;
+     unsigned y: 1;
+ };
+ 
+ // mismatched alignment
+ struct S_alignas {
+     float x;
+ };
+ struct S_aligned {
+     float x;
+ }__attribute__((aligned(4)));
+ 
+ // mismatched packing
+ struct S_pack_1 {
+     float x;
+     char c;
+ };
+ struct S_pack_2 {
+     float x;
+     char c;
+ };
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/issue21630.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/issue21630.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/issue21630.d	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/issue21630.d	Sun Feb  1 22:32:14 2026
***************
*** 0 ****
--- 1,18 ----
+ /+
+ TEST_OUTPUT:
+ ---
+ fail_compilation/issue21630.d(14): Error: cannot declare `enum` loop variables for non-unrolled foreach
+ fail_compilation/issue21630.d(15): Error: cannot declare `alias` loop variables for non-unrolled foreach
+ fail_compilation/issue21630.d(16): Error: cannot declare `enum` loop variables for non-unrolled foreach
+ fail_compilation/issue21630.d(17): Error: cannot declare `alias` loop variables for non-unrolled foreach
+ ---
+ +/
+ 
+ void main()
+ {
+     enum a = [1, 2, 3];
+     foreach(enum i; a) { } // error
+     foreach(alias i; a) { } // error
+     foreach(enum i; 0 .. 3) {  } // error
+     foreach(alias i; 0 .. 3) {  } // error
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/lookup.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/lookup.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/lookup.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/lookup.d	Sun Feb  1 22:32:14 2026
***************
*** 2,11 ****
  EXTRA_FILES: imports/imp1.d imports/imp2.d
  TEST_OUTPUT:
  ---
! fail_compilation/lookup.d(24): Error: no property `X` for type `lookup.B`, did you mean `imports.imp2.X`?
! fail_compilation/lookup.d(24):        while evaluating: `static assert((B).X == 0)`
! fail_compilation/lookup.d(25): Error: no property `Y` for type `lookup.B`, did you mean `imports.imp2.Y`?
! fail_compilation/lookup.d(25):        while evaluating: `static assert((B).Y == 2)`
  ---
  */
  
--- 2,13 ----
  EXTRA_FILES: imports/imp1.d imports/imp2.d
  TEST_OUTPUT:
  ---
! fail_compilation/lookup.d(26): Error: no property `X` for type `lookup.B`
! fail_compilation/imports/imp2.d(3):        did you mean `imports.imp2.X`?
! fail_compilation/lookup.d(26):        while evaluating: `static assert((B).X == 0)`
! fail_compilation/lookup.d(27): Error: no property `Y` for type `lookup.B`
! fail_compilation/imports/imp2.d(4):        did you mean `imports.imp2.Y`?
! fail_compilation/lookup.d(27):        while evaluating: `static assert((B).Y == 2)`
  ---
  */
  
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/mixinprop.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/mixinprop.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/mixinprop.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/mixinprop.d	Sun Feb  1 22:32:14 2026
***************
*** 1,9 ****
  /* TEST_OUTPUT:
  ---
! fail_compilation/mixinprop.d(12): Error: no property `x` for `mixin Foo!() F;
! ` of type `void`
  ---
  */
  mixin template Foo() { }
  
  void main()
--- 1,9 ----
  /* TEST_OUTPUT:
  ---
! fail_compilation/mixinprop.d(12): Error: no property `x` for `mixin Foo!() F;` of type `void`
  ---
  */
+ 
  mixin template Foo() { }
  
  void main()
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/named_arguments_error.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/named_arguments_error.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/named_arguments_error.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/named_arguments_error.d	Sun Feb  1 22:32:14 2026
***************
*** 1,26 ****
  /*
  TEST_OUTPUT:
  ---
- fail_compilation/named_arguments_error.d(37): Error: function `f` is not callable using argument types `(int, int, int)`
- fail_compilation/named_arguments_error.d(37):        parameter `x` assigned twice
- fail_compilation/named_arguments_error.d(31):        `named_arguments_error.f(int x, int y, int z)` declared here
  fail_compilation/named_arguments_error.d(38): Error: function `f` is not callable using argument types `(int, int, int)`
! fail_compilation/named_arguments_error.d(38):        argument `4` goes past end of parameter list
! fail_compilation/named_arguments_error.d(31):        `named_arguments_error.f(int x, int y, int z)` declared here
  fail_compilation/named_arguments_error.d(39): Error: function `f` is not callable using argument types `(int, int, int)`
! fail_compilation/named_arguments_error.d(39):        parameter `y` assigned twice
! fail_compilation/named_arguments_error.d(31):        `named_arguments_error.f(int x, int y, int z)` declared here
  fail_compilation/named_arguments_error.d(40): Error: function `f` is not callable using argument types `(int, int, int)`
! fail_compilation/named_arguments_error.d(40):        no parameter named `a`
! fail_compilation/named_arguments_error.d(31):        `named_arguments_error.f(int x, int y, int z)` declared here
! fail_compilation/named_arguments_error.d(41): Error: function `g` is not callable using argument types `(int, int)`
! fail_compilation/named_arguments_error.d(41):        missing argument for parameter #1: `int x`
! fail_compilation/named_arguments_error.d(33):        `named_arguments_error.g(int x, int y, int z = 3)` declared here
! fail_compilation/named_arguments_error.d(43): Error: no named argument `element` allowed for array dimension
! fail_compilation/named_arguments_error.d(44): Error: no named argument `number` allowed for scalar
! fail_compilation/named_arguments_error.d(45): Error: cannot implicitly convert expression `g(x: 3, y: 4, z: 5)` of type `int` to `string`
! fail_compilation/named_arguments_error.d(46): Error: template `tempfun` is not callable using argument types `!()(int, int)`
! fail_compilation/named_arguments_error.d(49):        Candidate is: `tempfun(T, U)(T t, U u)`
  ---
  */
  
--- 1,27 ----
  /*
  TEST_OUTPUT:
  ---
  fail_compilation/named_arguments_error.d(38): Error: function `f` is not callable using argument types `(int, int, int)`
! fail_compilation/named_arguments_error.d(38):        parameter `x` assigned twice
! fail_compilation/named_arguments_error.d(32):        `named_arguments_error.f(int x, int y, int z)` declared here
  fail_compilation/named_arguments_error.d(39): Error: function `f` is not callable using argument types `(int, int, int)`
! fail_compilation/named_arguments_error.d(39):        argument `4` goes past end of parameter list
! fail_compilation/named_arguments_error.d(32):        `named_arguments_error.f(int x, int y, int z)` declared here
  fail_compilation/named_arguments_error.d(40): Error: function `f` is not callable using argument types `(int, int, int)`
! fail_compilation/named_arguments_error.d(40):        parameter `y` assigned twice
! fail_compilation/named_arguments_error.d(32):        `named_arguments_error.f(int x, int y, int z)` declared here
! fail_compilation/named_arguments_error.d(41): Error: function `f` is not callable using argument types `(int, int, int)`
! fail_compilation/named_arguments_error.d(41):        no parameter named `a`
! fail_compilation/named_arguments_error.d(32):        `named_arguments_error.f(int x, int y, int z)` declared here
! fail_compilation/named_arguments_error.d(42): Error: function `g` is not callable using argument types `(int, int)`
! fail_compilation/named_arguments_error.d(42):        missing argument for parameter #1: `int x`
! fail_compilation/named_arguments_error.d(34):        `named_arguments_error.g(int x, int y, int z = 3)` declared here
! fail_compilation/named_arguments_error.d(44): Error: no named argument `element` allowed for array dimension
! fail_compilation/named_arguments_error.d(45): Error: no named argument `number` allowed for scalar
! fail_compilation/named_arguments_error.d(46): Error: cannot implicitly convert expression `g(x: 3, y: 4, z: 5)` of type `int` to `string`
! fail_compilation/named_arguments_error.d(47): Error: template `tempfun` is not callable using argument types `!()(int, int)`
! fail_compilation/named_arguments_error.d(47):        argument `1` goes past end of parameter list
! fail_compilation/named_arguments_error.d(50):        Candidate is: `tempfun(T, U)(T t, U u)`
  ---
  */
  
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/named_arguments_ifti_error.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/named_arguments_ifti_error.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/named_arguments_ifti_error.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/named_arguments_ifti_error.d	Sun Feb  1 22:32:14 2026
***************
*** 1,12 ****
  /*
  TEST_OUTPUT:
  ---
! fail_compilation/named_arguments_ifti_error.d(17): Error: template `f` is not callable using argument types `!()(int, int)`
! fail_compilation/named_arguments_ifti_error.d(13):        Candidate is: `f(T, U)(T x, U y)`
! fail_compilation/named_arguments_ifti_error.d(18): Error: template `f` is not callable using argument types `!()(int, int)`
! fail_compilation/named_arguments_ifti_error.d(13):        Candidate is: `f(T, U)(T x, U y)`
! fail_compilation/named_arguments_ifti_error.d(19): Error: template `f` is not callable using argument types `!()(int)`
! fail_compilation/named_arguments_ifti_error.d(13):        Candidate is: `f(T, U)(T x, U y)`
  ---
  */
  
--- 1,15 ----
  /*
  TEST_OUTPUT:
  ---
! fail_compilation/named_arguments_ifti_error.d(20): Error: template `f` is not callable using argument types `!()(int, int)`
! fail_compilation/named_arguments_ifti_error.d(20):        parameter `x` assigned twice
! fail_compilation/named_arguments_ifti_error.d(16):        Candidate is: `f(T, U)(T x, U y)`
! fail_compilation/named_arguments_ifti_error.d(21): Error: template `f` is not callable using argument types `!()(int, int)`
! fail_compilation/named_arguments_ifti_error.d(21):        argument `3` goes past end of parameter list
! fail_compilation/named_arguments_ifti_error.d(16):        Candidate is: `f(T, U)(T x, U y)`
! fail_compilation/named_arguments_ifti_error.d(22): Error: template `f` is not callable using argument types `!()(int)`
! fail_compilation/named_arguments_ifti_error.d(22):        missing argument for parameter #1: `T x`
! fail_compilation/named_arguments_ifti_error.d(16):        Candidate is: `f(T, U)(T x, U y)`
  ---
  */
  
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/nogc3.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/nogc3.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/nogc3.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/nogc3.d	Sun Feb  1 22:32:14 2026
*************** int[] bar13702(bool b) @nogc
*** 94,96 ****
--- 94,126 ----
      auto aux = 1 ~ [2]; // error
      return aux;
  }
+ 
+ /**********  Enum and pointer types ***************/
+ // https://github.com/dlang/dmd/issues/21052
+ /*
+ TEST_OUTPUT:
+ ---
+ fail_compilation/nogc3.d(111): Error: this array literal causes a GC allocation in `@nogc` function `f`
+ fail_compilation/nogc3.d(112): Error: this array literal causes a GC allocation in `@nogc` function `f`
+ ---
+ */
+ 
+ void f() @nogc
+ {
+     enum DA : int[] { a = [1,2,3] }
+     DA da = DA.a;
+     int i = *cast(int*)cast(char[4])['0', '0', '0', '0'];
+ }
+ 
+ /*
+ TEST_OUTPUT:
+ ---
+ fail_compilation/nogc3.d(125): Error: this array literal causes a GC allocation in `@nogc` function `g`
+ ---
+ */
+ 
+ // https://github.com/dlang/dmd/issues/21054
+ void g() @nogc
+ {
+     int[] x = (int[2]).init[];
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/nonvoid_return.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/nonvoid_return.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/nonvoid_return.d	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/nonvoid_return.d	Sun Feb  1 22:32:14 2026
***************
*** 0 ****
--- 1,37 ----
+ /*
+ TEST_OUTPUT:
+ ---
+ fail_compilation/nonvoid_return.d(15): Error: cannot return non-void from `void` function
+ fail_compilation/nonvoid_return.d(18): Error: cannot return non-void from `void` function
+ fail_compilation/nonvoid_return.d(29): Error: cannot return non-void from `void` function
+ fail_compilation/nonvoid_return.d(32): Error: undefined identifier `NONEXISTENT`
+ ---
+ */
+ 
+ 
+ 
+ void main()
+ {
+     return 10;
+ }
+ 
+ void fs() => "a";
+ 
+ class MyClass
+ {
+ }
+ 
+ MyClass[char[]] myarray;
+ 
+ void fn()
+ {
+     foreach (MyClass mc; myarray)
+         return mc;
+ }
+ 
+ auto err() { NONEXISTENT++; }
+ 
+ // Because `err` contains an error, it fails to infer void and gets an error return type
+ // Don't print the 'cannot return non-void' error in this case
+ 
+ void fe() => err;
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/noreturn2.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/noreturn2.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/noreturn2.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/noreturn2.d	Sun Feb  1 22:32:14 2026
*************** TEST_OUTPUT:
*** 117,123 ****
  ---
  fail_compilation/noreturn2.d(130): Error: cannot create instance of interface `I`
  fail_compilation/noreturn2.d(133): Error: can only throw class objects derived from `Throwable`, not type `int[]`
! fail_compilation/noreturn2.d(138): Error: undefined identifier `UnkownException`
  ---
  +/
  
--- 117,123 ----
  ---
  fail_compilation/noreturn2.d(130): Error: cannot create instance of interface `I`
  fail_compilation/noreturn2.d(133): Error: can only throw class objects derived from `Throwable`, not type `int[]`
! fail_compilation/noreturn2.d(139): Error: undefined identifier `UnkownException`
  ---
  +/
  
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/powinline.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/powinline.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/powinline.d	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/powinline.d	Sun Feb  1 22:32:14 2026
***************
*** 0 ****
--- 1,38 ----
+ /*
+ TEST_OUTPUT:
+ ---
+ fail_compilation/powinline.d(25): Error: cannot implicitly convert expression `(a + 5.0) ^^ 2L` of type `double` to `int`
+ fail_compilation/powinline.d(26): Error: cannot implicitly convert expression `(1.0 / foo()) ^^ 2L` of type `double` to `int`
+ fail_compilation/powinline.d(31): Error: void has no value
+ fail_compilation/powinline.d(31): Error: incompatible types for `(5.0) * (bar())`: `double` and `void`
+ fail_compilation/powinline.d(37): Error: cannot modify `immutable` expression `a`
+ ---
+ */
+ 
+ double foo()
+ {
+     return 5.0;
+ }
+ 
+ void bar()
+ {
+     return;
+ }
+ 
+ void test1()
+ {
+     double a = 2.0;
+     int b = (a + 5.0) ^^ 2.0;
+     b = (1 / foo()) ^^ 2.0;
+ }
+ 
+ void test2()
+ {
+     double a = (5.0 * bar()) ^^ 2.0;
+ }
+ 
+ void test3()
+ {
+     immutable double a = 3.0;
+     (a ^^= 2.0) = 6;
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/previewin3.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/previewin3.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/previewin3.d	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/previewin3.d	Sun Feb  1 22:32:14 2026
***************
*** 0 ****
--- 1,19 ----
+ /*
+ REQUIRED_ARGS: -preview=in -preview=dip1000
+ TEST_OUTPUT:
+ ----
+ fail_compilation/previewin3.d(2): Error: function `foo` is not callable using argument types `(int)`
+ fail_compilation/previewin3.d(2):        cannot pass argument `42` of type `int` to parameter `in WithDtor`
+ fail_compilation/previewin3.d(8):        `previewin3.foo(in WithDtor)` declared here
+ ----
+  */
+ 
+ #line 1
+ void rvalueErrorMsg () {
+     foo(42);
+ }
+ 
+ // Add a dtor to ensure things are passed by ref
+ struct WithDtor { ~this() @safe pure nothrow @nogc {} }
+ 
+ void foo(in WithDtor) {}
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/pull12941.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/pull12941.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/pull12941.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/pull12941.d	Sun Feb  1 22:32:14 2026
*************** fail_compilation/pull12941.d(105):
*** 18,28 ****
  
  #line 100
  
! int* foo(ref scope return int* p);
! int* foo(out scope return int* p);
  
! int* bar(scope return int* p);
! int* abc(ref return int* p);
  
  void test()
  {
--- 18,28 ----
  
  #line 100
  
! int* foo(return ref scope int* p);
! int* foo(return out scope int* p);
  
! int* bar(return scope int* p);
! int* abc(return ref int* p);
  
  void test()
  {
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/retscope2.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/retscope2.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/retscope2.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/retscope2.d	Sun Feb  1 22:32:14 2026
*************** fail_compilation/retscope2.d(721): Error
*** 130,136 ****
  
  struct S700
  {
!     @safe S700* get1() scope return
      {
          return &this;
      }
--- 130,136 ----
  
  struct S700
  {
!     @safe S700* get1() return ref scope
      {
          return &this;
      }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/retscope3.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/retscope3.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/retscope3.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/retscope3.d	Sun Feb  1 22:32:14 2026
*************** TEST_OUTPUT:
*** 55,61 ****
--- 55,63 ----
  ---
  fail_compilation/retscope3.d(4003): Error: escaping a reference to parameter `u` by copying `u[]` into allocated memory is not allowed in a `@safe` function
  fail_compilation/retscope3.d(4016): Error: storing reference to outer local variable `i` into allocated memory causes it to escape
+ fail_compilation/retscope3.d(4025): Deprecation: slice of static array temporary returned by `makeSA()` assigned to longer lived variable `a`
  fail_compilation/retscope3.d(4025): Error: escaping reference to stack allocated value returned by `makeSA()` into allocated memory
+ fail_compilation/retscope3.d(4032): Error: escaping a reference to local variable `i` by copying `& i` into allocated memory is not allowed in a `@safe` function
  ---
  */
  
*************** void bar4003() @safe
*** 87,89 ****
--- 89,99 ----
  {
      int[][] a = [makeSA()[]];
  }
+ 
+ // https://github.com/dlang/dmd/issues/20901
+ int* f20901() @safe
+ {
+     int i = 3;
+     auto x = &[&i][0]; // Should error, i is escaped into allocated memory
+     return *x;
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/seq_assign.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/seq_assign.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/seq_assign.d	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/seq_assign.d	Sun Feb  1 22:32:14 2026
***************
*** 0 ****
--- 1,43 ----
+ /*
+ TEST_OUTPUT:
+ ---
+ fail_compilation/seq_assign.d(28): Error: cannot assign `int` to expression sequence `(int)`
+ fail_compilation/seq_assign.d(29): Error: cannot implicitly convert expression `s` of type `string` to `int`
+ fail_compilation/seq_assign.d(30): Error: cannot modify constant `2`
+ fail_compilation/seq_assign.d(31): Error: mismatched sequence lengths, 1 and 2
+ fail_compilation/seq_assign.d(35): Error: mismatched sequence lengths, 1 and 2
+ fail_compilation/seq_assign.d(36): Error: cannot implicitly convert expression `__t_field_0` of type `string` to `int`
+ fail_compilation/seq_assign.d(40): Error: cannot assign `IntString` to expression sequence `(string, int)`
+ fail_compilation/seq_assign.d(42): Error: cannot implicitly convert expression `AliasSeq!(b, c)` of type `(int, int)` to `IntString`
+ ---
+ */
+ 
+ alias Seq(A...) = A;
+ 
+ struct IntString
+ {
+     Seq!(int, string) expand;
+     alias this = expand;
+ }
+ 
+ void main()
+ {
+     int b, c;
+     string s;
+ 
+     Seq!(b,) = 1; // RHS not seq
+     Seq!(b,) = Seq!(s,); // b type error
+     Seq!(2,) = Seq!(1,); // not lvalue
+     Seq!(b,) = Seq!(1, 2); // too many
+ 
+     auto t = Seq!("two", 3);
+     Seq!(s, b) = t; // OK
+     Seq!(b,) = t; // too many
+     Seq!(b, c) = t; // b type error
+ 
+     IntString t2;
+     Seq!(b, s) = t2; // OK
+     t = t2; // type mismatch
+     t2 = Seq!(b, s); // OK
+     t2 = Seq!(b, c); // c wrong type
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/shared.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/shared.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/shared.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/shared.d	Sun Feb  1 22:32:14 2026
*************** shared(int)* test_dotvarexp_3(return sha
*** 153,165 ****
  }
  
  // First level DotVarExp dereferencing
! ref shared(int) test_dotvarexp_4(return shared ref C2 c)
  {
      return c.c1.value;
  }
  
  // Second level DotVarExp dereferencing
! ref shared(int) test_dotvarexp_5(return shared ref C3 c)
  {
      return c.c1.c1.value;
  }
--- 153,165 ----
  }
  
  // First level DotVarExp dereferencing
! ref shared(int) test_dotvarexp_4(return ref shared C2 c)
  {
      return c.c1.value;
  }
  
  // Second level DotVarExp dereferencing
! ref shared(int) test_dotvarexp_5(return ref shared C3 c)
  {
      return c.c1.c1.value;
  }
*************** ref shared(K1) test_newexp_1()
*** 201,207 ****
  // Inference tests
  
  // Fails because no `ref`
! auto test_inference_1(return shared ref C3 c)
  {
      return c;
  }
--- 201,207 ----
  // Inference tests
  
  // Fails because no `ref`
! auto test_inference_1(return ref shared C3 c)
  {
      return c;
  }
*************** auto ref test_inference_3()
*** 221,227 ****
  }
  
  // Fails because `const` conversion
! auto ref Object test_inference_4(const return shared ref Object a)
  {
      return a;
  }
--- 221,227 ----
  }
  
  // Fails because `const` conversion
! auto ref Object test_inference_4(const return ref shared Object a)
  {
      return a;
  }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/test15191.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/test15191.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/test15191.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/test15191.d	Sun Feb  1 22:32:14 2026
*************** int* bar(return ref int s)
*** 25,32 ****
      return &foo(s);
  }
  
! ref int identity(ref return int x) {return x;}
! ref int* identityPtr(ref return int* x) {return x;}
  
  int* addrOfRefEscape()
  {
--- 25,32 ----
      return &foo(s);
  }
  
! ref int identity(return ref int x) {return x;}
! ref int* identityPtr(return ref int* x) {return x;}
  
  int* addrOfRefEscape()
  {
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/test15704.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/test15704.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/test15704.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/test15704.d	Sun Feb  1 22:32:14 2026
***************
*** 1,9 ****
  /*
   * TEST_OUTPUT:
  ---
! fail_compilation/test15704.d(17): Error: copying `void[]` to `void[]` is not allowed in a `@safe` function
! fail_compilation/test15704.d(18): Error: copying `const(void)[]` to `void[]` is not allowed in a `@safe` function
! fail_compilation/test15704.d(19): Deprecation: copying `int[]` to `void[]` will become `@system` in a future release
  ---
   */
  
--- 1,11 ----
  /*
   * TEST_OUTPUT:
  ---
! fail_compilation/test15704.d(19): Error: copying `void[]` to `void[]` is not allowed in a `@safe` function
! fail_compilation/test15704.d(20): Error: copying `const(void)[]` to `void[]` is not allowed in a `@safe` function
! fail_compilation/test15704.d(21): Deprecation: copying `int[]` to `void[]` will become `@system` in a future release
! fail_compilation/test15704.d(22): Error: cannot implicitly convert expression `cast(byte)0` of type `byte` to `void[]`
! fail_compilation/test15704.d(22): Error: cannot copy `byte` to `void[]`
  ---
   */
  
*************** void main() @safe {
*** 17,20 ****
--- 19,23 ----
      arr1[] = arr2[];  // overwrites pointers with arbitrary ints
      arr1[] = new const(void)[3];
      arr1[] = [5];
+     arr1[] = byte(); // filling not allowed
  }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/test15989.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/test15989.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/test15989.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/test15989.d	Sun Feb  1 22:32:14 2026
***************
*** 1,9 ****
  /*
  TEST_OUTPUT:
  ---
! fail_compilation/test15989.d(39): Error: variable `test15989.main.ctRegex` : Unable to initialize enum with class or pointer to struct. Use static const variable instead.
! fail_compilation/test15989.d(48): Error: variable `test15989.test.c` : Unable to initialize enum with class or pointer to struct. Use static const variable instead.
! fail_compilation/test15989.d(49): Error: cannot use non-constant CTFE pointer in an initializer `new int(3)`
  ---
  */
  
--- 1,11 ----
  /*
  TEST_OUTPUT:
  ---
! fail_compilation/test15989.d(41): Error: variable `test15989.main.ctRegex` : Unable to initialize enum with class or pointer to struct
! fail_compilation/test15989.d(41):        use static const variable instead
! fail_compilation/test15989.d(50): Error: variable `test15989.test.c` : Unable to initialize enum with class or pointer to struct
! fail_compilation/test15989.d(50):        use static const variable instead
! fail_compilation/test15989.d(51): Error: cannot use non-constant CTFE pointer in an initializer `new int(3)`
  ---
  */
  
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/test18127.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/test18127.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/test18127.d	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/test18127.d	Sun Feb  1 22:32:14 2026
***************
*** 0 ****
--- 1,106 ----
+ /*
+ TEST_OUTPUT:
+ ---
+ fail_compilation/imports/imp18127b.c(3): Error: struct `struct_or_union` already exists with an incompatible definition.
+ fail_compilation/imports/imp18127a.c(3):        previously declared here
+ fail_compilation/imports/imp18127b.c(3):        `imp18127b.struct_or_union` is a struct while `imp18127a.struct_or_union` is a union
+ fail_compilation/imports/imp18127b.c(3):        C structs with the same name from different imports are merged
+ fail_compilation/imports/imp18127b.c(8): Error: struct `S_n_fields` already exists with an incompatible definition.
+ fail_compilation/imports/imp18127a.c(8):        previously declared here
+ fail_compilation/imports/imp18127b.c(8):        `imp18127b.S_n_fields` has 1 field(s) while `imp18127a.S_n_fields` has 2 field(s)
+ fail_compilation/imports/imp18127b.c(8):        C structs with the same name from different imports are merged
+ fail_compilation/imports/imp18127b.c(13): Error: struct `S_types` already exists with an incompatible definition.
+ fail_compilation/imports/imp18127a.c(13):        previously declared here
+ fail_compilation/imports/imp18127b.c(14):        Field 0 differs in type
+ fail_compilation/imports/imp18127b.c(14):        typeof(x): int
+ fail_compilation/imports/imp18127a.c(14):        typeof(x): float
+ fail_compilation/imports/imp18127b.c(13):        C structs with the same name from different imports are merged
+ fail_compilation/imports/imp18127b.c(18): Error: struct `S_names` already exists with an incompatible definition.
+ fail_compilation/imports/imp18127a.c(18):        previously declared here
+ fail_compilation/imports/imp18127b.c(19):        Field 0 differs in name
+ fail_compilation/imports/imp18127b.c(19):        y
+ fail_compilation/imports/imp18127a.c(19):        x
+ fail_compilation/imports/imp18127b.c(18):        C structs with the same name from different imports are merged
+ fail_compilation/imports/imp18127b.c(22): Error: struct `B` already exists with an incompatible definition.
+ fail_compilation/imports/imp18127a.c(22):        previously declared here
+ fail_compilation/imports/imp18127b.c(23):        Field 0 differs in type
+ fail_compilation/imports/imp18127b.c(23):        typeof(x): float
+ fail_compilation/imports/imp18127a.c(23):        typeof(x): int
+ fail_compilation/imports/imp18127b.c(22):        C structs with the same name from different imports are merged
+ fail_compilation/imports/imp18127b.c(27): Error: struct `S_b` already exists with an incompatible definition.
+ fail_compilation/imports/imp18127a.c(27):        previously declared here
+ fail_compilation/imports/imp18127b.c(27):        C structs with the same name from different imports are merged
+ fail_compilation/imports/imp18127b.c(33): Error: struct `(anonymous struct)` already exists with an incompatible definition.
+ fail_compilation/imports/imp18127a.c(33):        previously declared here
+ fail_compilation/imports/imp18127b.c(34):        Field 0 differs in type
+ fail_compilation/imports/imp18127b.c(34):        typeof(x): float
+ fail_compilation/imports/imp18127a.c(34):        typeof(x): int
+ fail_compilation/imports/imp18127b.c(32): Error: struct `S_contains_anon_named` already exists with an incompatible definition.
+ fail_compilation/imports/imp18127a.c(32):        previously declared here
+ fail_compilation/imports/imp18127b.c(35):        Field 0 differs in type
+ fail_compilation/imports/imp18127b.c(35):        typeof(a): (anonymous struct)
+ fail_compilation/imports/imp18127a.c(35):        typeof(a): (anonymous struct)
+ fail_compilation/imports/imp18127b.c(32):        C structs with the same name from different imports are merged
+ fail_compilation/imports/imp18127b.c(38): Error: struct `S_contains_anon_unnamed` already exists with an incompatible definition.
+ fail_compilation/imports/imp18127a.c(38):        previously declared here
+ fail_compilation/imports/imp18127b.c(40):        Field 0 differs in type
+ fail_compilation/imports/imp18127b.c(40):        typeof(x): float
+ fail_compilation/imports/imp18127a.c(40):        typeof(x): int
+ fail_compilation/imports/imp18127b.c(38):        C structs with the same name from different imports are merged
+ fail_compilation/imports/imp18127b.c(45): Error: struct `S_bitfields_mismatch1` already exists with an incompatible definition.
+ fail_compilation/imports/imp18127a.c(45):        previously declared here
+ fail_compilation/imports/imp18127b.c(47):        Field 1 differs in being a bitfield
+ fail_compilation/imports/imp18127b.c(47):        `imp18127b.S_bitfields_mismatch1.y` is not a bitfield
+ fail_compilation/imports/imp18127a.c(47):        `imp18127a.S_bitfields_mismatch1.y` is a bitfield
+ fail_compilation/imports/imp18127b.c(45):        C structs with the same name from different imports are merged
+ fail_compilation/imports/imp18127b.c(49): Error: struct `S_bitfields_mismatch2` already exists with an incompatible definition.
+ fail_compilation/imports/imp18127a.c(49):        previously declared here
+ fail_compilation/imports/imp18127b.c(50):        Field 0 differs in being a bitfield
+ fail_compilation/imports/imp18127b.c(50):        `imp18127b.S_bitfields_mismatch2.x` *is a bitfield
+ fail_compilation/imports/imp18127a.c(50):        `imp18127a.S_bitfields_mismatch2.x` is not a bitfield
+ fail_compilation/imports/imp18127b.c(49):        C structs with the same name from different imports are merged
+ fail_compilation/imports/imp18127b.c(54): Error: struct `S_bitfields_widths` already exists with an incompatible definition.
+ fail_compilation/imports/imp18127a.c(54):        previously declared here
+ fail_compilation/imports/imp18127b.c(56):        Field 1 differs in bitfield width
+ fail_compilation/imports/imp18127b.c(56):        `imp18127b.S_bitfields_widths.y`: 2
+ fail_compilation/imports/imp18127a.c(56):        `imp18127a.S_bitfields_widths.y`: 1
+ fail_compilation/imports/imp18127b.c(54):        C structs with the same name from different imports are merged
+ fail_compilation/imports/imp18127b.c(59): Error: struct `S_bitfields_anon` already exists with an incompatible definition.
+ fail_compilation/imports/imp18127a.c(59):        previously declared here
+ fail_compilation/imports/imp18127b.c(61):        Field 1 differs in name
+ fail_compilation/imports/imp18127b.c(61):        y
+ fail_compilation/imports/imp18127a.c(61):        (anonymous)
+ fail_compilation/imports/imp18127b.c(59):        C structs with the same name from different imports are merged
+ fail_compilation/imports/imp18127b.c(65): Error: struct `S_alignas` already exists with an incompatible definition.
+ fail_compilation/imports/imp18127a.c(65):        previously declared here
+ fail_compilation/imports/imp18127b.c(66):        Field 0 differs in alignment or packing
+ fail_compilation/imports/imp18127b.c(66):        `imp18127b.S_alignas.x` alignment: default
+ fail_compilation/imports/imp18127a.c(66):        `imp18127a.S_alignas.x` alignment: 8
+ fail_compilation/imports/imp18127b.c(65):        C structs with the same name from different imports are merged
+ fail_compilation/imports/imp18127b.c(68): Error: struct `S_aligned` already exists with an incompatible definition.
+ fail_compilation/imports/imp18127a.c(68):        previously declared here
+ fail_compilation/imports/imp18127b.c(68):        `imp18127b.S_aligned` has different alignment or packing
+ fail_compilation/imports/imp18127b.c(68):        `imp18127b.S_aligned` alignment: 4
+ fail_compilation/imports/imp18127a.c(68):        `imp18127a.S_aligned` alignment: 8
+ fail_compilation/imports/imp18127b.c(68):        C structs with the same name from different imports are merged
+ fail_compilation/imports/imp18127b.c(73): Error: struct `S_pack_1` already exists with an incompatible definition.
+ fail_compilation/imports/imp18127a.c(73):        previously declared here
+ fail_compilation/imports/imp18127b.c(73):        `imp18127b.S_pack_1` has different alignment or packing
+ fail_compilation/imports/imp18127b.c(73):        `imp18127b.S_pack_1` alignment: default
+ fail_compilation/imports/imp18127a.c(73):        `imp18127a.S_pack_1` alignment: 1
+ fail_compilation/imports/imp18127b.c(73):        `imp18127b.S_pack_1` packed: false
+ fail_compilation/imports/imp18127a.c(73):        `imp18127a.S_pack_1` packed: true
+ fail_compilation/imports/imp18127b.c(73):        C structs with the same name from different imports are merged
+ fail_compilation/imports/imp18127b.c(77): Error: struct `S_pack_2` already exists with an incompatible definition.
+ fail_compilation/imports/imp18127a.c(79):        previously declared here
+ fail_compilation/imports/imp18127b.c(77):        `imp18127b.S_pack_2` has different alignment or packing
+ fail_compilation/imports/imp18127b.c(77):        `imp18127b.S_pack_2` alignment: default
+ fail_compilation/imports/imp18127a.c(79):        `imp18127a.S_pack_2` alignment: 1
+ fail_compilation/imports/imp18127b.c(77):        C structs with the same name from different imports are merged
+ ---
+ */
+ 
+ // https://github.com/dlang/dmd/issues/18127
+ 
+ import imports.imp18127a;
+ import imports.imp18127b;
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/test18282.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/test18282.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/test18282.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/test18282.d	Sun Feb  1 22:32:14 2026
*************** fail_compilation/test18282.d(53): Error:
*** 15,21 ****
  
  string* f() @safe
  {
!     scope string*[] ls;
      return ls[0];
  }
  
--- 15,21 ----
  
  string* f() @safe
  {
!     scope string*[] ls = [null];
      return ls[0];
  }
  
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/test19661.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/test19661.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/test19661.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/test19661.d	Sun Feb  1 22:32:14 2026
***************
*** 2,8 ****
  EXTRA_FILES: imports/imp19661.d
  TEST_OUTPUT:
  ---
! fail_compilation/test19661.d(11): Error: variables cannot be initialized with an expression of type `void`. Use `void` initialization instead.
  ---
  */
  
--- 2,9 ----
  EXTRA_FILES: imports/imp19661.d
  TEST_OUTPUT:
  ---
! fail_compilation/test19661.d(12): Error: variables cannot be initialized with an expression of type `void`
! fail_compilation/test19661.d(12):        only `= void;` is allowed, which prevents default initialization
  ---
  */
  
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/test20489.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/test20489.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/test20489.d	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/test20489.d	Sun Feb  1 22:32:14 2026
***************
*** 0 ****
--- 1,20 ----
+ /*
+ TEST_OUTPUT:
+ ---
+ fail_compilation/test20489.d(19): Error: function `pure nothrow @nogc @safe int test20489.D.f(int delegate(int) pure nothrow @nogc @safe body)` does not override any function, did you mean to override `pure nothrow @nogc @safe int test20489.B.f(scope int delegate(int) pure nothrow @nogc @safe)`?
+ fail_compilation/test20489.d(19):        Did you intend to override:
+ fail_compilation/test20489.d(19):        `pure nothrow @nogc @safe int test20489.B.f(scope int delegate(int) pure nothrow @nogc @safe)`
+ fail_compilation/test20489.d(19):        Parameter 1 is missing `scope`
+ ---
+ */
+ 
+ // Test case for https://github.com/dlang/dmd/issues/20489
+ // Improved error message on override mismatches
+ 
+ class B {
+     pure nothrow @nogc @safe int f(scope int delegate(int) pure nothrow @nogc @safe) { return 0; }
+ }
+ 
+ class D : B {
+     override pure nothrow @nogc @safe int f(int delegate(int) pure nothrow @nogc @safe body) { return 0; }
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/test20881.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/test20881.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/test20881.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/test20881.d	Sun Feb  1 22:32:14 2026
*************** struct S
*** 17,23 ****
  
      auto borrowA() return /*scope inferred*/ { return ptr; }
      int* borrowB() return { return ptr; }
!     int* borrowC() scope return { return ptr; }
  }
  
  void main()
--- 17,23 ----
  
      auto borrowA() return /*scope inferred*/ { return ptr; }
      int* borrowB() return { return ptr; }
!     int* borrowC() scope return ref { return ptr; }
  }
  
  void main()
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/test21215.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/test21215.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/test21215.d	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/test21215.d	Sun Feb  1 22:32:14 2026
***************
*** 0 ****
--- 1,35 ----
+ /* TEST_OUTPUT:
+ ---
+ fail_compilation/test21215.d(13): Error: `y` is not a member of `S`
+ fail_compilation/test21215.d(18): Error: `xhs` is not a member of `S`, did you mean variable `xsh`?
+ fail_compilation/test21215.d(28): Error: `y` is not a member of `S`
+ fail_compilation/test21215.d(32): Error: `yashu` is not a member of `S`
+ ---
+ */
+ struct S { int xsh; }
+ 
+ void test() {
+ 	auto s1 = S(
+ 		y:
+     1
+ 	);
+ 
+   auto s2 = S(
+     xhs:
+     1
+   );
+ 
+   auto s3 = S(
+     xsh: 1
+   );
+ 
+   auto s4 = S(
+     xsh: 1,
+     y: 2
+   );
+ 
+   auto s5 = S(
+     yashu:
+     2
+   );
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/test21304.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/test21304.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/test21304.d	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/test21304.d	Sun Feb  1 22:32:14 2026
***************
*** 0 ****
--- 1,6 ----
+ /* TEST_OUTPUT:
+ ---
+ fail_compilation/test21304.d(6): Error: undefined identifier `unknown`
+ ---
+ */
+ int[unknown] values = [1, 2, 3];
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/test21317.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/test21317.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/test21317.d	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/test21317.d	Sun Feb  1 22:32:14 2026
***************
*** 0 ****
--- 1,39 ----
+ module dmd.compiler.test.fail_compilation.test21317;
+ 
+ /* TEST_OUTPUT:
+ ---
+ fail_compilation/test21317.d(16): Error: `writeln` is not defined, perhaps `import std.stdio;` ?
+ fail_compilation/test21317.d(21): Error: undefined identifier `Zero`, did you mean variable `zero`?
+ fail_compilation/test21317.d(25): Error: undefined identifier `NULL`, did you mean `null`?
+ fail_compilation/test21317.d(31): Error: undefined identifier `this`, did you mean `typeof(this)`?
+ fail_compilation/test21317.d(38): Error: undefined identifier `unknown`
+ ---
+ */
+ 
+ // Weird formatting is intended to check the loc
+ 
+ int[
+   writeln
+   ] arr1;
+ 
+ int zero = 0;
+ int [
+   Zero
+   ] arr2;
+ 
+ int [
+   NULL
+   ] arr3;
+ 
+ struct S4
+ {
+     enum E4 :
+     this
+     {
+         fail,
+     }
+ }
+ 
+ int [
+   unknown
+   ] arr5;
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/test21408.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/test21408.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/test21408.d	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/test21408.d	Sun Feb  1 22:32:14 2026
***************
*** 0 ****
--- 1,23 ----
+ /*
+ TEST_OUTPUT:
+ ---
+ fail_compilation/test21408.d(12): Error: can't infer return type in function `opEquals`
+ fail_compilation/test21408.d(19): Error: can't infer return type in function `opEquals`
+ ---
+ */
+ 
+ struct A {
+     A[] as;
+     auto opEquals(A x) {
+         return as == x.as;
+     }
+ }
+ 
+ struct B {
+     B[] as;
+     auto opEquals(B x) {
+         return x == this;
+     }
+ }
+ 
+ void main() {}
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/test21429.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/test21429.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/test21429.d	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/test21429.d	Sun Feb  1 22:32:14 2026
***************
*** 0 ****
--- 1,21 ----
+ /*
+ TEST_OUTPUT:
+ ---
+ fail_compilation/test21429.d(20): Error: no property `z` for `s` of type `test21429.S`
+ fail_compilation/test21429.d(13):        struct `S` defined here
+ ---
+ */
+ //make sure this fails properly after fixing bug 21429.d
+ template mixinOpDispatch(string id){
+     string opDispatch(string s)() if(s == id){ return id; }
+ }
+ 
+ struct S {
+     mixin mixinOpDispatch!"x";
+     mixin mixinOpDispatch!"y";
+ }
+ 
+ void main(){
+     S s;
+     auto fail = s.z;
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/test21477.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/test21477.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/test21477.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/test21477.d	Sun Feb  1 22:32:14 2026
***************
*** 1,7 ****
  /* REQUIRED_ARGS: -betterC
  TEST_OUTPUT:
  ---
! fail_compilation/test21477.d(103): Error: expression `[1]` uses the GC and cannot be used with switch `-betterC`
  ---
  */
  
--- 1,7 ----
  /* REQUIRED_ARGS: -betterC
  TEST_OUTPUT:
  ---
! fail_compilation/test21477.d(103): Error: this array literal requires the GC and cannot be used with `-betterC`
  ---
  */
  
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/test21546.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/test21546.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/test21546.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/test21546.d	Sun Feb  1 22:32:14 2026
***************
*** 3,12 ****
  fail_compilation/test21546.d(113): Error: cannot implicitly convert expression `pc` of type `const(int)* delegate() return` to `int* delegate() return`
  fail_compilation/test21546.d(114): Error: cannot implicitly convert expression `pc` of type `const(int)* delegate() return` to `immutable(int)* delegate() return`
  fail_compilation/test21546.d(115): Error: cannot implicitly convert expression `pi` of type `immutable(int)* delegate() return` to `int* delegate() return`
! fail_compilation/test21546.d(213): Error: cannot implicitly convert expression `dc` of type `const(int) delegate() ref return` to `int delegate() ref return`
! fail_compilation/test21546.d(214): Error: cannot implicitly convert expression `dc` of type `const(int) delegate() ref return` to `immutable(int) delegate() ref return`
! fail_compilation/test21546.d(215): Error: cannot implicitly convert expression `di` of type `immutable(int) delegate() ref return` to `int delegate() ref return`
! fail_compilation/test21546.d(305): Error: cannot implicitly convert expression `[dgi]` of type `immutable(int) delegate() ref return[]` to `int delegate() ref return[]`
  ---
   */
  // https://issues.dlang.org/show_bug.cgi?id=21546
--- 3,12 ----
  fail_compilation/test21546.d(113): Error: cannot implicitly convert expression `pc` of type `const(int)* delegate() return` to `int* delegate() return`
  fail_compilation/test21546.d(114): Error: cannot implicitly convert expression `pc` of type `const(int)* delegate() return` to `immutable(int)* delegate() return`
  fail_compilation/test21546.d(115): Error: cannot implicitly convert expression `pi` of type `immutable(int)* delegate() return` to `int* delegate() return`
! fail_compilation/test21546.d(213): Error: cannot implicitly convert expression `dc` of type `const(int) delegate() return ref` to `int delegate() return ref`
! fail_compilation/test21546.d(214): Error: cannot implicitly convert expression `dc` of type `const(int) delegate() return ref` to `immutable(int) delegate() return ref`
! fail_compilation/test21546.d(215): Error: cannot implicitly convert expression `di` of type `immutable(int) delegate() return ref` to `int delegate() return ref`
! fail_compilation/test21546.d(305): Error: cannot implicitly convert expression `[dgi]` of type `immutable(int) delegate() return ref[]` to `int delegate() return ref[]`
  ---
   */
  // https://issues.dlang.org/show_bug.cgi?id=21546
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/test23710.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/test23710.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/test23710.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/test23710.d	Sun Feb  1 22:32:14 2026
***************
*** 1,7 ****
  /* REQUIRED_ARGS: -betterC
  TEST_OUTPUT:
  ---
! fail_compilation/test23710.d(111): Error: array concatenation of expression `foo ~ [1, 2, 3]` requires the GC which is not available with -betterC
  ---
   */
  // https://issues.dlang.org/show_bug.cgi?id=23710
--- 1,7 ----
  /* REQUIRED_ARGS: -betterC
  TEST_OUTPUT:
  ---
! fail_compilation/test23710.d(112): Error: array concatenation of expression `foo ~ cast(int[])a` requires the GC which is not available with -betterC
  ---
   */
  // https://issues.dlang.org/show_bug.cgi?id=23710
*************** int test(int i)
*** 12,24 ****
  {
      int j;
      int[] foo;
      if (0)
      {
          for (;;)
          {
              import core.stdc.stdio;
              printf("start body\n");
!             foo = foo ~ [1,2,3];
  L1:
              printf("foo.length = %zu\n", foo.length);
  	    j += foo.length;
--- 12,25 ----
  {
      int j;
      int[] foo;
+     int[3] a = [1,2,3];
      if (0)
      {
          for (;;)
          {
              import core.stdc.stdio;
              printf("start body\n");
!             foo = foo ~ a;
  L1:
              printf("foo.length = %zu\n", foo.length);
  	    j += foo.length;
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/testrvaluecpctor.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/testrvaluecpctor.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/testrvaluecpctor.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/testrvaluecpctor.d	Sun Feb  1 22:32:14 2026
*************** TEST_OUTPUT:
*** 5,11 ****
  ---
  fail_compilation/testrvaluecpctor.d(16): Error: cannot define both an rvalue constructor and a copy constructor for `struct Foo`
  fail_compilation/testrvaluecpctor.d(24):        Template instance `testrvaluecpctor.Foo!int.Foo.__ctor!(immutable(Foo!int), immutable(Foo!int))` creates an rvalue constructor for `struct Foo`
! fail_compilation/testrvaluecpctor.d(24): Error: none of the overloads of `this` can construct a `immutable` object with argument types `(immutable(Foo!int))`
  fail_compilation/testrvaluecpctor.d(18):        Candidates are: `testrvaluecpctor.Foo!int.Foo.this(ref scope Foo!int rhs)`
  fail_compilation/testrvaluecpctor.d(16):                        `this(Rhs, this This)(scope Rhs rhs)`
  ---
--- 5,11 ----
  ---
  fail_compilation/testrvaluecpctor.d(16): Error: cannot define both an rvalue constructor and a copy constructor for `struct Foo`
  fail_compilation/testrvaluecpctor.d(24):        Template instance `testrvaluecpctor.Foo!int.Foo.__ctor!(immutable(Foo!int), immutable(Foo!int))` creates an rvalue constructor for `struct Foo`
! fail_compilation/testrvaluecpctor.d(24): Error: none of the overloads of `this` can construct an immutable object with argument types `(immutable(Foo!int))`. Expected `immutable(immutable(Foo!int))`
  fail_compilation/testrvaluecpctor.d(18):        Candidates are: `testrvaluecpctor.Foo!int.Foo.this(ref scope Foo!int rhs)`
  fail_compilation/testrvaluecpctor.d(16):                        `this(Rhs, this This)(scope Rhs rhs)`
  ---
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/uda_lambda.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/uda_lambda.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/uda_lambda.d	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/uda_lambda.d	Sun Feb  1 22:32:14 2026
***************
*** 0 ****
--- 1,7 ----
+ /+
+ TEST_OUTPUT:
+ ---
+ fail_compilation/uda_lambda.d(7): Error: declaration expected, not `=>`
+ ---
+ +/
+ @a => 7 int b;
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/union_conv.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/union_conv.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/union_conv.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/union_conv.d	Sun Feb  1 22:32:14 2026
***************
*** 2,8 ****
  REQUIRED_ARGS: -preview=fixImmutableConv
  TEST_OUTPUT:
  ---
! fail_compilation/union_conv.d(18): Error: cannot implicitly convert expression `c` of type `const(U)` to `U`
  ---
  */
  
--- 2,8 ----
  REQUIRED_ARGS: -preview=fixImmutableConv
  TEST_OUTPUT:
  ---
! fail_compilation/union_conv.d(18): Error: cannot implicitly convert expression `c` of type `const(U)` to `U` because union `U` contains pointers or references
  ---
  */
  
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/varargsstc.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/varargsstc.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/varargsstc.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/varargsstc.d	Sun Feb  1 22:32:14 2026
*************** fail_compilation/varargsstc.d(103): Erro
*** 7,12 ****
  
  #line 100
  
! int printf(const(char)*, const scope shared return ...);
! int printf(const(char)*, ref out scope immutable shared return ...);
! int printf(const(char)*, ref scope immutable shared return ...);
--- 7,12 ----
  
  #line 100
  
! int printf(const(char)*, const return scope shared ...);
! int printf(const(char)*, return ref out scope immutable shared ...);
! int printf(const(char)*, return ref scope immutable shared ...);
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/verifyhookexist.d gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/verifyhookexist.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/fail_compilation/verifyhookexist.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/fail_compilation/verifyhookexist.d	Sun Feb  1 22:32:14 2026
*************** EXTRA_SOURCES: extra-files/minimal/objec
*** 8,19 ****
  /*
  TEST_OUTPUT:
  ---
! fail_compilation/verifyhookexist.d(22): Error: `object.__ArrayCast` not found. The current runtime does not support casting array of structs, or the runtime is corrupt.
! fail_compilation/verifyhookexist.d(28): Error: `object.__equals` not found. The current runtime does not support equal checks on arrays, or the runtime is corrupt.
! fail_compilation/verifyhookexist.d(29): Error: `object.__cmp` not found. The current runtime does not support comparing arrays, or the runtime is corrupt.
! fail_compilation/verifyhookexist.d(33): Error: `object._d_assert_fail` not found. The current runtime does not support generating assert messages, or the runtime is corrupt.
! fail_compilation/verifyhookexist.d(36): Error: `object.__switch` not found. The current runtime does not support switch cases on strings, or the runtime is corrupt.
! fail_compilation/verifyhookexist.d(41): Error: `object.__switch_error` not found. The current runtime does not support generating assert messages, or the runtime is corrupt.
  ---
  */
  
--- 8,18 ----
  /*
  TEST_OUTPUT:
  ---
! fail_compilation/verifyhookexist.d(21): Error: `object.__ArrayCast` not found. The current runtime does not support casting array of structs, or the runtime is corrupt.
! fail_compilation/verifyhookexist.d(28): Error: `object.__cmp` not found. The current runtime does not support comparing arrays, or the runtime is corrupt.
! fail_compilation/verifyhookexist.d(32): Error: `object._d_assert_fail` not found. The current runtime does not support generating assert messages, or the runtime is corrupt.
! fail_compilation/verifyhookexist.d(35): Error: `object.__switch` not found. The current runtime does not support switch cases on strings, or the runtime is corrupt.
! fail_compilation/verifyhookexist.d(40): Error: `object.__switch_error` not found. The current runtime does not support generating assert messages, or the runtime is corrupt.
  ---
  */
  
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/runnable/bit.d gcc-16-20260201/gcc/testsuite/gdc.test/runnable/bit.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/runnable/bit.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/runnable/bit.d	Sun Feb  1 22:32:14 2026
*************** void test3()
*** 96,106 ****
--- 96,122 ----
  }
  
  /********************************************/
+ // https://github.com/dlang/dmd/issues/18247
+ 
+ struct S4
+ {
+     ulong a:64;
+ }
+ 
+ void test4()
+ {
+     S4 s;
+     s.a = 1;
+     assert(s.a == 1);
+ }
+ 
+ /********************************************/
  
  int main()
  {
      test1();
      test2();
      test3();
+     test4();
      return 0;
  }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/runnable/bug19652.d gcc-16-20260201/gcc/testsuite/gdc.test/runnable/bug19652.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/runnable/bug19652.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/runnable/bug19652.d	Sun Feb  1 22:32:14 2026
*************** auto otherTest(inout ref Base block) @no
*** 17,22 ****
  auto otherTest(inout ref A block) @nogc {}
  
  void main() {
!     B* thingie;
      otherTest(*thingie);
  }
--- 17,22 ----
  auto otherTest(inout ref A block) @nogc {}
  
  void main() {
!     B* thingie = new B;
      otherTest(*thingie);
  }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/runnable/constfold.d gcc-16-20260201/gcc/testsuite/gdc.test/runnable/constfold.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/runnable/constfold.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/runnable/constfold.d	Sun Feb  1 22:32:14 2026
*************** class C8939regression
*** 418,424 ****
          string[2] str;
          refValue(str[n1]);
  
!         int[] da;
          refValue(da[n2]);
  
          int n; int* p = &n;
--- 418,424 ----
          string[2] str;
          refValue(str[n1]);
  
!         int[] da = [1];
          refValue(da[n2]);
  
          int n; int* p = &n;
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/runnable/foreach5.d gcc-16-20260201/gcc/testsuite/gdc.test/runnable/foreach5.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/runnable/foreach5.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/runnable/foreach5.d	Sun Feb  1 22:32:14 2026
***************
*** 1,5 ****
--- 1,6 ----
  /*
  EXTRA_FILES: imports/test15777a.d imports/test15777b.d
+ REQUIRED_ARGS: -verrors=simple
  TEST_OUTPUT:
  ---
  int
*************** int
*** 10,15 ****
--- 11,17 ----
  foobar7406(T)
  int
  test7406()
+ runnable/foreach5.d(1200): Deprecation: foreach: loop index implicitly converted from `size_t` to `short`
  ---
  */
  
*************** void test13756()
*** 1046,1051 ****
--- 1048,1068 ----
      {
          static assert(is(typeof(k) == const int));
      }
+ 
+     // https://github.com/dlang/dmd/issues/21456
+     foreach (long k, long v; aa)
+     {
+         assert(k == 1 && v == 20);
+     }
+     static struct S
+     {
+         int x, y, z;
+         this(int a) { z = a; }
+     }
+     foreach (long k, S s; aa)
+     {
+         assert(k == 1 && s.z == 20);
+     }
  }
  
  /***************************************/
*************** void test17041()
*** 1176,1181 ****
--- 1193,1214 ----
  }
  
  /***************************************/
+ // https://github.com/ldc-developers/ldc/issues/326
+ 
+ void testLDC326()
+ {
+     foreach (short i, dchar c; "ab")
+     {
+         if (c == 'a')
+             assert(i == 0);
+         else if (c == 'b')
+             assert(i == 1);
+         else
+             assert(0);
+     }
+ }
+ 
+ /***************************************/
  
  int main()
  {
*************** int main()
*** 1207,1212 ****
--- 1240,1246 ----
      test13756();
      test14653();
      test17041();
+     testLDC326();
  
      printf("Success\n");
      return 0;
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/runnable/mars1.d gcc-16-20260201/gcc/testsuite/gdc.test/runnable/mars1.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/runnable/mars1.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/runnable/mars1.d	Sun Feb  1 22:32:14 2026
*************** void test9()
*** 2549,2554 ****
--- 2549,2569 ----
  
  ////////////////////////////////////////////////////////////////////////
  
+ void test10()
+ {
+     double a,b,c;
+     double* pa,pb;
+ 
+     a = 5;
+     b = a++;
+     assert(a == 6);
+     pa = &a;
+     pb = &b;
+     *pb = (*pa)++;
+ }
+ 
+ ////////////////////////////////////////////////////////////////////////
+ 
  int main()
  {
      // All the various integer divide tests
*************** int main()
*** 2651,2656 ****
--- 2666,2672 ----
      test20574();
      test8();
      test9();
+     test10();
  
      printf("Success\n");
      return 0;
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/runnable/placenew.d gcc-16-20260201/gcc/testsuite/gdc.test/runnable/placenew.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/runnable/placenew.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/runnable/placenew.d	Sun Feb  1 22:32:14 2026
*************** void test6()
*** 93,98 ****
--- 93,164 ----
  
  /*************************************************/
  
+ struct S7
+ {
+     int x = 10;
+     int y = 20;
+ }
+ 
+ void test7()
+ {
+     S7 t = void;
+     new (t) S7(10,20);
+     assert(t.x == 10 && t.y == 20);
+ }
+ 
+ /*************************************************/
+ // https://github.com/dlang/dmd/issues/21203
+ 
+ struct Y8
+ {
+     int a;
+     this() @disable; // default disabled
+     this(int i) { a = i; }
+ }
+ 
+ struct S8
+ {
+     Y8 m;
+ 
+     this(int x)
+     {
+         new(m) Y8(x); // initialise `m`
+     }
+ }
+ 
+ void test8()
+ {
+     S8 s = S8(3);
+     assert(s.m.a == 3);
+ }
+ 
+ /*************************************************/
+ // https://github.com/dlang/dmd/issues/21549
+ 
+ struct Test9
+ {
+     size_t a, b = 3;
+     this(int x)
+ 	{
+ 		a = x;
+ 	}
+ }
+ 
+ void new9(ref Test9 p)
+ {
+     new(p) Test9(1);
+ }
+ 
+ void test9()
+ {
+ 	Test9 t9 = void;
+ 	new9(t9);
+ 	assert(t9.a == 1);
+ 	// assert(t9.b == 3);  // Test9.init not copied yet
+ }
+ 
+ /*************************************************/
+ 
  int main()
  {
      test1();
*************** int main()
*** 101,106 ****
--- 167,175 ----
      test4();
      test5();
      test6();
+     test7();
+     test8();
+     test9();
  
      return 0;
  }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/runnable/powinline.d gcc-16-20260201/gcc/testsuite/gdc.test/runnable/powinline.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/runnable/powinline.d	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gdc.test/runnable/powinline.d	Sun Feb  1 22:32:14 2026
***************
*** 0 ****
--- 1,64 ----
+ /*
+ REQUIRED_ARGS: -betterC
+ RUN_OUTPUT:
+ ---
+ Success
+ ---
+ */
+ import core.stdc.stdio;
+ 
+ void test1()
+ {
+     enum real Two = 2.0;
+     static assert(Two^^3 == 8.0);
+ }
+ 
+ void test2()
+ {
+     double x = 5.0;
+     assert(x^^-1 == 1/x);
+     x = -1.0;
+     assert(x^^1 == x);
+     assert((x += 3) ^^ 2.0 == 4.0);
+     assert((x) ^^ 2.0 == 4.0);
+     assert((x *= 5) ^^ 2.0 == (x * x));
+     assert(x^^-1 == 1.0 / x);
+     assert((x^^-1) ^^ 0.0 == 1.0);
+ }
+ 
+ void test3()
+ {
+     int x = 6;
+     assert(x ^^ 0 == 1);
+     assert((x += 3) ^^ 2 == 81);
+     assert(x ^^ 2 == (x ^^ 1) * (x ^^ 1));
+     static assert(4.0 ^^ -1 == 0.25);
+ }
+ 
+ void test4()
+ {
+     // Test that LHS side effects are evaluated.
+     int count = 0;
+     double x()
+     {
+         count++;
+         return 8.0;
+     }
+     assert(x ^^ -1 == 1.0 / 8.0);
+     assert(count == 1);
+     assert(x ^^ 0 == 1.0);
+     assert(count == 2);
+     assert(x ^^ 1 == 8.0);
+     assert(count == 3);
+     assert(x ^^ 2 == 64.0);
+     assert(count == 4);
+ }
+ 
+ extern(C) void main()
+ {
+     test1();
+     test2();
+     test3();
+     test4();
+     printf("Success\n");
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/runnable/sdtor.d gcc-16-20260201/gcc/testsuite/gdc.test/runnable/sdtor.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/runnable/sdtor.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/runnable/sdtor.d	Sun Feb  1 22:32:14 2026
*************** void test24010()
*** 4849,4854 ****
--- 4849,4870 ----
  }
  
  /**********************************/
+ extern (C) struct S21303
+ {
+     static bool dtorCalled = false;
+ 
+     ~this() { dtorCalled = true; }
+ }
+ 
+ void test21303()
+ {
+     {
+         S21303 s;
+     }
+     assert(S21303.dtorCalled);
+ }
+ 
+ /**********************************/
  
  int main()
  {
*************** int main()
*** 4990,4995 ****
--- 5006,5012 ----
      test68();
      testPR12012();
      test24010();
+     test21303();
  
      printf("Success\n");
      return 0;
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/runnable/staticaa.d gcc-16-20260201/gcc/testsuite/gdc.test/runnable/staticaa.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/runnable/staticaa.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/runnable/staticaa.d	Sun Feb  1 22:32:14 2026
*************** void testClassLiteral()
*** 206,211 ****
--- 206,223 ----
  
  /////////////////////////////////////////////
  
+ // https://github.com/dlang/dmd/issues/21690
+ void testMultiDim()
+ {
+     // int[int][int] aa1 = [ 1: [2: 3] ]; // Error: invalid value `[2:3]` in initializer (see #17804)
+     int[int][int] aa2 = ([ 1: [2: 3] ]); // workaround
+     auto aa3 = [ 1: [2: 3] ]; // works, too
+     static auto aa4 = [ 1: [2: 3] ]; // Error: internal compiler error: failed to detect static initialization of associative array
+     assert(aa2 == aa3);
+     assert(aa3 == aa4);
+ }
+ 
+ /////////////////////////////////////////////
  
  void main()
  {
*************** void main()
*** 219,222 ****
--- 231,235 ----
      testEnumInit();
      testStaticArray();
      testClassLiteral();
+     testMultiDim();
  }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/runnable/test17487.d gcc-16-20260201/gcc/testsuite/gdc.test/runnable/test17487.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/runnable/test17487.d	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gdc.test/runnable/test17487.d	Sun Feb  1 22:32:14 2026
***************
*** 0 ****
--- 1,179 ----
+ // https://github.com/dlang/dmd/issues/17487
+ import core.stdc.stdio;
+ 
+ // version = PRINT;
+ 
+ void testKey()
+ {
+     version(PRINT) printf("--- testKey\n");
+     auto count = new Count;
+ 
+     string[S] aa;
+     aa[S(count, 42)] = "foo";
+ 
+     version(PRINT) printf("--- after init\n");
+     version(PRINT) count.print();
+     assert(count.refCount == 1);
+ 
+     version(PRINT) printf("---\n");
+     assert(S(count, 42) in aa);
+ 
+     version(PRINT) printf("--- after in\n");
+     version(PRINT) count.print();
+     assert(count.refCount == 1);
+ 
+     version(PRINT) printf("---\n");
+     assert(S(new Count, 22) !in aa);
+     version(PRINT) printf("--- after !in\n");
+     version(PRINT) count.print();
+     assert(count.refCount == 1);
+ 
+     version(PRINT) printf("---\n");
+     aa[S(count, 42)] = "foo2";
+ 
+     version(PRINT) printf("--- after assign value\n");
+     version(PRINT) count.print();
+     assert(count.refCount == 1);
+     assert(count.copyConstructed == 1); // copy ctor used when adding key, not during lookup
+ }
+ 
+ void testValue()
+ {
+     version(PRINT) printf("--- testValue\n");
+     auto count = new Count;
+ 
+     S[int] aa;
+     aa[42] = S(count, 42);
+ 
+     version(PRINT) printf("--- after init\n");
+     version(PRINT) count.print();
+     assert(count.refCount == 1);
+     assert(count.constructed == 1);
+ 
+     version(PRINT) printf("---\n");
+     aa[22] = S(count, 22);
+ 
+     version(PRINT) printf("--- after create by value\n");
+     version(PRINT) count.print();
+     assert(count.refCount == 2);
+     assert(count.constructed == 2);
+ 
+     version(PRINT) printf("---\n");
+     aa[2] = aa[22];
+ 
+     version(PRINT) printf("--- after create by copy ctor\n");
+     version(PRINT) count.print();
+     assert(count.refCount == 3);
+     assert(count.copyConstructed == 1);
+ 
+     version(PRINT) printf("---\n");
+     aa[22] = aa[42];
+ 
+     version(PRINT) printf("--- after assign by copy\n");
+     version(PRINT) count.print();
+     assert(count.refCount == 3);
+     assert(count.assignedFrom == 1);
+     assert(count.assignedTo == 1);
+ 
+     version(PRINT) printf("---\n");
+ }
+ 
+ void main()
+ {
+     testKey();
+     testValue();
+     version(PRINT) printf("--- cleanup\n");
+ }
+ 
+ struct Count
+ {
+     int constructed;
+     int copyConstructed;
+     int assignedFrom;
+     int assignedTo;
+     int destroyed;
+     int refCount;
+ 
+     void print()
+     {
+         printf("Constructed: %d times\n", constructed);
+         printf("Copy Constructed: %d times\n", copyConstructed);
+         printf("Assigned from: %d times\n", assignedFrom);
+         printf("Assigned To: %d times\n", assignedTo);
+         printf("Destroyed: %d times\n", destroyed);
+         printf("refCount: %d\n", refCount);
+     }
+ }
+ 
+ struct S
+ {
+     Count* count;
+     int i;
+     bool destroyed;
+ 
+     this(Count* count, int i)
+     {
+         this.count = count;
+         this.i = i;
+         ++count.constructed;
+         ++count.refCount;
+         version(PRINT) printf("Constructing: %d, count(%p)\n", i, count);
+     }
+ 
+     this(ref S rhs)
+     {
+         this.count = rhs.count;
+         this.i = rhs.i;
+ 
+         ++count.copyConstructed;
+         ++count.refCount;
+         version(PRINT) printf("Copy Constructing: %d, count(%p)\n", i, count);
+     }
+ 
+     ~this()
+     {
+         version(PRINT) printf("Destroying: %d, count(%p)\n", i, count);
+ 
+         if(count)
+         {
+             ++count.destroyed;
+             --count.refCount;
+         }
+ 
+         destroyed = true;
+     }
+ 
+     void opAssign()(auto ref S rhs)
+     {
+         version(PRINT) printf("Assigning %d, count(%p) to %d, count(%p)\n",
+             rhs.i, rhs.count, this.i, this.count);
+ 
+         if(this.count)
+         {
+             ++this.count.assignedTo;
+             --this.count.refCount;
+         }
+ 
+         if(rhs.count)
+         {
+             ++rhs.count.assignedFrom;
+             ++rhs.count.refCount;
+         }
+ 
+         this.count = rhs.count;
+         this.i = rhs.i;
+     }
+ 
+     invariant
+     {
+         assert(!destroyed);
+     }
+ 
+     bool opEquals()(const auto ref S rhs) const {
+         return this.i == rhs.i;
+     }
+ 
+     size_t toHash() const {
+         return 0;
+     }
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/runnable/test20473.d gcc-16-20260201/gcc/testsuite/gdc.test/runnable/test20473.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/runnable/test20473.d	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gdc.test/runnable/test20473.d	Sun Feb  1 22:32:14 2026
***************
*** 0 ****
--- 1,110 ----
+ // https://github.com/dlang/dmd/issues/20473
+ // REQUIRED_ARGS: -preview=bitfields
+ 
+ struct S1
+ {
+     char[] slice;
+     bool flag:1;
+ }
+ 
+ void test1()
+ {
+     auto a = S1(['1','2'], false);
+     auto b = S1(['1','2'], true);
+     auto c = S1(['1','2'], true);
+     assert(a != b);
+     assert(b == c);
+     assert(typeid(S1).getHash(&a) != typeid(S1).getHash(&b));
+     assert(typeid(S1).getHash(&b) == typeid(S1).getHash(&c));
+ }
+ 
+ struct S2
+ {
+     bool flag:1;
+     Object o;
+ }
+ 
+ void test2()
+ {
+     auto o = new Object;
+     auto a = S2(false, o);
+     auto b = S2(true, o);
+     auto c = S2(true, o);
+     assert(a != b);
+     assert(b == c);
+     assert(typeid(S2).getHash(&a) != typeid(S2).getHash(&b));
+     assert(typeid(S2).getHash(&b) == typeid(S2).getHash(&c));
+ }
+ 
+ struct Wrapper3
+ {
+     void[] wrapped;
+ }
+ struct S3
+ {
+     bool flag:1;
+     Wrapper3 wrapper;
+ }
+ 
+ void test3()
+ {
+     auto a = S3(false, Wrapper3([1,2,3]));
+     auto b = S3(true, Wrapper3([1,2,3]));
+     auto c = S3(true, Wrapper3([1,2,3]));
+     assert(a != b);
+     assert(b == c);
+     assert(typeid(S3).getHash(&a) != typeid(S3).getHash(&b));
+     assert(typeid(S3).getHash(&b) == typeid(S3).getHash(&c));
+ }
+ 
+ struct Wrapper4
+ {
+     Object wrapped;
+ }
+ struct S4
+ {
+     bool flag:1;
+     Wrapper4 wrapper;
+ }
+ 
+ void test4()
+ {
+     auto o = new Object;
+     auto a = S4(false, Wrapper4(o));
+     auto b = S4(true, Wrapper4(o));
+     auto c = S4(true, Wrapper4(o));
+     assert(a != b);
+     assert(b == c);
+     assert(typeid(S4).getHash(&a) != typeid(S4).getHash(&b));
+     assert(typeid(S4).getHash(&b) == typeid(S4).getHash(&c));
+ }
+ 
+ enum Wrapper5 : string
+ {
+     empty = ""
+ }
+ struct S5
+ {
+     bool flag:1;
+     Wrapper5 wrapper;
+ }
+ 
+ void test5()
+ {
+     auto a = S5(false, Wrapper5.empty);
+     auto b = S5(true, Wrapper5.empty);
+     auto c = S5(true, Wrapper5.empty);
+     assert(a != b);
+     assert(b == c);
+     assert(typeid(S5).getHash(&a) != typeid(S5).getHash(&b));
+     assert(typeid(S5).getHash(&b) == typeid(S5).getHash(&c));
+ }
+ 
+ void main()
+ {
+     test1();
+     test2();
+     test3();
+     test4();
+     test5();
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/runnable/test21429.d gcc-16-20260201/gcc/testsuite/gdc.test/runnable/test21429.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/runnable/test21429.d	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gdc.test/runnable/test21429.d	Sun Feb  1 22:32:14 2026
***************
*** 0 ****
--- 1,131 ----
+ mixin template OD(string s)
+ {
+ 
+     string opDispatch(string name)() if (name == s)
+     {
+         return name;
+     }
+ }
+ 
+ mixin template ODA(string s)
+ {
+     void opDispatch(string name)(int x) if (name == s)
+     {
+         this.val = x;
+     }
+ }
+ 
+ struct T
+ {
+     mixin OD!"x";
+     mixin OD!"y";
+ }
+ 
+ struct TAssign
+ {
+     int val;
+     mixin ODA!"x";
+     mixin ODA!"y";
+ }
+ 
+ struct U
+ {
+     mixin OD!"z";
+ }
+ 
+ 
+ template adder()
+ {
+     int opBinary(string s : "+")(int x) { return x; }
+ }
+ 
+ template subtracter()
+ {
+     int opBinary(string s : "-")(int x) { return -x; }
+ }
+ 
+ 
+ struct Arithmetic
+ {
+     mixin adder;
+     mixin subtracter;
+ 
+ }
+ 
+ template adderRight()
+ {
+     int opBinaryRight(string s : "+")(int x){ return x; }
+ }
+ 
+ 
+ template subtracterRight()
+ {
+     int opBinaryRight(string s: "-")(int x){ return -x; }
+ }
+ 
+ struct ArithmeticRight
+ {
+     mixin adderRight;
+     mixin subtracterRight;
+ }
+ 
+ template mixinOpAssign(string op)
+ {
+     void opOpAssign(string s)(int x) if(s == op)
+     {
+         val = x;
+         lastOp = s;
+     }
+ }
+ 
+ struct AssignOverloads
+ {
+     int val;
+     string lastOp;
+     mixin mixinOpAssign!"+";
+     mixin mixinOpAssign!"-";
+ }
+ 
+ 
+ void main()
+ {
+ 
+     T t;
+     string s = t.x();
+     assert(s == "x");
+     assert(t.y == "y");
+ 
+     //explicit call should work
+     assert(t.opDispatch!"x" == "x");
+ 
+ 
+     //TODO: fix these
+     Arithmetic a;
+     assert((a + 5) == 5);
+     assert((a - 7) == -7);
+ 
+ 
+     ArithmeticRight ar;
+     assert((5 + ar) == 5);
+     assert((7 - ar) == -7);
+ 
+ 
+     U u;
+     //should work for a single mixin
+     assert(u.z == "z");
+ 
+     TAssign ta;
+     ta.x = 5;
+     assert(ta.val == 5);
+     ta.y = 10;
+     assert(ta.val == 10);
+ 
+     AssignOverloads oa;
+     oa += 5;
+     assert(oa.val == 5);
+     assert(oa.lastOp == "+");
+     oa -= 10;
+     assert(oa.val == 10);
+     assert(oa.lastOp == "-");
+ 
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/runnable/test21435.d gcc-16-20260201/gcc/testsuite/gdc.test/runnable/test21435.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/runnable/test21435.d	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gdc.test/runnable/test21435.d	Sun Feb  1 22:32:14 2026
***************
*** 0 ****
--- 1,73 ----
+ // https://github.com/dlang/dmd/issues/21435
+ 
+ void check_align()
+ {
+     pragma(inline, false);
+     int x;
+     (cast(size_t)&x & 3) == 0 || assert(false);
+ }
+ 
+ char* getenv_setargv(char* env)
+ {
+     auto p = env;
+     auto q = env;
+     auto r = env;
+     auto s = env;
+     auto t = env;
+     auto u = env;
+     auto ptr = env;
+ 
+     while (1)
+     {
+         auto c = *ptr++;
+         switch (c)
+         {
+             case 0:
+                 check_align();
+                 return env;
+ 
+             case 'a':
+                 *p++ = 'A';
+                 continue;
+ 
+             case 'b':
+                 *q++ = 'B';
+                 continue;
+ 
+             case 'c':
+                 *r++ = 'C';
+                 continue;
+ 
+             case 'd':
+                 *s++ = 'D';
+                 continue;
+ 
+             case 'e':
+                 *t++ = 'E';
+                 continue;
+ 
+             case 'f':
+                 *u++ = 'F';
+                 continue;
+ 
+             case 'g':
+                 *p++ = 'G';
+                 continue;
+ 
+             case 'h':
+                 *p++ = 'H';
+                 continue;
+ 
+             default:
+                 *p++ = c;
+                 continue;
+         }
+     }
+ }
+ 
+ void main()
+ {
+     char[10] m = "abcdefghi";
+     auto str = getenv_setargv(m.ptr);
+     str[0] || assert(false);
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/runnable/test21660.d gcc-16-20260201/gcc/testsuite/gdc.test/runnable/test21660.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/runnable/test21660.d	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gdc.test/runnable/test21660.d	Sun Feb  1 22:32:14 2026
***************
*** 0 ****
--- 1,31 ----
+ // REQUIRED_ARGS: -preview=bitfields
+ struct S
+ {
+     int a : 3;
+     int b : 3;
+ }
+ 
+ struct T
+ {
+     uint a : 1;
+     union {
+         uint b : 2;
+         struct {
+             uint : 2;
+             uint c : 3;
+         }
+     }
+ }
+ 
+ void main()
+ {
+     S s = S(1, 2);
+     assert(s.a == 1 && s.b == 2);
+     S t = S(b:1, a:2);
+     assert(t.a == 2 && t.b == 1);
+ 
+     T u = T(1, 2, 3);
+     assert(u.a == 1 && u.b == 2 && u.c == 3);
+     T v = T(a:1, b:2, c:3);
+     assert(v.a == 1 && v.b == 2 && v.c == 3);
+ }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/runnable/test42.d gcc-16-20260201/gcc/testsuite/gdc.test/runnable/test42.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/runnable/test42.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/runnable/test42.d	Sun Feb  1 22:32:14 2026
*************** shared class Bug5504b
*** 3638,3647 ****
  
  void test5504()
  {
!     immutable Bug5504 c;
      c.foo(10);
      c.xx!(int).hoo(10);
!     shared Bug5504b d;
      d.foo(10);
      d.xx!(int).hoo(10);
  }
--- 3638,3647 ----
  
  void test5504()
  {
!     immutable Bug5504 c = new immutable Bug5504;
      c.foo(10);
      c.xx!(int).hoo(10);
!     shared Bug5504b d = new shared Bug5504b;
      d.foo(10);
      d.xx!(int).hoo(10);
  }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/runnable/testaa2.d gcc-16-20260201/gcc/testsuite/gdc.test/runnable/testaa2.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/runnable/testaa2.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/runnable/testaa2.d	Sun Feb  1 22:32:14 2026
*************** void testinenum()
*** 307,312 ****
--- 307,379 ----
      assert("one" in aa);
  }
  
+ // https://github.com/dlang/dmd/issues/21258
+ void test21258()
+ {
+     alias AliasSeq(TList...) = TList;
+ 
+     struct S { int x; } // use a local type to not generate required TypeInfo elsewhere
+     foreach (T; AliasSeq!(S[int]))
+         enum E { a = T.init, } // bug report uses bad syntax here, but this crashed, too
+ }
+ 
+ // https://github.com/dlang/dmd/issues/21207
+ void test21207()
+ {
+ 	struct S { int x; } // use a local type to not generate required TypeInfo elsewhere
+     enum aa = ["baz": S(7)];
+ 
+     void foo(S[string] x = aa) { }
+     foo();
+ }
+ 
+ /************************************************/
+ 
+ void testEvaluationOrder()
+ {
+ 	static int last;
+ 	int[int] aa;
+ 	int[4] arr;
+ 
+ 	int seqi(int n, int i, int ln = __LINE__)
+ 	{
+ 		n += ln * 100;
+ 		assert(n > last);
+ 		last = n;
+ 		return i;
+ 	}
+ 	ref int[int] seqaa(int n, int ln = __LINE__)
+ 	{
+ 		n += ln * 100;
+ 		assert(n > last);
+ 		last = n;
+ 		return aa;
+ 	}
+ 	seqaa(1)[seqi(2, 0)] = seqi(3, 1); // aa[0] = 1
+ 	int x = seqaa(1)[seqi(2, 0)];  // x = aa[0]
+ 	seqaa(1)[seqi(2, 1)] = seqaa(3)[seqi(4, 0)]; // aa[1] = aa[0]
+ 	assert(seqi(1, 0) in seqaa(2)); // 0 in aa
+ 
+ 	// only executed once?
+ 	auto naa = seqaa(1).dup;
+ 	auto len = seqaa(1).length;
+ 	auto keys = seqaa(1).keys;
+ 	auto values = seqaa(1).values;
+ 	auto hash = hashOf(seqaa(1));
+ 	seqaa(1).rehash;
+ 	seqaa(1).clear;
+ 
+ 	version (none)
+ 		seqaa(1) = [seqi(2, 1) : seqi(3, 1), seqi(4, 2) : seqi(5, 4)]; // aa = [1:1, 2:4]
+ 	else
+ 		aa = [1:1, 2:4];
+ 
+ 	assert(seqaa(1).remove(seqi(2, 1))); // aa.remove(1)
+ 
+ 	assert(seqaa(1) == seqaa(2)); // aa == aa
+ 	assert(!(seqaa(1) != seqaa(2))); // aa != aa
+ }
+ 
  /************************************************/
  
  int main()
*************** int main()
*** 318,323 ****
--- 385,392 ----
      test3825x();
      testinout();
      testinenum();
+     test21258();
+ 	testEvaluationOrder();
  
      printf("Success\n");
      return 0;
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/runnable/testaa3.d gcc-16-20260201/gcc/testsuite/gdc.test/runnable/testaa3.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/runnable/testaa3.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/runnable/testaa3.d	Sun Feb  1 22:32:14 2026
*************** int[int] testRetx()
*** 314,319 ****
--- 314,342 ----
  
  void aafunc(int[int] aa) {}
  
+ void testTypeinfo()
+ {
+     int[int] a = [ 1:1, 2:4, 3:9, 4:16 ];
+     int[int] b = [ 1:1, 2:4, 3:9, 4:16 ];
+     assert(a == b);
+ 
+     hash_t ahash1 = hashOf(a);
+     hash_t ahash2 = typeid(a).getHash(&a);
+     assert(ahash1 == ahash2);
+     hash_t bhash1 = hashOf(a);
+     hash_t bhash2 = typeid(a).getHash(&a);
+     assert(bhash1 == bhash2);
+     assert(ahash1 == bhash1);
+     assert(typeid(a).equals(&a, &b));
+ 
+     string[string] c = [ "1":"one", "2":"two", "3":"three" ];
+     hash_t chash1 = hashOf(c);
+     hash_t chash2 = typeid(c).getHash(&c);
+     assert(chash1 == chash2);
+     assert(chash1 != ahash2);
+     assert(typeid(c).equals(&c, &c));
+ }
+ 
  /***************************************************/
  // https://issues.dlang.org/show_bug.cgi?id=12214
  
*************** void main()
*** 370,375 ****
--- 393,399 ----
      assert(testRet());
      static assert(testRet());
  
+     testTypeinfo();
      test12220();
      test12403();
  }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/runnable/testinvariant.d gcc-16-20260201/gcc/testsuite/gdc.test/runnable/testinvariant.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/runnable/testinvariant.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/runnable/testinvariant.d	Sun Feb  1 22:32:14 2026
*************** void test16384()
*** 228,235 ****
      assert(s == "needs to be thrown2");
  }
  
- 
  /***************************************************/
  
  void main()
  {
--- 228,279 ----
      assert(s == "needs to be thrown2");
  }
  
  /***************************************************/
+ // Fix: https://github.com/dlang/dmd/issues/20924 (invariant not called on extern(C++) classes)
+ 
+ extern(C++) class C
+ {
+     invariant { assert(0); }
+     void f() {}
+ }
+ 
+ extern(D) class D
+ {
+     invariant { assert(0); }
+     void f() {}
+ }
+ 
+ void test20924()
+ {
+     import core.exception : AssertError;
+     // Test extern(C++) class invariant
+     try
+     {
+         auto c = new C();
+         c.f(); // Trigger invariant
+         assert(false, "Failed: invariant in extern(C++) class not checked");
+     }
+     catch (AssertError e)
+     {
+         // Expected behavior - invariant was checked
+         return;
+     }
+     assert(0, "Invariant in extern(C++) class was not checked");
+ 
+     // Test extern(D) class invariant
+     try
+     {
+         auto d = new D();
+         d.f(); // Trigger invariant
+         assert(false, "Failed: invariant in extern(D) class not checked");
+     }
+     catch (AssertError e)
+     {
+         // Expected behavior - invariant was checked
+         return;
+     }
+     assert(0, "Invariant in extern(D) class was not checked");
+ }
  
  void main()
  {
*************** void main()
*** 238,241 ****
--- 282,286 ----
      test16384();
      test13113();
      test13147();
+     test20924();
  }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gdc.test/runnable/testscope2.d gcc-16-20260201/gcc/testsuite/gdc.test/runnable/testscope2.d
*** gcc-16-20260125/gcc/testsuite/gdc.test/runnable/testscope2.d	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gdc.test/runnable/testscope2.d	Sun Feb  1 22:32:14 2026
***************
*** 2,8 ****
  /*
  TEST_OUTPUT:
  ---
! foo1 ulong function(return ref int* delegate() return p) ref return
  foo2 int function(return ref int delegate() p) ref
  foo3 int function(ref inout(int*) p) ref
  foo4 int function(return ref inout(int*) p) ref
--- 2,8 ----
  /*
  TEST_OUTPUT:
  ---
! foo1 ulong function(return ref int* delegate() return p) return ref
  foo2 int function(return ref int delegate() p) ref
  foo3 int function(ref inout(int*) p) ref
  foo4 int function(return ref inout(int*) p) ref
*************** struct SS
*** 18,24 ****
      ref ulong foo1(return ref int* delegate() return p) return;
      ref int foo2(return ref int delegate() p);
      ref int foo3(inout ref int* p);
!     ref int foo4(return inout ref int* p);
  }
  
  pragma(msg, "foo1 ", typeof(&SS.foo1));
--- 18,24 ----
      ref ulong foo1(return ref int* delegate() return p) return;
      ref int foo2(return ref int delegate() p);
      ref int foo3(inout ref int* p);
!     ref int foo4(return ref inout int* p);
  }
  
  pragma(msg, "foo1 ", typeof(&SS.foo1));
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gfortran.dg/array_memcpy_2.f90 gcc-16-20260201/gcc/testsuite/gfortran.dg/array_memcpy_2.f90
*** gcc-16-20260125/gcc/testsuite/gfortran.dg/array_memcpy_2.f90	Sun Jan 25 22:32:16 2026
--- gcc-16-20260201/gcc/testsuite/gfortran.dg/array_memcpy_2.f90	Sun Feb  1 22:32:14 2026
***************
*** 1,11 ****
  ! This checks that the "z = y" assignment is not considered copyable, as the
  ! array is of a derived type containing allocatable components.  Hence, we
! ! we should expand the scalarized loop, which contains *two* memcpy calls
  ! for the assignment itself, plus one for initialization.
  ! { dg-do compile }
  ! { dg-options "-O2 -fdump-tree-original" }
  !
  ! PR 121628
  !
    type :: a
      integer, allocatable :: i(:)
--- 1,12 ----
  ! This checks that the "z = y" assignment is not considered copyable, as the
  ! array is of a derived type containing allocatable components.  Hence, we
! ! should expand the scalarized loop, which contains *two* memcpy calls
  ! for the assignment itself, plus one for initialization.
  ! { dg-do compile }
  ! { dg-options "-O2 -fdump-tree-original" }
  !
  ! PR 121628
+ ! PR 123868 - fixed double allocation that caused 4 memcpy instead of 3
  !
    type :: a
      integer, allocatable :: i(:)
***************
*** 26,29 ****
  
    z = y
  end
! ! { dg-final { scan-tree-dump-times "__builtin_memcpy" 4 "original" } }
--- 27,30 ----
  
    z = y
  end
! ! { dg-final { scan-tree-dump-times "__builtin_memcpy" 3 "original" } }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gfortran.dg/gomp/groupprivate-7.f90 gcc-16-20260201/gcc/testsuite/gfortran.dg/gomp/groupprivate-7.f90
*** gcc-16-20260125/gcc/testsuite/gfortran.dg/gomp/groupprivate-7.f90	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gfortran.dg/gomp/groupprivate-7.f90	Sun Feb  1 22:32:14 2026
***************
*** 0 ****
--- 1,21 ----
+ module m
+ implicit none
+ integer :: x
+ !$omp declare target local(x)
+ contains
+ subroutine f
+ integer, save :: y
+ integer  :: z
+ common /com/ z
+ 
+ ! A variable that is a groupprivate variable or a device-local variable must
+ ! not appear as a list item in a map clause.
+ 
+ !$omp groupprivate(y)
+ !$omp groupprivate(/com/)
+ !$omp target enter data map(x) ! { dg-error "'x' argument to MAP clause at .1. must not be a device-local variable, including GROUPPRIVATE" }
+ !$omp target enter data map(y) ! { dg-error "'y' argument to MAP clause at .1. must not be a device-local variable, including GROUPPRIVATE" }
+ !!$omp target enter data map(to : /com/) ! -> PR fortran/92730
+ end
+ 
+ end module
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gfortran.dg/pr123868.f90 gcc-16-20260201/gcc/testsuite/gfortran.dg/pr123868.f90
*** gcc-16-20260125/gcc/testsuite/gfortran.dg/pr123868.f90	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gfortran.dg/pr123868.f90	Sun Feb  1 22:32:14 2026
***************
*** 0 ****
--- 1,34 ----
+ ! { dg-do run }
+ ! PR fortran/123868 - Memory leak on assignment with nested allocatable
+ ! components.  Regression introduced by PR121628 commit which caused
+ ! gfc_duplicate_allocatable to be called twice for allocatable array
+ ! components with nested allocatable components.
+ 
+ module bugMod
+ 
+   type :: vs
+      character(len=1), allocatable :: s
+   end type vs
+ 
+   type :: ih
+      type(vs), allocatable, dimension(:) :: hk
+   end type ih
+ 
+ end module bugMod
+ 
+ program bugProg
+   use bugMod
+ 
+   block
+     type(ih) :: c, d
+ 
+     allocate(d%hk(1))
+     allocate(d%hk(1)%s)
+     d%hk(1)%s='z'
+     c=d
+     if (c%hk(1)%s /= 'z') stop 1
+     if (d%hk(1)%s /= 'z') stop 2
+ 
+   end block
+ 
+ end program bugProg
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gfortran.dg/simd-builtins-9.f90 gcc-16-20260201/gcc/testsuite/gfortran.dg/simd-builtins-9.f90
*** gcc-16-20260125/gcc/testsuite/gfortran.dg/simd-builtins-9.f90	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gfortran.dg/simd-builtins-9.f90	Sun Feb  1 22:32:14 2026
***************
*** 0 ****
--- 1,16 ----
+ ! { dg-do compile { target { aarch64*-*-linux* } } }
+ ! { dg-additional-options "-nostdinc -O3 -fpre-include=simd-builtins-9.h -fdump-tree-optimized" }
+ 
+ program test_overloaded_intrinsic
+   real(8) :: x8(3200), y8(3200)
+ 
+   y8 = sin(x8)
+   print *, y8
+ 
+   x8 = cos(y8)
+   print *, x8
+ end
+ 
+ ! { dg-final { scan-tree-dump-not "sin.simdclone" "optimized" } } */
+ 
+ ! { dg-final { scan-tree-dump "cos.simdclone" "optimized" } } */
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gfortran.dg/simd-builtins-9.h gcc-16-20260201/gcc/testsuite/gfortran.dg/simd-builtins-9.h
*** gcc-16-20260125/gcc/testsuite/gfortran.dg/simd-builtins-9.h	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gfortran.dg/simd-builtins-9.h	Sun Feb  1 22:32:14 2026
***************
*** 0 ****
--- 1,2 ----
+ !GCC$ builtin (sin) attributes simd (notinbranch) if('fastmath')
+ !GCC$ builtin (cos) attributes simd (notinbranch)
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gfortran.dg/vect/pr123016.f90 gcc-16-20260201/gcc/testsuite/gfortran.dg/vect/pr123016.f90
*** gcc-16-20260125/gcc/testsuite/gfortran.dg/vect/pr123016.f90	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gfortran.dg/vect/pr123016.f90	Sun Feb  1 22:32:14 2026
***************
*** 0 ****
--- 1,22 ----
+ ! { dg-do compile }
+ ! { dg-additional-options "-Ofast" }
+ ! { dg-additional-options "-mcpu=neoverse-v2" { target aarch64*-*-* } }"
+ !GCC$ builtin (expf) attributes simd (notinbranch)
+       MODULE MODULE_CU_BMJ
+       INTEGER:: JTB
+       CONTAINS
+       SUBROUTINE BMJDRVRQVCUTEN
+ REAL, DIMENSION(JTB) :: THEOLD,TOLDY2T
+       DO KTH=1,KTHM
+         TH=TH+DTH
+         DENOM=TH
+         IF (DENOM>EPS) THEN
+            QS=EXP(0/DENOM)
+         ELSE
+            QS=0.
+         ENDIF
+         THEOLD(KTH)=EXP(ELOCP*QS)
+       ENDDO
+       CALL SPLINE
+       END
+       END
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gfortran.target/aarch64/pr123628.f90 gcc-16-20260201/gcc/testsuite/gfortran.target/aarch64/pr123628.f90
*** gcc-16-20260125/gcc/testsuite/gfortran.target/aarch64/pr123628.f90	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gfortran.target/aarch64/pr123628.f90	Sun Feb  1 22:32:14 2026
***************
*** 0 ****
--- 1,16 ----
+ ! { dg-do compile }
+ ! { dg-options "-O2 -march=armv9-a -fdump-tree-ifcvt -w" }
+ ! { dg-final { scan-tree-dump {.MASK_CALL \(__builtin_expf, } ifcvt } }
+ !GCC$ builtin (expf) attributes simd (notinbranch)
+ SUBROUTINE a(b)
+    REAL, DIMENSION(:) :: b
+    c: DO i = 1, d
+    IF (e <= f) THEN
+       g = EXP(h)
+       r = g
+       IF (r > s) THEN
+          b(i) = t
+       END IF
+    END IF
+    END DO c
+ END
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gnat.dg/iter7.adb gcc-16-20260201/gcc/testsuite/gnat.dg/iter7.adb
*** gcc-16-20260125/gcc/testsuite/gnat.dg/iter7.adb	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gnat.dg/iter7.adb	Sun Feb  1 22:32:15 2026
***************
*** 0 ****
--- 1,15 ----
+ --  { dg-do run }
+ --  { dg-options "-gnat2022" }
+ 
+ procedure Iter7 is
+ 
+    type Enum is (A, B, C);
+    for Enum use (A => 1, B => 2, C => 3);
+ 
+    Enum_Filter : array (Enum) of Boolean := (others => False);
+ 
+ begin
+    for F in Enum when Enum_Filter (F) loop
+       raise Program_Error;
+    end loop;
+ end;
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gnat.dg/prefix4.adb gcc-16-20260201/gcc/testsuite/gnat.dg/prefix4.adb
*** gcc-16-20260125/gcc/testsuite/gnat.dg/prefix4.adb	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gnat.dg/prefix4.adb	Sun Feb  1 22:32:15 2026
***************
*** 0 ****
--- 1,14 ----
+ --  { dg-do run }
+ --  { dg-options "-gnatX" }
+ 
+ with Prefix4_Pkg; use Prefix4_Pkg;
+ 
+ procedure Prefix4 is
+ 
+   Val : T (1);
+ 
+ begin
+   if not Val.F then
+     raise Program_Error;
+   end if;
+ end;
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gnat.dg/prefix4_pkg.ads gcc-16-20260201/gcc/testsuite/gnat.dg/prefix4_pkg.ads
*** gcc-16-20260125/gcc/testsuite/gnat.dg/prefix4_pkg.ads	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gnat.dg/prefix4_pkg.ads	Sun Feb  1 22:32:15 2026
***************
*** 0 ****
--- 1,13 ----
+ package Prefix4_Pkg is
+ 
+   type T (D : Integer) is private;
+ 
+   function F (X : T) return Boolean is (True);
+ 
+ private
+ 
+   type T (D : Integer) is record
+     F : Boolean := False;
+   end record;
+ 
+ end Prefix4_Pkg;
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gnat.dg/put_image2.adb gcc-16-20260201/gcc/testsuite/gnat.dg/put_image2.adb
*** gcc-16-20260125/gcc/testsuite/gnat.dg/put_image2.adb	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gnat.dg/put_image2.adb	Sun Feb  1 22:32:15 2026
***************
*** 0 ****
--- 1,18 ----
+ -- { dg-do run }
+ -- { dg-options "-gnat2022" }
+ 
+ procedure Put_Image2 is
+ 
+   type T is array (1 .. 13) of Integer;
+ 
+   function "&" (Left : T; Right : T) return T is (others => 2);
+ 
+   function To_Virtual_String (Item : String) return T is (others => 0);
+ 
+   procedure F (S : T) is null;
+ 
+   X : array (1 .. 1) of Integer := [others => 0];
+ 
+ begin
+   F ((others => 0) & To_Virtual_String (X'Image));
+ end;
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gnat.dg/specs/aggr11.ads gcc-16-20260201/gcc/testsuite/gnat.dg/specs/aggr11.ads
*** gcc-16-20260125/gcc/testsuite/gnat.dg/specs/aggr11.ads	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gnat.dg/specs/aggr11.ads	Sun Feb  1 22:32:15 2026
***************
*** 0 ****
--- 1,17 ----
+ -- PR ada/123861
+ -- { dg-do compile }
+ -- { dg-options "-gnat2022" }
+ 
+ with Ada.Containers.Vectors;
+ 
+ package Aggr11 is
+ 
+   package Vectors is new Ada.Containers.Vectors (Positive, Integer);
+   use Vectors;
+ 
+   A : constant Vector  := [];
+   B : constant Boolean := [] = A;        -- ICE
+   C : constant Boolean := Vector'[] = A; -- Works
+   D : constant Boolean := A = [];        -- Works
+ 
+ end Aggr11;
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gnat.dg/specs/limited_with3-child-grandchild-grandgrandchild.ads gcc-16-20260201/gcc/testsuite/gnat.dg/specs/limited_with3-child-grandchild-grandgrandchild.ads
*** gcc-16-20260125/gcc/testsuite/gnat.dg/specs/limited_with3-child-grandchild-grandgrandchild.ads	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gnat.dg/specs/limited_with3-child-grandchild-grandgrandchild.ads	Sun Feb  1 22:32:15 2026
***************
*** 0 ****
--- 1,5 ----
+ package Limited_With3.Child.Grandchild.Grandgrandchild is
+ 
+   function F return T is (Three);
+ 
+ end Limited_With3.Child.Grandchild.Grandgrandchild;
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gnat.dg/specs/limited_with3-child-grandchild.ads gcc-16-20260201/gcc/testsuite/gnat.dg/specs/limited_with3-child-grandchild.ads
*** gcc-16-20260125/gcc/testsuite/gnat.dg/specs/limited_with3-child-grandchild.ads	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gnat.dg/specs/limited_with3-child-grandchild.ads	Sun Feb  1 22:32:15 2026
***************
*** 0 ****
--- 1,5 ----
+ package Limited_With3.Child.Grandchild is
+ 
+   function F return T is (Two);
+ 
+ end Limited_With3.Child.Grandchild;
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gnat.dg/specs/limited_with3-child.ads gcc-16-20260201/gcc/testsuite/gnat.dg/specs/limited_with3-child.ads
*** gcc-16-20260125/gcc/testsuite/gnat.dg/specs/limited_with3-child.ads	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gnat.dg/specs/limited_with3-child.ads	Sun Feb  1 22:32:15 2026
***************
*** 0 ****
--- 1,7 ----
+ package Limited_With3.Child is
+ 
+   type T is (One, Two, Three);
+ 
+   function F return T is (One);
+ 
+ end Limited_With3.Child;
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gnat.dg/specs/limited_with3.ads gcc-16-20260201/gcc/testsuite/gnat.dg/specs/limited_with3.ads
*** gcc-16-20260125/gcc/testsuite/gnat.dg/specs/limited_with3.ads	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gnat.dg/specs/limited_with3.ads	Sun Feb  1 22:32:15 2026
***************
*** 0 ****
--- 1,4 ----
+ limited with Limited_With3.Child;
+ 
+ package Limited_With3 is
+ end Limited_With3;
diff -Nrcpad gcc-16-20260125/gcc/testsuite/gnat.dg/unchecked_union4.adb gcc-16-20260201/gcc/testsuite/gnat.dg/unchecked_union4.adb
*** gcc-16-20260125/gcc/testsuite/gnat.dg/unchecked_union4.adb	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/gcc/testsuite/gnat.dg/unchecked_union4.adb	Sun Feb  1 22:32:15 2026
***************
*** 0 ****
--- 1,19 ----
+ --  { dg-do compile }
+ --  { dg-options "-gnateV" }
+ 
+ procedure Unchecked_Union4 is
+ 
+    type R (Bytes_Mode : Boolean := False) is record
+       case Bytes_Mode is
+          when True =>
+             A : Boolean;
+          when False =>
+             B : Boolean;
+       end case;
+    end record with Unchecked_Union;
+ 
+    function F (Message : R) return Integer is (0);
+ 
+ begin
+    null;
+ end;
diff -Nrcpad gcc-16-20260125/gcc/testsuite/lib/profopt.exp gcc-16-20260201/gcc/testsuite/lib/profopt.exp
*** gcc-16-20260125/gcc/testsuite/lib/profopt.exp	Sun Jan 25 22:32:17 2026
--- gcc-16-20260201/gcc/testsuite/lib/profopt.exp	Sun Feb  1 22:32:15 2026
*************** proc profopt-execute { src } {
*** 312,317 ****
--- 312,318 ----
      global generate_final_code use_final_code
      global verbose
      global testname_with_flags
+     global additional_sources_used
  
      if ![info exists profile_option] {
          error "No profile option specified for first compile."
*************** proc profopt-execute { src } {
*** 474,479 ****
--- 475,493 ----
  		    set missing_file 1
  		    fail "$testcase execution: file $bprefix$base.$ext does not exist, $option $profile_option"
  		}
+ 		if [info exists additional_sources_used] {
+ 		    foreach srcfile $additional_sources_used {
+ 			set add_basename [file tail $srcfile]
+ 			set add_base [file rootname $add_basename]
+ 			remote_upload target $tmpdir/$bprefix$add_base.$ext
+ 			set files [glob -nocomplain $bprefix$add_base.$ext]
+ 			if { $files == "" } {
+ 			    set status "fail"
+ 			    set missing_file 1
+ 			    fail "$testcase execution: file $bprefix$add_base.$ext does not exist, $option $profile_option"
+ 			}
+ 		    }
+ 		}
  	    }
  	}
          if { $missing_file == 0 } {
*************** proc profopt-execute { src } {
*** 606,609 ****
--- 620,624 ----
  	}
      }
      unset testname_with_flags
+     cleanup-after-saved-dg-test
  }
diff -Nrcpad gcc-16-20260125/gcc/testsuite/lib/target-supports.exp gcc-16-20260201/gcc/testsuite/lib/target-supports.exp
*** gcc-16-20260125/gcc/testsuite/lib/target-supports.exp	Sun Jan 25 22:32:17 2026
--- gcc-16-20260201/gcc/testsuite/lib/target-supports.exp	Sun Feb  1 22:32:15 2026
*************** proc check_effective_target_rvv_zvl256b_
*** 2163,2168 ****
--- 2163,2186 ----
        } "-march=${gcc_march}"]
  }
  
+ # Return 1 if the target runtime supports at least 256-bit
+ # vectors, 0 otherwise.  Cache the result.
+ 
+ proc check_effective_target_rvv_zvl_ge_256b_ok { } {
+     # Check if the target has at least a VLENB of 32.
+     set gcc_march [riscv_get_arch]
+     return [check_runtime ${gcc_march}_exec {
+ 	int main()
+ 	{
+ 	  int vlenb = 0;
+ 	  asm ("csrr %0,vlenb" : "=r" (vlenb) : : );
+ 	  if (vlenb >= 32)
+ 	    return 0;
+ 	  return 1;
+ 	}
+       } "-march=${gcc_march}"]
+ }
+ 
  # Return 1 if the target runtime supports 512-bit vectors, 0 otherwise.
  # Cache the result.
  
*************** proc check_effective_target_arm_neon_ok_
*** 5604,5610 ****
      }
      global et_arm_neon_flags
      set et_arm_neon_flags ""
!     foreach flags {"" "-mfloat-abi=softfp" "-mfpu=neon" "-mfpu=neon -mfloat-abi=softfp" "-mfpu=neon -mfloat-abi=softfp -mcpu=unset -march=armv7-a" "-mfloat-abi=hard" "-mfpu=neon -mfloat-abi=hard" "-mfpu=neon -mfloat-abi=hard -mcpu=unset -march=armv7-a"} {
  	if { [check_no_compiler_messages_nocache arm_neon_ok object {
  	    #include <arm_neon.h>
  	    int dummy;
--- 5622,5634 ----
      }
      global et_arm_neon_flags
      set et_arm_neon_flags ""
!     foreach flags {
! 	""
! 	"-mfloat-abi=softfp"
! 	"-mfloat-abi=softfp -mcpu=unset -march=armv7-a+simd -mfpu=auto"
! 	"-mfloat-abi=hard"
! 	"-mfloat-abi=hard -mcpu=unset -march=armv7-a+simd -mfpu=auto"
!     } {
  	if { [check_no_compiler_messages_nocache arm_neon_ok object {
  	    #include <arm_neon.h>
  	    int dummy;
*************** proc check_effective_target_arm_neon_fp1
*** 5804,5827 ****
      global et_arm_neon_fp16_flags
      global et_arm_neon_flags
      set et_arm_neon_fp16_flags ""
!     if { [check_effective_target_arm_neon_ok] } {
! 	foreach flags {"" "-mfloat-abi=softfp" "-mfpu=neon-fp16"
! 		       "-mfpu=neon-fp16 -mfloat-abi=softfp"
! 		       "-mfp16-format=ieee"
! 		       "-mfloat-abi=softfp -mfp16-format=ieee"
! 		       "-mfpu=neon-fp16 -mfp16-format=ieee"
! 		       "-mfpu=neon-fp16 -mfloat-abi=softfp -mfp16-format=ieee"} {
! 	    if { [check_no_compiler_messages_nocache arm_neon_fp16_ok object {
! 		#include "arm_neon.h"
! 		float16x4_t
! 		foo (float32x4_t arg)
! 		{
! 		  return vcvt_f16_f32 (arg);
! 		}
! 	    } "$et_arm_neon_flags $flags"] } {
! 		set et_arm_neon_fp16_flags [concat $et_arm_neon_flags $flags]
! 		return 1
  	    }
  	}
      }
  
--- 5828,5859 ----
      global et_arm_neon_fp16_flags
      global et_arm_neon_flags
      set et_arm_neon_fp16_flags ""
!     foreach flags {
! 	""
! 	"-mfp16-format=ieee"
! 	"-mcpu=unset -march=armv7-a+simd+vfpv3-fp16 -mfpu=auto"
! 	"-mcpu=unset -march=armv7-a+simd+vfpv3-fp16 -mfpu=auto -mfp16-format=ieee"
! 
! 	"-mfloat-abi=softfp"
! 	"-mfloat-abi=softfp -mfp16-format=ieee"
! 	"-mcpu=unset -march=armv7-a+simd+vfpv3-fp16 -mfpu=auto -mfloat-abi=softfp"
! 	"-mcpu=unset -march=armv7-a+simd+vfpv3-fp16 -mfpu=auto -mfloat-abi=softfp -mfp16-format=ieee"
! 
! 	"-mfloat-abi=hard"
! 	"-mfloat-abi=hard -mfp16-format=ieee"
! 	"-mcpu=unset -march=armv7-a+simd+vfpv3-fp16 -mfpu=auto -mfloat-abi=hard"
! 	"-mcpu=unset -march=armv7-a+simd+vfpv3-fp16 -mfpu=auto -mfloat-abi=hard -mfp16-format=ieee"
!     } {
! 	if { [check_no_compiler_messages_nocache arm_neon_fp16_ok object {
! 	    #include "arm_neon.h"
! 	    float16x4_t
! 	    foo (float32x4_t arg)
! 	    {
! 		return vcvt_f16_f32 (arg);
  	    }
+ 	} "$flags"] } {
+ 	    set et_arm_neon_fp16_flags $flags
+ 	    return 1
  	}
      }
  
*************** proc check_effective_target_arm_v8_2a_fp
*** 6892,6918 ****
  proc check_effective_target_arm_v8_2a_fp16_neon_ok_nocache { } {
      global et_arm_v8_2a_fp16_neon_flags
      set et_arm_v8_2a_fp16_neon_flags ""
-     set cpu_unset ""
  
      if { ![istarget arm*-*-*] && ![istarget aarch64*-*-*] } {
  	return 0;
      }
  
      if { [istarget arm*-*-*] } {
! 	set cpu_unset "-mcpu=unset"
      }
  
      # Iterate through sets of options to find the compiler flags that
      # need to be added to the -march option.
!     foreach flags {"" "-mfpu=neon-fp-armv8" "-mfloat-abi=softfp" \
! 		       "-mfpu=neon-fp-armv8 -mfloat-abi=softfp"} {
  	if { [check_no_compiler_messages_nocache \
  		  arm_v8_2a_fp16_neon_ok object {
! 	    #if !defined (__ARM_FEATURE_FP16_VECTOR_ARITHMETIC)
! 	    #error "__ARM_FEATURE_FP16_VECTOR_ARITHMETIC not defined"
! 	    #endif
! 	} "$flags $cpu_unset -march=armv8.2-a+fp16"] } {
! 	    set et_arm_v8_2a_fp16_neon_flags "$flags $cpu_unset -march=armv8.2-a+fp16"
  	    return 1
  	}
      }
--- 6924,6968 ----
  proc check_effective_target_arm_v8_2a_fp16_neon_ok_nocache { } {
      global et_arm_v8_2a_fp16_neon_flags
      set et_arm_v8_2a_fp16_neon_flags ""
  
      if { ![istarget arm*-*-*] && ![istarget aarch64*-*-*] } {
  	return 0;
      }
  
      if { [istarget arm*-*-*] } {
! 	set flag_opts {
! 	    ""
! 	    "-mfp16-format=ieee"
! 	    "-mcpu=unset -march=armv8.2-a+fp16 -mfpu=auto"
! 	    "-mcpu=unset -march=armv8.2-a+fp16 -mfpu=auto -mfp16-format=ieee"
! 
! 	    "-mfloat-abi=softfp"
! 	    "-mfloat-abi=softfp -mfp16-format=ieee"
! 	    "-mcpu=unset -march=armv8.2-a+fp16 -mfpu=auto -mfloat-abi=softfp"
! 	    "-mcpu=unset -march=armv8.2-a+fp16 -mfpu=auto -mfloat-abi=softfp -mfp16-format=ieee"
! 
! 	    "-mfloat-abi=hard"
! 	    "-mfloat-abi=hard -mfp16-format=ieee"
! 	    "-mcpu=unset -march=armv8.2-a+fp16 -mfpu=auto -mfloat-abi=hard"
! 	    "-mcpu=unset -march=armv8.2-a+fp16 -mfpu=auto -mfloat-abi=hard -mfp16-format=ieee"
! 	}
!     } else {
! 	set flag_opts {
! 	    ""
! 	    "-march=armv8.2-a+fp16"
! 	}
      }
  
      # Iterate through sets of options to find the compiler flags that
      # need to be added to the -march option.
!     foreach flags $flag_opts {
  	if { [check_no_compiler_messages_nocache \
  		  arm_v8_2a_fp16_neon_ok object {
! 		      #if !defined (__ARM_FEATURE_FP16_VECTOR_ARITHMETIC)
! 		      #error "__ARM_FEATURE_FP16_VECTOR_ARITHMETIC not defined"
! 		      #endif
! 		  } "$flags"] } {
! 	    set et_arm_v8_2a_fp16_neon_flags "$flags"
  	    return 1
  	}
      }
*************** set exts {
*** 12682,12688 ****
  set exts_sve2 {
      "sme-f8f16" "sme-f8f32"
      "sme-b16b16" "sme-f16f16" "sme-i16i64" "sme" "sme2" "sme2p1"
!     "ssve-fp8dot2" "ssve-fp8dot4" "ssve-fp8fma"
  }
  
  foreach { aarch64_ext } $exts {
--- 12732,12738 ----
  set exts_sve2 {
      "sme-f8f16" "sme-f8f32"
      "sme-b16b16" "sme-f16f16" "sme-i16i64" "sme" "sme2" "sme2p1"
!     "ssve-fp8dot2" "ssve-fp8dot4" "ssve-fp8fma" "sve-bfscale"
  }
  
  foreach { aarch64_ext } $exts {
*************** proc check_effective_target_inff { } {
*** 13727,13753 ****
  proc check_effective_target_arm_v8_3a_complex_neon_ok_nocache { } {
      global et_arm_v8_3a_complex_neon_flags
      set et_arm_v8_3a_complex_neon_flags ""
-     set cpu_unset ""
  
      if { ![istarget arm*-*-*] && ![istarget aarch64*-*-*] } {
  	return 0;
      }
  
      if { [istarget arm*-*-*] } {
! 	set cpu_unset "-mcpu=unset"
      }
  
      # Iterate through sets of options to find the compiler flags that
      # need to be added to the -march option.
!     foreach flags {"" "-mfloat-abi=softfp -mfpu=auto" "-mfloat-abi=hard -mfpu=auto"} {
  	if { [check_no_compiler_messages_nocache \
  		  arm_v8_3a_complex_neon_ok assembly {
  	    #if !defined (__ARM_FEATURE_COMPLEX)
  	    #error "__ARM_FEATURE_COMPLEX not defined"
  	    #endif
  	    #include <complex.h>
! 	} "$flags $cpu_unset -march=armv8.3-a+simd"] } {
! 	    set et_arm_v8_3a_complex_neon_flags "$flags $cpu_unset -march=armv8.3-a+simd"
  	    return 1;
  	}
      }
--- 13777,13809 ----
  proc check_effective_target_arm_v8_3a_complex_neon_ok_nocache { } {
      global et_arm_v8_3a_complex_neon_flags
      set et_arm_v8_3a_complex_neon_flags ""
  
      if { ![istarget arm*-*-*] && ![istarget aarch64*-*-*] } {
  	return 0;
      }
  
      if { [istarget arm*-*-*] } {
! 	set flag_opts {
! 	    ""
! 	    "-mcpu=unset -march=armv8.3-a+simd"
! 	    "-mfloat-abi=softfp -mfpu=auto -mcpu=unset -march=armv8.3-a+simd"
! 	    "-mfloat-abi=hard -mfpu=auto -mcpu=unset -march=armv8.3-a+simd"
! 	}
!     } else {
! 	set flag_opts { "" "-march=armv8.3-a" }
      }
  
      # Iterate through sets of options to find the compiler flags that
      # need to be added to the -march option.
!     foreach flags $flag_opts {
  	if { [check_no_compiler_messages_nocache \
  		  arm_v8_3a_complex_neon_ok assembly {
  	    #if !defined (__ARM_FEATURE_COMPLEX)
  	    #error "__ARM_FEATURE_COMPLEX not defined"
  	    #endif
  	    #include <complex.h>
! 	} "$flags"] } {
! 	    set et_arm_v8_3a_complex_neon_flags "$flags"
  	    return 1;
  	}
      }
*************** proc add_options_for_arm_v8_3a_complex_n
*** 13775,13793 ****
  proc check_effective_target_arm_v8_3a_fp16_complex_neon_ok_nocache { } {
      global et_arm_v8_3a_fp16_complex_neon_flags
      set et_arm_v8_3a_fp16_complex_neon_flags ""
-     set cpu_unset ""
  
      if { ![istarget arm*-*-*] && ![istarget aarch64*-*-*] } {
  	return 0;
      }
  
      if { [istarget arm*-*-*] } {
! 	set cpu_unset "-mcpu=unset"
      }
  
      # Iterate through sets of options to find the compiler flags that
      # need to be added to the -march option.
!     foreach flags {"" "-mfloat-abi=softfp -mfpu=auto" "-mfloat-abi=hard -mfpu=auto"} {
  	if { [check_no_compiler_messages_nocache \
  		  arm_v8_3a_fp16_complex_neon_ok assembly {
  	    #if !defined (__ARM_FEATURE_COMPLEX)
--- 13831,13855 ----
  proc check_effective_target_arm_v8_3a_fp16_complex_neon_ok_nocache { } {
      global et_arm_v8_3a_fp16_complex_neon_flags
      set et_arm_v8_3a_fp16_complex_neon_flags ""
  
      if { ![istarget arm*-*-*] && ![istarget aarch64*-*-*] } {
  	return 0;
      }
  
      if { [istarget arm*-*-*] } {
! 	set flag_opts {
! 	    ""
! 	    "-mfpu=auto -mcpu=unset -march=armv8.3-a+fp16+simd"
! 	    "-mfloat-abi=softfp -mfpu=auto -mcpu=unset -march=armv8.3-a+fp16+simd"
! 	    "-mfloat-abi=hard -mfpu=auto -mcpu=unset -march=armv8.3-a+fp16+simd"
! 	}
!     } else {
! 	set flag_opts { "" "-march=armv8.3-a+fp16" }
      }
  
      # Iterate through sets of options to find the compiler flags that
      # need to be added to the -march option.
!     foreach flags $flag_opts {
  	if { [check_no_compiler_messages_nocache \
  		  arm_v8_3a_fp16_complex_neon_ok assembly {
  	    #if !defined (__ARM_FEATURE_COMPLEX)
*************** proc check_effective_target_arm_v8_3a_fp
*** 13797,13805 ****
  	    #error "__ARM_FEATURE_FP16_VECTOR_ARITHMETIC not defined"
  	    #endif
  	    #include <complex.h>
! 	} "$flags $cpu_unset -march=armv8.3-a+fp16+simd"] } {
! 	    set et_arm_v8_3a_fp16_complex_neon_flags \
! 			"$flags $cpu_unset -march=armv8.3-a+fp16+simd"
  	    return 1;
  	}
      }
--- 13859,13866 ----
  	    #error "__ARM_FEATURE_FP16_VECTOR_ARITHMETIC not defined"
  	    #endif
  	    #include <complex.h>
! 	} "$flags"] } {
! 	    set et_arm_v8_3a_fp16_complex_neon_flags "$flags"
  	    return 1;
  	}
      }
diff -Nrcpad gcc-16-20260125/gcc/tree-core.h gcc-16-20260201/gcc/tree-core.h
*** gcc-16-20260125/gcc/tree-core.h	Sun Jan 25 22:32:17 2026
--- gcc-16-20260201/gcc/tree-core.h	Sun Feb  1 22:32:15 2026
*************** struct GTY(()) tree_base {
*** 1387,1392 ****
--- 1387,1395 ----
         ENUM_IS_OPAQUE in
  	   ENUMERAL_TYPE
  
+        CONST_WRAPPER_P in
+ 	   VIEW_CONVERT_EXPR (used by C++)
+ 
     protected_flag:
  
         TREE_PROTECTED in
diff -Nrcpad gcc-16-20260125/gcc/tree-eh.cc gcc-16-20260201/gcc/tree-eh.cc
*** gcc-16-20260125/gcc/tree-eh.cc	Sun Jan 25 22:32:17 2026
--- gcc-16-20260201/gcc/tree-eh.cc	Sun Feb  1 22:32:15 2026
*************** sink_clobbers (basic_block bb,
*** 3861,3866 ****
--- 3861,3878 ----
      }
    if (first_sunk)
      {
+       /* If there isn't a single predecessor but no virtual PHI node
+ 	 create one and arrange for virtual operands to be renamed as
+ 	 we cannot be sure all incoming edges will updated from sinking
+ 	 something.  */
+       if (!vphi && !single_pred_p (succbb))
+ 	{
+ 	  vphi = create_phi_node (gimple_vop (cfun), succbb);
+ 	  FOR_EACH_EDGE (e, ei, succbb->preds)
+ 	    add_phi_arg (vphi, gimple_vop (cfun), e, UNKNOWN_LOCATION);
+ 	  mark_virtual_operands_for_renaming (cfun);
+ 	  todo |= TODO_update_ssa_only_virtuals;
+ 	}
        /* Adjust virtual operands if we sunk across a virtual PHI.  */
        if (vphi)
  	{
*************** sink_clobbers (basic_block bb,
*** 3880,3893 ****
  		   gimple_vuse (last_sunk));
  	  SET_USE (gimple_vuse_op (last_sunk), phi_def);
  	}
-       /* If there isn't a single predecessor but no virtual PHI node
-          arrange for virtual operands to be renamed.  */
-       else if (!single_pred_p (succbb)
- 	       && TREE_CODE (gimple_vuse (last_sunk)) == SSA_NAME)
- 	{
- 	  mark_virtual_operand_for_renaming (gimple_vuse (last_sunk));
- 	  todo |= TODO_update_ssa_only_virtuals;
- 	}
      }
  
    return todo;
--- 3892,3897 ----
diff -Nrcpad gcc-16-20260125/gcc/tree-if-conv.cc gcc-16-20260201/gcc/tree-if-conv.cc
*** gcc-16-20260125/gcc/tree-if-conv.cc	Sun Jan 25 22:32:17 2026
--- gcc-16-20260201/gcc/tree-if-conv.cc	Sun Feb  1 22:32:15 2026
*************** if_convertible_switch_p (gswitch *sw)
*** 1120,1125 ****
--- 1120,1155 ----
    return true;
  }
  
+ /* Return true when STMT is an if-convertible SIMD clone stmts.
+ 
+    A SIMD clone statement is if-convertible if:
+     - it is an GIMPLE_CALL,
+     - it has a FNDECL,
+     - it has SIMD clones,
+     - it has at least one inbranch clone.  */
+ static bool
+ if_convertible_simdclone_stmt_p (gimple *stmt)
+ {
+   if (!is_gimple_call (stmt))
+     return false;
+ 
+   tree fndecl = gimple_call_fndecl (stmt);
+   if (fndecl)
+     {
+       /* We can vectorize some builtins and functions with SIMD "inbranch"
+ 	 clones.  */
+       struct cgraph_node *node = cgraph_node::get (fndecl);
+       if (node && node->simd_clones != NULL)
+ 	/* Ensure that at least one clone can be "inbranch".  */
+ 	for (struct cgraph_node *n = node->simd_clones; n != NULL;
+ 	     n = n->simdclone->next_clone)
+ 	  if (n->simdclone->inbranch)
+ 	    return true;
+     }
+ 
+   return false;
+ }
+ 
  /* Return true when STMT is if-convertible.
  
     A statement is if-convertible if:
*************** if_convertible_stmt_p (gimple *stmt, vec
*** 1147,1168 ****
  
      case GIMPLE_CALL:
        {
! 	tree fndecl = gimple_call_fndecl (stmt);
! 	if (fndecl)
  	  {
! 	    /* We can vectorize some builtins and functions with SIMD
! 	       "inbranch" clones.  */
! 	    struct cgraph_node *node = cgraph_node::get (fndecl);
! 	    if (node && node->simd_clones != NULL)
! 	      /* Ensure that at least one clone can be "inbranch".  */
! 	      for (struct cgraph_node *n = node->simd_clones; n != NULL;
! 		   n = n->simdclone->next_clone)
! 		if (n->simdclone->inbranch)
! 		  {
! 		    gimple_set_plf (stmt, GF_PLF_2, true);
! 		    need_to_predicate = true;
! 		    return true;
! 		  }
  	  }
  
  	/* Check if the call can trap and if so require predication.  */
--- 1177,1188 ----
  
      case GIMPLE_CALL:
        {
! 	/* Check if stmt is a simd clone first.  */
! 	if (if_convertible_simdclone_stmt_p (stmt))
  	  {
! 	    gimple_set_plf (stmt, GF_PLF_2, true);
! 	    need_to_predicate = true;
! 	    return true;
  	  }
  
  	/* Check if the call can trap and if so require predication.  */
*************** predicate_statements (loop_p loop)
*** 3108,3114 ****
  	    }
  	  else if (gimple_plf (stmt, GF_PLF_2)
  		   && (is_gimple_assign (stmt)
! 		       || gimple_call_builtin_p (stmt)))
  	    {
  	      tree lhs = gimple_get_lhs (stmt);
  	      /* ?? Assume that calls without an LHS are not data processing
--- 3128,3135 ----
  	    }
  	  else if (gimple_plf (stmt, GF_PLF_2)
  		   && (is_gimple_assign (stmt)
! 		       || (gimple_call_builtin_p (stmt)
! 			   && !if_convertible_simdclone_stmt_p (stmt))))
  	    {
  	      tree lhs = gimple_get_lhs (stmt);
  	      /* ?? Assume that calls without an LHS are not data processing
diff -Nrcpad gcc-16-20260125/gcc/tree-ssa-forwprop.cc gcc-16-20260201/gcc/tree-ssa-forwprop.cc
*** gcc-16-20260125/gcc/tree-ssa-forwprop.cc	Sun Jan 25 22:32:17 2026
--- gcc-16-20260201/gcc/tree-ssa-forwprop.cc	Sun Feb  1 22:32:15 2026
*************** simplify_vector_constructor (gimple_stmt
*** 4139,4150 ****
        perm_type = TREE_TYPE (orig[0]);
        /* Determine the element type for the conversion source.
  	 As orig_elem_type keeps track of the original type, check
! 	 if we need to perform a sign swap after permuting.  */
        tree conv_elem_type = TREE_TYPE (perm_type);
        if (conv_code != ERROR_MARK
  	  && orig_elem_type[0]
! 	  && tree_nop_conversion_p (orig_elem_type[0], conv_elem_type))
! 	conv_elem_type = orig_elem_type[0];
        conv_src_type = build_vector_type (conv_elem_type, nelts);
        if (conv_code != ERROR_MARK
  	  && !supportable_convert_operation (conv_code, type, conv_src_type,
--- 4139,4155 ----
        perm_type = TREE_TYPE (orig[0]);
        /* Determine the element type for the conversion source.
  	 As orig_elem_type keeps track of the original type, check
! 	 if we need to perform a sign swap after permuting.
! 	 We need to be able to construct a vector type from the element
! 	 type which is not possible for e.g. BitInt or pointers
! 	 so pun with an integer type if needed.  */
        tree conv_elem_type = TREE_TYPE (perm_type);
        if (conv_code != ERROR_MARK
  	  && orig_elem_type[0]
! 	  && TYPE_SIGN (orig_elem_type[0]) != TYPE_SIGN (conv_elem_type))
! 	conv_elem_type = signed_or_unsigned_type_for (TYPE_UNSIGNED
! 						      (orig_elem_type[0]),
! 						      conv_elem_type);
        conv_src_type = build_vector_type (conv_elem_type, nelts);
        if (conv_code != ERROR_MARK
  	  && !supportable_convert_operation (conv_code, type, conv_src_type,
*************** simplify_vector_constructor (gimple_stmt
*** 4272,4278 ****
  			    TYPE_SIZE (conv_code != ERROR_MARK ? conv_src_type
  							       : type),
  			    bitsize_zero_node);
!       /* Otherwise, we can still have an intermediate sign change.  */
        else if (conv_code != ERROR_MARK
  	       && tree_nop_conversion_p (conv_src_type, perm_type))
  	res = gimple_build (&stmts, VIEW_CONVERT_EXPR, conv_src_type, res);
--- 4277,4285 ----
  			    TYPE_SIZE (conv_code != ERROR_MARK ? conv_src_type
  							       : type),
  			    bitsize_zero_node);
!       /* Otherwise, we can still have an intermediate sign change.
! 	 ??? In that case we have two subsequent conversions.
! 	 We should be able to merge them.  */
        else if (conv_code != ERROR_MARK
  	       && tree_nop_conversion_p (conv_src_type, perm_type))
  	res = gimple_build (&stmts, VIEW_CONVERT_EXPR, conv_src_type, res);
diff -Nrcpad gcc-16-20260125/gcc/tree-ssa-loop-niter.cc gcc-16-20260201/gcc/tree-ssa-loop-niter.cc
*** gcc-16-20260125/gcc/tree-ssa-loop-niter.cc	Sun Jan 25 22:32:17 2026
--- gcc-16-20260201/gcc/tree-ssa-loop-niter.cc	Sun Feb  1 22:32:15 2026
*************** number_of_iterations_lt_to_ne (tree type
*** 1218,1224 ****
      }
  
    /* IV0 < IV1 does not loop if IV0->base >= IV1->base.  */
!   if (mpz_cmp (mmod, bnds->below) < 0)
      noloop = boolean_false_node;
    else
      noloop = fold_build2 (GE_EXPR, boolean_type_node,
--- 1218,1224 ----
      }
  
    /* IV0 < IV1 does not loop if IV0->base >= IV1->base.  */
!   if (fv_comp_no_overflow && mpz_cmp (mmod, bnds->below) < 0)
      noloop = boolean_false_node;
    else
      noloop = fold_build2 (GE_EXPR, boolean_type_node,
diff -Nrcpad gcc-16-20260125/gcc/tree-ssa-math-opts.cc gcc-16-20260201/gcc/tree-ssa-math-opts.cc
*** gcc-16-20260125/gcc/tree-ssa-math-opts.cc	Sun Jan 25 22:32:17 2026
--- gcc-16-20260201/gcc/tree-ssa-math-opts.cc	Sun Feb  1 22:32:15 2026
*************** convert_mult_to_fma_1 (tree mul_result,
*** 3120,3125 ****
--- 3120,3145 ----
        if (is_gimple_debug (use_stmt))
  	continue;
  
+       /* If the use is a type convert, look further into it if the operations
+ 	 are the same under two's complement.  */
+       tree lhs_type;
+       if (gimple_assign_cast_p (use_stmt)
+ 	  && (lhs_type = TREE_TYPE (gimple_get_lhs (use_stmt)))
+ 	  && tree_nop_conversion_p (lhs_type, TREE_TYPE (op1)))
+ 	{
+ 	  tree cast_lhs = gimple_get_lhs (use_stmt);
+ 	  gimple *tmp_use;
+ 	  use_operand_p tmp_use_p;
+ 	  if (single_imm_use (cast_lhs, &tmp_use_p, &tmp_use))
+ 	    {
+ 	      release_defs (use_stmt);
+ 	      use_stmt = tmp_use;
+ 	      result = cast_lhs;
+ 	      gsi_remove (&gsi, true);
+ 	      gsi = gsi_for_stmt (use_stmt);
+ 	    }
+ 	}
+ 
        if (is_gimple_assign (use_stmt)
  	  && gimple_assign_rhs_code (use_stmt) == NEGATE_EXPR)
  	{
*************** convert_mult_to_fma_1 (tree mul_result,
*** 3159,3164 ****
--- 3179,3191 ----
        if (seq)
  	gsi_insert_seq_before (&gsi, seq, GSI_SAME_STMT);
  
+       /* Ensure all the operands are of the same type.  Use the type of the
+ 	 addend as that's the statement being replaced.  */
+       op2 = gimple_convert (&gsi, true, GSI_SAME_STMT,
+ 			    UNKNOWN_LOCATION, TREE_TYPE (addop), op2);
+       mulop1 = gimple_convert (&gsi, true, GSI_SAME_STMT,
+ 			       UNKNOWN_LOCATION, TREE_TYPE (addop), mulop1);
+ 
        if (len)
  	fma_stmt
  	  = gimple_build_call_internal (IFN_COND_LEN_FMA, 7, cond, mulop1, op2,
*************** convert_mult_to_fma (gimple *mul_stmt, t
*** 3419,3424 ****
--- 3446,3465 ----
        if (is_gimple_debug (use_stmt))
  	continue;
  
+       /* If the use is a type convert, look further into it if the operations
+ 	 are the same under two's complement.  */
+       tree lhs_type;
+       if (gimple_assign_cast_p (use_stmt)
+ 	  && (lhs_type = TREE_TYPE (gimple_get_lhs (use_stmt)))
+ 	  && tree_nop_conversion_p (lhs_type, TREE_TYPE (op1)))
+ 	{
+ 	  tree cast_lhs = gimple_get_lhs (use_stmt);
+ 	  gimple *tmp_use;
+ 	  use_operand_p tmp_use_p;
+ 	  if (single_imm_use (cast_lhs, &tmp_use_p, &tmp_use))
+ 	    use_stmt = tmp_use;
+ 	}
+ 
        /* For now restrict this operations to single basic blocks.  In theory
  	 we would want to support sinking the multiplication in
  	 m = a*b;
diff -Nrcpad gcc-16-20260125/gcc/tree-ssa-phiopt.cc gcc-16-20260201/gcc/tree-ssa-phiopt.cc
*** gcc-16-20260125/gcc/tree-ssa-phiopt.cc	Sun Jan 25 22:32:17 2026
--- gcc-16-20260201/gcc/tree-ssa-phiopt.cc	Sun Feb  1 22:32:15 2026
*************** cond_if_else_store_replacement (basic_bl
*** 3349,3357 ****
        return false;
      }
  
!   /* Find pairs of stores with equal LHS.  */
    auto_vec<std::pair<gimple *, gimple *>, 1> stores_pairs;
!   for (auto then_dr : then_datarefs)
      {
        if (DR_IS_READ (then_dr))
          continue;
--- 3349,3369 ----
        return false;
      }
  
!   /* Clear visited on else stores, we want to make sure to pick each store
!      at most once to avoid quadratic behavior.  */
!   for (auto else_dr : else_datarefs)
!     {
!       if (DR_IS_READ (else_dr))
! 	continue;
!       gimple_set_visited (DR_STMT (else_dr), false);
!     }
! 
!   /* Find pairs of stores with equal LHS.  Work from the end to avoid
!      re-ordering stores unnecessarily.  */
    auto_vec<std::pair<gimple *, gimple *>, 1> stores_pairs;
!   unsigned i;
!   data_reference_p then_dr;
!   FOR_EACH_VEC_ELT_REVERSE (then_datarefs, i, then_dr)
      {
        if (DR_IS_READ (then_dr))
          continue;
*************** cond_if_else_store_replacement (basic_bl
*** 3362,3373 ****
  	continue;
        found = false;
  
!       for (auto else_dr : else_datarefs)
          {
            if (DR_IS_READ (else_dr))
              continue;
  
            else_store = DR_STMT (else_dr);
            else_lhs = gimple_get_lhs (else_store);
  	  if (else_lhs == NULL_TREE)
  	    continue;
--- 3374,3389 ----
  	continue;
        found = false;
  
!       unsigned j;
!       data_reference_p else_dr;
!       FOR_EACH_VEC_ELT_REVERSE (else_datarefs, j, else_dr)
          {
            if (DR_IS_READ (else_dr))
              continue;
  
            else_store = DR_STMT (else_dr);
+ 	  if (gimple_visited_p (else_store))
+ 	    continue;
            else_lhs = gimple_get_lhs (else_store);
  	  if (else_lhs == NULL_TREE)
  	    continue;
*************** cond_if_else_store_replacement (basic_bl
*** 3382,3387 ****
--- 3398,3404 ----
        if (!found)
          continue;
  
+       gimple_set_visited (else_store, true);
        stores_pairs.safe_push (std::make_pair (then_store, else_store));
      }
  
diff -Nrcpad gcc-16-20260125/gcc/tree-ssa-reassoc.cc gcc-16-20260201/gcc/tree-ssa-reassoc.cc
*** gcc-16-20260125/gcc/tree-ssa-reassoc.cc	Sun Jan 25 22:32:17 2026
--- gcc-16-20260201/gcc/tree-ssa-reassoc.cc	Sun Feb  1 22:32:15 2026
*************** build_and_add_sum (tree type, tree op1,
*** 1568,1574 ****
    if ((!op1def || gimple_nop_p (op1def))
        && (!op2def || gimple_nop_p (op2def)))
      {
!       gsi = gsi_after_labels (single_succ (ENTRY_BLOCK_PTR_FOR_FN (cfun)));
        if (!gsi_end_p (gsi)
  	  && is_gimple_call (gsi_stmt (gsi))
  	  && (gimple_call_flags (gsi_stmt (gsi)) & ECF_RETURNS_TWICE))
--- 1568,1575 ----
    if ((!op1def || gimple_nop_p (op1def))
        && (!op2def || gimple_nop_p (op2def)))
      {
!       gsi = gsi_start_nondebug_after_labels_bb
! 		(single_succ (ENTRY_BLOCK_PTR_FOR_FN (cfun)));
        if (!gsi_end_p (gsi)
  	  && is_gimple_call (gsi_stmt (gsi))
  	  && (gimple_call_flags (gsi_stmt (gsi)) & ECF_RETURNS_TWICE))
diff -Nrcpad gcc-16-20260125/gcc/tree-vect-loop.cc gcc-16-20260201/gcc/tree-vect-loop.cc
*** gcc-16-20260125/gcc/tree-vect-loop.cc	Sun Jan 25 22:32:17 2026
--- gcc-16-20260201/gcc/tree-vect-loop.cc	Sun Feb  1 22:32:15 2026
*************** vect_analyze_loop_form (class loop *loop
*** 1556,1562 ****
  	return opt_result::failure_at (vect_location,
  				       "not vectorized: Bad inner loop.\n");
  
!       if (!expr_invariant_in_loop_p (loop, inner.number_of_iterations))
  	return opt_result::failure_at (vect_location,
  				       "not vectorized: inner-loop count not"
  				       " invariant.\n");
--- 1556,1563 ----
  	return opt_result::failure_at (vect_location,
  				       "not vectorized: Bad inner loop.\n");
  
!       if (inner.number_of_iterations ==  chrec_dont_know
! 	  || !expr_invariant_in_loop_p (loop, inner.number_of_iterations))
  	return opt_result::failure_at (vect_location,
  				       "not vectorized: inner-loop count not"
  				       " invariant.\n");
*************** get_initial_defs_for_reduction (loop_vec
*** 4962,4968 ****
    if (neutral_op
        && !useless_type_conversion_p (vector_elt_type,
  				     TREE_TYPE (neutral_op)))
!     neutral_op = gimple_convert (&ctor_seq, vector_elt_type, neutral_op);
    for (j = 0; j < nunits * number_of_vectors; ++j)
      {
        tree op;
--- 4963,4978 ----
    if (neutral_op
        && !useless_type_conversion_p (vector_elt_type,
  				     TREE_TYPE (neutral_op)))
!     {
!       if (VECTOR_BOOLEAN_TYPE_P (vector_type))
! 	neutral_op = gimple_build (&ctor_seq, COND_EXPR,
! 				   vector_elt_type,
! 				   neutral_op,
! 				   build_all_ones_cst (vector_elt_type),
! 				   build_zero_cst (vector_elt_type));
!       else
! 	neutral_op = gimple_convert (&ctor_seq, vector_elt_type, neutral_op);
!     }
    for (j = 0; j < nunits * number_of_vectors; ++j)
      {
        tree op;
*************** vect_find_reusable_accumulator (loop_vec
*** 5154,5162 ****
  	 initialize the accumulator with a neutral value instead.  */
        if (!operand_equal_p (initial_value, main_adjustment))
  	return false;
!       code_helper code = VECT_REDUC_INFO_CODE (reduc_info);
!       initial_values[0] = neutral_op_for_reduction (TREE_TYPE (initial_value),
! 						    code, initial_value);
      }
    VECT_REDUC_INFO_EPILOGUE_ADJUSTMENT (reduc_info) = main_adjustment;
    VECT_REDUC_INFO_INITIAL_VALUES (reduc_info).truncate (0);
--- 5164,5170 ----
  	 initialize the accumulator with a neutral value instead.  */
        if (!operand_equal_p (initial_value, main_adjustment))
  	return false;
!       initial_values[0] = VECT_REDUC_INFO_NEUTRAL_OP (reduc_info);
      }
    VECT_REDUC_INFO_EPILOGUE_ADJUSTMENT (reduc_info) = main_adjustment;
    VECT_REDUC_INFO_INITIAL_VALUES (reduc_info).truncate (0);
*************** vectorizable_reduction (loop_vec_info lo
*** 7607,7614 ****
    tree initial_value = NULL_TREE;
    if (reduc_chain)
      initial_value = vect_phi_initial_value (reduc_def_phi);
!   neutral_op = neutral_op_for_reduction (TREE_TYPE (vectype_out),
  					 orig_code, initial_value);
  
    if (double_reduc && reduction_type == FOLD_LEFT_REDUCTION)
      {
--- 7615,7624 ----
    tree initial_value = NULL_TREE;
    if (reduc_chain)
      initial_value = vect_phi_initial_value (reduc_def_phi);
!   neutral_op = neutral_op_for_reduction (TREE_TYPE
! 					   (gimple_phi_result (reduc_def_phi)),
  					 orig_code, initial_value);
+   VECT_REDUC_INFO_NEUTRAL_OP (reduc_info) = neutral_op;
  
    if (double_reduc && reduction_type == FOLD_LEFT_REDUCTION)
      {
*************** vectorizable_reduction (loop_vec_info lo
*** 7648,7662 ****
    /* For double reductions, and for SLP reductions with a neutral value,
       we construct a variable-length initial vector by loading a vector
       full of the neutral value and then shift-and-inserting the start
!      values into the low-numbered elements.  */
    if ((double_reduc || neutral_op)
        && !nunits_out.is_constant ()
!       && (SLP_TREE_LANES (slp_node) != 1 && !reduc_chain)
!       && (!neutral_op
! 	  || !operand_equal_p (neutral_op,
! 			       vect_phi_initial_value (reduc_def_phi)))
        && !direct_internal_fn_supported_p (IFN_VEC_SHL_INSERT,
! 					  vectype_out, OPTIMIZE_FOR_SPEED))
      {
        if (dump_enabled_p ())
  	dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
--- 7658,7676 ----
    /* For double reductions, and for SLP reductions with a neutral value,
       we construct a variable-length initial vector by loading a vector
       full of the neutral value and then shift-and-inserting the start
!      values into the low-numbered elements.  This is however not needed
!      when neutral and initial value are equal or we can handle the
!      initial value via adjustment in the epilogue.  */
    if ((double_reduc || neutral_op)
        && !nunits_out.is_constant ()
!       && reduction_type != INTEGER_INDUC_COND_REDUCTION
!       && !((SLP_TREE_LANES (slp_node) == 1 || reduc_chain)
! 	   && neutral_op
! 	   && (!double_reduc
! 	       || operand_equal_p (neutral_op,
! 				   vect_phi_initial_value (reduc_def_phi))))
        && !direct_internal_fn_supported_p (IFN_VEC_SHL_INSERT,
! 					  vectype_out, OPTIMIZE_FOR_BOTH))
      {
        if (dump_enabled_p ())
  	dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
*************** vect_transform_cycle_phi (loop_vec_info
*** 8327,8333 ****
  					       vectype_out);
  
    /* Get the loop-entry arguments.  */
-   tree vec_initial_def = NULL_TREE;
    auto_vec<tree> vec_initial_defs;
    vec_initial_defs.reserve (vec_num);
    /* Optimize: if initial_def is for REDUC_MAX smaller than the base
--- 8341,8346 ----
*************** vect_transform_cycle_phi (loop_vec_info
*** 8376,8415 ****
  	  gphi *this_phi = as_a<gphi *> (stmts[i]->stmt);
  	  initial_values.quick_push (vect_phi_initial_value (this_phi));
  	}
!       if (vec_num == 1)
! 	vect_find_reusable_accumulator (loop_vinfo, reduc_info, vectype_out);
!       if (!initial_values.is_empty ())
  	{
! 	  tree initial_value
! 	    = (num_phis == 1 ? initial_values[0] : NULL_TREE);
! 	  code_helper code = VECT_REDUC_INFO_CODE (reduc_info);
! 	  tree neutral_op
! 	    = neutral_op_for_reduction (TREE_TYPE (vectype_out),
! 					code, initial_value);
! 	  /* Try to simplify the vector initialization by applying an
! 	     adjustment after the reduction has been performed.  This
! 	     can also break a critical path but on the other hand
! 	     requires to keep the initial value live across the loop.  */
! 	  if (neutral_op
! 	      && initial_values.length () == 1
! 	      && !VECT_REDUC_INFO_REUSED_ACCUMULATOR (reduc_info)
! 	      && STMT_VINFO_DEF_TYPE (stmt_info) == vect_reduction_def
! 	      && !operand_equal_p (neutral_op, initial_values[0]))
! 	    {
! 	      VECT_REDUC_INFO_EPILOGUE_ADJUSTMENT (reduc_info)
! 		= initial_values[0];
! 	      initial_values[0] = neutral_op;
! 	    }
! 	  get_initial_defs_for_reduction (loop_vinfo, reduc_info, vectype_out,
! 					  &vec_initial_defs, vec_num,
! 					  stmts.length (), neutral_op);
  	}
!     }
! 
!   if (vec_initial_def)
!     {
!       vec_initial_defs.create (1);
!       vec_initial_defs.quick_push (vec_initial_def);
      }
  
    if (reduc_info)
--- 8389,8417 ----
  	  gphi *this_phi = as_a<gphi *> (stmts[i]->stmt);
  	  initial_values.quick_push (vect_phi_initial_value (this_phi));
  	}
!       tree neutral_op = VECT_REDUC_INFO_NEUTRAL_OP (reduc_info);
!       if (vec_num == 1
! 	  && vect_find_reusable_accumulator (loop_vinfo,
! 					     reduc_info, vectype_out))
! 	;
!       /* Try to simplify the vector initialization by applying an
! 	 adjustment after the reduction has been performed.  This
! 	 can also break a critical path but on the other hand
! 	 requires to keep the initial value live across the loop.  */
!       else if (neutral_op
! 	       && initial_values.length () == 1
! 	       && STMT_VINFO_DEF_TYPE (stmt_info) == vect_reduction_def
! 	       && !operand_equal_p (neutral_op, initial_values[0]))
  	{
! 	  VECT_REDUC_INFO_EPILOGUE_ADJUSTMENT (reduc_info)
! 	    = initial_values[0];
! 	  initial_values[0] = neutral_op;
  	}
!       if (!VECT_REDUC_INFO_REUSED_ACCUMULATOR (reduc_info)
! 	  || loop_vinfo->main_loop_edge)
! 	get_initial_defs_for_reduction (loop_vinfo, reduc_info, vectype_out,
! 					&vec_initial_defs, vec_num,
! 					stmts.length (), neutral_op);
      }
  
    if (reduc_info)
diff -Nrcpad gcc-16-20260125/gcc/tree-vect-slp.cc gcc-16-20260201/gcc/tree-vect-slp.cc
*** gcc-16-20260125/gcc/tree-vect-slp.cc	Sun Jan 25 22:32:17 2026
--- gcc-16-20260201/gcc/tree-vect-slp.cc	Sun Feb  1 22:32:15 2026
*************** vect_remove_slp_scalar_calls (vec_info *
*** 12135,12144 ****
        if (lhs)
  	new_stmt = gimple_build_assign (lhs, build_zero_cst (TREE_TYPE (lhs)));
        else
! 	{
! 	  new_stmt = gimple_build_nop ();
! 	  unlink_stmt_vdef (stmt_info->stmt);
! 	}
        gsi = gsi_for_stmt (stmt);
        vinfo->replace_stmt (&gsi, stmt_info, new_stmt);
        if (lhs)
--- 12135,12142 ----
        if (lhs)
  	new_stmt = gimple_build_assign (lhs, build_zero_cst (TREE_TYPE (lhs)));
        else
! 	new_stmt = gimple_build_nop ();
!       unlink_stmt_vdef (stmt_info->stmt);
        gsi = gsi_for_stmt (stmt);
        vinfo->replace_stmt (&gsi, stmt_info, new_stmt);
        if (lhs)
diff -Nrcpad gcc-16-20260125/gcc/tree-vect-stmts.cc gcc-16-20260201/gcc/tree-vect-stmts.cc
*** gcc-16-20260125/gcc/tree-vect-stmts.cc	Sun Jan 25 22:32:17 2026
--- gcc-16-20260201/gcc/tree-vect-stmts.cc	Sun Feb  1 22:32:15 2026
*************** vectorizable_call (vec_info *vinfo,
*** 3632,3639 ****
    if (could_trap && cost_vec && loop_vinfo)
      {
        /* If the operation can trap it must be conditional, otherwise fail.  */
!       internal_fn cond_fn = get_conditional_internal_fn (ifn);
!       internal_fn cond_len_fn = get_len_internal_fn (ifn);
        if (LOOP_VINFO_CAN_USE_PARTIAL_VECTORS_P (loop_vinfo))
  	{
  	  /* We assume that BB SLP fills all lanes, so no inactive lanes can
--- 3632,3640 ----
    if (could_trap && cost_vec && loop_vinfo)
      {
        /* If the operation can trap it must be conditional, otherwise fail.  */
!       internal_fn cond_fn = (internal_fn_mask_index (ifn) != -1
! 			     ? ifn : get_conditional_internal_fn (ifn));
!       internal_fn cond_len_fn = get_len_internal_fn (cond_fn);
        if (LOOP_VINFO_CAN_USE_PARTIAL_VECTORS_P (loop_vinfo))
  	{
  	  /* We assume that BB SLP fills all lanes, so no inactive lanes can
*************** vectorizable_call (vec_info *vinfo,
*** 3698,3705 ****
    int reduc_idx = SLP_TREE_REDUC_IDX (slp_node);
    internal_fn cond_fn = (internal_fn_mask_index (ifn) != -1
  			 ? ifn : get_conditional_internal_fn (ifn));
!   internal_fn cond_len_fn = get_len_internal_fn (ifn);
!   int len_opno = internal_fn_len_index (cond_len_fn);
    vec_loop_masks *masks = (loop_vinfo ? &LOOP_VINFO_MASKS (loop_vinfo) : NULL);
    vec_loop_lens *lens = (loop_vinfo ? &LOOP_VINFO_LENS (loop_vinfo) : NULL);
    unsigned int nvectors = vect_get_num_copies (vinfo, slp_node);
--- 3699,3705 ----
    int reduc_idx = SLP_TREE_REDUC_IDX (slp_node);
    internal_fn cond_fn = (internal_fn_mask_index (ifn) != -1
  			 ? ifn : get_conditional_internal_fn (ifn));
!   internal_fn cond_len_fn = get_len_internal_fn (cond_fn);
    vec_loop_masks *masks = (loop_vinfo ? &LOOP_VINFO_MASKS (loop_vinfo) : NULL);
    vec_loop_lens *lens = (loop_vinfo ? &LOOP_VINFO_LENS (loop_vinfo) : NULL);
    unsigned int nvectors = vect_get_num_copies (vinfo, slp_node);
*************** vectorizable_call (vec_info *vinfo,
*** 3767,3788 ****
    bool masked_loop_p = loop_vinfo && LOOP_VINFO_FULLY_MASKED_P (loop_vinfo);
    bool len_loop_p = loop_vinfo && LOOP_VINFO_FULLY_WITH_LENGTH_P (loop_vinfo);
    unsigned int vect_nargs = nargs;
!   if (len_loop_p)
      {
!       if (len_opno >= 0)
! 	{
! 	  ifn = cond_len_fn;
! 	  /* COND_* -> COND_LEN_* takes 2 extra arguments:LEN,BIAS.  */
! 	  vect_nargs += 2;
! 	}
!       else if (reduc_idx >= 0)
! 	gcc_unreachable ();
      }
    else if (masked_loop_p && mask_opno == -1 && (reduc_idx >= 0 || could_trap))
      {
        ifn = cond_fn;
        vect_nargs += 2;
      }
    if (clz_ctz_arg1)
      ++vect_nargs;
  
--- 3767,3788 ----
    bool masked_loop_p = loop_vinfo && LOOP_VINFO_FULLY_MASKED_P (loop_vinfo);
    bool len_loop_p = loop_vinfo && LOOP_VINFO_FULLY_WITH_LENGTH_P (loop_vinfo);
    unsigned int vect_nargs = nargs;
!   if (len_loop_p && (reduc_idx >= 0 || could_trap || mask_opno >= 0))
      {
!       ifn = cond_len_fn;
!       /* COND_* -> COND_LEN_* takes 2 extra arguments:LEN,BIAS.  */
!       vect_nargs += 2;
!       /* But unless there's a mask argument already we need that
! 	 as well, and an else value.  */
!       if (mask_opno == -1)
! 	vect_nargs += 2;
      }
    else if (masked_loop_p && mask_opno == -1 && (reduc_idx >= 0 || could_trap))
      {
        ifn = cond_fn;
        vect_nargs += 2;
      }
+   int len_opno = internal_fn_len_index (ifn);
    if (clz_ctz_arg1)
      ++vect_nargs;
  
*************** vectorizable_call (vec_info *vinfo,
*** 3822,3834 ****
  	    {
  	      int varg = 0;
  	      /* Add the mask if necessary.  */
! 	      if (masked_loop_p && mask_opno == -1
! 		  && (reduc_idx >= 0 || could_trap))
  		{
  		  gcc_assert (internal_fn_mask_index (ifn) == varg);
! 		  unsigned int vec_num = vec_oprnds0.length ();
! 		  vargs[varg++] = vect_get_loop_mask (loop_vinfo, gsi, masks,
! 						      vec_num, vectype_out, i);
  		}
  	      size_t k;
  	      for (k = 0; k < nargs; k++)
--- 3822,3845 ----
  	    {
  	      int varg = 0;
  	      /* Add the mask if necessary.  */
! 	      if ((masked_loop_p || len_loop_p) && mask_opno == -1
! 		  && internal_fn_mask_index (ifn) != -1)
  		{
  		  gcc_assert (internal_fn_mask_index (ifn) == varg);
! 		  if (masked_loop_p)
! 		    {
! 		      unsigned int vec_num = vec_oprnds0.length ();
! 		      vargs[varg++] = vect_get_loop_mask (loop_vinfo, gsi,
! 							  masks, vec_num,
! 							  vectype_out, i);
! 		    }
! 		  else
! 		    {
! 		      tree mask_vectype = truth_type_for (vectype_out);
! 		      vargs[varg++] = vect_build_all_ones_mask (loop_vinfo,
! 								stmt_info,
! 								mask_vectype);
! 		    }
  		}
  	      size_t k;
  	      for (k = 0; k < nargs; k++)
*************** vectorizable_call (vec_info *vinfo,
*** 3837,3844 ****
  		  vargs[varg++] = vec_oprndsk[i];
  		}
  	      /* Add the else value if necessary.  */
! 	      if (masked_loop_p && mask_opno == -1
! 		 && (reduc_idx >= 0 || could_trap))
  		{
  		  gcc_assert (internal_fn_else_index (ifn) == varg);
  		  if (reduc_idx >= 0)
--- 3848,3855 ----
  		  vargs[varg++] = vec_oprndsk[i];
  		}
  	      /* Add the else value if necessary.  */
! 	      if ((masked_loop_p || len_loop_p) && mask_opno == -1
! 		  && internal_fn_else_index (ifn) != -1)
  		{
  		  gcc_assert (internal_fn_else_index (ifn) == varg);
  		  if (reduc_idx >= 0)
*************** vectorizable_call (vec_info *vinfo,
*** 3846,3852 ****
  		  else
  		    {
  		      auto else_value = targetm.preferred_else_value
! 			(cond_fn, vectype_out, varg - 1, &vargs[1]);
  		      vargs[varg++] = else_value;
  		    }
  		}
--- 3857,3863 ----
  		  else
  		    {
  		      auto else_value = targetm.preferred_else_value
! 			(ifn, vectype_out, varg - 1, &vargs[1]);
  		      vargs[varg++] = else_value;
  		    }
  		}
*************** vectorizable_simd_clone_call (vec_info *
*** 4484,4489 ****
--- 4495,4509 ----
  		  else
  		    {
  		      masktype = bestn_inbranch->simdclone->args[i].vector_type;
+ 		      /* The aarch64 port will add custom attributes to types
+ 			 for SVE simdclones which make the types different.  We
+ 			 should use canonincal types for masks within the
+ 			 vectorizer, hence we construct the related vectype
+ 			 here.  */
+ 		      masktype
+ 			= build_truth_vector_type_for_mode
+ 			  (TYPE_VECTOR_SUBPARTS (masktype),
+ 			   TYPE_MODE (masktype));
  		      callee_nelements = TYPE_VECTOR_SUBPARTS (masktype);
  		    }
  		  auto o = vector_unroll_factor (nunits, callee_nelements);
diff -Nrcpad gcc-16-20260125/gcc/tree-vectorizer.h gcc-16-20260201/gcc/tree-vectorizer.h
*** gcc-16-20260125/gcc/tree-vectorizer.h	Sun Jan 25 22:32:17 2026
--- gcc-16-20260201/gcc/tree-vectorizer.h	Sun Feb  1 22:32:15 2026
*************** public:
*** 876,881 ****
--- 876,884 ----
       when we reduce a mask.  */
    tree reduc_vectype_for_mask;
  
+   /* The neutral operand to use, if any.  */
+   tree neutral_op;
+ 
    /* For INTEGER_INDUC_COND_REDUCTION, the initial value to be used.  */
    tree induc_cond_initial_val;
  
*************** typedef class vect_reduc_info_s *vect_re
*** 912,917 ****
--- 915,921 ----
  #define VECT_REDUC_INFO_VECTYPE_FOR_MASK(I) ((I)->reduc_vectype_for_mask)
  #define VECT_REDUC_INFO_FORCE_SINGLE_CYCLE(I) ((I)->force_single_cycle)
  #define VECT_REDUC_INFO_RESULT_POS(I) ((I)->reduc_result_pos)
+ #define VECT_REDUC_INFO_NEUTRAL_OP(I) ((I)->neutral_op)
  
  /* Information about a reduction accumulator from the main loop that could
     conceivably be reused as the input to a reduction in an epilogue loop.  */
diff -Nrcpad gcc-16-20260125/gcc/tree.h gcc-16-20260201/gcc/tree.h
*** gcc-16-20260125/gcc/tree.h	Sun Jan 25 22:32:17 2026
--- gcc-16-20260201/gcc/tree.h	Sun Feb  1 22:32:15 2026
*************** extern void omp_clause_range_check_faile
*** 796,801 ****
--- 796,806 ----
  /* Determines whether an ENUMERAL_TYPE has defined the list of constants. */
  #define ENUM_IS_OPAQUE(NODE) (ENUMERAL_TYPE_CHECK (NODE)->base.private_flag)
  
+ /* Determines whether a VIEW_CONVERT_EXPR node is used to create const
+    qualified variant of its first operand (used by C++ contracts).  */
+ #define CONST_WRAPPER_P(NODE) \
+   (TREE_CHECK (NODE, VIEW_CONVERT_EXPR)->base.private_flag)
+ 
  /* In an expr node (usually a conversion) this means the node was made
     implicitly and should not lead to any sort of warning.  In a decl node,
     warnings concerning the decl should be suppressed.  This is used at
diff -Nrcpad gcc-16-20260125/gcc/var-tracking.cc gcc-16-20260201/gcc/var-tracking.cc
*** gcc-16-20260125/gcc/var-tracking.cc	Sun Jan 25 22:32:17 2026
--- gcc-16-20260201/gcc/var-tracking.cc	Sun Feb  1 22:32:15 2026
*************** val_store (dataflow_set *set, rtx val, r
*** 2519,2525 ****
  	  struct elt_loc_list *l;
  	  for (l = v->locs; l; l = l->next)
  	    {
! 	      fprintf (dump_file, "\n%i: ", INSN_UID (l->setting_insn));
  	      print_inline_rtx (dump_file, l->loc, 0);
  	    }
  	}
--- 2519,2526 ----
  	  struct elt_loc_list *l;
  	  for (l = v->locs; l; l = l->next)
  	    {
! 	      fprintf (dump_file, "\n%i: ",
! 		       l->setting_insn ? INSN_UID (l->setting_insn) : -1);
  	      print_inline_rtx (dump_file, l->loc, 0);
  	    }
  	}
diff -Nrcpad gcc-16-20260125/libatomic/ChangeLog gcc-16-20260201/libatomic/ChangeLog
*** gcc-16-20260125/libatomic/ChangeLog	Sun Jan 25 22:32:17 2026
--- gcc-16-20260201/libatomic/ChangeLog	Sun Feb  1 22:32:15 2026
***************
*** 1,3 ****
--- 1,10 ----
+ 2026-01-30  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	* Makefile.am (all-local, install-asneeded): Only create
+ 	libatomic_asneeded.so script if libatomic.so exist, only
+ 	create libatomic_asneeded.a symlink if libatomic.a exist.
+ 	* Makefile.in: Regenerate.
+ 
  2026-01-19  Jakub Jelinek  <jakub@redhat.com>
  
  	PR libgcc/123650
diff -Nrcpad gcc-16-20260125/libatomic/Makefile.am gcc-16-20260201/libatomic/Makefile.am
*** gcc-16-20260125/libatomic/Makefile.am	Sun Jan 25 22:32:17 2026
--- gcc-16-20260201/libatomic/Makefile.am	Sun Feb  1 22:32:15 2026
*************** all-local: libatomic.la
*** 185,196 ****
  	$(LIBTOOL) --mode=install $(INSTALL_DATA) libatomic.la $(gcc_objdir)$(MULTISUBDIR)/
  if LIBAT_BUILD_ASNEEDED_SOLINK
  	cd $(gcc_objdir)$(MULTISUBDIR) || exit 1; \
! 	(echo "/* GNU ld script"; \
  	 echo "   Add DT_NEEDED entry for -latomic only if needed.  */"; \
  	 echo "INPUT ( AS_NEEDED ( -latomic ) )" \
! 	) > libatomic_asneeded.so; \
! 	rm -f libatomic_asneeded.a; \
! 	$(LN_S) libatomic.a libatomic_asneeded.a
  endif
  	rm $(gcc_objdir)$(MULTISUBDIR)/libatomic.la
  
--- 185,196 ----
  	$(LIBTOOL) --mode=install $(INSTALL_DATA) libatomic.la $(gcc_objdir)$(MULTISUBDIR)/
  if LIBAT_BUILD_ASNEEDED_SOLINK
  	cd $(gcc_objdir)$(MULTISUBDIR) || exit 1; \
! 	if test -f libatomic.so; then (echo "/* GNU ld script"; \
  	 echo "   Add DT_NEEDED entry for -latomic only if needed.  */"; \
  	 echo "INPUT ( AS_NEEDED ( -latomic ) )" \
! 	) > libatomic_asneeded.so; fi; \
! 	if test -f libatomic.a; then rm -f libatomic_asneeded.a; \
! 	$(LN_S) libatomic.a libatomic_asneeded.a; fi
  endif
  	rm $(gcc_objdir)$(MULTISUBDIR)/libatomic.la
  
*************** install-data-am: install-asneeded
*** 200,211 ****
  install-asneeded: install-toolexeclibLTLIBRARIES
  	$(MKDIR_P) "$(DESTDIR)$(toolexeclibdir)" || exit 1; \
  	cd "$(DESTDIR)$(toolexeclibdir)" || exit 1; \
! 	(echo "/* GNU ld script"; \
  	 echo "   Add DT_NEEDED entry for -latomic only if needed.  */"; \
  	 echo "INPUT ( AS_NEEDED ( -latomic ) )" \
! 	) > libatomic_asneeded.so; \
! 	rm -f libatomic_asneeded.a; \
! 	$(LN_S) libatomic.a libatomic_asneeded.a
  endif
  
  # target overrides
--- 200,211 ----
  install-asneeded: install-toolexeclibLTLIBRARIES
  	$(MKDIR_P) "$(DESTDIR)$(toolexeclibdir)" || exit 1; \
  	cd "$(DESTDIR)$(toolexeclibdir)" || exit 1; \
! 	if test -f libatomic.so; then (echo "/* GNU ld script"; \
  	 echo "   Add DT_NEEDED entry for -latomic only if needed.  */"; \
  	 echo "INPUT ( AS_NEEDED ( -latomic ) )" \
! 	) > libatomic_asneeded.so; fi; \
! 	if test -f libatomic.a; then rm -f libatomic_asneeded.a; \
! 	$(LN_S) libatomic.a libatomic_asneeded.a; fi
  endif
  
  # target overrides
diff -Nrcpad gcc-16-20260125/libatomic/Makefile.in gcc-16-20260201/libatomic/Makefile.in
*** gcc-16-20260125/libatomic/Makefile.in	Sun Jan 25 22:32:21 2026
--- gcc-16-20260201/libatomic/Makefile.in	Sun Feb  1 22:32:20 2026
*************** all-multi: $(libatomic_la_LIBADD)
*** 932,943 ****
  all-local: libatomic.la
  	$(LIBTOOL) --mode=install $(INSTALL_DATA) libatomic.la $(gcc_objdir)$(MULTISUBDIR)/
  @LIBAT_BUILD_ASNEEDED_SOLINK_TRUE@	cd $(gcc_objdir)$(MULTISUBDIR) || exit 1; \
! @LIBAT_BUILD_ASNEEDED_SOLINK_TRUE@	(echo "/* GNU ld script"; \
  @LIBAT_BUILD_ASNEEDED_SOLINK_TRUE@	 echo "   Add DT_NEEDED entry for -latomic only if needed.  */"; \
  @LIBAT_BUILD_ASNEEDED_SOLINK_TRUE@	 echo "INPUT ( AS_NEEDED ( -latomic ) )" \
! @LIBAT_BUILD_ASNEEDED_SOLINK_TRUE@	) > libatomic_asneeded.so; \
! @LIBAT_BUILD_ASNEEDED_SOLINK_TRUE@	rm -f libatomic_asneeded.a; \
! @LIBAT_BUILD_ASNEEDED_SOLINK_TRUE@	$(LN_S) libatomic.a libatomic_asneeded.a
  	rm $(gcc_objdir)$(MULTISUBDIR)/libatomic.la
  
  @LIBAT_BUILD_ASNEEDED_SOLINK_TRUE@install-data-am: install-asneeded
--- 932,943 ----
  all-local: libatomic.la
  	$(LIBTOOL) --mode=install $(INSTALL_DATA) libatomic.la $(gcc_objdir)$(MULTISUBDIR)/
  @LIBAT_BUILD_ASNEEDED_SOLINK_TRUE@	cd $(gcc_objdir)$(MULTISUBDIR) || exit 1; \
! @LIBAT_BUILD_ASNEEDED_SOLINK_TRUE@	if test -f libatomic.so; then (echo "/* GNU ld script"; \
  @LIBAT_BUILD_ASNEEDED_SOLINK_TRUE@	 echo "   Add DT_NEEDED entry for -latomic only if needed.  */"; \
  @LIBAT_BUILD_ASNEEDED_SOLINK_TRUE@	 echo "INPUT ( AS_NEEDED ( -latomic ) )" \
! @LIBAT_BUILD_ASNEEDED_SOLINK_TRUE@	) > libatomic_asneeded.so; fi; \
! @LIBAT_BUILD_ASNEEDED_SOLINK_TRUE@	if test -f libatomic.a; then rm -f libatomic_asneeded.a; \
! @LIBAT_BUILD_ASNEEDED_SOLINK_TRUE@	$(LN_S) libatomic.a libatomic_asneeded.a; fi
  	rm $(gcc_objdir)$(MULTISUBDIR)/libatomic.la
  
  @LIBAT_BUILD_ASNEEDED_SOLINK_TRUE@install-data-am: install-asneeded
*************** all-local: libatomic.la
*** 945,956 ****
  @LIBAT_BUILD_ASNEEDED_SOLINK_TRUE@install-asneeded: install-toolexeclibLTLIBRARIES
  @LIBAT_BUILD_ASNEEDED_SOLINK_TRUE@	$(MKDIR_P) "$(DESTDIR)$(toolexeclibdir)" || exit 1; \
  @LIBAT_BUILD_ASNEEDED_SOLINK_TRUE@	cd "$(DESTDIR)$(toolexeclibdir)" || exit 1; \
! @LIBAT_BUILD_ASNEEDED_SOLINK_TRUE@	(echo "/* GNU ld script"; \
  @LIBAT_BUILD_ASNEEDED_SOLINK_TRUE@	 echo "   Add DT_NEEDED entry for -latomic only if needed.  */"; \
  @LIBAT_BUILD_ASNEEDED_SOLINK_TRUE@	 echo "INPUT ( AS_NEEDED ( -latomic ) )" \
! @LIBAT_BUILD_ASNEEDED_SOLINK_TRUE@	) > libatomic_asneeded.so; \
! @LIBAT_BUILD_ASNEEDED_SOLINK_TRUE@	rm -f libatomic_asneeded.a; \
! @LIBAT_BUILD_ASNEEDED_SOLINK_TRUE@	$(LN_S) libatomic.a libatomic_asneeded.a
  
  # target overrides
  -include $(tmake_file)
--- 945,956 ----
  @LIBAT_BUILD_ASNEEDED_SOLINK_TRUE@install-asneeded: install-toolexeclibLTLIBRARIES
  @LIBAT_BUILD_ASNEEDED_SOLINK_TRUE@	$(MKDIR_P) "$(DESTDIR)$(toolexeclibdir)" || exit 1; \
  @LIBAT_BUILD_ASNEEDED_SOLINK_TRUE@	cd "$(DESTDIR)$(toolexeclibdir)" || exit 1; \
! @LIBAT_BUILD_ASNEEDED_SOLINK_TRUE@	if test -f libatomic.so; then (echo "/* GNU ld script"; \
  @LIBAT_BUILD_ASNEEDED_SOLINK_TRUE@	 echo "   Add DT_NEEDED entry for -latomic only if needed.  */"; \
  @LIBAT_BUILD_ASNEEDED_SOLINK_TRUE@	 echo "INPUT ( AS_NEEDED ( -latomic ) )" \
! @LIBAT_BUILD_ASNEEDED_SOLINK_TRUE@	) > libatomic_asneeded.so; fi; \
! @LIBAT_BUILD_ASNEEDED_SOLINK_TRUE@	if test -f libatomic.a; then rm -f libatomic_asneeded.a; \
! @LIBAT_BUILD_ASNEEDED_SOLINK_TRUE@	$(LN_S) libatomic.a libatomic_asneeded.a; fi
  
  # target overrides
  -include $(tmake_file)
diff -Nrcpad gcc-16-20260125/libcpp/ChangeLog gcc-16-20260201/libcpp/ChangeLog
*** gcc-16-20260125/libcpp/ChangeLog	Sun Jan 25 22:32:17 2026
--- gcc-16-20260201/libcpp/ChangeLog	Sun Feb  1 22:32:15 2026
***************
*** 1,3 ****
--- 1,11 ----
+ 2026-01-30  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR preprocessor/123273
+ 	* lex.cc (cpp_directive_only_process): Only go to done_comment
+ 	for '/' if star is true and esc is false.  When seeing '\\' with
+ 	esc set to true, clear esc as well as star instead of keeping esc
+ 	set.
+ 
  2026-01-15  Marek Polacek  <polacek@redhat.com>
  	    Jakub Jelinek  <jakub@redhat.com>
  
diff -Nrcpad gcc-16-20260125/libcpp/lex.cc gcc-16-20260201/libcpp/lex.cc
*** gcc-16-20260125/libcpp/lex.cc	Sun Jan 25 22:32:17 2026
--- gcc-16-20260201/libcpp/lex.cc	Sun Feb  1 22:32:15 2026
*************** cpp_directive_only_process (cpp_reader *
*** 5490,5496 ****
  		    switch (c)
  		      {
  		      case '\\':
! 			esc = true;
  			break;
  
  		      case '\r':
--- 5490,5502 ----
  		    switch (c)
  		      {
  		      case '\\':
! 			if (esc)
! 			  {
! 			    star = false;
! 			    esc = false;
! 			  }
! 			else
! 			  esc = true;
  			break;
  
  		      case '\r':
*************** cpp_directive_only_process (cpp_reader *
*** 5521,5527 ****
  			break;
  
  		      case '/':
! 			if (star)
  			  goto done_comment;
  			/* FALLTHROUGH  */
  
--- 5527,5533 ----
  			break;
  
  		      case '/':
! 			if (star && !esc)
  			  goto done_comment;
  			/* FALLTHROUGH  */
  
diff -Nrcpad gcc-16-20260125/libffi/ChangeLog gcc-16-20260201/libffi/ChangeLog
*** gcc-16-20260125/libffi/ChangeLog	Sun Jan 25 22:32:17 2026
--- gcc-16-20260201/libffi/ChangeLog	Sun Feb  1 22:32:15 2026
***************
*** 1,3 ****
--- 1,14 ----
+ 2026-01-29  Pietro Monteiro  <pietro@sociotechnical.xyz>
+ 
+ 	PR libffi/117635
+ 	* merge.sh: Delete .allow-ai-service and .gail-labels when
+ 	merging new upstream versions.
+ 
+ 2026-01-29  Pietro Monteiro  <pietro@sociotechnical.xyz>
+ 
+ 	PR libffi/117635
+ 	* LOCAL_PATCHES: Add missing patches.
+ 
  2025-12-29  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
  
  	* configure: Regenerate.
diff -Nrcpad gcc-16-20260125/libffi/LOCAL_PATCHES gcc-16-20260201/libffi/LOCAL_PATCHES
*** gcc-16-20260125/libffi/LOCAL_PATCHES	Sun Jan 25 22:32:17 2026
--- gcc-16-20260201/libffi/LOCAL_PATCHES	Sun Feb  1 22:32:15 2026
***************
*** 1,5 ****
--- 1,18 ----
  5be7b66998127286fada45e4f23bd8a2056d553e
  4824ed41ba7cd63e60fd9f8769a58b79935a90d1
  90205f67e465ae7dfcf733c2b2b177ca7ff68da0
+ 333efaea633971912f2208d37b7b62992759d400
  a91f844ef449d0dd1cf2e0e47b0ade0d8a6304e1
  3cc159bc01516e370e8f119db70e2fbd803f3f80
+ 902c755930326cb4405672aa3ea13c35c653cbff
+ e4703bd0e15b4ed6e5eae36604b28bd4ca4f8cee
+ 043550bceea7881163bba5d8a0486bb100a05809
+ 4beacf3cb8d128b3b9c8c2d3824693b895414428
+ 6a6d3817afa02bbcd2388c8e005da6faf88932f1
+ a0673ec5f9236dca6ada23f28343c591ccd575e4
+ 967d4171b2eb0557e86ba28996423353f0f1b141
+ 35b05a02de1e8aee7c754a20f50736977c71caca
+ 61aa380bad45fb070379f259f7abc5e5f50c9009
+ 9e1c71bab50d51a1a8ec1a75080ffde6ca3d854c
+ 9fb5348e3021021e82d75e4ca4e6f8d51a34c24f
+ a616b7e1db7319c587b9c65fe9548c59c67d1234
diff -Nrcpad gcc-16-20260125/libffi/merge.sh gcc-16-20260201/libffi/merge.sh
*** gcc-16-20260125/libffi/merge.sh	Sun Jan 25 22:32:17 2026
--- gcc-16-20260201/libffi/merge.sh	Sun Feb  1 22:32:15 2026
*************** echo Current upstream revision: $CUR_REV
*** 33,41 ****
  
  # Remove the unused files.
  pushd upstream
! rm -rf ChangeLog.old .appveyor* .ci .github .gitignore .travis* \
! 	config.guess config.sub libtool-ldflags m4 make_sunver.pl \
! 	msvc_build
  rm -rf .git autogen.sh
  cp -a . ..
  popd
--- 33,43 ----
  
  # Remove the unused files.
  pushd upstream
! 
! rm -rf ChangeLog.old .allow-ai-service .gail-labels .appveyor* .ci .github \
! 	.gitignore .travis* config.guess config.sub libtool-ldflags m4 \
! 	make_sunver.pl msvc_build
! 
  rm -rf .git autogen.sh
  cp -a . ..
  popd
diff -Nrcpad gcc-16-20260125/libga68/ChangeLog gcc-16-20260201/libga68/ChangeLog
*** gcc-16-20260125/libga68/ChangeLog	Sun Jan 25 22:32:17 2026
--- gcc-16-20260201/libga68/ChangeLog	Sun Feb  1 22:32:15 2026
***************
*** 1,3 ****
--- 1,16 ----
+ 2026-01-30  Pietro Monteiro  <pietro@sociotechnical.xyz>
+ 
+ 	* ga68-alloc.c (_libga68_realloc_internal): New function.
+ 	* ga68-posix.c (_libga68_posixperror): Adjust calls to _libga68_u32_to_u8.
+ 	(_libga68_posixfopen): Likewise.
+ 	(_libga68_posixcreat): Likewise.
+ 	(_libga68_posixgetenv): Likewise.
+ 	(_libga68_posixfputs): Likewise.
+ 	(_libga68_posixfconnect): Likewise.
+ 	* ga68-unistr.c (_libga68_u32_to_u8): Use internal allocator.
+ 	* ga68.h (_libga68_realloc_internal): New prototype.
+ 	(_libga68_u32_to_u8): Update prototype.
+ 
  2026-01-24  Jose E. Marchesi  <jemarch@gnu.org>
  
  	PR algol68/123733
diff -Nrcpad gcc-16-20260125/libga68/ga68-alloc.c gcc-16-20260201/libga68/ga68-alloc.c
*** gcc-16-20260125/libga68/ga68-alloc.c	Sun Jan 25 22:32:17 2026
--- gcc-16-20260201/libga68/ga68-alloc.c	Sun Feb  1 22:32:15 2026
*************** _libga68_malloc_internal (size_t size)
*** 42,47 ****
--- 42,56 ----
    return res;
  }
  
+ void *
+ _libga68_realloc_internal (void *ptr, size_t size)
+ {
+   void *res = (void *) realloc (ptr, size);
+   if (!res)
+     _libga68_abort ("Virtual memory exhausted\n");
+   return res;
+ }
+ 
  #if LIBGA68_WITH_GC
  #include <gc/gc.h>
  
diff -Nrcpad gcc-16-20260125/libga68/ga68-posix.c gcc-16-20260201/libga68/ga68-posix.c
*** gcc-16-20260125/libga68/ga68-posix.c	Sun Jan 25 22:32:17 2026
--- gcc-16-20260201/libga68/ga68-posix.c	Sun Feb  1 22:32:15 2026
*************** void
*** 57,69 ****
  _libga68_posixperror (uint32_t *s, size_t len, size_t stride)
  {
    size_t u8len;
!   uint8_t *u8str = _libga68_u32_to_u8 (s, len, stride, NULL, &u8len);
  
    const char *errstr = strerror (_libga68_errno);
    (void) write (2, u8str, u8len);
    (void) write (2, ": ", 2);
    (void) write (2, errstr, strlen (errstr));
    (void) write (2, "\n", 1);
  }
  
  uint32_t *
--- 57,70 ----
  _libga68_posixperror (uint32_t *s, size_t len, size_t stride)
  {
    size_t u8len;
!   char *u8str = _libga68_u32_to_u8 (s, len, stride, &u8len);
  
    const char *errstr = strerror (_libga68_errno);
    (void) write (2, u8str, u8len);
    (void) write (2, ": ", 2);
    (void) write (2, errstr, strlen (errstr));
    (void) write (2, "\n", 1);
+   _libga68_free_internal (u8str);
  }
  
  uint32_t *
*************** _libga68_posixfopen (const uint32_t *pat
*** 95,105 ****
    int fd;
    int openflags = 0;
    size_t u8len;
!   const uint8_t *u8pathname = _libga68_u32_to_u8 (pathname, len, stride, NULL,
! 						  &u8len);
!   char *filepath = (char *) _libga68_malloc_internal (u8len + 1);
!   memcpy (filepath, u8pathname, u8len);
!   filepath[u8len] = '\0';
  
    /* Default mode: try read-write initially.
       If that fails, then try read-only.
--- 96,102 ----
    int fd;
    int openflags = 0;
    size_t u8len;
!   char *filepath = _libga68_u32_to_u8 (pathname, len, stride, &u8len);
  
    /* Default mode: try read-write initially.
       If that fails, then try read-only.
*************** _libga68_posixcreat (uint32_t *pathname,
*** 141,151 ****
  		     uint32_t mode)
  {
    size_t u8len;
!   uint8_t *u8pathname = _libga68_u32_to_u8 (pathname, len, stride, NULL, &u8len);
!   u8pathname[u8len] = '\0';
  
!   int res = creat (u8pathname, mode);
    _libga68_errno = errno;
    return res;
  }
  
--- 138,148 ----
  		     uint32_t mode)
  {
    size_t u8len;
!   char *filepath = _libga68_u32_to_u8 (pathname, len, stride, &u8len);
  
!   int res = creat (filepath, mode);
    _libga68_errno = errno;
+   _libga68_free_internal (filepath);
    return res;
  }
  
*************** void
*** 189,202 ****
  _libga68_posixgetenv (uint32_t *s, size_t len, size_t stride,
  		      uint32_t **r, size_t *rlen)
  {
!   size_t varlen;
!   char *varname = _libga68_u32_to_u8 (s, len, stride, NULL, &varlen);
  
!   char *var = _libga68_malloc_internal (varlen + 1);
!   memcpy (var, varname, varlen);
!   var[varlen] = '\0';
!   char *val = getenv (var);
!   _libga68_free_internal (var);
  
    if (val == NULL)
      {
--- 186,196 ----
  _libga68_posixgetenv (uint32_t *s, size_t len, size_t stride,
  		      uint32_t **r, size_t *rlen)
  {
!   size_t u8len;
!   char *varname = _libga68_u32_to_u8 (s, len, stride, &u8len);
  
!   char *val = getenv (varname);
!   _libga68_free_internal (varname);
  
    if (val == NULL)
      {
*************** int
*** 222,231 ****
  _libga68_posixfputs (int fd, uint32_t *s, size_t len, size_t stride)
  {
    size_t u8len;
!   uint8_t *u8str = _libga68_u32_to_u8 (s, len, stride, NULL, &u8len);
  
    ssize_t ret = write (fd, u8str, u8len);
    _libga68_errno = errno;
    if (ret == -1)
      return 0;
    else
--- 216,226 ----
  _libga68_posixfputs (int fd, uint32_t *s, size_t len, size_t stride)
  {
    size_t u8len;
!   char *u8str = _libga68_u32_to_u8 (s, len, stride, &u8len);
  
    ssize_t ret = write (fd, u8str, u8len);
    _libga68_errno = errno;
+   _libga68_free_internal (u8str);
    if (ret == -1)
      return 0;
    else
*************** _libga68_posixfconnect (uint32_t *str, s
*** 371,377 ****
  			int port)
  {
    size_t u8len;
!   uint8_t *u8host = _libga68_u32_to_u8 (str, len, stride, NULL, &u8len);
  
    /* Create a stream socket.  */
    int fd = socket (AF_INET, SOCK_STREAM, 0);
--- 366,372 ----
  			int port)
  {
    size_t u8len;
!   char *host = _libga68_u32_to_u8 (str, len, stride, &u8len);
  
    /* Create a stream socket.  */
    int fd = socket (AF_INET, SOCK_STREAM, 0);
*************** _libga68_posixfconnect (uint32_t *str, s
*** 380,388 ****
      goto error;
  
    /* Lookup the specified host.  */
-   char *host = _libga68_malloc_internal (u8len + 1);
-   memcpy (host, u8host, u8len);
-   host[u8len] = '\0';
    struct hostent *server = gethostbyname (host);
    if (server == NULL)
      {
--- 375,380 ----
*************** _libga68_posixfconnect (uint32_t *str, s
*** 409,416 ****
  
   close_fd_and_error:
    close (fd);
-  error:
    _libga68_free_internal (host);
    return -1;
  }
  
--- 401,408 ----
  
   close_fd_and_error:
    close (fd);
    _libga68_free_internal (host);
+  error:
    return -1;
  }
  
diff -Nrcpad gcc-16-20260125/libga68/ga68-unistr.c gcc-16-20260201/libga68/ga68-unistr.c
*** gcc-16-20260125/libga68/ga68-unistr.c	Sun Jan 25 22:32:17 2026
--- gcc-16-20260201/libga68/ga68-unistr.c	Sun Feb  1 22:32:15 2026
*************** _libga68_u8_uctomb (uint8_t *s, uint32_t
*** 305,338 ****
    return -2;
  }
  
! /* Convert UCS-4 to UTF-8  */
  
! uint8_t *
! _libga68_u32_to_u8 (const uint32_t *s, size_t n, size_t stride,
! 		    uint8_t *resultbuf, size_t *lengthp)
  {
    const uint32_t *s_end;
    /* Output string accumulator.  */
!   uint8_t *result;
!   size_t allocated;
!   size_t length;
  
    stride = stride / sizeof (uint32_t);
    s_end = s + (n * stride);
    
-   if (resultbuf != NULL)
-     {
-       result = resultbuf;
-       allocated = *lengthp;
-     }
-   else
-     {
-       result = NULL;
-       allocated = 0;
-     }
-   length = 0;
    /* Invariants:
!      result is either == resultbuf or == NULL or malloc-allocated.
       If length > 0, then result != NULL.  */
  
    while (s < s_end)
--- 305,330 ----
    return -2;
  }
  
! /* Convert S of size N with stride STRIDE UCS-4 to UTF-8.
!    Returns a pointer to the converted string with a traiiling '\0'.
!    The string length, not counting the trailling '\0', is returned on LENGTHP.
!    Returns NULL on error.
!    Callers *must* call _libga68_free_internal on a non-null result.  */
  
! char *
! _libga68_u32_to_u8 (const uint32_t *s, size_t n, size_t stride, size_t *lengthp)
  {
    const uint32_t *s_end;
    /* Output string accumulator.  */
!   uint8_t *result = NULL;
!   size_t allocated = 0;
!   size_t length = 0;
  
    stride = stride / sizeof (uint32_t);
    s_end = s + (n * stride);
    
    /* Invariants:
!      result is either == NULL or allocated by the internal malloc.
       If length > 0, then result != NULL.  */
  
    while (s < s_end)
*************** _libga68_u32_to_u8 (const uint32_t *s, s
*** 350,357 ****
        count = _libga68_u8_uctomb (result + length, uc, allocated - length);
        if (count == -1)
          {
!           if (!(result == resultbuf || result == NULL))
!             free (result);
            errno = EILSEQ;
            return NULL;
          }
--- 342,349 ----
        count = _libga68_u8_uctomb (result + length, uc, allocated - length);
        if (count == -1)
          {
! 	  if (result != NULL)
! 	    _libga68_free_internal (result);
            errno = EILSEQ;
            return NULL;
          }
*************** _libga68_u32_to_u8 (const uint32_t *s, s
*** 362,376 ****
            allocated = (allocated > 0 ? 2 * allocated : 12);
            if (length + 6 > allocated)
              allocated = length + 6;
!           if (result == resultbuf || result == NULL)
! 	    memory = (uint8_t *) _libga68_malloc_leaf (allocated * sizeof (uint8_t));
            else
  	    memory =
! 	      (uint8_t *) _libga68_realloc (result, allocated * sizeof (uint8_t));
  
-           if (result == resultbuf && length > 0)
-             memcpy ((char *) memory, (char *) result,
-                     length * sizeof (uint8_t));
            result = memory;
            count = _libga68_u8_uctomb (result + length, uc, allocated - length);
            if (count < 0)
--- 354,365 ----
            allocated = (allocated > 0 ? 2 * allocated : 12);
            if (length + 6 > allocated)
              allocated = length + 6;
! 	  if (result == NULL)
! 	    memory = (uint8_t *) _libga68_malloc_internal (allocated * sizeof (uint8_t));
            else
  	    memory =
! 	      (uint8_t *) _libga68_realloc_internal (result, allocated * sizeof (uint8_t));
  
            result = memory;
            count = _libga68_u8_uctomb (result + length, uc, allocated - length);
            if (count < 0)
*************** _libga68_u32_to_u8 (const uint32_t *s, s
*** 384,409 ****
        if (result == NULL)
          {
            /* Return a non-NULL value.  NULL means error.  */
! 	  result = (uint8_t *) _libga68_malloc_leaf (1);
!           if (result == NULL)
!             {
!               errno = ENOMEM;
!               return NULL;
!             }
          }
      }
!   else if (result != resultbuf && length < allocated)
      {
!       /* Shrink the allocated memory if possible.  */
!       uint8_t *memory;
  
!       memory = (uint8_t *) _libga68_realloc_unchecked (result, length * sizeof (uint8_t));
!       if (memory != NULL)
!         result = memory;
      }
  
    *lengthp = length;
!   return result;
  }
  
  /* Used by ga68_u8_to_u32 below.  */
--- 373,398 ----
        if (result == NULL)
          {
            /* Return a non-NULL value.  NULL means error.  */
! 	  result = (uint8_t *) _libga68_malloc_internal (1);
          }
      }
!   else
      {
!       if (length + 1 != allocated)
! 	{
! 	  /* Resize the allocated memory to fit the string plus the trailling NULL.  */
! 	  uint8_t *memory;
  
! 	  memory =
! 	    (uint8_t *) _libga68_realloc_internal (result,
! 						   (length  +1) * sizeof (uint8_t));
! 	  result = memory;
! 	}
!       result[length] = 0x0;
      }
  
    *lengthp = length;
!   return (char *) result;
  }
  
  /* Used by ga68_u8_to_u32 below.  */
diff -Nrcpad gcc-16-20260125/libga68/ga68.h gcc-16-20260201/libga68/ga68.h
*** gcc-16-20260125/libga68/ga68.h	Sun Jan 25 22:32:17 2026
--- gcc-16-20260201/libga68/ga68.h	Sun Feb  1 22:32:15 2026
*************** void *_libga68_malloc (size_t size);
*** 73,78 ****
--- 73,79 ----
  void *_libga68_malloc_leaf (size_t size);
  void *_libga68_malloc_internal (size_t size) GA68_HIDDEN;
  void *_libga68_realloc (void *ptr, size_t size) GA68_HIDDEN;
+ void *_libga68_realloc_internal (void *ptr, size_t size) GA68_HIDDEN;
  void *_libga68_realloc_unchecked (void *ptr, size_t size) GA68_HIDDEN;
  void _libga68_free_internal (void *ptr) GA68_HIDDEN;
  
*************** int _libga68_u32_cmp2 (const uint32_t *s
*** 117,124 ****
  		       const uint32_t *s2, size_t n2, size_t stride2);
  int _libga68_u8_uctomb (uint8_t *s, uint32_t uc, ptrdiff_t n) GA68_HIDDEN;
  int _libga68_u8_mbtouc (uint32_t *puc, const uint8_t *s, size_t n) GA68_HIDDEN;
! uint8_t *_libga68_u32_to_u8 (const uint32_t *s, size_t n, size_t stride,
! 			     uint8_t *resultbuf, size_t *lengthp) GA68_HIDDEN;
  uint32_t *_libga68_u8_to_u32 (const uint8_t *s, size_t n,
  			      uint32_t *resultbuf, size_t *lengthp);
  
--- 118,125 ----
  		       const uint32_t *s2, size_t n2, size_t stride2);
  int _libga68_u8_uctomb (uint8_t *s, uint32_t uc, ptrdiff_t n) GA68_HIDDEN;
  int _libga68_u8_mbtouc (uint32_t *puc, const uint8_t *s, size_t n) GA68_HIDDEN;
! char *_libga68_u32_to_u8 (const uint32_t *s, size_t n, size_t stride,
! 			  size_t *lengthp) GA68_HIDDEN;
  uint32_t *_libga68_u8_to_u32 (const uint8_t *s, size_t n,
  			      uint32_t *resultbuf, size_t *lengthp);
  
diff -Nrcpad gcc-16-20260125/libitm/ChangeLog gcc-16-20260201/libitm/ChangeLog
*** gcc-16-20260125/libitm/ChangeLog	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libitm/ChangeLog	Sun Feb  1 22:32:17 2026
***************
*** 1,3 ****
--- 1,11 ----
+ 2026-01-31  Pietro Monteiro  <pietro@sociotechnical.xyz>
+ 
+ 	PR libitm/69018
+ 	* testsuite/lib/libitm.exp (libitm_target_compile): Add
+ 	lang_include_flags and `-B${blddir}/${lang_library_paths}' to
+ 	additional_flags.
+ 	* testsuite/libitm.c++/c++.exp: Set lang_library_paths and lang_include_flags.
+ 
  2026-01-01  Jakub Jelinek  <jakub@redhat.com>
  
  	* libitm.texi: Bump @copying's copyright year.
diff -Nrcpad gcc-16-20260125/libitm/testsuite/lib/libitm.exp gcc-16-20260201/libitm/testsuite/lib/libitm.exp
*** gcc-16-20260125/libitm/testsuite/lib/libitm.exp	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libitm/testsuite/lib/libitm.exp	Sun Feb  1 22:32:17 2026
***************
*** 9,16 ****
  # GNU General Public License for more details.
  #
  # You should have received a copy of the GNU General Public License
! # along with this program; if not, write to the Free Software
! # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  
  # Damn dejagnu for not having proper library search paths for load_lib.
  # We have to explicitly load everything that gcc-dg.exp wants to load.
--- 9,15 ----
  # GNU General Public License for more details.
  #
  # You should have received a copy of the GNU General Public License
! # along with this program; if not, see <http://www.gnu.org/licenses/>.
  
  # Damn dejagnu for not having proper library search paths for load_lib.
  # We have to explicitly load everything that gcc-dg.exp wants to load.
*************** proc libitm_target_compile { source dest
*** 193,206 ****
      global gluefile wrap_flags
      global ALWAYS_CFLAGS
      global GCC_UNDER_TEST
!     global lang_test_file
!     global lang_library_path
      global lang_link_flags
  
!     if { [info exists lang_test_file] } {
! 	if { $blddir != "" } {
  	    lappend options "ldflags=-L${blddir}/${lang_library_path}"
  	}
  	lappend options "ldflags=${lang_link_flags}"
      }
  
--- 192,215 ----
      global gluefile wrap_flags
      global ALWAYS_CFLAGS
      global GCC_UNDER_TEST
!     global lang_library_paths
      global lang_link_flags
+     global lang_include_flags
  
!     if { [info exists lang_include_flags] } {
! 	lappend options "additional_flags=${lang_include_flags}"
!     }
! 
!     if { [info exists lang_library_paths] } {
! 	foreach lang_library_path $lang_library_paths {
! 	    # targets that use lib[...].a%s in their specs need a -B option
! 	    # for uninstalled testing.
! 	    lappend options "additional_flags=-B${blddir}/${lang_library_path}"
  	    lappend options "ldflags=-L${blddir}/${lang_library_path}"
  	}
+     }
+ 
+     if { [info exists lang_link_flags] } {
  	lappend options "ldflags=${lang_link_flags}"
      }
  
*************** proc libitm_target_compile { source dest
*** 219,225 ****
  	set options [concat "$ALWAYS_CFLAGS" $options]
      }
  
!     set options [dg-additional-files-options $options $source $dest $type]
  
      set result [target_compile $source $dest $type $options]
  
--- 228,236 ----
  	set options [concat "$ALWAYS_CFLAGS" $options]
      }
  
!     if { $source != "" } {
!         set options [dg-additional-files-options $options $source $dest $type]
!     }
  
      set result [target_compile $source $dest $type $options]
  
diff -Nrcpad gcc-16-20260125/libitm/testsuite/libitm.c++/c++.exp gcc-16-20260201/libitm/testsuite/libitm.c++/c++.exp
*** gcc-16-20260125/libitm/testsuite/libitm.c++/c++.exp	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libitm/testsuite/libitm.c++/c++.exp	Sun Feb  1 22:32:17 2026
***************
*** 11,18 ****
  # GNU General Public License for more details.
  #
  # You should have received a copy of the GNU General Public License
! # along with this program; if not, write to the Free Software
! # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  
  load_lib libitm-dg.exp
  load_gcc_lib gcc-dg.exp
--- 11,17 ----
  # GNU General Public License for more details.
  #
  # You should have received a copy of the GNU General Public License
! # along with this program; if not, see <http://www.gnu.org/licenses/>.
  
  load_lib libitm-dg.exp
  load_gcc_lib gcc-dg.exp
*************** set blddir [lookfor_file [get_multilibs]
*** 33,80 ****
  
  
  if { $blddir != "" } {
!     # Look for a static libstdc++ first.
!     if [file exists "${blddir}/${lang_library_path}/libstdc++.a"] {
! 	set lang_test_file "${lang_library_path}/libstdc++.a"
! 	set lang_test_file_found 1
! 	# We may have a shared only build, so look for a shared libstdc++.
!     } elseif [file exists "${blddir}/${lang_library_path}/libstdc++.${shlib_ext}"] {
! 	set lang_test_file "${lang_library_path}/libstdc++.${shlib_ext}"
! 	set lang_test_file_found 1
!     } else {
! 	puts "No libstdc++ library found, will not execute c++ tests"
      }
! } elseif { [info exists GXX_UNDER_TEST] } {
!     set lang_test_file_found 1
!     # Needs to exist for libitm.exp.
!     set lang_test_file ""
  } else {
!     puts "GXX_UNDER_TEST not defined, will not execute c++ tests"
  }
  
! if { $lang_test_file_found } {
!     # Gather a list of all tests.
!     set tests [lsort [glob -nocomplain $srcdir/$subdir/*.C]]
  
!     set stdcxxadder ""
!     if { $blddir != "" } {
! 	set ld_library_path "$always_ld_library_path:${blddir}/${lang_library_path}"
! 	set stdcxxadder "-B ${blddir}/${lang_library_path}"
!     } else {
! 	set ld_library_path "$always_ld_library_path"
!     }
!     append ld_library_path [gcc-set-multilib-library-path $GCC_UNDER_TEST]
!     set_ld_library_path_env_vars
  
!     set flags_file "${blddir}/../libstdc++-v3/scripts/testsuite_flags"
!     if { [file exists $flags_file] } {
! 	set libstdcxx_includes [exec sh $flags_file --build-includes]
!     } else {
! 	set libstdcxx_includes ""
!     }
  
!     # Main loop.
!     dg-runtest $tests $stdcxxadder $libstdcxx_includes
  }
  
  # All done.
--- 32,73 ----
  
  
  if { $blddir != "" } {
!     if { ![file exists "${blddir}/${lang_library_path}/libstdc++.a"]
! 	 && ![file exists "${blddir}/${lang_library_path}/libstdc++.${shlib_ext}"] } {
! 	verbose -log "No libstdc++ library found, will not execute c++ tests"
! 	unset lang_library_path
! 	return
      }
!     lappend lang_library_paths ${lang_library_path}
! } elseif { ![info exists GXX_UNDER_TEST] } {
!     verbose -log "GXX_UNDER_TEST not defined, will not execute c++ tests"
!     return
! }
! 
! # Gather a list of all tests.
! set tests [lsort [glob -nocomplain $srcdir/$subdir/*.C]]
! 
! if { $blddir != "" } {
!     set ld_library_path "$always_ld_library_path:${blddir}/${lang_library_path}"
  } else {
!     set ld_library_path "$always_ld_library_path"
  }
  
! append ld_library_path [gcc-set-multilib-library-path $GCC_UNDER_TEST]
! set_ld_library_path_env_vars
  
! set flags_file "${blddir}/../libstdc++-v3/scripts/testsuite_flags"
! if { [file exists $flags_file] } {
!     set lang_include_flags [exec sh $flags_file --build-includes]
! }
  
! # Main loop.
! dg-runtest $tests "" ""
  
! if { $blddir != "" } {
!     unset lang_include_flags
!     unset lang_library_path
!     unset lang_library_paths
  }
  
  # All done.
diff -Nrcpad gcc-16-20260125/libphobos/ChangeLog gcc-16-20260201/libphobos/ChangeLog
*** gcc-16-20260125/libphobos/ChangeLog	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/ChangeLog	Sun Feb  1 22:32:17 2026
***************
*** 1,3 ****
--- 1,33 ----
+ 2026-01-31  Iain Buclaw  <ibuclaw@gdcproject.org>
+ 
+ 	* libdruntime/MERGE: Merge upstream druntime e1f6680f50.
+ 	* libdruntime/Makefile.am (DRUNTIME_DSOURCES): Add
+ 	core/internal/cast_.d.  Remove rt/aaA.d, rt/adi.d, rt/cast_.d.
+ 	(DRUNTIME_DSOURCES_POSIX): Add core/sys/posix/endian.d.
+ 	* libdruntime/Makefile.in: Regenerate.
+ 	* src/MERGE: Merge upstream phobos f87979028.
+ 	* src/Makefile.am (PHOBOS_DSOURCES): Add std/internal/entropy.d.
+ 	* src/Makefile.in: Regenerate.
+ 	* testsuite/libphobos.aa/test_aa.d: Adjust test.
+ 	* testsuite/libphobos.init_fini/custom_gc.d: Likewise.
+ 
+ 2026-01-30  Iain Buclaw  <ibuclaw@gdcproject.org>
+ 
+ 	* libdruntime/MERGE: Merge upstream druntime 1017635a96.
+ 	* libdruntime/Makefile.am (DRUNTIME_DSOURCES_LINUX): Add
+ 	core/sys/linux/sys/syscall.d, core/sys/linux/syscall.d.
+ 	* libdruntime/Makefile.in: Regenerate.
+ 	* src/MERGE: Merge upstream phobos 5a142da0a.
+ 	* src/Makefile.am (PHOBOS_DSOURCES): Remove
+ 	std/internal/windows/bcrypt.d.
+ 	* src/Makefile.in: Regenerate.
+ 
+ 2026-01-26  Iain Buclaw  <ibuclaw@gdcproject.org>
+ 
+ 	PR d/122800
+ 	* configure: Regenerate.
+ 	* configure.ac (libtool_VERSION): Update to 7:0:0.
+ 
  2025-12-29  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
  
  	* configure: Regenerate.
diff -Nrcpad gcc-16-20260125/libphobos/configure gcc-16-20260201/libphobos/configure
*** gcc-16-20260125/libphobos/configure	Sun Jan 25 22:32:22 2026
--- gcc-16-20260201/libphobos/configure	Sun Feb  1 22:32:20 2026
*************** SPEC_PHOBOS_DEPS="$LIBS"
*** 16175,16181 ****
  
  
  # Libdruntime / phobos soname version
! libtool_VERSION=6:0:0
  
  
  # Set default flags (after DRUNTIME_WERROR!)
--- 16175,16181 ----
  
  
  # Libdruntime / phobos soname version
! libtool_VERSION=7:0:0
  
  
  # Set default flags (after DRUNTIME_WERROR!)
diff -Nrcpad gcc-16-20260125/libphobos/configure.ac gcc-16-20260201/libphobos/configure.ac
*** gcc-16-20260125/libphobos/configure.ac	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/configure.ac	Sun Feb  1 22:32:17 2026
*************** SPEC_PHOBOS_DEPS="$LIBS"
*** 256,262 ****
  AC_SUBST(SPEC_PHOBOS_DEPS)
  
  # Libdruntime / phobos soname version
! libtool_VERSION=6:0:0
  AC_SUBST(libtool_VERSION)
  
  # Set default flags (after DRUNTIME_WERROR!)
--- 256,262 ----
  AC_SUBST(SPEC_PHOBOS_DEPS)
  
  # Libdruntime / phobos soname version
! libtool_VERSION=7:0:0
  AC_SUBST(libtool_VERSION)
  
  # Set default flags (after DRUNTIME_WERROR!)
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/MERGE gcc-16-20260201/libphobos/libdruntime/MERGE
*** gcc-16-20260125/libphobos/libdruntime/MERGE	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/MERGE	Sun Feb  1 22:32:17 2026
***************
*** 1,4 ****
! 09ed02ce56ea5bf3e59f21ee0390cd85eb8bfaa7
  
  The first line of this file holds the git revision number of the last
  merge done from the dlang/dmd repository.
--- 1,4 ----
! e1f6680f50d147846316c2fa3363461a2aa7ac1d
  
  The first line of this file holds the git revision number of the last
  merge done from the dlang/dmd repository.
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/Makefile.am gcc-16-20260201/libphobos/libdruntime/Makefile.am
*** gcc-16-20260125/libphobos/libdruntime/Makefile.am	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/Makefile.am	Sun Feb  1 22:32:17 2026
*************** DRUNTIME_DSOURCES = core/atomic.d core/a
*** 184,196 ****
  	core/internal/array/construction.d core/internal/array/duplication.d \
  	core/internal/array/equality.d core/internal/array/operations.d \
  	core/internal/array/utils.d core/internal/atomic.d \
! 	core/internal/attributes.d core/internal/container/array.d \
! 	core/internal/container/common.d core/internal/container/hashtab.d \
! 	core/internal/container/treap.d core/internal/convert.d \
! 	core/internal/dassert.d core/internal/destruction.d \
! 	core/internal/entrypoint.d core/internal/gc/bits.d \
! 	core/internal/gc/blkcache.d core/internal/gc/blockmeta.d \
! 	core/internal/gc/impl/conservative/gc.d \
  	core/internal/gc/impl/manual/gc.d core/internal/gc/impl/proto/gc.d \
  	core/internal/gc/os.d core/internal/gc/pooltable.d \
  	core/internal/gc/proxy.d core/internal/hash.d core/internal/lifetime.d \
--- 184,196 ----
  	core/internal/array/construction.d core/internal/array/duplication.d \
  	core/internal/array/equality.d core/internal/array/operations.d \
  	core/internal/array/utils.d core/internal/atomic.d \
! 	core/internal/attributes.d core/internal/cast_.d \
! 	core/internal/container/array.d core/internal/container/common.d \
! 	core/internal/container/hashtab.d core/internal/container/treap.d \
! 	core/internal/convert.d core/internal/dassert.d \
! 	core/internal/destruction.d core/internal/entrypoint.d \
! 	core/internal/gc/bits.d core/internal/gc/blkcache.d \
! 	core/internal/gc/blockmeta.d core/internal/gc/impl/conservative/gc.d \
  	core/internal/gc/impl/manual/gc.d core/internal/gc/impl/proto/gc.d \
  	core/internal/gc/os.d core/internal/gc/pooltable.d \
  	core/internal/gc/proxy.d core/internal/hash.d core/internal/lifetime.d \
*************** DRUNTIME_DSOURCES = core/atomic.d core/a
*** 221,231 ****
  	gcc/sections/macho.d gcc/sections/package.d gcc/sections/pecoff.d \
  	gcc/simd.d gcc/unwind/arm.d gcc/unwind/arm_common.d gcc/unwind/c6x.d \
  	gcc/unwind/generic.d gcc/unwind/package.d gcc/unwind/pe.d object.d \
! 	rt/aApply.d rt/aApplyR.d rt/aaA.d rt/adi.d rt/arraycat.d rt/cast_.d \
! 	rt/config.d rt/critical_.d rt/deh.d rt/dmain2.d rt/ehalloc.d \
! 	rt/invariant_.d rt/lifetime.d rt/memory.d rt/minfo.d rt/monitor_.d \
! 	rt/profilegc.d rt/sections.d rt/tlsgc.d rt/util/typeinfo.d \
! 	rt/util/utility.d
  
  DRUNTIME_DSOURCES_STDCXX = core/stdcpp/allocator.d core/stdcpp/array.d \
  	core/stdcpp/exception.d core/stdcpp/memory.d core/stdcpp/new_.d \
--- 221,230 ----
  	gcc/sections/macho.d gcc/sections/package.d gcc/sections/pecoff.d \
  	gcc/simd.d gcc/unwind/arm.d gcc/unwind/arm_common.d gcc/unwind/c6x.d \
  	gcc/unwind/generic.d gcc/unwind/package.d gcc/unwind/pe.d object.d \
! 	rt/aApply.d rt/aApplyR.d rt/arraycat.d rt/config.d rt/critical_.d \
! 	rt/deh.d rt/dmain2.d rt/ehalloc.d rt/invariant_.d rt/lifetime.d \
! 	rt/memory.d rt/minfo.d rt/monitor_.d rt/profilegc.d rt/sections.d \
! 	rt/tlsgc.d rt/util/typeinfo.d rt/util/utility.d
  
  DRUNTIME_DSOURCES_STDCXX = core/stdcpp/allocator.d core/stdcpp/array.d \
  	core/stdcpp/exception.d core/stdcpp/memory.d core/stdcpp/new_.d \
*************** DRUNTIME_DSOURCES_LINUX = core/sys/linux
*** 297,304 ****
  	core/sys/linux/sys/mman.d core/sys/linux/sys/mount.d \
  	core/sys/linux/sys/prctl.d core/sys/linux/sys/procfs.d \
  	core/sys/linux/sys/signalfd.d core/sys/linux/sys/socket.d \
! 	core/sys/linux/sys/sysinfo.d core/sys/linux/sys/time.d \
! 	core/sys/linux/sys/xattr.d core/sys/linux/termios.d \
  	core/sys/linux/time.d core/sys/linux/timerfd.d core/sys/linux/tipc.d \
  	core/sys/linux/uinput.d core/sys/linux/unistd.d
  
--- 296,304 ----
  	core/sys/linux/sys/mman.d core/sys/linux/sys/mount.d \
  	core/sys/linux/sys/prctl.d core/sys/linux/sys/procfs.d \
  	core/sys/linux/sys/signalfd.d core/sys/linux/sys/socket.d \
! 	core/sys/linux/sys/syscall.d core/sys/linux/sys/sysinfo.d \
! 	core/sys/linux/sys/time.d core/sys/linux/sys/xattr.d \
! 	core/sys/linux/syscall.d core/sys/linux/termios.d \
  	core/sys/linux/time.d core/sys/linux/timerfd.d core/sys/linux/tipc.d \
  	core/sys/linux/uinput.d core/sys/linux/unistd.d
  
*************** DRUNTIME_DSOURCES_OPENBSD = core/sys/ope
*** 323,337 ****
  
  DRUNTIME_DSOURCES_POSIX = core/sys/posix/aio.d \
  	core/sys/posix/arpa/inet.d core/sys/posix/config.d \
! 	core/sys/posix/dirent.d core/sys/posix/dlfcn.d core/sys/posix/fcntl.d \
! 	core/sys/posix/grp.d core/sys/posix/iconv.d core/sys/posix/inttypes.d \
! 	core/sys/posix/libgen.d core/sys/posix/locale.d \
! 	core/sys/posix/mqueue.d core/sys/posix/net/if_.d \
! 	core/sys/posix/netdb.d core/sys/posix/netinet/in_.d \
! 	core/sys/posix/netinet/tcp.d core/sys/posix/poll.d \
! 	core/sys/posix/pthread.d core/sys/posix/pwd.d core/sys/posix/sched.d \
! 	core/sys/posix/semaphore.d core/sys/posix/setjmp.d \
! 	core/sys/posix/signal.d core/sys/posix/spawn.d \
  	core/sys/posix/stdc/time.d core/sys/posix/stdio.d \
  	core/sys/posix/stdlib.d core/sys/posix/string.d \
  	core/sys/posix/strings.d core/sys/posix/sys/filio.d \
--- 323,337 ----
  
  DRUNTIME_DSOURCES_POSIX = core/sys/posix/aio.d \
  	core/sys/posix/arpa/inet.d core/sys/posix/config.d \
! 	core/sys/posix/dirent.d core/sys/posix/dlfcn.d core/sys/posix/endian.d \
! 	core/sys/posix/fcntl.d core/sys/posix/grp.d core/sys/posix/iconv.d \
! 	core/sys/posix/inttypes.d core/sys/posix/libgen.d \
! 	core/sys/posix/locale.d core/sys/posix/mqueue.d \
! 	core/sys/posix/net/if_.d core/sys/posix/netdb.d \
! 	core/sys/posix/netinet/in_.d core/sys/posix/netinet/tcp.d \
! 	core/sys/posix/poll.d core/sys/posix/pthread.d core/sys/posix/pwd.d \
! 	core/sys/posix/sched.d core/sys/posix/semaphore.d \
! 	core/sys/posix/setjmp.d core/sys/posix/signal.d core/sys/posix/spawn.d \
  	core/sys/posix/stdc/time.d core/sys/posix/stdio.d \
  	core/sys/posix/stdlib.d core/sys/posix/string.d \
  	core/sys/posix/strings.d core/sys/posix/sys/filio.d \
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/Makefile.in gcc-16-20260201/libphobos/libdruntime/Makefile.in
*** gcc-16-20260125/libphobos/libdruntime/Makefile.in	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/Makefile.in	Sun Feb  1 22:32:17 2026
*************** am__objects_1 = core/atomic.lo core/attr
*** 205,211 ****
  	core/internal/array/equality.lo \
  	core/internal/array/operations.lo core/internal/array/utils.lo \
  	core/internal/atomic.lo core/internal/attributes.lo \
! 	core/internal/container/array.lo \
  	core/internal/container/common.lo \
  	core/internal/container/hashtab.lo \
  	core/internal/container/treap.lo core/internal/convert.lo \
--- 205,211 ----
  	core/internal/array/equality.lo \
  	core/internal/array/operations.lo core/internal/array/utils.lo \
  	core/internal/atomic.lo core/internal/attributes.lo \
! 	core/internal/cast_.lo core/internal/container/array.lo \
  	core/internal/container/common.lo \
  	core/internal/container/hashtab.lo \
  	core/internal/container/treap.lo core/internal/convert.lo \
*************** am__objects_1 = core/atomic.lo core/attr
*** 248,259 ****
  	gcc/sections/pecoff.lo gcc/simd.lo gcc/unwind/arm.lo \
  	gcc/unwind/arm_common.lo gcc/unwind/c6x.lo \
  	gcc/unwind/generic.lo gcc/unwind/package.lo gcc/unwind/pe.lo \
! 	object.lo rt/aApply.lo rt/aApplyR.lo rt/aaA.lo rt/adi.lo \
! 	rt/arraycat.lo rt/cast_.lo rt/config.lo rt/critical_.lo \
! 	rt/deh.lo rt/dmain2.lo rt/ehalloc.lo rt/invariant_.lo \
! 	rt/lifetime.lo rt/memory.lo rt/minfo.lo rt/monitor_.lo \
! 	rt/profilegc.lo rt/sections.lo rt/tlsgc.lo rt/util/typeinfo.lo \
! 	rt/util/utility.lo
  am__objects_2 = core/stdc/libgdruntime_la-errno_.lo \
  	etc/valgrind/libgdruntime_la-valgrind_.lo
  am__objects_3 = core/sys/elf/package.lo
--- 248,258 ----
  	gcc/sections/pecoff.lo gcc/simd.lo gcc/unwind/arm.lo \
  	gcc/unwind/arm_common.lo gcc/unwind/c6x.lo \
  	gcc/unwind/generic.lo gcc/unwind/package.lo gcc/unwind/pe.lo \
! 	object.lo rt/aApply.lo rt/aApplyR.lo rt/arraycat.lo \
! 	rt/config.lo rt/critical_.lo rt/deh.lo rt/dmain2.lo \
! 	rt/ehalloc.lo rt/invariant_.lo rt/lifetime.lo rt/memory.lo \
! 	rt/minfo.lo rt/monitor_.lo rt/profilegc.lo rt/sections.lo \
! 	rt/tlsgc.lo rt/util/typeinfo.lo rt/util/utility.lo
  am__objects_2 = core/stdc/libgdruntime_la-errno_.lo \
  	etc/valgrind/libgdruntime_la-valgrind_.lo
  am__objects_3 = core/sys/elf/package.lo
*************** am__objects_4 = core/stdcpp/allocator.lo
*** 265,295 ****
  	core/stdcpp/vector.lo core/stdcpp/xutility.lo
  am__objects_5 = core/sys/posix/aio.lo core/sys/posix/arpa/inet.lo \
  	core/sys/posix/config.lo core/sys/posix/dirent.lo \
! 	core/sys/posix/dlfcn.lo core/sys/posix/fcntl.lo \
! 	core/sys/posix/grp.lo core/sys/posix/iconv.lo \
! 	core/sys/posix/inttypes.lo core/sys/posix/libgen.lo \
! 	core/sys/posix/locale.lo core/sys/posix/mqueue.lo \
! 	core/sys/posix/net/if_.lo core/sys/posix/netdb.lo \
! 	core/sys/posix/netinet/in_.lo core/sys/posix/netinet/tcp.lo \
! 	core/sys/posix/poll.lo core/sys/posix/pthread.lo \
! 	core/sys/posix/pwd.lo core/sys/posix/sched.lo \
! 	core/sys/posix/semaphore.lo core/sys/posix/setjmp.lo \
! 	core/sys/posix/signal.lo core/sys/posix/spawn.lo \
! 	core/sys/posix/stdc/time.lo core/sys/posix/stdio.lo \
! 	core/sys/posix/stdlib.lo core/sys/posix/string.lo \
! 	core/sys/posix/strings.lo core/sys/posix/sys/filio.lo \
! 	core/sys/posix/sys/ioccom.lo core/sys/posix/sys/ioctl.lo \
! 	core/sys/posix/sys/ipc.lo core/sys/posix/sys/mman.lo \
! 	core/sys/posix/sys/msg.lo core/sys/posix/sys/resource.lo \
! 	core/sys/posix/sys/select.lo core/sys/posix/sys/shm.lo \
! 	core/sys/posix/sys/socket.lo core/sys/posix/sys/stat.lo \
! 	core/sys/posix/sys/statvfs.lo core/sys/posix/sys/time.lo \
! 	core/sys/posix/sys/ttycom.lo core/sys/posix/sys/types.lo \
! 	core/sys/posix/sys/uio.lo core/sys/posix/sys/un.lo \
! 	core/sys/posix/sys/utsname.lo core/sys/posix/sys/wait.lo \
! 	core/sys/posix/syslog.lo core/sys/posix/termios.lo \
! 	core/sys/posix/time.lo core/sys/posix/ucontext.lo \
! 	core/sys/posix/unistd.lo core/sys/posix/utime.lo
  @DRUNTIME_OS_POSIX_TRUE@am__objects_6 = $(am__objects_5)
  am__objects_7 = core/sys/darwin/config.lo \
  	core/sys/darwin/crt_externs.lo core/sys/darwin/dlfcn.lo \
--- 264,295 ----
  	core/stdcpp/vector.lo core/stdcpp/xutility.lo
  am__objects_5 = core/sys/posix/aio.lo core/sys/posix/arpa/inet.lo \
  	core/sys/posix/config.lo core/sys/posix/dirent.lo \
! 	core/sys/posix/dlfcn.lo core/sys/posix/endian.lo \
! 	core/sys/posix/fcntl.lo core/sys/posix/grp.lo \
! 	core/sys/posix/iconv.lo core/sys/posix/inttypes.lo \
! 	core/sys/posix/libgen.lo core/sys/posix/locale.lo \
! 	core/sys/posix/mqueue.lo core/sys/posix/net/if_.lo \
! 	core/sys/posix/netdb.lo core/sys/posix/netinet/in_.lo \
! 	core/sys/posix/netinet/tcp.lo core/sys/posix/poll.lo \
! 	core/sys/posix/pthread.lo core/sys/posix/pwd.lo \
! 	core/sys/posix/sched.lo core/sys/posix/semaphore.lo \
! 	core/sys/posix/setjmp.lo core/sys/posix/signal.lo \
! 	core/sys/posix/spawn.lo core/sys/posix/stdc/time.lo \
! 	core/sys/posix/stdio.lo core/sys/posix/stdlib.lo \
! 	core/sys/posix/string.lo core/sys/posix/strings.lo \
! 	core/sys/posix/sys/filio.lo core/sys/posix/sys/ioccom.lo \
! 	core/sys/posix/sys/ioctl.lo core/sys/posix/sys/ipc.lo \
! 	core/sys/posix/sys/mman.lo core/sys/posix/sys/msg.lo \
! 	core/sys/posix/sys/resource.lo core/sys/posix/sys/select.lo \
! 	core/sys/posix/sys/shm.lo core/sys/posix/sys/socket.lo \
! 	core/sys/posix/sys/stat.lo core/sys/posix/sys/statvfs.lo \
! 	core/sys/posix/sys/time.lo core/sys/posix/sys/ttycom.lo \
! 	core/sys/posix/sys/types.lo core/sys/posix/sys/uio.lo \
! 	core/sys/posix/sys/un.lo core/sys/posix/sys/utsname.lo \
! 	core/sys/posix/sys/wait.lo core/sys/posix/syslog.lo \
! 	core/sys/posix/termios.lo core/sys/posix/time.lo \
! 	core/sys/posix/ucontext.lo core/sys/posix/unistd.lo \
! 	core/sys/posix/utime.lo
  @DRUNTIME_OS_POSIX_TRUE@am__objects_6 = $(am__objects_5)
  am__objects_7 = core/sys/darwin/config.lo \
  	core/sys/darwin/crt_externs.lo core/sys/darwin/dlfcn.lo \
*************** am__objects_19 = core/sys/linux/config.l
*** 385,392 ****
  	core/sys/linux/sys/mman.lo core/sys/linux/sys/mount.lo \
  	core/sys/linux/sys/prctl.lo core/sys/linux/sys/procfs.lo \
  	core/sys/linux/sys/signalfd.lo core/sys/linux/sys/socket.lo \
! 	core/sys/linux/sys/sysinfo.lo core/sys/linux/sys/time.lo \
! 	core/sys/linux/sys/xattr.lo core/sys/linux/termios.lo \
  	core/sys/linux/time.lo core/sys/linux/timerfd.lo \
  	core/sys/linux/tipc.lo core/sys/linux/uinput.lo \
  	core/sys/linux/unistd.lo
--- 385,393 ----
  	core/sys/linux/sys/mman.lo core/sys/linux/sys/mount.lo \
  	core/sys/linux/sys/prctl.lo core/sys/linux/sys/procfs.lo \
  	core/sys/linux/sys/signalfd.lo core/sys/linux/sys/socket.lo \
! 	core/sys/linux/sys/syscall.lo core/sys/linux/sys/sysinfo.lo \
! 	core/sys/linux/sys/time.lo core/sys/linux/sys/xattr.lo \
! 	core/sys/linux/syscall.lo core/sys/linux/termios.lo \
  	core/sys/linux/time.lo core/sys/linux/timerfd.lo \
  	core/sys/linux/tipc.lo core/sys/linux/uinput.lo \
  	core/sys/linux/unistd.lo
*************** DRUNTIME_DSOURCES = core/atomic.d core/a
*** 869,881 ****
  	core/internal/array/construction.d core/internal/array/duplication.d \
  	core/internal/array/equality.d core/internal/array/operations.d \
  	core/internal/array/utils.d core/internal/atomic.d \
! 	core/internal/attributes.d core/internal/container/array.d \
! 	core/internal/container/common.d core/internal/container/hashtab.d \
! 	core/internal/container/treap.d core/internal/convert.d \
! 	core/internal/dassert.d core/internal/destruction.d \
! 	core/internal/entrypoint.d core/internal/gc/bits.d \
! 	core/internal/gc/blkcache.d core/internal/gc/blockmeta.d \
! 	core/internal/gc/impl/conservative/gc.d \
  	core/internal/gc/impl/manual/gc.d core/internal/gc/impl/proto/gc.d \
  	core/internal/gc/os.d core/internal/gc/pooltable.d \
  	core/internal/gc/proxy.d core/internal/hash.d core/internal/lifetime.d \
--- 870,882 ----
  	core/internal/array/construction.d core/internal/array/duplication.d \
  	core/internal/array/equality.d core/internal/array/operations.d \
  	core/internal/array/utils.d core/internal/atomic.d \
! 	core/internal/attributes.d core/internal/cast_.d \
! 	core/internal/container/array.d core/internal/container/common.d \
! 	core/internal/container/hashtab.d core/internal/container/treap.d \
! 	core/internal/convert.d core/internal/dassert.d \
! 	core/internal/destruction.d core/internal/entrypoint.d \
! 	core/internal/gc/bits.d core/internal/gc/blkcache.d \
! 	core/internal/gc/blockmeta.d core/internal/gc/impl/conservative/gc.d \
  	core/internal/gc/impl/manual/gc.d core/internal/gc/impl/proto/gc.d \
  	core/internal/gc/os.d core/internal/gc/pooltable.d \
  	core/internal/gc/proxy.d core/internal/hash.d core/internal/lifetime.d \
*************** DRUNTIME_DSOURCES = core/atomic.d core/a
*** 906,916 ****
  	gcc/sections/macho.d gcc/sections/package.d gcc/sections/pecoff.d \
  	gcc/simd.d gcc/unwind/arm.d gcc/unwind/arm_common.d gcc/unwind/c6x.d \
  	gcc/unwind/generic.d gcc/unwind/package.d gcc/unwind/pe.d object.d \
! 	rt/aApply.d rt/aApplyR.d rt/aaA.d rt/adi.d rt/arraycat.d rt/cast_.d \
! 	rt/config.d rt/critical_.d rt/deh.d rt/dmain2.d rt/ehalloc.d \
! 	rt/invariant_.d rt/lifetime.d rt/memory.d rt/minfo.d rt/monitor_.d \
! 	rt/profilegc.d rt/sections.d rt/tlsgc.d rt/util/typeinfo.d \
! 	rt/util/utility.d
  
  DRUNTIME_DSOURCES_STDCXX = core/stdcpp/allocator.d core/stdcpp/array.d \
  	core/stdcpp/exception.d core/stdcpp/memory.d core/stdcpp/new_.d \
--- 907,916 ----
  	gcc/sections/macho.d gcc/sections/package.d gcc/sections/pecoff.d \
  	gcc/simd.d gcc/unwind/arm.d gcc/unwind/arm_common.d gcc/unwind/c6x.d \
  	gcc/unwind/generic.d gcc/unwind/package.d gcc/unwind/pe.d object.d \
! 	rt/aApply.d rt/aApplyR.d rt/arraycat.d rt/config.d rt/critical_.d \
! 	rt/deh.d rt/dmain2.d rt/ehalloc.d rt/invariant_.d rt/lifetime.d \
! 	rt/memory.d rt/minfo.d rt/monitor_.d rt/profilegc.d rt/sections.d \
! 	rt/tlsgc.d rt/util/typeinfo.d rt/util/utility.d
  
  DRUNTIME_DSOURCES_STDCXX = core/stdcpp/allocator.d core/stdcpp/array.d \
  	core/stdcpp/exception.d core/stdcpp/memory.d core/stdcpp/new_.d \
*************** DRUNTIME_DSOURCES_LINUX = core/sys/linux
*** 981,988 ****
  	core/sys/linux/sys/mman.d core/sys/linux/sys/mount.d \
  	core/sys/linux/sys/prctl.d core/sys/linux/sys/procfs.d \
  	core/sys/linux/sys/signalfd.d core/sys/linux/sys/socket.d \
! 	core/sys/linux/sys/sysinfo.d core/sys/linux/sys/time.d \
! 	core/sys/linux/sys/xattr.d core/sys/linux/termios.d \
  	core/sys/linux/time.d core/sys/linux/timerfd.d core/sys/linux/tipc.d \
  	core/sys/linux/uinput.d core/sys/linux/unistd.d
  
--- 981,989 ----
  	core/sys/linux/sys/mman.d core/sys/linux/sys/mount.d \
  	core/sys/linux/sys/prctl.d core/sys/linux/sys/procfs.d \
  	core/sys/linux/sys/signalfd.d core/sys/linux/sys/socket.d \
! 	core/sys/linux/sys/syscall.d core/sys/linux/sys/sysinfo.d \
! 	core/sys/linux/sys/time.d core/sys/linux/sys/xattr.d \
! 	core/sys/linux/syscall.d core/sys/linux/termios.d \
  	core/sys/linux/time.d core/sys/linux/timerfd.d core/sys/linux/tipc.d \
  	core/sys/linux/uinput.d core/sys/linux/unistd.d
  
*************** DRUNTIME_DSOURCES_OPENBSD = core/sys/ope
*** 1007,1021 ****
  
  DRUNTIME_DSOURCES_POSIX = core/sys/posix/aio.d \
  	core/sys/posix/arpa/inet.d core/sys/posix/config.d \
! 	core/sys/posix/dirent.d core/sys/posix/dlfcn.d core/sys/posix/fcntl.d \
! 	core/sys/posix/grp.d core/sys/posix/iconv.d core/sys/posix/inttypes.d \
! 	core/sys/posix/libgen.d core/sys/posix/locale.d \
! 	core/sys/posix/mqueue.d core/sys/posix/net/if_.d \
! 	core/sys/posix/netdb.d core/sys/posix/netinet/in_.d \
! 	core/sys/posix/netinet/tcp.d core/sys/posix/poll.d \
! 	core/sys/posix/pthread.d core/sys/posix/pwd.d core/sys/posix/sched.d \
! 	core/sys/posix/semaphore.d core/sys/posix/setjmp.d \
! 	core/sys/posix/signal.d core/sys/posix/spawn.d \
  	core/sys/posix/stdc/time.d core/sys/posix/stdio.d \
  	core/sys/posix/stdlib.d core/sys/posix/string.d \
  	core/sys/posix/strings.d core/sys/posix/sys/filio.d \
--- 1008,1022 ----
  
  DRUNTIME_DSOURCES_POSIX = core/sys/posix/aio.d \
  	core/sys/posix/arpa/inet.d core/sys/posix/config.d \
! 	core/sys/posix/dirent.d core/sys/posix/dlfcn.d core/sys/posix/endian.d \
! 	core/sys/posix/fcntl.d core/sys/posix/grp.d core/sys/posix/iconv.d \
! 	core/sys/posix/inttypes.d core/sys/posix/libgen.d \
! 	core/sys/posix/locale.d core/sys/posix/mqueue.d \
! 	core/sys/posix/net/if_.d core/sys/posix/netdb.d \
! 	core/sys/posix/netinet/in_.d core/sys/posix/netinet/tcp.d \
! 	core/sys/posix/poll.d core/sys/posix/pthread.d core/sys/posix/pwd.d \
! 	core/sys/posix/sched.d core/sys/posix/semaphore.d \
! 	core/sys/posix/setjmp.d core/sys/posix/signal.d core/sys/posix/spawn.d \
  	core/sys/posix/stdc/time.d core/sys/posix/stdio.d \
  	core/sys/posix/stdlib.d core/sys/posix/string.d \
  	core/sys/posix/strings.d core/sys/posix/sys/filio.d \
*************** core/internal/array/operations.lo:  \
*** 1255,1260 ****
--- 1256,1262 ----
  core/internal/array/utils.lo: core/internal/array/$(am__dirstamp)
  core/internal/atomic.lo: core/internal/$(am__dirstamp)
  core/internal/attributes.lo: core/internal/$(am__dirstamp)
+ core/internal/cast_.lo: core/internal/$(am__dirstamp)
  core/internal/container/$(am__dirstamp):
  	@$(MKDIR_P) core/internal/container
  	@: > core/internal/container/$(am__dirstamp)
*************** rt/$(am__dirstamp):
*** 1409,1418 ****
  	@: > rt/$(am__dirstamp)
  rt/aApply.lo: rt/$(am__dirstamp)
  rt/aApplyR.lo: rt/$(am__dirstamp)
- rt/aaA.lo: rt/$(am__dirstamp)
- rt/adi.lo: rt/$(am__dirstamp)
  rt/arraycat.lo: rt/$(am__dirstamp)
- rt/cast_.lo: rt/$(am__dirstamp)
  rt/config.lo: rt/$(am__dirstamp)
  rt/critical_.lo: rt/$(am__dirstamp)
  rt/deh.lo: rt/$(am__dirstamp)
--- 1411,1417 ----
*************** core/sys/posix/arpa/inet.lo: core/sys/po
*** 1464,1469 ****
--- 1463,1469 ----
  core/sys/posix/config.lo: core/sys/posix/$(am__dirstamp)
  core/sys/posix/dirent.lo: core/sys/posix/$(am__dirstamp)
  core/sys/posix/dlfcn.lo: core/sys/posix/$(am__dirstamp)
+ core/sys/posix/endian.lo: core/sys/posix/$(am__dirstamp)
  core/sys/posix/fcntl.lo: core/sys/posix/$(am__dirstamp)
  core/sys/posix/grp.lo: core/sys/posix/$(am__dirstamp)
  core/sys/posix/iconv.lo: core/sys/posix/$(am__dirstamp)
*************** core/sys/linux/sys/prctl.lo: core/sys/li
*** 1756,1764 ****
--- 1756,1766 ----
  core/sys/linux/sys/procfs.lo: core/sys/linux/sys/$(am__dirstamp)
  core/sys/linux/sys/signalfd.lo: core/sys/linux/sys/$(am__dirstamp)
  core/sys/linux/sys/socket.lo: core/sys/linux/sys/$(am__dirstamp)
+ core/sys/linux/sys/syscall.lo: core/sys/linux/sys/$(am__dirstamp)
  core/sys/linux/sys/sysinfo.lo: core/sys/linux/sys/$(am__dirstamp)
  core/sys/linux/sys/time.lo: core/sys/linux/sys/$(am__dirstamp)
  core/sys/linux/sys/xattr.lo: core/sys/linux/sys/$(am__dirstamp)
+ core/sys/linux/syscall.lo: core/sys/linux/$(am__dirstamp)
  core/sys/linux/termios.lo: core/sys/linux/$(am__dirstamp)
  core/sys/linux/time.lo: core/sys/linux/$(am__dirstamp)
  core/sys/linux/timerfd.lo: core/sys/linux/$(am__dirstamp)
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/core/atomic.d gcc-16-20260201/libphobos/libdruntime/core/atomic.d
*** gcc-16-20260125/libphobos/libdruntime/core/atomic.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/core/atomic.d	Sun Feb  1 22:32:17 2026
*************** void atomicStore(MemoryOrder ms = Memory
*** 154,160 ****
  {
      static assert (is (V : T), "Can't assign `newval` of type `shared " ~ V.stringof ~ "` to `shared " ~ T.stringof ~ "`.");
  
!     core.internal.atomic.atomicStore!ms(cast(T*)&val, cast(V)newval);
  }
  
  /**
--- 154,160 ----
  {
      static assert (is (V : T), "Can't assign `newval` of type `shared " ~ V.stringof ~ "` to `shared " ~ T.stringof ~ "`.");
  
!     core.internal.atomic.atomicStore!ms(cast(T*)&val, *cast(V*)&newval);
  }
  
  /**
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/core/checkedint.d gcc-16-20260201/libphobos/libdruntime/core/checkedint.d
*** gcc-16-20260125/libphobos/libdruntime/core/checkedint.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/core/checkedint.d	Sun Feb  1 22:32:17 2026
*************** unittest
*** 757,765 ****
   * Returns:
   *      the product
   */
! pragma(inline, true)
  uint mulu()(uint x, uint y, ref bool overflow)
  {
      immutable ulong r = ulong(x) * ulong(y);
      if (r >> 32)
          overflow = true;
--- 757,787 ----
   * Returns:
   *      the product
   */
! // pragma(inline, true)
  uint mulu()(uint x, uint y, ref bool overflow)
  {
+     version (D_InlineAsm_X86)         enum useAsm = true;
+     else version (D_InlineAsm_X86_64) enum useAsm = true;
+     else                              enum useAsm = false;
+ 
+     static if (useAsm)
+     {
+         if (!__ctfe)
+         {
+             uint r;
+             bool o;
+             asm pure nothrow @nogc @trusted
+             {
+                 mov EAX, x;
+                 mul y;        // EDX:EAX = EAX * y
+                 mov r, EAX;
+                 setc o;
+             }
+             overflow |= o;
+             return r;
+         }
+     }
+ 
      immutable ulong r = ulong(x) * ulong(y);
      if (r >> 32)
          overflow = true;
*************** unittest
*** 791,796 ****
--- 813,824 ----
  pragma(inline, true)
  ulong mulu()(ulong x, uint y, ref bool overflow)
  {
+     version (D_InlineAsm_X86_64)
+     {
+         if (!__ctfe)
+             return mulu(x, ulong(y), overflow);
+     }
+ 
      ulong r = x * y;
      if (x >> 32 &&
              r / x != y)
*************** ulong mulu()(ulong x, uint y, ref bool o
*** 799,807 ****
  }
  
  /// ditto
! pragma(inline, true)
  ulong mulu()(ulong x, ulong y, ref bool overflow)
  {
      immutable ulong r = x * y;
      if ((x | y) >> 32 &&
              x &&
--- 827,853 ----
  }
  
  /// ditto
! // pragma(inline, true)
  ulong mulu()(ulong x, ulong y, ref bool overflow)
  {
+     version (D_InlineAsm_X86_64)
+     {
+         if (!__ctfe)
+         {
+             ulong r;
+             bool o;
+             asm pure nothrow @nogc @trusted
+             {
+                 mov RAX, x;
+                 mul y;        // RDX:RAX = RAX * y
+                 mov r, RAX;
+                 setc o;
+             }
+             overflow |= o;
+             return r;
+         }
+     }
+ 
      immutable ulong r = x * y;
      if ((x | y) >> 32 &&
              x &&
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/core/gc/config.d gcc-16-20260201/libphobos/libdruntime/core/gc/config.d
*** gcc-16-20260125/libphobos/libdruntime/core/gc/config.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/core/gc/config.d	Sun Feb  1 22:32:17 2026
*************** import core.stdc.stdio : printf;
*** 12,17 ****
--- 12,19 ----
  
  __gshared Config config;
  
+ private __gshared bool _initialized;
+ 
  struct Config
  {
      bool disable;            // start disabled
*************** struct Config
*** 31,37 ****
  
      bool initialize()
      {
!         return initConfigOptions(this, "gcopt");
      }
  
      void help() @nogc nothrow
--- 33,41 ----
  
      bool initialize()
      {
!         if (!_initialized)
!             _initialized = initConfigOptions(this, "gcopt");
!         return _initialized;
      }
  
      void help() @nogc nothrow
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/core/gc/gcinterface.d gcc-16-20260201/libphobos/libdruntime/core/gc/gcinterface.d
*** gcc-16-20260125/libphobos/libdruntime/core/gc/gcinterface.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/core/gc/gcinterface.d	Sun Feb  1 22:32:17 2026
***************
*** 13,18 ****
--- 13,20 ----
   */
  module core.gc.gcinterface;
  
+ import core.thread.threadbase : ThreadBase;
+ 
  static import core.memory;
  alias BlkAttr = core.memory.GC.BlkAttr;
  alias BlkInfo = core.memory.GC.BlkInfo;
*************** interface GC
*** 270,273 ****
--- 272,303 ----
       * Returns: true if successful.
       */
      bool shrinkArrayUsed(void[] slice, size_t existingUsed, bool atomic = false) nothrow;
+ 
+     /**
+      * Prepare a thread for use with the GC after the GC is initialized. Note
+      * that you can register an initThread function to call before the GC is
+      * initialized, see core.gc.registry.
+      *
+      * This function is always called *from* the thread as it is being started,
+      * before any static initializers. The thread object parameter may not yet
+      * be registered as `ThreadBase.getThis()`, as this is called before that
+      * happens.
+      */
+     void initThread(ThreadBase thread) nothrow @nogc;
+ 
+     /**
+      * Clean up any GC related data from the thread before it exits. There is
+      * no equivalent of this function as a hook before the GC is initialized.
+      * That is, the thread init function called before the GC is initialized
+      * (from the registry hook) should assume this function may not be called
+      * on termination if the GC is never initialized.
+      *
+      * Most times, this is called from the thread that is the given thread
+      * reference, but it's possible the `thread` parameter is not the same as
+      * the current thread.
+      *
+      * There is no guarantee the thread is still registered as
+      * `ThreadBase.getThis()`.
+      */
+     void cleanupThread(ThreadBase thread) nothrow @nogc;
  }
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/core/gc/registry.d gcc-16-20260201/libphobos/libdruntime/core/gc/registry.d
*** gcc-16-20260125/libphobos/libdruntime/core/gc/registry.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/core/gc/registry.d	Sun Feb  1 22:32:17 2026
***************
*** 8,13 ****
--- 8,14 ----
  module core.gc.registry;
  
  import core.gc.gcinterface : GC;
+ import core.thread.threadbase : ThreadBase;
  
  /*@nogc nothrow:*/
  
*************** import core.gc.gcinterface : GC;
*** 22,48 ****
  alias GCFactory = GC function();
  
  /**
   * Register a GC factory under the given `name`.  This function must be called
   * from a C constructor before druntime is initialized.
   *
   * To use the registered GC, it's name must be specified gcopt runtime option,
   * e.g. by passing $(TT, --DRT-gcopt=gc:my_gc_name) as application argument.
   *
   * Params:
   *   name = name of the GC implementation; should be unique
   *   factory = function to instantiate the implementation
   * Note: The registry does not perform synchronization, as registration is
   *   assumed to be executed serially, as is the case for C constructors.
   * See_Also:
   *   $(LINK2 https://dlang.org/spec/garbage.html#gc_config, Configuring the Garbage Collector)
   */
! void registerGCFactory(string name, GCFactory factory) nothrow @nogc
  {
      import core.stdc.stdlib : realloc;
  
      auto ptr = cast(Entry*)realloc(entries.ptr, (entries.length + 1) * Entry.sizeof);
      entries = ptr[0 .. entries.length + 1];
!     entries[$ - 1] = Entry(name, factory);
  }
  
  /**
--- 23,70 ----
  alias GCFactory = GC function();
  
  /**
+  * A function that will initialize a thread before the GC has been initialized.
+  * Once the GC is initialized, the interface method GC.initThread for each new
+  * thread.
+  */
+ alias GCThreadInitFunction = void function(ThreadBase base) nothrow @nogc;
+ 
+ /**
   * Register a GC factory under the given `name`.  This function must be called
   * from a C constructor before druntime is initialized.
   *
   * To use the registered GC, it's name must be specified gcopt runtime option,
   * e.g. by passing $(TT, --DRT-gcopt=gc:my_gc_name) as application argument.
   *
+  * The thread init function will be called *only before* the GC has been
+  * initialized to the registered GC. It is called as the first step in starting
+  * the new thread before the thread is registered with the runtime as a running
+  * thread. This allows any specific thread data that is needed for running the
+  * GC to be registered with the thread object.
+  *
+  * After the GC is initialized, the GC interface function `initThread` is
+  * called instead. This function should expect the possibility that the
+  * reciprocal `cleanupThread` method may not be called if the GC is never
+  * initialized.
+  *
   * Params:
   *   name = name of the GC implementation; should be unique
   *   factory = function to instantiate the implementation
+  *   threadInit = function to call from a new thread *before* registration in
+  *       the list of running threads, to set up any GC-specific data.
   * Note: The registry does not perform synchronization, as registration is
   *   assumed to be executed serially, as is the case for C constructors.
   * See_Also:
   *   $(LINK2 https://dlang.org/spec/garbage.html#gc_config, Configuring the Garbage Collector)
   */
! void registerGCFactory(string name, GCFactory factory,
!         GCThreadInitFunction threadInit = null) nothrow @nogc
  {
      import core.stdc.stdlib : realloc;
  
      auto ptr = cast(Entry*)realloc(entries.ptr, (entries.length + 1) * Entry.sizeof);
      entries = ptr[0 .. entries.length + 1];
!     entries[$ - 1] = Entry(name, factory, threadInit);
  }
  
  /**
*************** GC createGCInstance(string name)
*** 70,75 ****
--- 92,113 ----
      return null;
  }
  
+ /**
+  * Get the thread init function used for the selected GC.
+  *
+  * Note, this must be called before `createGCInstance`. It is typically called by
+  * `rt_init`.
+  */
+ GCThreadInitFunction threadInit(string name) nothrow @nogc
+ {
+     foreach (entry; entries)
+     {
+         if (entry.name == name)
+             return entry.threadInit;
+     }
+     return null;
+ }
+ 
  // list of all registerd GCs
  const(Entry[]) registeredGCFactories(scope int dummy=0) nothrow @nogc
  {
*************** struct Entry
*** 82,87 ****
--- 120,126 ----
  {
      string name;
      GCFactory factory;
+     GCThreadInitFunction threadInit;
  }
  
  __gshared Entry[] entries;
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/core/int128.d gcc-16-20260201/libphobos/libdruntime/core/int128.d
*** gcc-16-20260125/libphobos/libdruntime/core/int128.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/core/int128.d	Sun Feb  1 22:32:17 2026
*************** else
*** 36,41 ****
--- 36,47 ----
      else             private enum Cent_alignment = (size_t.sizeof * 2);
  }
  
+ version (X86_64)
+ {
+     version (GNU) version = GNU_OR_LDC_X86_64;
+     version (LDC) version = GNU_OR_LDC_X86_64;
+ }
+ 
  /**
   * 128 bit integer type.
   * See_also: $(REF Int128, std,int128).
*************** Cent sar1(Cent c)
*** 189,198 ****
   */
  pure
  Cent shl(Cent c, uint n)
  {
-     if (n >= Ubits * 2)
-         return Zero;
- 
      if (n >= Ubits)
      {
          c.hi = c.lo << (n - Ubits);
--- 195,202 ----
   */
  pure
  Cent shl(Cent c, uint n)
+ in (n < Ubits * 2)
  {
      if (n >= Ubits)
      {
          c.hi = c.lo << (n - Ubits);
*************** Cent shl(Cent c, uint n)
*** 216,225 ****
   */
  pure
  Cent shr(Cent c, uint n)
  {
-     if (n >= Ubits * 2)
-         return Zero;
- 
      if (n >= Ubits)
      {
          c.lo = c.hi >> (n - Ubits);
--- 220,227 ----
   */
  pure
  Cent shr(Cent c, uint n)
+ in (n < Ubits * 2)
  {
      if (n >= Ubits)
      {
          c.lo = c.hi >> (n - Ubits);
*************** Cent shr(Cent c, uint n)
*** 243,260 ****
   */
  pure
  Cent sar(Cent c, uint n)
  {
      const signmask = -(c.hi >> (Ubits - 1));
      const signshift = (Ubits * 2) - n;
      c = shr(c, n);
  
!     // Sign extend all bits beyond the precision of Cent.
!     if (n >= Ubits * 2)
!     {
!         c.hi = signmask;
!         c.lo = signmask;
!     }
!     else if (signshift >= Ubits * 2)
      {
      }
      else if (signshift >= Ubits)
--- 245,257 ----
   */
  pure
  Cent sar(Cent c, uint n)
+ in (n < Ubits * 2)
  {
      const signmask = -(c.hi >> (Ubits - 1));
      const signshift = (Ubits * 2) - n;
      c = shr(c, n);
  
!     if (signshift == Ubits * 2)
      {
      }
      else if (signshift >= Ubits)
*************** pure
*** 317,322 ****
--- 314,321 ----
  Cent rol(Cent c, uint n)
  {
      n &= Ubits * 2 - 1;
+     if (n == 0)
+         return c;
      Cent l = shl(c, n);
      Cent r = shr(c, Ubits * 2 - n);
      return or(l, r);
*************** pure
*** 334,339 ****
--- 333,340 ----
  Cent ror(Cent c, uint n)
  {
      n &= Ubits * 2 - 1;
+     if (n == 0)
+         return c;
      Cent r = shr(c, n);
      Cent l = shl(c, Ubits * 2 - n);
      return or(r, l);
*************** Cent mul(Cent c1, Cent c2)
*** 458,463 ****
--- 459,513 ----
      return ret;
  }
  
+ /****************************
+  * Multiply 64-bit operands u1 * u2 in 128-bit precision.
+  * Params:
+  *      u1 = operand 1
+  *      u2 = operand 2
+  * Returns:
+  *      u1 * u2 in 128-bit precision
+  */
+ pure
+ Cent mul(ulong u1, ulong u2)
+ {
+     if (!__ctfe)
+     {
+         version (GNU_OR_LDC_X86_64)
+         {
+             Cent ret = void;
+             asm pure @trusted nothrow @nogc
+             {
+                 "mulq %3"
+                 : "=a"(ret.lo), "=d"(ret.hi)
+                 : "a"(u1), "r"(u2)
+                 : "cc";
+             }
+             return ret;
+         }
+         else version (D_InlineAsm_X86_64)
+         {
+             U lo = void;
+             U hi = void;
+             asm pure @trusted nothrow @nogc
+             {
+                 mov RAX, u1;
+                 mul u2;
+                 mov lo, RAX;
+                 mov hi, RDX;
+             }
+             return Cent(lo: lo, hi: hi);
+         }
+     }
+ 
+     return mul(Cent(lo: u1), Cent(lo: u2));
+ }
+ 
+ unittest
+ {
+     assert(mul(3, 42) == Cent(lo: 126));
+     assert(mul(1L << 60, 1 << 10) == Cent(hi: 1 << 6));
+ }
+ 
  
  /****************************
   * Unsigned divide c1 / c2.
*************** Cent udivmod(Cent c1, Cent c2, out Cent
*** 490,552 ****
      // Based on "Unsigned Doubleword Division" in Hacker's Delight
      import core.bitop;
  
-     // Divides a 128-bit dividend by a 64-bit divisor.
-     // The result must fit in 64 bits.
-     static U udivmod128_64(Cent c1, U c2, out U modulus)
-     {
-         // We work in base 2^^32
-         enum base = 1UL << 32;
-         enum divmask = (1UL << (Ubits / 2)) - 1;
-         enum divshift = Ubits / 2;
- 
-         // Check for overflow and divide by 0
-         if (c1.hi >= c2)
-         {
-             modulus = 0UL;
-             return ~0UL;
-         }
- 
-         // Computes [num1 num0] / den
-         static uint udiv96_64(U num1, uint num0, U den)
-         {
-             // Extract both digits of the denominator
-             const den1 = cast(uint)(den >> divshift);
-             const den0 = cast(uint)(den & divmask);
-             // Estimate ret as num1 / den1, and then correct it
-             U ret = num1 / den1;
-             const t2 = (num1 % den1) * base + num0;
-             const t1 = ret * den0;
-             if (t1 > t2)
-                 ret -= (t1 - t2 > den) ? 2 : 1;
-             return cast(uint)ret;
-         }
- 
-         // Determine the normalization factor. We multiply c2 by this, so that its leading
-         // digit is at least half base. In binary this means just shifting left by the number
-         // of leading zeros, so that there's a 1 in the MSB.
-         // We also shift number by the same amount. This cannot overflow because c1.hi < c2.
-         const shift = (Ubits - 1) - bsr(c2);
-         c2 <<= shift;
-         U num2 = c1.hi;
-         num2 <<= shift;
-         num2 |= (c1.lo >> (-shift & 63)) & (-cast(I)shift >> 63);
-         c1.lo <<= shift;
- 
-         // Extract the low digits of the numerator (after normalizing)
-         const num1 = cast(uint)(c1.lo >> divshift);
-         const num0 = cast(uint)(c1.lo & divmask);
- 
-         // Compute q1 = [num2 num1] / c2
-         const q1 = udiv96_64(num2, num1, c2);
-         // Compute the true (partial) remainder
-         const rem = num2 * base + num1 - q1 * c2;
-         // Compute q0 = [rem num0] / c2
-         const q0 = udiv96_64(rem, num0, c2);
- 
-         modulus = (rem * base + num0 - q0 * c2) >> shift;
-         return (cast(U)q1 << divshift) | q0;
-     }
- 
      // Special cases
      if (!tst(c2))
      {
--- 540,545 ----
*************** Cent udivmod(Cent c1, Cent c2, out Cent
*** 576,582 ****
          if (q1)
              c1.hi = c1.hi % c2.lo;
          Cent rem;
!         const q0 = udivmod128_64(c1, c2.lo, rem.lo);
          modulus = rem;
          const Cent ret = { lo:q0, hi:q1 };
          return ret;
--- 569,575 ----
          if (q1)
              c1.hi = c1.hi % c2.lo;
          Cent rem;
!         const q0 = udivmod(c1, c2.lo, rem.lo);
          modulus = rem;
          const Cent ret = { lo:q0, hi:q1 };
          return ret;
*************** Cent udivmod(Cent c1, Cent c2, out Cent
*** 597,603 ****
  
      // Get quotient from divide unsigned operation.
      U rem_ignored;
!     const Cent q1 = { lo:udivmod128_64(u1, v1, rem_ignored) };
  
      // Undo normalization and division of c1 by 2.
      Cent quotient = shr(shl(q1, shift), 63);
--- 590,596 ----
  
      // Get quotient from divide unsigned operation.
      U rem_ignored;
!     const Cent q1 = { lo:udivmod(u1, v1, rem_ignored) };
  
      // Undo normalization and division of c1 by 2.
      Cent quotient = shr(shl(q1, shift), 63);
*************** Cent udivmod(Cent c1, Cent c2, out Cent
*** 624,629 ****
--- 617,723 ----
      return quotient;
  }
  
+ /****************************
+  * Unsigned divide 128-bit c1 / 64-bit c2. The result must fit in 64 bits.
+  * The remainder after division is stored to modulus.
+  * Params:
+  *      c1 = dividend
+  *      c2 = divisor
+  *      modulus = set to c1 % c2
+  * Returns:
+  *      quotient c1 / c2
+  */
+ pure
+ U udivmod(Cent c1, U c2, out U modulus)
+ {
+     import core.bitop;
+ 
+     if (!__ctfe)
+     {
+         version (GNU_OR_LDC_X86_64)
+         {
+             U ret = void;
+             asm pure @trusted nothrow @nogc
+             {
+                 "divq %4"
+                 : "=a"(ret), "=d"(modulus)
+                 : "a"(c1.lo), "d"(c1.hi), "r"(c2)
+                 : "cc";
+             }
+             return ret;
+         }
+         else version (D_InlineAsm_X86_64)
+         {
+             const lo = c1.lo;
+             const hi = c1.hi;
+             U mod = void;
+             U ret = void;
+             asm pure @trusted nothrow @nogc
+             {
+                 mov RAX, lo;
+                 mov RDX, hi;
+                 div c2;
+                 mov mod, RDX; // DMD bug: cannot use modulus directly
+                 mov ret, RAX;
+             }
+             modulus = mod;
+             return ret;
+         }
+     }
+ 
+     // We work in base 2^^32
+     enum base = 1UL << 32;
+     enum divmask = (1UL << (Ubits / 2)) - 1;
+     enum divshift = Ubits / 2;
+ 
+     // Check for overflow and divide by 0
+     if (c1.hi >= c2)
+     {
+         modulus = 0UL;
+         return ~0UL;
+     }
+ 
+     // Computes [num1 num0] / den
+     static uint udiv96_64(U num1, uint num0, U den)
+     {
+         // Extract both digits of the denominator
+         const den1 = cast(uint)(den >> divshift);
+         const den0 = cast(uint)(den & divmask);
+         // Estimate ret as num1 / den1, and then correct it
+         U ret = num1 / den1;
+         const t2 = (num1 % den1) * base + num0;
+         const t1 = ret * den0;
+         if (t1 > t2)
+             ret -= (t1 - t2 > den) ? 2 : 1;
+         return cast(uint)ret;
+     }
+ 
+     // Determine the normalization factor. We multiply c2 by this, so that its leading
+     // digit is at least half base. In binary this means just shifting left by the number
+     // of leading zeros, so that there's a 1 in the MSB.
+     // We also shift number by the same amount. This cannot overflow because c1.hi < c2.
+     const shift = (Ubits - 1) - bsr(c2);
+     c2 <<= shift;
+     U num2 = c1.hi;
+     num2 <<= shift;
+     num2 |= (c1.lo >> (-shift & 63)) & (-cast(I)shift >> 63);
+     c1.lo <<= shift;
+ 
+     // Extract the low digits of the numerator (after normalizing)
+     const num1 = cast(uint)(c1.lo >> divshift);
+     const num0 = cast(uint)(c1.lo & divmask);
+ 
+     // Compute q1 = [num2 num1] / c2
+     const q1 = udiv96_64(num2, num1, c2);
+     // Compute the true (partial) remainder
+     const rem = num2 * base + num1 - q1 * c2;
+     // Compute q0 = [rem num0] / c2
+     const q0 = udiv96_64(rem, num0, c2);
+ 
+     modulus = (rem * base + num0 - q0 * c2) >> shift;
+     return (cast(U)q1 << divshift) | q0;
+ }
+ 
  
  /****************************
   * Signed divide c1 / c2.
*************** unittest
*** 893,910 ****
      assert(shl(C10,0) == C10);
      assert(shl(C10,Ubits) == C10_0);
      assert(shl(C10,1) == C20);
-     assert(shl(C10,Ubits * 2) == C0);
      assert(shr(C10_0,0) == C10_0);
      assert(shr(C10_0,Ubits) == C10);
      assert(shr(C10_0,Ubits - 1) == C20);
      assert(shr(C10_0,Ubits + 1) == C5);
-     assert(shr(C10_0,Ubits * 2) == C0);
      assert(sar(C10_0,0) == C10_0);
      assert(sar(C10_0,Ubits) == C10);
      assert(sar(C10_0,Ubits - 1) == C20);
      assert(sar(C10_0,Ubits + 1) == C5);
-     assert(sar(C10_0,Ubits * 2) == C0);
-     assert(sar(Cm1,Ubits * 2) == Cm1);
  
      assert(shl1(C10) == C20);
      assert(shr1(C10_0) == C5_0);
--- 987,1000 ----
*************** unittest
*** 916,922 ****
      assert(udiv(C10,C2) == C5);
      assert(udivmod(C10,C2, modulus) ==  C5);   assert(modulus == C0);
      assert(udivmod(C10,C3, modulus) ==  C3);   assert(modulus == C1);
-     assert(udivmod(C10,C0, modulus) == Cm1);   assert(modulus == C0);
      assert(udivmod(C2,C90_30, modulus) == C0); assert(modulus == C2);
      assert(udiv(mul(C90_30, C2), C2) == C90_30);
      assert(udiv(mul(C90_30, C2), C90_30) == C2);
--- 1006,1011 ----
*************** unittest
*** 961,964 ****
--- 1050,1055 ----
      assert(rol(ror(C7_9, 5), 5) == C7_9);
      assert(rol(C7_9, 1) == rol1(C7_9));
      assert(ror(C7_9, 1) == ror1(C7_9));
+     assert(rol(C7_9, 0) == C7_9);
+     assert(ror(C7_9, 0) == C7_9);
  }
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/core/internal/array/appending.d gcc-16-20260201/libphobos/libdruntime/core/internal/array/appending.d
*** gcc-16-20260125/libphobos/libdruntime/core/internal/array/appending.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/core/internal/array/appending.d	Sun Feb  1 22:32:17 2026
***************
*** 9,16 ****
  */
  module core.internal.array.appending;
  
! /// See $(REF _d_arrayappendcTX, rt,lifetime,_d_arrayappendcTX)
! private extern (C) byte[] _d_arrayappendcTX(const TypeInfo ti, ref return scope byte[] px, size_t n) @trusted pure nothrow;
  
  private enum isCopyingNothrow(T) = __traits(compiles, (ref T rhs) nothrow { T lhs = rhs; });
  
--- 9,19 ----
  */
  module core.internal.array.appending;
  
! private extern (C)
! {
!     bool gc_expandArrayUsed(void[] slice, size_t newUsed, bool atomic) pure nothrow;
!     bool gc_shrinkArrayUsed(void[] slice, size_t existingUsed, bool atomic) pure nothrow;
! }
  
  private enum isCopyingNothrow(T) = __traits(compiles, (ref T rhs) nothrow { T lhs = rhs; });
  
*************** private enum isCopyingNothrow(T) = __tra
*** 25,46 ****
   * Bugs:
   *  This function template was ported from a much older runtime hook that bypassed safety,
   *  purity, and throwabilty checks. To prevent breaking existing code, this function template
!  *  is temporarily declared `@trusted pure` until the implementation can be brought up to modern D expectations.
   */
  ref Tarr _d_arrayappendcTX(Tarr : T[], T)(return ref scope Tarr px, size_t n) @trusted
  {
!     // needed for CTFE: https://github.com/dlang/druntime/pull/3870#issuecomment-1178800718
      version (DigitalMars) pragma(inline, false);
      version (D_TypeInfo)
      {
!         auto ti = typeid(Tarr);
  
!         // _d_arrayappendcTX takes the `px` as a ref byte[], but its length
!         // should still be the original length
!         auto pxx = (cast(byte*)px.ptr)[0 .. px.length];
!         ._d_arrayappendcTX(ti, pxx, n);
!         px = (cast(T*)pxx.ptr)[0 .. pxx.length];
  
          return px;
      }
      else
--- 28,110 ----
   * Bugs:
   *  This function template was ported from a much older runtime hook that bypassed safety,
   *  purity, and throwabilty checks. To prevent breaking existing code, this function template
!  *  is temporarily declared `@trusted` until the implementation can be brought up to modern D expectations.
   */
  ref Tarr _d_arrayappendcTX(Tarr : T[], T)(return ref scope Tarr px, size_t n) @trusted
  {
!     import core.internal.traits: Unqual;
! 
!     alias Unqual_T = Unqual!T;
!     alias Unqual_Tarr = Unqual_T[];
!     enum isshared = is(T == shared);
!     auto unqual_px = cast(Unqual_Tarr) px;
! 
!     // Ignoring additional attributes allows reusing the same generated code
!     px = cast(Tarr)_d_arrayappendcTX_(unqual_px, n, isshared);
!     return px;
! }
! 
! private ref Tarr _d_arrayappendcTX_(Tarr : T[], T)(return ref scope Tarr px, size_t n, bool isshared) @trusted
! {
      version (DigitalMars) pragma(inline, false);
      version (D_TypeInfo)
      {
!         // Short circuit if no data is being appended.
!         if (n == 0)
!             return px;
  
!         import core.stdc.string : memcpy, memset;
!         import core.internal.lifetime : __doPostblit;
!         import core.internal.array.utils: __arrayAlloc, newCapacity, __typeAttrs;
!         import core.internal.gc.blockmeta : PAGESIZE;
!         import core.exception: onOutOfMemoryError;
!         import core.memory: GC;
! 
!         alias BlkAttr = GC.BlkAttr;
! 
!         enum sizeelem = T.sizeof;
!         auto length = px.length;
!         auto newlength = length + n;
!         auto newsize = newlength * sizeelem;
!         auto size = length * sizeelem;
! 
!         if (!gc_expandArrayUsed(px, newsize, isshared))
!         {
!             // could not set the size, we must reallocate.
!             auto newcap = newCapacity(newlength, sizeelem);
!             auto attrs = __typeAttrs!T(cast(void*)px.ptr) | BlkAttr.APPENDABLE;
! 
!             T* ptr = cast(T*)GC.malloc(newcap, attrs, typeid(T));
!             if (ptr is null)
!             {
!                 onOutOfMemoryError();
!                 assert(0);
!             }
! 
!             if (newsize != newcap)
!             {
!                 // For small blocks that are always fully scanned, if we allocated more
!                 // capacity than was requested, we are responsible for zeroing that
!                 // memory.
!                 // TODO: should let the GC figure this out, as this property may
!                 // not always hold.
!                 if (!(attrs & BlkAttr.NO_SCAN) && newcap < PAGESIZE)
!                     memset(ptr + newlength, 0, newcap - newsize);
  
+                 gc_shrinkArrayUsed(ptr[0 .. newlength], newcap, isshared);
+             }
+ 
+             memcpy(ptr, px.ptr, size);
+ 
+             // do potsblit processing.
+             __doPostblit!T(ptr[0 .. length]);
+ 
+             px = ptr[0 .. newlength];
+             return px;
+         }
+ 
+         // we were able to expand in place, just update the length
+         px = px.ptr[0 .. newlength];
          return px;
      }
      else
*************** ref Tarr _d_arrayappendcTX(Tarr : T[], T
*** 50,58 ****
  version (D_ProfileGC)
  {
      /**
!      * TraceGC wrapper around $(REF _d_arrayappendT, core,internal,array,appending).
       */
!     ref Tarr _d_arrayappendcTXTrace(Tarr : T[], T)(return ref scope Tarr px, size_t n, string file = __FILE__, int line = __LINE__, string funcname = __FUNCTION__) @trusted
      {
          version (D_TypeInfo)
          {
--- 114,123 ----
  version (D_ProfileGC)
  {
      /**
!      * TraceGC wrapper around _d_arrayappendcTX.
       */
!     ref Tarr _d_arrayappendcTXTrace(Tarr : T[], T)(return ref scope Tarr px, size_t n,
!         string file = __FILE__, int line = __LINE__, string funcname = __FUNCTION__) @trusted
      {
          version (D_TypeInfo)
          {
*************** ref Tarr _d_arrayappendT(Tarr : T[], T)(
*** 72,110 ****
      version (DigitalMars) pragma(inline, false);
  
      import core.stdc.string : memcpy;
!     import core.internal.traits : hasElaborateCopyConstructor, Unqual;
  
-     enum hasPostblit = __traits(hasPostblit, T);
      auto length = x.length;
  
      _d_arrayappendcTX(x, y.length);
  
      // Only call `copyEmplace` if `T` has a copy ctor and no postblit.
!     static if (hasElaborateCopyConstructor!T && !hasPostblit)
      {
          import core.lifetime : copyEmplace;
  
!         foreach (i, ref elem; y)
!             copyEmplace(elem, x[length + i]);
      }
      else
      {
          if (y.length)
          {
              // blit all elements at once
!             auto xptr = cast(Unqual!T *)&x[length];
!             immutable size = T.sizeof;
! 
!             memcpy(xptr, cast(Unqual!T *)&y[0], y.length * size);
  
              // call postblits if they exist
!             static if (hasPostblit)
              {
!                 auto eptr = xptr + y.length;
!                 for (auto ptr = xptr; ptr < eptr; ptr++)
!                     ptr.__xpostblit();
!             }
!         }
      }
  
      return x;
--- 137,197 ----
      version (DigitalMars) pragma(inline, false);
  
      import core.stdc.string : memcpy;
!     import core.internal.traits : Unqual;
  
      auto length = x.length;
  
      _d_arrayappendcTX(x, y.length);
  
      // Only call `copyEmplace` if `T` has a copy ctor and no postblit.
!     static if (__traits(hasCopyConstructor, T))
      {
          import core.lifetime : copyEmplace;
  
!         size_t i;
!         try
!         {
!             for (i = 0; i < y.length; ++i)
!                 copyEmplace(y[i], x[length + i]);
!         }
!         catch (Exception o)
!         {
!             /* Destroy, in reverse order, what we've constructed so far
!             */
!             while (i--)
!             {
!                 auto elem = cast(Unqual!T*) &x[length + i];
!                 destroy(*elem);
!             }
! 
!             throw o;
!         }
      }
      else
      {
          if (y.length)
          {
              // blit all elements at once
!             memcpy(cast(void*)&x[length], cast(void*)&y[0], y.length * T.sizeof);
  
              // call postblits if they exist
!             static if (__traits(hasPostblit, T))
              {
!                 import core.internal.lifetime : __doPostblit;
!                 size_t i = 0;
!                 try __doPostblit(x[length .. $], i);
!                 catch (Exception o)
!                 {
!                     // Destroy, in reverse order, what we've constructed so far
!                     while (i--)
!                     {
!                         auto elem = cast(Unqual!T*) &x[length + i];
!                         destroy(*elem);
!                     }
! 
!                     throw o;
!                 }
!             }}
      }
  
      return x;
*************** version (D_ProfileGC)
*** 205,207 ****
--- 292,357 ----
      _d_arrayappendT(str, "c");
      assert(str == "abc");
  }
+ 
+ @safe nothrow unittest
+ {
+     static class FailedPostblitException : Exception { this() nothrow @safe { super(null); } }
+     static size_t inner_postblit_cnt = 0;
+     static size_t inner_dtor_cnt = 0;
+     static size_t outer_postblit_cnt = 0;
+     static size_t outer_dtor_cnt = 0;
+     static struct Inner
+     {
+         char id;
+ 
+         @safe:
+         this(this)
+         {
+             ++inner_postblit_cnt;
+             if (id == '2')
+                 throw new FailedPostblitException();
+         }
+ 
+         ~this() nothrow
+         {
+             ++inner_dtor_cnt;
+         }
+     }
+ 
+     static struct Outer
+     {
+         Inner inner1, inner2, inner3;
+ 
+         nothrow @safe:
+         this(char first, char second, char third)
+         {
+             inner1 = Inner(first);
+             inner2 = Inner(second);
+             inner3 = Inner(third);
+         }
+ 
+         this(this)
+         {
+             ++outer_postblit_cnt;
+         }
+ 
+         ~this()
+         {
+             ++outer_dtor_cnt;
+         }
+     }
+ 
+     Outer[3] arr = [Outer('1', '1', '1'), Outer('1', '2', '3'), Outer('3', '3', '3')];
+ 
+     try {
+         Outer[] arrApp;
+         arrApp ~= arr;
+     }
+     catch (FailedPostblitException) {}
+     catch (Exception) assert(false);
+ 
+     assert(inner_postblit_cnt == 5);
+     assert(inner_dtor_cnt == 4);
+     assert(outer_postblit_cnt == 1);
+     assert(outer_dtor_cnt == 1);
+ }
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/core/internal/array/capacity.d gcc-16-20260201/libphobos/libdruntime/core/internal/array/capacity.d
*** gcc-16-20260125/libphobos/libdruntime/core/internal/array/capacity.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/core/internal/array/capacity.d	Sun Feb  1 22:32:17 2026
***************
*** 9,72 ****
  */
  module core.internal.array.capacity;
  
! // HACK: `nothrow` and `pure` is faked.
! private extern (C) void[] _d_arraysetlengthT(const TypeInfo ti, size_t newlength, void[]* p) nothrow pure;
! private extern (C) void[] _d_arraysetlengthiT(const TypeInfo ti, size_t newlength, void[]* p) nothrow pure;
  
! /*
!  * This template is needed because there need to be a `_d_arraysetlengthTTrace!Tarr` instance for every
!  * `_d_arraysetlengthT!Tarr`. By wrapping both of these functions inside of this template we force the
!  * compiler to create a instance of both function for every type that is used.
!  */
  
! /// Implementation of `_d_arraysetlengthT` and `_d_arraysetlengthTTrace`
! template _d_arraysetlengthTImpl(Tarr : T[], T)
  {
!     private enum errorMessage = "Cannot resize arrays if compiling without support for runtime type information!";
  
!     /**
!      * Resize dynamic array
!      * Params:
!      *  arr = the array that will be resized, taken as a reference
!      *  newlength = new length of array
!      * Returns:
!      *  The new length of the array
!      * Bugs:
!      *   The safety level of this function is faked. It shows itself as `@trusted pure nothrow` to not break existing code.
!      */
!     size_t _d_arraysetlengthT(return scope ref Tarr arr, size_t newlength) @trusted pure nothrow
      {
!         version (DigitalMars) pragma(inline, false);
!         version (D_TypeInfo)
          {
!             auto ti = typeid(Tarr);
  
!             static if (__traits(isZeroInit, T))
!                 ._d_arraysetlengthT(ti, newlength, cast(void[]*)&arr);
!             else
!                 ._d_arraysetlengthiT(ti, newlength, cast(void[]*)&arr);
  
!             return arr.length;
          }
          else
!             assert(0, errorMessage);
      }
  
!     version (D_ProfileGC)
      {
!         import core.internal.array.utils : _d_HookTraceImpl;
  
!         /**
!          * TraceGC wrapper around $(REF _d_arraysetlengthT, core,internal,array,core.internal.array.capacity).
!          * Bugs:
!          *  This function template was ported from a much older runtime hook that bypassed safety,
!          *  purity, and throwabilty checks. To prevent breaking existing code, this function template
!          *  is temporarily declared `@trusted pure nothrow` until the implementation can be brought up to modern D expectations.
!          */
!         alias _d_arraysetlengthTTrace = _d_HookTraceImpl!(Tarr, _d_arraysetlengthT, errorMessage);
      }
  }
  
  @safe unittest
  {
      struct S
--- 9,381 ----
  */
  module core.internal.array.capacity;
  
! debug (PRINTF) import core.stdc.stdio : printf;
! debug (VALGRIND) import etc.valgrind.valgrind;
  
! // for now, all GC array functions are not exposed via core.memory.
! extern(C) {
!     bool gc_expandArrayUsed(void[] slice, size_t newUsed, bool atomic) nothrow pure;
!     size_t gc_reserveArrayCapacity(void[] slice, size_t request, bool atomic) nothrow pure;
!     bool gc_shrinkArrayUsed(void[] slice, size_t existingUsed, bool atomic) nothrow pure;
!     void[] gc_getArrayUsed(void *ptr, bool atomic) nothrow pure;
! }
  
! /**
! Shrink the "allocated" length of an array to be the exact size of the array.
! 
! It doesn't matter what the current allocated length of the array is, the
! user is telling the runtime that he knows what he is doing.
! 
! Params:
!     T = the type of the elements in the array (this should be unqualified)
!     arr = array to shrink. Its `.length` is element length, not byte length, despite `void` type
!     isshared = true if the underlying data is shared
! */
! void _d_arrayshrinkfit(Tarr: T[], T)(Tarr arr, bool isshared) @trusted
  {
!     import core.exception : onFinalizeError;
!     import core.internal.traits: hasElaborateDestructor;
  
!     debug(PRINTF) printf("_d_arrayshrinkfit, elemsize = %zd, arr.ptr = %p arr.length = %zd\n", T.sizeof, arr.ptr, arr.length);
!     auto reqlen = arr.length;
! 
!     auto curArr = cast(Tarr)gc_getArrayUsed(arr.ptr, isshared);
!     if (curArr.ptr is null)
!         // not a valid GC pointer
!         return;
! 
!     // align the array.
!     auto offset = arr.ptr - curArr.ptr;
!     auto curlen = curArr.length - offset;
!     if (curlen <= reqlen)
!         // invalid situation, or no change.
!         return;
! 
!     // if the type has a destructor, destroy elements we are about to remove.
!     static if(is(T == struct) && hasElaborateDestructor!T)
      {
!         try
          {
!             // Finalize the elements that are being removed
  
!             // Due to the fact that the delete operator calls destructors
!             // for arrays from the last element to the first, we maintain
!             // compatibility here by doing the same.
!             for (auto curP = arr.ptr + curlen - 1; curP >= arr.ptr + reqlen; curP--)
!             {
!                 // call destructor
!                 curP.__xdtor();
!             }
!         }
!         catch (Exception e)
!         {
!             onFinalizeError(typeid(T), e);
!         }
!     }
  
!     gc_shrinkArrayUsed(arr[0 .. reqlen], curlen * T.sizeof, isshared);
! }
! 
! /**
! Set the array capacity.
! 
! If the array capacity isn't currently large enough
! to hold the requested capacity (in number of elements), then the array is
! resized/reallocated to the appropriate size.
! 
! Pass in a requested capacity of 0 to get the current capacity.
! 
! Params:
!     T = the type of the elements in the array (this should be unqualified)
!     newcapacity = requested new capacity
!     p = pointer to array to set. Its `length` is left unchanged.
!     isshared = true if the underlying data is shared
! 
! Returns: the number of elements that can actually be stored once the resizing is done
! */
! size_t _d_arraysetcapacityPureNothrow(T)(size_t newcapacity, void[]* p, bool isshared) pure nothrow @trusted
! do
! {
!     alias PureNothrowType = size_t function(size_t, void[]*, bool) pure nothrow @trusted;
!     return (cast(PureNothrowType) &_d_arraysetcapacity!T)(newcapacity, p, isshared);
! }
! 
! size_t _d_arraysetcapacity(T)(size_t newcapacity, void[]* p, bool isshared) @trusted
! in
! {
!     assert(!(*p).length || (*p).ptr);
! }
! do
! {
!     import core.checkedint : mulu;
!     import core.exception : onOutOfMemoryError;
!     import core.stdc.string : memcpy, memset;
!     import core.internal.array.utils: __typeAttrs;
!     import core.internal.lifetime : __doPostblit;
! 
!     import core.memory : GC;
! 
!     alias BlkAttr = GC.BlkAttr;
! 
!     auto size = T.sizeof;
! 
!     bool overflow = false;
!     const reqsize = mulu(size, newcapacity, overflow);
!     if (overflow)
!     {
!         onOutOfMemoryError();
!         assert(0);
!     }
! 
!     // step 1, see if we can ensure the capacity is valid in-place
!     auto datasize = (*p).length * size;
!     auto curCapacity = gc_reserveArrayCapacity((*p).ptr[0 .. datasize], reqsize, isshared);
!     if (curCapacity != 0) // in-place worked!
!         return curCapacity / size;
! 
!     if (reqsize <= datasize) // requested size is less than array size, the current array satisfies
!         // the request. But this is not an appendable GC array, so return 0.
!         return 0;
! 
!     // step 2, if reserving in-place doesn't work, allocate a new array with at
!     // least the requested allocated size.
!     auto attrs = __typeAttrs!T((*p).ptr) | BlkAttr.APPENDABLE;
! 
!     // use this static enum to avoid recomputing TypeInfo for every call.
!     static enum ti = typeid(T);
!     auto ptr = GC.malloc(reqsize, attrs, ti);
!     if (ptr is null)
!     {
!         onOutOfMemoryError();
!         assert(0);
!     }
! 
!     // copy the data over.
!     // note that malloc will have initialized the data we did not request to 0.
!     memcpy(ptr, (*p).ptr, datasize);
! 
!     // handle postblit
!     __doPostblit!T(cast(T[])ptr[0 .. datasize]);
! 
!     if (!(attrs & BlkAttr.NO_SCAN))
!     {
!         // need to memset the newly requested data, except for the data that
!         // malloc returned that we didn't request.
!         void* endptr = ptr + reqsize;
!         void* begptr = ptr + datasize;
! 
!         // sanity check
!         assert(endptr >= begptr);
!         memset(begptr, 0, endptr - begptr);
!     }
! 
!     *p = ptr[0 .. (*p).length];
! 
!     // set up the correct length. Note that we need to do this here, because
!     // the GC malloc will automatically set the used size to what we requested.
!     gc_shrinkArrayUsed(ptr[0 .. datasize], reqsize, isshared);
! 
!     curCapacity = gc_reserveArrayCapacity(ptr[0 .. datasize], 0, isshared);
!     assert(curCapacity);
!     return curCapacity / size;
! }
! 
! /**
! Resize a dynamic array by setting its `.length` property.
! 
! Newly created elements are initialized based on their default value.
! If the array's elements initialize to `0`, memory is zeroed out. Otherwise, elements are explicitly initialized.
! 
! This function handles memory allocation, expansion, and initialization while maintaining array integrity.
! 
! ---
! void main()
! {
!     int[] a = [1, 2];
!     a.length = 3; // Gets lowered to `_d_arraysetlengthT!(int)(a, 3, false)`
! }
! ---
! 
! Params:
!     arr         = The array to resize.
!     newlength   = The new value for the array's `.length`.
! 
! Returns:
!     The resized array with updated length and properly initialized elements.
! 
! Throws:
!     OutOfMemoryError if allocation fails.
! */
! size_t _d_arraysetlengthT(Tarr : T[], T)(return ref scope Tarr arr, size_t newlength) @trusted
! {
!     import core.internal.traits : Unqual;
! 
!     // Check if the type is shared
!     enum isShared = is(T == shared);
! 
!     // Unqualify the type to remove `const`, `immutable`, `shared`, etc.
!     alias UnqT = Unqual!T;
! 
!     // Cast the array to the unqualified type
!     auto unqual_arr = cast(UnqT[]) arr;
! 
!     // Call the implementation with the unqualified array and sharedness flag
!     size_t result = _d_arraysetlengthT_(unqual_arr, newlength, isShared);
! 
!     arr = cast(Tarr) unqual_arr;
!     // Return the result
!     return result;
! }
! 
! private size_t _d_arraysetlengthT_(Tarr : T[], T)(return ref scope Tarr arr, size_t newlength, bool isShared) @trusted
! {
!     import core.checkedint : mulu;
!     import core.exception : onFinalizeError, onOutOfMemoryError;
!     import core.stdc.string : memcpy, memset;
!     import core.internal.traits : hasElaborateCopyConstructor, Unqual;
!     import core.lifetime : emplace;
!     import core.memory;
!     import core.internal.lifetime : __doPostblit;
! 
!     alias BlkAttr = GC.BlkAttr;
!     alias UnqT = Unqual!T;
! 
!     debug(PRINTF)
!     {
!         printf("_d_arraysetlengthT(arr.ptr = %p, arr.length = %zd, newlength = %zd)\n",
!             arr.ptr, arr.length, newlength);
!     }
! 
!     // If the new length is less than or equal to the current length, just truncate the array
!     if (newlength <= arr.length)
!     {
!         arr = arr[0 .. newlength];
!         return newlength;
!     }
! 
!     enum sizeelem = T.sizeof;
!     enum hasPostblit = __traits(hasMember, T, "__postblit");
!     enum hasEnabledPostblit = hasPostblit && !__traits(isDisabled, T.__postblit);
! 
!     bool overflow = false;
!     const newsize = mulu(sizeelem, newlength, overflow);
!     if (overflow)
!     {
!         onOutOfMemoryError();
!         assert(0);
!     }
! 
!     debug(PRINTF) printf("newsize = %zx\n", newsize);
! 
!     uint gcAttrs = BlkAttr.APPENDABLE;
!     static if (is(T == struct) && __traits(hasMember, T, "xdtor"))
!     {
!         gcAttrs |= BlkAttr.FINALIZE;
!     }
! 
!     if (!arr.ptr)
!     {
!         assert(arr.length == 0);
!         void* ptr = GC.malloc(newsize, gcAttrs);
!         if (!ptr)
!         {
!             onOutOfMemoryError();
!             assert(0);
!         }
! 
!         static if (__traits(isZeroInit, T))
!         {
!             memset(ptr, 0, newsize);
!         }
!         else static if (hasElaborateCopyConstructor!T && !hasPostblit)
!         {
!             foreach (i; 0 .. newlength)
!                 emplace(cast(UnqT*) ptr + i, UnqT.init); // safe default construction
          }
          else
!         {
!             auto temp = UnqT.init;
!             foreach (i; 0 .. newlength)
!                 memcpy(cast(UnqT*) ptr + i, cast(const void*)&temp, T.sizeof);
! 
!             static if (hasEnabledPostblit)
!                 __doPostblit!T((cast(T*) ptr)[0 .. newlength]);
!         }
! 
!         arr = (cast(T*) ptr)[0 .. newlength];
!         return newlength;
      }
  
!     size_t oldsize = arr.length * sizeelem;
! 
!     auto newdata = cast(void*) arr.ptr;
! 
!     if (!gc_expandArrayUsed(newdata[0 .. oldsize], newsize, isShared))
      {
!         newdata = GC.malloc(newsize, gcAttrs);
!         if (!newdata)
!         {
!             onOutOfMemoryError();
!             assert(0);
!         }
!         static if (hasElaborateCopyConstructor!T && !hasPostblit)
!         {
!             // Use emplace for types with copy constructors but not postblit
!             foreach (i; 0 .. arr.length)
!                 emplace(cast(UnqT*)newdata + i, arr[i]); // safe copy
!         }
!         else
!         {
!             memcpy(newdata, cast(const(void)*)arr.ptr, oldsize);
  
!             // Postblit handling for types with postblit, but ensure it compiles
!             static if (hasEnabledPostblit)
!                 __doPostblit!T((cast(T*) (cast(ubyte*)newdata))[0 .. arr.length]);
!         }
!     }
! 
!     // Handle initialization based on whether the type requires zero-init
!     static if (__traits(isZeroInit, T))
!         memset(cast(void*) (cast(ubyte*)newdata + oldsize), 0, newsize - oldsize);
!     else static if (hasElaborateCopyConstructor!T && !hasPostblit)
!     {
!         foreach (i; 0 .. newlength - arr.length)
!             emplace(cast(UnqT*) (cast(ubyte*)newdata + oldsize) + i, UnqT.init);
      }
+     else
+     {
+         auto temp = UnqT.init;
+         foreach (i; 0 .. newlength - arr.length)
+             memcpy(cast(UnqT*) (cast(ubyte*)newdata + oldsize) + i, cast(const void*)&temp, T.sizeof);
+ 
+         static if (hasEnabledPostblit)
+             __doPostblit!T((cast(T*) (cast(ubyte*)newdata + oldsize))[0 .. newlength - arr.length]);
+     }
+ 
+     arr = (cast(T*) newdata)[0 .. newlength];
+     return newlength;
  }
  
+ version (D_ProfileGC)
+ {
+     enum errorMessage = "Cannot resize arrays";
+     import core.internal.array.utils : _d_HookTraceImpl;
+ 
+     // Function wrapper around the hook, so it’s callable
+     size_t _d_arraysetlengthTTrace(Tarr : T[], T)(
+         return ref scope Tarr arr,
+         size_t newlength,
+         string file = __FILE__,
+         int line = __LINE__,
+         string func = __FUNCTION__
+     ) @trusted
+     {
+         alias Hook = _d_HookTraceImpl!(Tarr, _d_arraysetlengthT!Tarr, errorMessage);
+         return Hook(arr, newlength, file, line, func);
+     }
+ }
+ 
+ // @safe unittest remains intact
  @safe unittest
  {
      struct S
*************** template _d_arraysetlengthTImpl(Tarr : T
*** 75,87 ****
      }
  
      int[] arr;
!     _d_arraysetlengthTImpl!(typeof(arr))._d_arraysetlengthT(arr, 16);
      assert(arr.length == 16);
      foreach (int i; arr)
          assert(i == int.init);
  
      shared S[] arr2;
!     _d_arraysetlengthTImpl!(typeof(arr2))._d_arraysetlengthT(arr2, 16);
      assert(arr2.length == 16);
      foreach (s; arr2)
          assert(s == S.init);
--- 384,396 ----
      }
  
      int[] arr;
!     _d_arraysetlengthT!(typeof(arr))(arr, 16);
      assert(arr.length == 16);
      foreach (int i; arr)
          assert(i == int.init);
  
      shared S[] arr2;
!     _d_arraysetlengthT!(typeof(arr2))(arr2, 16);
      assert(arr2.length == 16);
      foreach (s; arr2)
          assert(s == S.init);
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/core/internal/array/concatenation.d gcc-16-20260201/libphobos/libdruntime/core/internal/array/concatenation.d
*** gcc-16-20260125/libphobos/libdruntime/core/internal/array/concatenation.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/core/internal/array/concatenation.d	Sun Feb  1 22:32:17 2026
*************** module core.internal.array.concatenation
*** 19,25 ****
   */
  Tret _d_arraycatnTX(Tret, Tarr...)(auto ref Tarr froms) @trusted
  {
!     import core.internal.array.capacity : _d_arraysetlengthTImpl;
      import core.internal.traits : hasElaborateCopyConstructor, Unqual;
      import core.lifetime : copyEmplace;
      import core.stdc.string : memcpy;
--- 19,26 ----
   */
  Tret _d_arraycatnTX(Tret, Tarr...)(auto ref Tarr froms) @trusted
  {
!     import core.exception : onOutOfMemoryError;
!     import core.internal.array.utils : __arrayAlloc;
      import core.internal.traits : hasElaborateCopyConstructor, Unqual;
      import core.lifetime : copyEmplace;
      import core.stdc.string : memcpy;
*************** Tret _d_arraycatnTX(Tret, Tarr...)(auto
*** 27,63 ****
      Tret res;
      size_t totalLen;
  
!     alias T = typeof(res[0]);
!     enum elemSize = T.sizeof;
!     enum hasPostblit = __traits(hasPostblit, T);
  
      static foreach (from; froms)
!         static if (is (typeof(from) : T))
!             totalLen++;
          else
!             totalLen += from.length;
  
      if (totalLen == 0)
!         return res;
  
!     // We cannot use this, because it refuses to work if the array type has disabled default construction.
!     // res.length = totalLen;
!     // Call the runtime function directly instead.
!     // TODO: once `__arrayAlloc` is templated, call that instead.
!     version (D_ProfileGC)
!     {
!         // TODO: forward file, line, name from _d_arraycatnTXTrace
!         _d_arraysetlengthTImpl!(typeof(res))._d_arraysetlengthTTrace(
!             res, totalLen, __FILE__, __LINE__, __FUNCTION__);
!     }
!     else
!     {
!         _d_arraysetlengthTImpl!(typeof(res))._d_arraysetlengthT(res, totalLen);
!     }
  
-     /* Currently, if both a postblit and a cpctor are defined, the postblit is
-      * used. If this changes, the condition below will have to be adapted.
-      */
      static if (hasElaborateCopyConstructor!T && !hasPostblit)
      {
          size_t i = 0;
--- 28,54 ----
      Tret res;
      size_t totalLen;
  
!     alias T = typeof(res[0]); // Element type of the result array
!     alias UnqT = Unqual!T;    // Unqualified version of T (strips const/immutable)
!     enum elemSize = T.sizeof; // Size of each element
!     enum hasPostblit = __traits(hasPostblit, T); // Whether T has a postblit constructor
  
+     // Compute total length of the resulting array
      static foreach (from; froms)
!         static if (is(typeof(from) : T))
!             totalLen++; // Single element contributes one to length
          else
!             totalLen += from.length; // Arrays contribute their full length
  
      if (totalLen == 0)
!         return res; // Return an empty array if no elements are present
  
!     // Allocate memory for mutable arrays using __arrayAlloc
!     res = cast(Tret) __arrayAlloc!(UnqT)(elemSize * totalLen);
! 
!     if (res.ptr is null)
!         onOutOfMemoryError(); // Abort if allocation fails
  
      static if (hasElaborateCopyConstructor!T && !hasPostblit)
      {
          size_t i = 0;
*************** Tret _d_arraycatnTX(Tret, Tarr...)(auto
*** 73,88 ****
      }
      else
      {
!         auto resptr = cast(Unqual!T *) res;
          foreach (ref from; froms)
              static if (is (typeof(from) : T))
!                 memcpy(resptr++, cast(Unqual!T *) &from, elemSize);
              else
              {
                  const len = from.length;
                  if (len)
                  {
!                     memcpy(resptr, cast(Unqual!T *) from, len * elemSize);
                      resptr += len;
                  }
              }
--- 64,79 ----
      }
      else
      {
!         auto resptr = cast(UnqT *) res;
          foreach (ref from; froms)
              static if (is (typeof(from) : T))
!                 memcpy(resptr++, cast(UnqT *) &from, elemSize);
              else
              {
                  const len = from.length;
                  if (len)
                  {
!                     memcpy(resptr, cast(UnqT *) from, len * elemSize);
                      resptr += len;
                  }
              }
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/core/internal/array/construction.d gcc-16-20260201/libphobos/libdruntime/core/internal/array/construction.d
*** gcc-16-20260125/libphobos/libdruntime/core/internal/array/construction.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/core/internal/array/construction.d	Sun Feb  1 22:32:17 2026
*************** Tarr _d_arrayctor(Tarr : T[], T)(return
*** 65,71 ****
  
      enforceRawArraysConformable("initialization", T.sizeof, vFrom, vTo);
  
!     static if (hasElaborateCopyConstructor!T)
      {
          size_t i;
          try
--- 65,71 ----
  
      enforceRawArraysConformable("initialization", T.sizeof, vFrom, vTo);
  
!     static if (__traits(hasCopyConstructor, T))
      {
          size_t i;
          try
*************** Tarr _d_arrayctor(Tarr : T[], T)(return
*** 88,95 ****
      }
      else
      {
!         // blit all elements at once
!         memcpy(cast(void*) to.ptr, from.ptr, to.length * T.sizeof);
      }
  
      return to;
--- 88,117 ----
      }
      else
      {
!         if (to.length)
!         {
!             // blit all elements at once
!             memcpy(cast(void*) to.ptr, from.ptr, to.length * T.sizeof);
! 
!             // call postblits if they exist
!             static if (__traits(hasPostblit, T))
!             {
!                 import core.internal.lifetime : __doPostblit;
!                 size_t i = 0;
!                 try __doPostblit(to, i);
!                 catch (Exception o)
!                 {
!                     // Destroy, in reverse order, what we've constructed so far
!                     while (i--)
!                     {
!                         auto elem = cast(Unqual!T*) &to[i];
!                         destroy(*elem);
!                     }
! 
!                     throw o;
!                 }
!             }
!         }
      }
  
      return to;
*************** T[] _d_newarrayUPureNothrow(T)(size_t le
*** 346,351 ****
--- 368,374 ----
  
  T[] _d_newarrayU(T)(size_t length, bool isShared=false) @trusted
  {
+     import core.checkedint : mulu;
      import core.exception : onOutOfMemoryError;
      import core.internal.traits : Unqual;
      import core.internal.array.utils : __arrayAlloc;
*************** T[] _d_newarrayU(T)(size_t length, bool
*** 353,404 ****
      alias UnqT = Unqual!T;
  
      size_t elemSize = T.sizeof;
-     size_t arraySize;
  
      debug(PRINTF) printf("_d_newarrayU(length = x%zu, size = %zu)\n", length, elemSize);
      if (length == 0 || elemSize == 0)
          return null;
  
!     version (D_InlineAsm_X86)
!     {
!         asm pure nothrow @nogc
!         {
!             mov     EAX, elemSize       ;
!             mul     EAX, length         ;
!             mov     arraySize, EAX      ;
!             jnc     Lcontinue           ;
!         }
!     }
!     else version (D_InlineAsm_X86_64)
      {
!         asm pure nothrow @nogc
          {
!             mov     RAX, elemSize       ;
!             mul     RAX, length         ;
!             mov     arraySize, RAX      ;
!             jnc     Lcontinue           ;
          }
      }
-     else
-     {
-         import core.checkedint : mulu;
- 
-         bool overflow = false;
-         arraySize = mulu(elemSize, length, overflow);
-         if (!overflow)
-             goto Lcontinue;
-     }
  
- Loverflow:
      onOutOfMemoryError();
      assert(0);
- 
- Lcontinue:
-     auto arr = __arrayAlloc!UnqT(arraySize);
-     if (!arr.ptr)
-         goto Loverflow;
-     debug(PRINTF) printf("p = %p\n", arr.ptr);
-     return (cast(T*) arr.ptr)[0 .. length];
  }
  
  /// ditto
--- 376,399 ----
      alias UnqT = Unqual!T;
  
      size_t elemSize = T.sizeof;
  
      debug(PRINTF) printf("_d_newarrayU(length = x%zu, size = %zu)\n", length, elemSize);
      if (length == 0 || elemSize == 0)
          return null;
  
!     bool overflow = false;
!     const arraySize = mulu(elemSize, length, overflow);
!     if (!overflow)
      {
!         if (auto arr = __arrayAlloc!UnqT(arraySize))
          {
!             debug(PRINTF) printf("p = %p\n", arr.ptr);
!             return (cast(T*) arr.ptr)[0 .. length];
          }
      }
  
      onOutOfMemoryError();
      assert(0);
  }
  
  /// ditto
*************** version (D_ProfileGC)
*** 505,511 ****
   * Returns:
   *    newly allocated array
   */
! Tarr _d_newarraymTX(Tarr : U[], T, U)(size_t[] dims, bool isShared=false) @trusted
  {
      debug(PRINTF) printf("_d_newarraymTX(dims.length = %zd)\n", dims.length);
  
--- 500,506 ----
   * Returns:
   *    newly allocated array
   */
! Tarr _d_newarraymTX(Tarr : U[], T, U)(scope size_t[] dims, bool isShared=false) @trusted
  {
      debug(PRINTF) printf("_d_newarraymTX(dims.length = %zd)\n", dims.length);
  
*************** Tarr _d_newarraymTX(Tarr : U[], T, U)(si
*** 520,526 ****
  
          auto dim = dims[0];
  
!         debug(PRINTF) printf("__allocateInnerArray(UnqT = %s, dim = %lu, ndims = %lu\n", UnqT.stringof.ptr, dim, dims.length);
          if (dims.length == 1)
          {
              auto r = _d_newarrayT!UnqT(dim, isShared);
--- 515,521 ----
  
          auto dim = dims[0];
  
!         debug(PRINTF) printf("__allocateInnerArray(UnqT = %s, dim = %u, ndims = %u)\n", UnqT.stringof.ptr, cast(uint)dim, cast(uint)dims.length);
          if (dims.length == 1)
          {
              auto r = _d_newarrayT!UnqT(dim, isShared);
*************** version (D_ProfileGC)
*** 602,608 ****
      /**
      * TraceGC wrapper around $(REF _d_newarraymT, core,internal,array,construction).
      */
!     Tarr _d_newarraymTXTrace(Tarr : U[], T, U)(size_t[] dims, bool isShared=false, string file = __FILE__, int line = __LINE__, string funcname = __FUNCTION__) @trusted
      {
          version (D_TypeInfo)
          {
--- 597,603 ----
      /**
      * TraceGC wrapper around $(REF _d_newarraymT, core,internal,array,construction).
      */
!     Tarr _d_newarraymTXTrace(Tarr : U[], T, U)(scope size_t[] dims, bool isShared=false, string file = __FILE__, int line = __LINE__, string funcname = __FUNCTION__) @trusted
      {
          version (D_TypeInfo)
          {
*************** version (D_ProfileGC)
*** 615,617 ****
--- 610,675 ----
              assert(0, "Cannot create new multi-dimensional array if compiling without support for runtime type information!");
      }
  }
+ 
+ 
+ /**
+ Allocate an array literal
+ 
+ Rely on the caller to do the initialization of the array.
+ 
+ ---
+ int[] getArr()
+ {
+     return [10, 20];
+     // auto res = cast(int*) _d_arrayliteralTX(typeid(int[]), 2);
+     // res[0] = 10;
+     // res[1] = 20;
+     // return res[0..2];
+ }
+ ---
+ 
+ Params:
+     T = unqualified type of array elements
+     length = `.length` of array literal
+ 
+ Returns: pointer to allocated array
+ */
+ void* _d_arrayliteralTX(T)(size_t length) @trusted pure nothrow
+ {
+     const allocsize = length * T.sizeof;
+ 
+     if (allocsize == 0)
+         return null;
+     else
+     {
+         import core.memory : GC;
+         import core.internal.traits : hasIndirections, hasElaborateDestructor;
+         alias BlkAttr = GC.BlkAttr;
+ 
+         /* Same as in core.internal.array.utils.__typeAttrs!T,
+         *  but don't use a nested template function call here to avoid
+         *  possible linking errors.
+         */
+         uint attrs = BlkAttr.APPENDABLE;
+         static if (!hasIndirections!T)
+             attrs |= BlkAttr.NO_SCAN;
+         static if (is(T == struct) && hasElaborateDestructor!T)
+             attrs |= BlkAttr.FINALIZE;
+ 
+         return GC.malloc(allocsize, attrs, typeid(T));
+     }
+ }
+ 
+ version (D_ProfileGC)
+ void* _d_arrayliteralTXTrace(T)(size_t length, string file = __FILE__, int line = __LINE__, string funcname = __FUNCTION__) @trusted pure nothrow
+ {
+     version (D_TypeInfo)
+     {
+         import core.internal.array.utils : TraceHook, gcStatsPure, accumulatePure;
+         mixin(TraceHook!((T[]).stringof, "_d_arrayliteralTX"));
+ 
+         return _d_arrayliteralTX!T(length);
+     }
+     else
+         assert(0);
+ }
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/core/internal/array/duplication.d gcc-16-20260201/libphobos/libdruntime/core/internal/array/duplication.d
*** gcc-16-20260125/libphobos/libdruntime/core/internal/array/duplication.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/core/internal/array/duplication.d	Sun Feb  1 22:32:17 2026
*************** U[] _dup(T, U)(T[] a) if (!__traits(isPO
*** 362,368 ****
  // https://issues.dlang.org/show_bug.cgi?id=24453
  @safe unittest
  {
!     static inout(char)[] foo(ref scope return inout(char)[] s)
      {
          auto bla = s.idup;
          return s;
--- 362,368 ----
  // https://issues.dlang.org/show_bug.cgi?id=24453
  @safe unittest
  {
!     static inout(char)[] foo(return ref scope inout(char)[] s)
      {
          auto bla = s.idup;
          return s;
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/core/internal/array/equality.d gcc-16-20260201/libphobos/libdruntime/core/internal/array/equality.d
*** gcc-16-20260125/libphobos/libdruntime/core/internal/array/equality.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/core/internal/array/equality.d	Sun Feb  1 22:32:17 2026
*************** module core.internal.array.equality;
*** 14,54 ****
  // * dynamic arrays,
  // * (most) arrays of different (unqualified) element types, and
  // * arrays of structs with custom opEquals.
! 
!  // The scalar-only overload takes advantage of known properties of scalars to
!  // reduce template instantiation. This is expected to be the most common case.
! bool __equals(T1, T2)(scope const T1[] lhs, scope const T2[] rhs)
! @nogc nothrow pure @trusted
! if (__traits(isScalar, T1) && __traits(isScalar, T2))
! {
!     const length = lhs.length;
! 
!     static if (T1.sizeof == T2.sizeof
!         // Signedness needs to match for types that promote to int.
!         // (Actually it would be okay to memcmp bool[] and byte[] but that is
!         // probably too uncommon to be worth checking for.)
!         && (T1.sizeof >= 4 || __traits(isUnsigned, T1) == __traits(isUnsigned, T2))
!         && !__traits(isFloating, T1) && !__traits(isFloating, T2))
!     {
!         if (__ctfe)
!             return length == rhs.length && isEqual(lhs.ptr, rhs.ptr, length);
!         else
!         {
!             // This would improperly allow equality of integers and pointers
!             // but the CTFE branch will stop this function from compiling then.
!             import core.stdc.string : memcmp;
!             return length == rhs.length &&
!                 (!length || 0 == memcmp(cast(const void*) lhs.ptr, cast(const void*) rhs.ptr, length * T1.sizeof));
!         }
!     }
!     else
!     {
!         return length == rhs.length && isEqual(lhs.ptr, rhs.ptr, length);
!     }
! }
! 
! bool __equals(T1, T2)(scope T1[] lhs, scope T2[] rhs)
! if (!__traits(isScalar, T1) || !__traits(isScalar, T2))
  {
      if (lhs.length != rhs.length)
          return false;
--- 14,20 ----
  // * dynamic arrays,
  // * (most) arrays of different (unqualified) element types, and
  // * arrays of structs with custom opEquals.
! bool __equals(T1, T2)(scope T1[] lhs, scope T2[] rhs) @trusted
  {
      if (lhs.length != rhs.length)
          return false;
*************** if (!__traits(isScalar, T1) || !__traits
*** 56,92 ****
      if (lhs.length == 0)
          return true;
  
!     static if (useMemcmp!(T1, T2))
!     {
!         if (!__ctfe)
!         {
!             static bool trustedMemcmp(scope T1[] lhs, scope T2[] rhs) @trusted @nogc nothrow pure
!             {
!                 pragma(inline, true);
!                 import core.stdc.string : memcmp;
!                 return memcmp(cast(void*) lhs.ptr, cast(void*) rhs.ptr, lhs.length * T1.sizeof) == 0;
!             }
!             return trustedMemcmp(lhs, rhs);
!         }
!         else
!         {
!             foreach (const i; 0 .. lhs.length)
!             {
!                 if (at(lhs, i) != at(rhs, i))
!                     return false;
!             }
!             return true;
!         }
!     }
!     else
!     {
!         foreach (const i; 0 .. lhs.length)
!         {
!             if (at(lhs, i) != at(rhs, i))
!                 return false;
!         }
!         return true;
!     }
  }
  
  /******************************
--- 22,30 ----
      if (lhs.length == 0)
          return true;
  
!     alias PureType = bool function(scope T1[], scope T2[], size_t) @safe pure nothrow @nogc;
! 
!     return (cast(PureType)&isEqual!(T1,T2))(lhs, rhs, lhs.length);
  }
  
  /******************************
*************** if (!__traits(isScalar, T1) || !__traits
*** 94,104 ****
   * Outlined to enable __equals() to be inlined, as dmd cannot inline loops.
   */
  private
! bool isEqual(T1, T2)(scope const T1* t1, scope const T2* t2, size_t length)
  {
      foreach (const i; 0 .. length)
!         if (t1[i] != t2[i])
              return false;
      return true;
  }
  
--- 32,57 ----
   * Outlined to enable __equals() to be inlined, as dmd cannot inline loops.
   */
  private
! bool isEqual(T1, T2)(scope T1[] lhs, scope T2[] rhs, size_t length)
  {
+     // Returns a reference to an array element, eliding bounds check and
+     // casting void to ubyte.
+     pragma(inline, true)
+     static ref at(T)(scope T[] r, size_t i) @trusted
+         // exclude opaque structs due to https://issues.dlang.org/show_bug.cgi?id=20959
+         if (!(is(T == struct) && !is(typeof(T.sizeof))))
+     {
+         static if (is(T == void))
+             return (cast(ubyte[]) r)[i];
+         else
+             return r[i];
+     }
+ 
      foreach (const i; 0 .. length)
!     {
!         if (at(lhs, i) != at(rhs, i))
              return false;
+     }
      return true;
  }
  
*************** bool isEqual(T1, T2)(scope const T1* t1,
*** 173,241 ****
      assert(a1 != a2);
  }
  
- 
- private:
- 
- // - Recursively folds static array types to their element type,
- // - maps void to ubyte, and
- // - pointers to size_t.
- template BaseType(T)
- {
-     static if (__traits(isStaticArray, T))
-         alias BaseType = BaseType!(typeof(T.init[0]));
-     else static if (is(immutable T == immutable void))
-         alias BaseType = ubyte;
-     else static if (is(T == E*, E))
-         alias BaseType = size_t;
-     else
-         alias BaseType = T;
- }
- 
- // Use memcmp if the element sizes match and both base element types are integral.
- // Due to int promotion, disallow small integers of diverging signed-ness though.
- template useMemcmp(T1, T2)
- {
-     static if (T1.sizeof != T2.sizeof)
-         enum useMemcmp = false;
-     else
-     {
-         alias B1 = BaseType!T1;
-         alias B2 = BaseType!T2;
-         enum useMemcmp = __traits(isIntegral, B1) && __traits(isIntegral, B2)
-            && !( (B1.sizeof < 4 || B2.sizeof < 4) && __traits(isUnsigned, B1) != __traits(isUnsigned, B2) );
-     }
- }
- 
- unittest
- {
-     enum E { foo, bar }
- 
-     static assert(useMemcmp!(byte, byte));
-     static assert(useMemcmp!(ubyte, ubyte));
-     static assert(useMemcmp!(void, const void));
-     static assert(useMemcmp!(void, immutable bool));
-     static assert(useMemcmp!(void, inout char));
-     static assert(useMemcmp!(void, shared ubyte));
-     static assert(!useMemcmp!(void, byte));       // differing signed-ness
-     static assert(!useMemcmp!(char[8], byte[8])); // ditto
- 
-     static assert(useMemcmp!(short, short));
-     static assert(useMemcmp!(wchar, ushort));
-     static assert(!useMemcmp!(wchar, short)); // differing signed-ness
- 
-     static assert(useMemcmp!(int, uint)); // no promotion, ignoring signed-ness
-     static assert(useMemcmp!(dchar, E));
- 
-     static assert(useMemcmp!(immutable void*, size_t));
-     static assert(useMemcmp!(double*, ptrdiff_t));
-     static assert(useMemcmp!(long[2][3], const(ulong)[2][3]));
- 
-     static assert(!useMemcmp!(float, float));
-     static assert(!useMemcmp!(double[2], double[2]));
-     static assert(!useMemcmp!(Object, Object));
-     static assert(!useMemcmp!(int[], int[]));
- }
- 
  // https://issues.dlang.org/show_bug.cgi?id=21094
  unittest
  {
--- 126,131 ----
*************** unittest
*** 262,277 ****
          return lhs == rhs;
      }
  }
- 
- // Returns a reference to an array element, eliding bounds check and
- // casting void to ubyte.
- pragma(inline, true)
- ref at(T)(T[] r, size_t i) @trusted
-     // exclude opaque structs due to https://issues.dlang.org/show_bug.cgi?id=20959
-     if (!(is(T == struct) && !is(typeof(T.sizeof))))
- {
-     static if (is(immutable T == immutable void))
-         return (cast(ubyte*) r.ptr)[i];
-     else
-         return r.ptr[i];
- }
--- 152,154 ----
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/core/internal/array/utils.d gcc-16-20260201/libphobos/libdruntime/core/internal/array/utils.d
*** gcc-16-20260125/libphobos/libdruntime/core/internal/array/utils.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/core/internal/array/utils.d	Sun Feb  1 22:32:17 2026
*************** void[] __arrayAlloc(T)(size_t arrSize) @
*** 156,158 ****
--- 156,249 ----
          return ptr[0 .. arrSize];
      return null;
  }
+ 
+ /**
+ Given an array of length `size` that needs to be expanded to `newlength`,
+ compute a new capacity.
+ 
+ Better version by Dave Fladebo, enhanced by Steven Schveighoffer:
+ This uses an inverse logorithmic algorithm to pre-allocate a bit more
+ space for larger arrays.
+ - The maximum "extra" space is about 80% of the requested space. This is for
+ PAGE size and smaller.
+ - As the arrays grow, the relative pre-allocated space shrinks.
+ - Perhaps most importantly, overall memory usage and stress on the GC
+ is decreased significantly for demanding environments.
+ - The algorithm is tuned to avoid any division at runtime.
+ 
+ Params:
+     newlength = new `.length`
+     elemsize = size of the element in the new array
+ Returns: new capacity for array
+ */
+ size_t newCapacity(size_t newlength, size_t elemsize) pure nothrow
+ {
+     size_t newcap = newlength * elemsize;
+ 
+     /*
+      * Max growth factor numerator is 234, so allow for multiplying by 256.
+      * But also, the resulting size cannot be more than 2x, so prevent
+      * growing if 2x would fill up the address space (for 32-bit)
+      */
+     enum largestAllowed = (ulong.max >> 8) & (size_t.max >> 1);
+     if (!newcap || (newcap & ~largestAllowed))
+         return newcap;
+ 
+     /*
+      * The calculation for "extra" space depends on the requested capacity.
+      * We use an inverse logarithm of the new capacity to add an extra 15%
+      * to 83% capacity. Note that normally we humans think in terms of
+      * percent, but using 128 instead of 100 for the denominator means we
+      * can avoid all division by simply bit-shifthing. Since there are only
+      * 64 bits in a long, the bsr of a size_t is going to be 0 - 63. Using
+      * a lookup table allows us to precalculate the multiplier based on the
+      * inverse logarithm. The formula rougly is:
+      *
+      * newcap = request * (1.0 + min(0.83, 10.0 / (log(request) + 1)))
+      */
+     import core.bitop;
+     static immutable multTable = (){
+         assert(__ctfe);
+         ulong[size_t.sizeof * 8] result;
+         foreach (i; 0 .. result.length)
+         {
+             auto factor = 128 + 1280 / (i + 1);
+             result[i] = factor > 234 ? 234 : factor;
+         }
+         return result;
+     }();
+ 
+     auto mult = multTable[bsr(newcap)];
+ 
+     // if this were per cent, then the code would look like:
+     // ((newlength * mult + 99) / 100) * elemsize
+     newcap = cast(size_t)((newlength * mult + 127) >> 7) * elemsize;
+     debug(PRINTF) printf("mult: %2.2f, alloc: %2.2f\n",mult/128.0,newcap / cast(double)elemsize);
+     debug(PRINTF) printf("newcap = %zd, newlength = %zd, elemsize = %zd\n", newcap, newlength, elemsize);
+     return newcap;
+ }
+ 
+ uint __typeAttrs(T)(void *copyAttrsFrom = null)
+ {
+     import core.internal.traits : hasIndirections, hasElaborateDestructor;
+     import core.memory : GC;
+ 
+     alias BlkAttr = GC.BlkAttr;
+ 
+     if (copyAttrsFrom)
+     {
+         // try to copy attrs from the given block
+         auto info = GC.query(copyAttrsFrom);
+         if (info.base)
+             return info.attr;
+     }
+ 
+     uint attrs = 0;
+     static if (!hasIndirections!T)
+         attrs |= BlkAttr.NO_SCAN;
+ 
+     static if (is(T == struct) && hasElaborateDestructor!T)
+         attrs |= BlkAttr.FINALIZE;
+ 
+     return attrs;
+ }
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/core/internal/cast_.d gcc-16-20260201/libphobos/libdruntime/core/internal/cast_.d
*** gcc-16-20260125/libphobos/libdruntime/core/internal/cast_.d	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/libphobos/libdruntime/core/internal/cast_.d	Sun Feb  1 22:32:17 2026
***************
*** 0 ****
--- 1,311 ----
+ module core.internal.cast_;
+ 
+ // Needed because ClassInfo.opEquals(Object) does a dynamic cast,
+ // but we are trying to implement dynamic cast.
+ bool areClassInfosEqual(scope const ClassInfo a, scope const ClassInfo b) pure nothrow @safe @nogc
+ {
+     // same class if signatures match, works with potential duplicates across binaries
+     if (a is b)
+         return true;
+ 
+     // new fast way
+     if (a.m_flags & TypeInfo_Class.ClassFlags.hasNameSig)
+         return a.nameSig[0] == b.nameSig[0]
+             && a.nameSig[1] == b.nameSig[1]
+             && a.nameSig[2] == b.nameSig[2]
+             && a.nameSig[3] == b.nameSig[3];
+ 
+     // old slow way for temporary binary compatibility
+     return a.name == b.name;
+ }
+ 
+ 
+ /*****
+  * Dynamic cast from a class object `o` to class or interface `To`, where `To` is a subtype of `o`.
+  * Params:
+  *      o = instance of class
+  *      To = class or interface that is a subtype of `o`
+  * Returns:
+  *      null if `o` is null or `To` is not a subclass type of `o`. Otherwise, return `o`.
+  */
+ private void* _d_dynamic_cast(To)(const return scope Object o) @trusted
+ {
+     void* res = null;
+     size_t offset = 0;
+ 
+     if (o && _d_isbaseof2!To(typeid(o), offset))
+     {
+         res = cast(void*) o + offset;
+     }
+     return res;
+ }
+ 
+ /**
+  * Dynamic cast `o` to final class `To` only one level down
+  * Params:
+  *      o = object that is instance of a class
+  *      To = final class that is a subclass type of `o`
+  * Returns:
+  *      o if it succeeds, null if it fails
+  */
+ private void* _d_paint_cast(To)(const return scope Object o)
+ {
+     /* If o is really an instance of c, just do a paint
+      */
+     auto p = o && cast(void*)(areClassInfosEqual(typeid(o), typeid(To).info)) ? o : null;
+     debug assert(cast(void*)p is cast(void*)_d_dynamic_cast!To(o));
+     return cast(void*)p;
+ }
+ 
+ private void* _d_class_cast_impl(const return scope Object o, const ClassInfo c) pure nothrow @safe @nogc
+ {
+     if (!o)
+         return null;
+ 
+     ClassInfo oc = typeid(o);
+     int delta = oc.depth;
+ 
+     if (delta && c.depth)
+     {
+         delta -= c.depth;
+         if (delta < 0)
+             return null;
+ 
+         while (delta--)
+             oc = oc.base;
+         if (areClassInfosEqual(oc, c))
+             return cast(void*)o;
+         return null;
+     }
+ 
+     // no depth data - support the old way
+     do
+     {
+         if (areClassInfosEqual(oc, c))
+             return cast(void*)o;
+         oc = oc.base;
+     } while (oc);
+     return null;
+ }
+ 
+ /*****
+  * Dynamic cast from a class object o to class type `To`, where `To` is a subclass type of `o`.
+  * Params:
+  *      o = instance of class
+  *      To = a subclass type of o
+  * Returns:
+  *      null if `o` is null or `To` is not a subclass type of `o`. Otherwise, return `o`.
+  */
+ private void* _d_class_cast(To)(const return scope Object o)
+ {
+     return _d_class_cast_impl(o, typeid(To));
+ }
+ 
+ /*************************************
+  * Attempts to cast interface Object o to class type `To`.
+  * Returns o if successful, null if not.
+  */
+ private void* _d_interface_cast(To)(void* p) @trusted
+ {
+     if (!p)
+         return null;
+ 
+     Interface* pi = **cast(Interface***) p;
+ 
+     Object o2 = cast(Object)(p - pi.offset);
+     void* res = null;
+     size_t offset = 0;
+     if (o2 && _d_isbaseof2!To(typeid(o2), offset))
+     {
+         res = cast(void*) o2 + offset;
+     }
+     return res;
+ }
+ 
+ /**
+ * Hook that detects the type of cast performed and calls the appropriate function.
+ * Params:
+ *      o = object that is being casted
+ *      To = type to which the object is being casted
+ * Returns:
+ *      null if the cast fails, otherwise returns the object casted to the type `To`.
+ */
+ void* _d_cast(To, From)(From o) @trusted
+ {
+     static if (is(From == class) && is(To == interface))
+     {
+         return _d_dynamic_cast!To(o);
+     }
+ 
+     static if (is(From == class) && is(To == class))
+     {
+         static if (is(From FromSupers == super) && is(To ToSupers == super))
+         {
+             /* Check for:
+             *  class A { }
+             *  final class B : A { }
+             *  ... cast(B) A ...
+             */
+             // Multiple inheritance is not allowed, so we can safely assume
+             // that the second super can only be an interface.
+             static if (__traits(isFinalClass, To) && is(ToSupers[0] == From) &&
+                        ToSupers.length == 1 && FromSupers.length <= 1)
+             {
+                 return _d_paint_cast!To(o);
+             }
+         }
+ 
+         static if (is (To : From))
+         {
+             static if (is (To == From))
+             {
+                 return cast(void*)o;
+             }
+             else
+             {
+                 return _d_class_cast!To(o);
+             }
+         }
+ 
+         return null;
+     }
+ 
+     static if (is(From == interface))
+     {
+         static if (is(From == To))
+         {
+             return cast(void*)o;
+         }
+         else
+         {
+             return _d_interface_cast!To(cast(void*)o);
+         }
+     }
+     else
+     {
+         return null;
+     }
+ }
+ 
+ private bool _d_isbaseof2(To)(scope ClassInfo oc, scope ref size_t offset)
+ {
+     auto c = typeid(To).info;
+ 
+     if (areClassInfosEqual(oc, c))
+         return true;
+ 
+     do
+     {
+         if (oc.base && areClassInfosEqual(oc.base, c))
+             return true;
+ 
+         // Bugzilla 2013: Use depth-first search to calculate offset
+         // from the derived (oc) to the base (c).
+         foreach (iface; oc.interfaces)
+         {
+             if (areClassInfosEqual(iface.classinfo, c) || _d_isbaseof2!To(iface.classinfo, offset))
+             {
+                 offset += iface.offset;
+                 return true;
+             }
+         }
+ 
+         oc = oc.base;
+     } while (oc);
+ 
+     return false;
+ }
+ 
+ @safe pure unittest
+ {
+     interface I {}
+ 
+     class A {}
+     class B : A {}
+     class C : B, I{}
+ 
+     A ac = new C();
+     assert(_d_cast!I(ac) !is null); // A(c) to I
+     assert(_d_dynamic_cast!I(ac) !is null);
+ 
+     A ab = new B();
+     assert(_d_cast!I(ab) is null); // A(b) to I
+     assert(_d_dynamic_cast!I(ab) is null);
+ }
+ 
+ @safe pure unittest
+ {
+     class A {}
+     class B : A {}
+     class C : B {}
+     final class D : C {}
+ 
+     C cd = new D();
+     assert(_d_cast!D(cd) !is null); // C(d) to D
+     assert(_d_paint_cast!D(cd) !is null);
+ 
+     class G {}
+     final class J {}
+     A a = new A();
+     assert(_d_cast!G(a) is null); // A(a) to G
+     assert(_d_paint_cast!G(a) is null);
+ 
+     assert(_d_cast!J(a) is null); // A(a) to J
+     assert(_d_paint_cast!J(a) is null);
+ }
+ 
+ @safe pure unittest
+ {
+     class A {}
+     class B : A {}
+     class C : B {}
+     class D {}
+ 
+     A ac = new C();
+     assert(_d_cast!C(ac) !is null); // A(c) to C
+     assert(_d_class_cast!C(ac) !is null);
+ 
+     assert(_d_cast!B(ac) !is null); // A(c) to B
+     assert(_d_class_cast!B(ac) !is null);
+ 
+     A ab = new B();
+     assert(_d_cast!C(ab) is null); // A(b) to C
+     assert(_d_class_cast!C(ab) is null);
+ 
+     A a = new A();
+     assert(_d_cast!D(a) is null); // A(a) to D
+     assert(_d_class_cast!D(a) is null);
+ }
+ 
+ @safe pure unittest
+ {
+     interface I1 {}
+     interface I2 {}
+     interface I3 {}
+     class A {}
+     class B : A, I1, I2 {}
+     class C : B, I3 {}
+ 
+     I1 bi = new B();
+     assert(_d_cast!I2(bi) !is null); // I1(b) to I2
+     assert(_d_interface_cast!I2(cast(void*)bi) !is null);
+ 
+     assert(_d_cast!A(bi) !is null); // I1(b) to A
+     assert(_d_interface_cast!A(cast(void*)bi) !is null);
+ 
+     assert(_d_cast!B(bi) !is null); // I1(b) to B
+     assert(_d_interface_cast!B(cast(void*)bi) !is null);
+ 
+     assert(_d_cast!I3(bi) is null); // I1(b) to I3
+     assert(_d_interface_cast!I3(cast(void*)bi) is null);
+ 
+     assert(_d_cast!C(bi) is null); // I1(b) to C
+     assert(_d_interface_cast!C(cast(void*)bi) is null);
+ 
+     assert(_d_cast!I1(bi) !is null); // I1(b) to I1
+     assert(_d_interface_cast!I1(cast(void*)bi) !is null);
+ 
+     I3 ci = new C();
+     assert(_d_cast!I1(ci) !is null); // I3(c) to I1
+     assert(_d_interface_cast!I1(cast(void*)ci) !is null);
+ }
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/core/internal/convert.d gcc-16-20260201/libphobos/libdruntime/core/internal/convert.d
*** gcc-16-20260125/libphobos/libdruntime/core/internal/convert.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/core/internal/convert.d	Sun Feb  1 22:32:17 2026
*************** package template floatSize(T) if (is(T:r
*** 647,652 ****
--- 647,653 ----
  @trusted pure nothrow @nogc
  const(ubyte)[] toUbyte(T)(return scope const T[] arr) if (T.sizeof == 1)
  {
+     pragma(inline, true);
      return cast(const(ubyte)[])arr;
  }
  
*************** const(ubyte)[] toUbyte(T)(const ref scop
*** 687,692 ****
--- 688,694 ----
  {
      static if (T.sizeof == 1)
      {
+         pragma(inline, true);
          if (__ctfe)
          {
              ubyte[] result = ctfe_alloc(1);
*************** const(ubyte)[] toUbyte(T)(const ref scop
*** 722,727 ****
--- 724,730 ----
  @trusted pure nothrow @nogc
  const(ubyte)[] toUbyte(T)(const ref scope T val) if (is(T == __vector))
  {
+     pragma(inline, true);
      if (!__ctfe)
          return (cast(const ubyte*) &val)[0 .. T.sizeof];
      else static if (is(typeof(val[0]) : void))
*************** const(ubyte)[] toUbyte(T)(const ref scop
*** 744,749 ****
--- 747,753 ----
  @trusted pure nothrow @nogc
  const(ubyte)[] toUbyte(T)(const ref return scope T val) if (is(T == enum))
  {
+     pragma(inline, true);
      if (__ctfe)
      {
          static if (is(T V == enum)){}
*************** nothrow pure @safe unittest
*** 767,772 ****
--- 771,777 ----
  @trusted pure nothrow @nogc
  const(ubyte)[] toUbyte(T)(const ref T val) if (is(T == delegate) || is(T : V*, V) && __traits(getAliasThis, T).length == 0)
  {
+     pragma(inline, true);
      if (__ctfe)
      {
          if (val !is null) assert(0, "Unable to compute byte representation of non-null pointer at compile time");
*************** const(ubyte)[] toUbyte(T)(const ref T va
*** 781,786 ****
--- 786,792 ----
  @trusted pure nothrow @nogc
  const(ubyte)[] toUbyte(T)(const return ref scope T val) if (is(T == struct) || is(T == union))
  {
+     pragma(inline, true);
      if (__ctfe)
      {
          ubyte[] bytes = ctfe_alloc(T.sizeof);
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/core/internal/gc/blkcache.d gcc-16-20260201/libphobos/libdruntime/core/internal/gc/blkcache.d
*** gcc-16-20260125/libphobos/libdruntime/core/internal/gc/blkcache.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/core/internal/gc/blkcache.d	Sun Feb  1 22:32:17 2026
*************** else
*** 63,79 ****
  }
  
  // free the allocation on thread exit.
! @standalone static ~this()
  {
!     if (__blkcache_storage)
      {
          import core.stdc.stdlib : free;
!         import core.thread.threadbase;
!         auto tBase = ThreadBase.getThis();
!         if (tBase !is null)
!             tBase.tlsGCData = null;
!         free(__blkcache_storage);
!         __blkcache_storage = null;
      }
  }
  
--- 63,78 ----
  }
  
  // free the allocation on thread exit.
! void cleanupBlkCache(void* storage) nothrow @nogc
  {
!     if (storage)
      {
+         // check if this is the same thread as the current running thread, and
+         // if so, make sure we don't leave a dangling pointer.
+         if (__blkcache_storage is storage)
+             __blkcache_storage = null;
          import core.stdc.stdlib : free;
!         free(storage);
      }
  }
  
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/core/internal/gc/impl/conservative/gc.d gcc-16-20260201/libphobos/libdruntime/core/internal/gc/impl/conservative/gc.d
*** gcc-16-20260125/libphobos/libdruntime/core/internal/gc/impl/conservative/gc.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/core/internal/gc/impl/conservative/gc.d	Sun Feb  1 22:32:17 2026
*************** class ConservativeGC : GC
*** 1532,1538 ****
              return false;
  
          // try extending the block into subsequent pages.
!         immutable requiredExtension = newUsed - info.size - LARGEPAD;
          auto extendedSize = extend(info.base, requiredExtension, requiredExtension, null);
          if (extendedSize == 0)
              // could not extend, can't satisfy the request
--- 1532,1538 ----
              return false;
  
          // try extending the block into subsequent pages.
!         immutable requiredExtension = newUsed - (info.size - LARGEPAD);
          auto extendedSize = extend(info.base, requiredExtension, requiredExtension, null);
          if (extendedSize == 0)
              // could not extend, can't satisfy the request
*************** class ConservativeGC : GC
*** 1637,1642 ****
--- 1637,1650 ----
  
          return existingCapacity - offset;
      }
+ 
+     void initThread(ThreadBase t) nothrow @nogc { }
+ 
+     void cleanupThread(ThreadBase t) nothrow @nogc
+     {
+         cleanupBlkCache(t.tlsGCData);
+         t.tlsGCData = null;
+     }
  }
  
  
*************** struct Gcx
*** 1862,1869 ****
  
          roots.removeAll();
          ranges.removeAll();
!         toscanConservative.reset();
!         toscanPrecise.reset();
      }
  
  
--- 1870,1876 ----
  
          roots.removeAll();
          ranges.removeAll();
!         scanStackConservative.reset(); // scanStackPrecise overlaps with scanStackConservative
      }
  
  
*************** struct Gcx
*** 2427,2440 ****
      {
      nothrow:
          @disable this(this);
-         auto stackLock = shared(AlignedSpinLock)(SpinLock.Contention.brief);
  
          void reset()
          {
              _length = 0;
              if (_p)
              {
!                 os_mem_unmap(_p, _cap * RANGE.sizeof);
                  _p = null;
              }
              _cap = 0;
--- 2434,2446 ----
      {
      nothrow:
          @disable this(this);
  
          void reset()
          {
              _length = 0;
              if (_p)
              {
!                 os_mem_unmap(_p, _cap);
                  _p = null;
              }
              _cap = 0;
*************** struct Gcx
*** 2446,2484 ****
  
          void push(RANGE rng)
          {
!             if (_length == _cap) grow();
!             _p[_length++] = rng;
!         }
! 
!         RANGE pop()
!         in { assert(!empty); }
!         do
!         {
!             return _p[--_length];
          }
  
!         bool popLocked(ref RANGE rng)
          {
!             if (_length == 0)
!                 return false;
  
!             stackLock.lock();
!             scope(exit) stackLock.unlock();
!             if (_length == 0)
!                 return false;
!             rng = _p[--_length];
!             return true;
          }
  
!         ref inout(RANGE) opIndex(size_t idx) inout
!         in { assert(idx < _length); }
          do
          {
!             return _p[idx];
          }
  
!         @property size_t length() const { return _length; }
!         @property bool empty() const { return !length; }
  
      private:
          void grow()
--- 2452,2482 ----
  
          void push(RANGE rng)
          {
!             if ((_length + 1) * RANGE.sizeof > _cap) grow();
!             _p[_length] = rng;
!             _length++;
          }
  
!         void pushReverse(RANGE[] ranges)
          {
!             while ((_length + ranges.length) * RANGE.sizeof > _cap)
!                 grow();
  
!             // reverse order for depth-first-order traversal
!             foreach_reverse (ref range; ranges)
!                 _p[_length++] = range;
          }
  
!         void pop(ref RANGE rng)
!         in { assert(_length > 0); }
          do
          {
!             rng = _p[--_length];
          }
  
!         @property bool empty() const { return !_length; }
!         size_t length() const { return _length; }
!         RANGE* ptr() { return _p; }
  
      private:
          void grow()
*************** struct Gcx
*** 2486,2499 ****
              pragma(inline, false);
  
              enum initSize = 64 * 1024; // Windows VirtualAlloc granularity
!             immutable ncap = _cap ? 2 * _cap : initSize / RANGE.sizeof;
!             auto p = cast(RANGE*)os_mem_map(ncap * RANGE.sizeof);
              if (p is null) onOutOfMemoryError();
              debug (VALGRIND) makeMemUndefined(p[0..ncap]);
              if (_p !is null)
              {
                  p[0 .. _length] = _p[0 .. _length];
!                 os_mem_unmap(_p, _cap * RANGE.sizeof);
              }
              _p = p;
              _cap = ncap;
--- 2484,2497 ----
              pragma(inline, false);
  
              enum initSize = 64 * 1024; // Windows VirtualAlloc granularity
!             immutable ncap = _cap ? 2 * _cap : initSize;
!             auto p = cast(RANGE*)os_mem_map(ncap);
              if (p is null) onOutOfMemoryError();
              debug (VALGRIND) makeMemUndefined(p[0..ncap]);
              if (_p !is null)
              {
                  p[0 .. _length] = _p[0 .. _length];
!                 os_mem_unmap(_p, _cap);
              }
              _p = p;
              _cap = ncap;
*************** struct Gcx
*** 2501,2518 ****
  
          size_t _length;
          RANGE* _p;
!         size_t _cap;
      }
  
!     ToScanStack!(ScanRange!false) toscanConservative;
!     ToScanStack!(ScanRange!true) toscanPrecise;
! 
      template scanStack(bool precise)
      {
          static if (precise)
!             alias scanStack = toscanPrecise;
          else
!             alias scanStack = toscanConservative;
      }
  
      /**
--- 2499,2518 ----
  
          size_t _length;
          RANGE* _p;
!         size_t _cap; // in bytes
      }
  
!     union
!     {
!         ToScanStack!(ScanRange!false) scanStackConservative;
!         ToScanStack!(ScanRange!true) scanStackPrecise;
!     }
      template scanStack(bool precise)
      {
          static if (precise)
!             alias scanStack = scanStackPrecise;
          else
!             alias scanStack = scanStackConservative;
      }
  
      /**
*************** struct Gcx
*** 2520,2531 ****
       */
      private void mark(bool precise, bool parallel, bool shared_mem)(ScanRange!precise rng) scope nothrow
      {
-         alias toscan = scanStack!precise;
- 
          debug(MARK_PRINTF)
              printf("marking range: [%p..%p] (%#llx)\n", rng.pbot, rng.ptop, cast(long)(rng.ptop - rng.pbot));
  
!         // limit the amount of ranges added to the toscan stack
          enum FANOUT_LIMIT = 32;
          size_t stackPos;
          ScanRange!precise[FANOUT_LIMIT] stack = void;
--- 2520,2529 ----
       */
      private void mark(bool precise, bool parallel, bool shared_mem)(ScanRange!precise rng) scope nothrow
      {
          debug(MARK_PRINTF)
              printf("marking range: [%p..%p] (%#llx)\n", rng.pbot, rng.ptop, cast(long)(rng.ptop - rng.pbot));
  
!         // limit the amount of ranges added to the scan stack
          enum FANOUT_LIMIT = 32;
          size_t stackPos;
          ScanRange!precise[FANOUT_LIMIT] stack = void;
*************** struct Gcx
*** 2706,2721 ****
              {
                  static if (parallel)
                  {
!                     if (!toscan.popLocked(rng))
                          break; // nothing more to do
                  }
                  else
                  {
!                     if (toscan.empty)
                          break; // nothing more to do
  
                      // pop range from global stack and recurse
!                     rng = toscan.pop();
                  }
              }
              // printf("  pop [%p..%p] (%#zx)\n", p1, p2, cast(size_t)p2 - cast(size_t)p1);
--- 2704,2719 ----
              {
                  static if (parallel)
                  {
!                     if (!scanStackPopLocked(rng))
                          break; // nothing more to do
                  }
                  else
                  {
!                     if (scanStack!precise.empty)
                          break; // nothing more to do
  
                      // pop range from global stack and recurse
!                     scanStack!precise.pop(rng);
                  }
              }
              // printf("  pop [%p..%p] (%#zx)\n", p1, p2, cast(size_t)p2 - cast(size_t)p1);
*************** struct Gcx
*** 2725,2746 ****
              rng.pbot += (void*).sizeof;
              if (rng.pbot < rng.ptop)
              {
!                 if (stackPos < stack.length)
!                 {
!                     stack[stackPos] = tgt;
!                     stackPos++;
!                     continue;
!                 }
!                 static if (parallel)
                  {
!                     toscan.stackLock.lock();
!                     scope(exit) toscan.stackLock.unlock();
                  }
!                 toscan.push(rng);
!                 // reverse order for depth-first-order traversal
!                 foreach_reverse (ref range; stack)
!                     toscan.push(range);
!                 stackPos = 0;
              }
          LendOfRange:
              // continue with last found range
--- 2723,2743 ----
              rng.pbot += (void*).sizeof;
              if (rng.pbot < rng.ptop)
              {
!                 if (stackPos >= stack.length)
                  {
!                     static if (parallel)
!                     {
!                         scanStackPushLocked!precise(stack);
!                     }
!                     else
!                     {
!                         scanStack!precise.pushReverse(stack);
!                     }
!                     stackPos = 0;
                  }
!                 stack[stackPos] = tgt;
!                 stackPos++;
!                 continue;
              }
          LendOfRange:
              // continue with last found range
*************** Lmark:
*** 3526,3533 ****
                          Gcx.instance.numScanThreads = 0;
                          Gcx.instance.scanThreadData = null;
                          Gcx.instance.busyThreads = 0;
  
!                         memset(&Gcx.instance.evStart, 0, Gcx.instance.evStart.sizeof);
                          memset(&Gcx.instance.evDone, 0, Gcx.instance.evDone.sizeof);
                      }
                  }
--- 3523,3531 ----
                          Gcx.instance.numScanThreads = 0;
                          Gcx.instance.scanThreadData = null;
                          Gcx.instance.busyThreads = 0;
+                         Gcx.instance.stackLock = shared(AlignedSpinLock)(SpinLock.Contention.brief);
  
!                         memset(&Gcx.instance.evStackFilled, 0, Gcx.instance.evStackFilled.sizeof);
                          memset(&Gcx.instance.evDone, 0, Gcx.instance.evDone.sizeof);
                      }
                  }
*************** Lmark:
*** 3551,3562 ****
      uint numScanThreads;
      ScanThreadData* scanThreadData;
  
!     Event evStart;
      Event evDone;
  
      shared uint busyThreads;
      shared uint stoppedThreads;
!     bool stopGC;
  
      void markParallel() nothrow
      {
--- 3549,3560 ----
      uint numScanThreads;
      ScanThreadData* scanThreadData;
  
!     Event evStackFilled;
      Event evDone;
  
      shared uint busyThreads;
      shared uint stoppedThreads;
!     shared bool stopGC;
  
      void markParallel() nothrow
      {
*************** Lmark:
*** 3565,3589 ****
          if (toscanRoots.empty)
              return;
  
!         void** pbot = toscanRoots._p;
!         void** ptop = toscanRoots._p + toscanRoots._length;
  
          debug(PARALLEL_PRINTF) printf("markParallel\n");
  
!         size_t pointersPerThread = toscanRoots._length / (numScanThreads + 1);
          if (pointersPerThread > 0)
          {
              void pushRanges(bool precise)()
              {
!                 alias toscan = scanStack!precise;
!                 toscan.stackLock.lock();
  
                  for (int idx = 0; idx < numScanThreads; idx++)
                  {
!                     toscan.push(ScanRange!precise(pbot, pbot + pointersPerThread));
                      pbot += pointersPerThread;
                  }
!                 toscan.stackLock.unlock();
              }
              if (ConservativeGC.isPrecise)
                  pushRanges!true();
--- 3563,3586 ----
          if (toscanRoots.empty)
              return;
  
!         auto pbot = toscanRoots.ptr;
!         auto ptop = pbot + toscanRoots.length;
  
          debug(PARALLEL_PRINTF) printf("markParallel\n");
  
!         size_t pointersPerThread = toscanRoots.length / (numScanThreads + 1);
          if (pointersPerThread > 0)
          {
              void pushRanges(bool precise)()
              {
!                 stackLock.lock();
  
                  for (int idx = 0; idx < numScanThreads; idx++)
                  {
!                     scanStack!precise.push(ScanRange!precise(pbot, pbot + pointersPerThread));
                      pbot += pointersPerThread;
                  }
!                 stackLock.unlock();
              }
              if (ConservativeGC.isPrecise)
                  pushRanges!true();
*************** Lmark:
*** 3592,3612 ****
          }
          assert(pbot < ptop);
  
!         busyThreads.atomicOp!"+="(1); // main thread is busy
! 
!         evStart.setIfInitialized();
  
          debug(PARALLEL_PRINTF) printf("mark %lld roots\n", cast(ulong)(ptop - pbot));
  
          if (ConservativeGC.isPrecise)
!             mark!(true, true, true)(ScanRange!true(pbot, ptop, null));
          else
!             mark!(false, true, true)(ScanRange!false(pbot, ptop));
! 
!         busyThreads.atomicOp!"-="(1);
  
-         debug(PARALLEL_PRINTF) printf("waitForScanDone\n");
-         pullFromScanStack();
          debug(PARALLEL_PRINTF) printf("waitForScanDone done\n");
      }
  
--- 3589,3610 ----
          }
          assert(pbot < ptop);
  
!         evStackFilled.setIfInitialized(); // background threads start now
  
          debug(PARALLEL_PRINTF) printf("mark %lld roots\n", cast(ulong)(ptop - pbot));
  
+         void pullLoop(bool precise)()
+         {
+             mark!(precise, true, true)(ScanRange!precise(pbot, ptop));
+ 
+             while (pullFromScanStackImpl!precise())
+                 evDone.wait(1.msecs);
+         }
          if (ConservativeGC.isPrecise)
!             pullLoop!(true)();
          else
!             pullLoop!(false)();
  
          debug(PARALLEL_PRINTF) printf("waitForScanDone done\n");
      }
  
*************** Lmark:
*** 3654,3660 ****
          if (!scanThreadData)
              onOutOfMemoryError();
  
!         evStart.initialize(false, false);
          evDone.initialize(false, false);
  
          version (Posix)
--- 3652,3658 ----
          if (!scanThreadData)
              onOutOfMemoryError();
  
!         evStackFilled.initialize(true, false);
          evDone.initialize(false, false);
  
          version (Posix)
*************** Lmark:
*** 3696,3703 ****
          stopGC = true;
          while (atomicLoad(stoppedThreads) < startedThreads && !allThreadsDead)
          {
!             evStart.setIfInitialized();
!             evDone.wait(dur!"msecs"(1));
          }
  
          for (int idx = 0; idx < numScanThreads; idx++)
--- 3694,3701 ----
          stopGC = true;
          while (atomicLoad(stoppedThreads) < startedThreads && !allThreadsDead)
          {
!             evStackFilled.setIfInitialized();
!             evDone.wait(1.msecs);
          }
  
          for (int idx = 0; idx < numScanThreads; idx++)
*************** Lmark:
*** 3709,3716 ****
              }
          }
  
          evDone.terminate();
-         evStart.terminate();
  
          cstdlib.free(scanThreadData);
          // scanThreadData = null; // keep non-null to not start again after shutdown
--- 3707,3714 ----
              }
          }
  
+         evStackFilled.terminate();
          evDone.terminate();
  
          cstdlib.free(scanThreadData);
          // scanThreadData = null; // keep non-null to not start again after shutdown
*************** Lmark:
*** 3723,3748 ****
      {
          while (!stopGC)
          {
!             evStart.wait();
              pullFromScanStack();
!             evDone.setIfInitialized();
          }
          stoppedThreads.atomicOp!"+="(1);
      }
  
!     void pullFromScanStack() nothrow
      {
          if (ConservativeGC.isPrecise)
!             pullFromScanStackImpl!true();
          else
!             pullFromScanStackImpl!false();
      }
  
!     void pullFromScanStackImpl(bool precise)() nothrow
      {
-         if (atomicLoad(busyThreads) == 0)
-             return;
- 
          version (Posix) debug (PARALLEL_PRINTF)
          {
              import core.sys.posix.pthread : pthread_self, pthread_t;
--- 3721,3744 ----
      {
          while (!stopGC)
          {
!             evStackFilled.wait();
              pullFromScanStack();
!             evDone.setIfInitialized(); // tell main loop we are done
          }
          stoppedThreads.atomicOp!"+="(1);
+         evDone.setIfInitialized(); // wake up main
      }
  
!     bool pullFromScanStack() nothrow
      {
          if (ConservativeGC.isPrecise)
!             return pullFromScanStackImpl!true();
          else
!             return pullFromScanStackImpl!false();
      }
  
!     bool pullFromScanStackImpl(bool precise)() nothrow
      {
          version (Posix) debug (PARALLEL_PRINTF)
          {
              import core.sys.posix.pthread : pthread_self, pthread_t;
*************** Lmark:
*** 3751,3779 ****
          }
  
          ScanRange!precise rng;
-         alias toscan = scanStack!precise;
  
!         while (atomicLoad(busyThreads) > 0)
          {
-             if (toscan.empty)
-             {
-                 evDone.wait(dur!"msecs"(1));
-                 continue;
-             }
- 
              busyThreads.atomicOp!"+="(1);
!             if (toscan.popLocked(rng))
              {
!                 version (Posix) debug (PARALLEL_PRINTF)
!                 {
!                     printf("scanBackground thread %d scanning range [%p,%lld] from stack\n",
!                         threadId, rng.pbot, cast(long) (rng.ptop - rng.pbot));
!                 }
!                 mark!(precise, true, true)(rng);
              }
              busyThreads.atomicOp!"-="(1);
          }
          version (Posix) debug (PARALLEL_PRINTF) printf("scanBackground thread %d done\n", threadId);
      }
  }
  
--- 3747,3806 ----
          }
  
          ScanRange!precise rng;
  
!         stackLock.lock();
!         while (!scanStack!precise.empty())
          {
              busyThreads.atomicOp!"+="(1);
!             scanStack!precise.pop(rng);
!             if (scanStack!precise.empty)
!                 evStackFilled.reset();
!             stackLock.unlock();
! 
!             version (Posix) debug (PARALLEL_PRINTF)
              {
!                 printf("scanBackground thread %d scanning range [%p,%lld] from stack\n",
!                     threadId, rng.pbot, cast(long) (rng.ptop - rng.pbot));
              }
+             mark!(precise, true, true)(rng);
+             // returns here only if an empty scan stack has been seen
+ 
+             stackLock.lock();
              busyThreads.atomicOp!"-="(1);
          }
+         bool cont = busyThreads > 0;
+         stackLock.unlock();
+ 
          version (Posix) debug (PARALLEL_PRINTF) printf("scanBackground thread %d done\n", threadId);
+         return cont;
+     }
+ 
+     auto stackLock = shared(AlignedSpinLock)(SpinLock.Contention.brief);
+ 
+     void scanStackPushLocked(bool precise)(ScanRange!precise[] ranges)
+     {
+         stackLock.lock();
+         scope(exit) stackLock.unlock();
+         bool wasEmpty = scanStack!precise.empty;
+ 
+         scanStack!precise.pushReverse(ranges);
+ 
+         if (wasEmpty)
+             evStackFilled.setIfInitialized();
+     }
+ 
+     bool scanStackPopLocked(bool precise)(ref ScanRange!precise rng)
+     {
+         stackLock.lock();
+         scope(exit) stackLock.unlock();
+         if (scanStack!precise.empty())
+             return false;
+ 
+         scanStack!precise.pop(rng);
+ 
+         if (scanStack!precise.empty())
+             evStackFilled.reset();
+         return true;
      }
  }
  
*************** unittest
*** 5366,5371 ****
--- 5393,5418 ----
      }
  }
  
+ // https://github.com/dlang/dmd/issues/21615
+ debug(SENTINEL) {} else // no additional capacity with SENTINEL
+ @safe unittest
+ {
+     size_t numReallocations = 0;
+     ubyte[] buffer = new ubyte[4096];
+     auto p = &buffer[0];
+     foreach (i; 0 .. 1000) {
+         buffer.length += 4096;
+         if (p !is &buffer[0])
+         {
+             ++numReallocations;
+             p = &buffer[0];
+         }
+     }
+ 
+     // pick a decently small number, it's unclear where this memory will start out.
+     assert(numReallocations <= 5);
+ }
+ 
  /* ============================ MEMSTOMP =============================== */
  
  /// Mark the specified memory region as uninitialized -
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/core/internal/gc/impl/manual/gc.d gcc-16-20260201/libphobos/libdruntime/core/internal/gc/impl/manual/gc.d
*** gcc-16-20260125/libphobos/libdruntime/core/internal/gc/impl/manual/gc.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/core/internal/gc/impl/manual/gc.d	Sun Feb  1 22:32:17 2026
*************** import core.gc.gcinterface;
*** 23,28 ****
--- 23,30 ----
  
  import core.internal.container.array;
  
+ import core.thread.threadbase : ThreadBase;
+ 
  import cstdlib = core.stdc.stdlib : calloc, free, malloc, realloc;
  static import core.memory;
  
*************** class ManualGC : GC
*** 287,290 ****
--- 289,300 ----
      {
          return false;
      }
+ 
+     void initThread(ThreadBase t) nothrow @nogc
+     {
+     }
+ 
+     void cleanupThread(ThreadBase t) nothrow @nogc
+     {
+     }
  }
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/core/internal/gc/impl/proto/gc.d gcc-16-20260201/libphobos/libdruntime/core/internal/gc/impl/proto/gc.d
*** gcc-16-20260125/libphobos/libdruntime/core/internal/gc/impl/proto/gc.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/core/internal/gc/impl/proto/gc.d	Sun Feb  1 22:32:17 2026
*************** module core.internal.gc.impl.proto.gc;
*** 3,8 ****
--- 3,12 ----
  
  import core.gc.gcinterface;
  
+ import core.gc.registry : GCThreadInitFunction, threadInit;
+ 
+ import core.thread.threadbase : ThreadBase;
+ 
  import core.internal.container.array;
  
  import cstdlib = core.stdc.stdlib : calloc, free, malloc, realloc;
*************** private
*** 28,38 ****
--- 32,46 ----
      extern (C) void gc_addRoot(const void* p ) nothrow @nogc;
  }
  
+ 
  class ProtoGC : GC
  {
      Array!Root roots;
      Array!Range ranges;
  
+     // stored on first use, which should be called whenever rt_init is called.
+     private GCThreadInitFunction _initThreadFn;
+ 
      // Call this function when initializing the real GC
      // upon ProtoGC term. This function should be called
      // after the real GC is in place.
*************** class ProtoGC : GC
*** 261,264 ****
--- 269,291 ----
      {
          return false;
      }
+ 
+     void initThread(ThreadBase thread) nothrow
+     {
+         if (_initThreadFn is null)
+         {
+             static void defaultThreadInit(ThreadBase base) nothrow @nogc { }
+             import core.gc.config;
+             config.initialize();
+             _initThreadFn = .threadInit(config.gc);
+             if (_initThreadFn is null)
+                 _initThreadFn = &defaultThreadInit;
+         }
+ 
+         _initThreadFn(thread);
+     }
+ 
+     void cleanupThread(ThreadBase thread)
+     {
+     }
  }
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/core/internal/gc/proxy.d gcc-16-20260201/libphobos/libdruntime/core/internal/gc/proxy.d
*** gcc-16-20260125/libphobos/libdruntime/core/internal/gc/proxy.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/core/internal/gc/proxy.d	Sun Feb  1 22:32:17 2026
*************** extern (C)
*** 266,272 ****
          return instance.shrinkArrayUsed( slice, existingUsed, atomic );
      }
  
!     GC gc_getProxy() nothrow
      {
          return instance;
      }
--- 266,272 ----
          return instance.shrinkArrayUsed( slice, existingUsed, atomic );
      }
  
!     GC gc_getProxy() nothrow @nogc
      {
          return instance;
      }
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/core/internal/hash.d gcc-16-20260201/libphobos/libdruntime/core/internal/hash.d
*** gcc-16-20260125/libphobos/libdruntime/core/internal/hash.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/core/internal/hash.d	Sun Feb  1 22:32:17 2026
*************** private template canBitwiseHash(T)
*** 132,137 ****
--- 132,138 ----
  size_t hashOf(T)(auto ref T val, size_t seed = 0)
  if (is(T == enum) && !__traits(isScalar, T))
  {
+     pragma(inline, true);
      static if (is(T EType == enum)) {} //for EType
      return hashOf(cast(EType) val, seed);
  }
*************** if (is(T == enum) && !__traits(isScalar,
*** 140,145 ****
--- 141,147 ----
  size_t hashOf(T)(scope const auto ref T val, size_t seed = 0)
  if (!is(T == enum) && __traits(isStaticArray, T) && canBitwiseHash!T)
  {
+     pragma(inline, true);
      import core.internal.convert : toUbyte;
      // FIXME:
      // We would like to to do this:
*************** if (!is(T == enum) && __traits(isStaticA
*** 173,178 ****
--- 175,181 ----
  size_t hashOf(T)(auto ref T val, size_t seed = 0)
  if (!is(T == enum) && __traits(isStaticArray, T) && !canBitwiseHash!T)
  {
+     pragma(inline, true);
      // FIXME:
      // We would like to to do this:
      //
*************** if (is(T == S[], S) && (__traits(isScala
*** 207,216 ****
--- 210,221 ----
      else static if (is(typeof(toUbyte(val)) == const(ubyte)[]))
      //ubyteble array (arithmetic types and structs without toHash) CTFE ready for arithmetic types and structs without reference fields
      {
+         pragma(inline, true);
          return bytesHashAlignedBy!ElementType(toUbyte(val), seed);
      }
      else //Other types. CTFE unsupported
      {
+         pragma(inline, true);
          assert(!__ctfe, "unable to compute hash of "~T.stringof~" at compile time");
          return bytesHashAlignedBy!ElementType((cast(const(ubyte)*) val.ptr)[0 .. ElementType.sizeof*val.length], seed);
      }
*************** size_t hashOf(T)(scope const T val) if (
*** 258,263 ****
--- 263,269 ----
      else static if (is(T EType == enum) && is(typeof(val[0])))
      {
          // Enum type whose base type is vector.
+         pragma(inline, true);
          return hashOf(cast(EType) val);
      }
      else static if (__traits(isIntegral, T))
*************** size_t hashOf(T)(scope const T val, size
*** 293,298 ****
--- 299,305 ----
  {
      static if (is(T V : V*))
      {
+         pragma(inline, true);
          if (__ctfe)
          {
              if (val is null) return hashOf(size_t(0), seed);
*************** size_t hashOf(T)(scope const T val, size
*** 303,308 ****
--- 310,316 ----
      else static if (is(T EType == enum) && is(typeof(val[0])))
      {
          // Enum type whose base type is vector.
+         pragma(inline, true);
          return hashOf(cast(EType) val, seed);
      }
      else static if (__traits(isIntegral, val) && T.sizeof <= size_t.sizeof)
*************** if (is(T == __vector)) // excludes enum
*** 379,384 ****
--- 387,393 ----
      }
      else
      {
+         pragma(inline, true);
          import core.internal.convert : toUbyte;
          return bytesHashAlignedBy!T(toUbyte(val), seed);
      }
*************** if (is(T == __vector)) // excludes enum
*** 388,393 ****
--- 397,403 ----
  @trusted @nogc nothrow pure
  size_t hashOf(T)(scope const T val) if (!is(T == enum) && is(T : typeof(null)))
  {
+     pragma(inline, true);
      return 0;
  }
  
*************** size_t hashOf(T)(scope const T val) if (
*** 395,400 ****
--- 405,411 ----
  @trusted @nogc nothrow pure
  size_t hashOf(T)(scope const T val, size_t seed) if (!is(T == enum) && is(T : typeof(null)))
  {
+     pragma(inline, true);
      return hashOf(size_t(0), seed);
  }
  
*************** if (!is(T == enum) && (is(T == struct) |
*** 572,577 ****
--- 583,589 ----
  @trusted @nogc nothrow pure
  size_t hashOf(T)(scope const T val, size_t seed = 0) if (!is(T == enum) && is(T == delegate))
  {
+     pragma(inline, true);
      if (__ctfe)
      {
          if (val is null) return hashOf(size_t(0), hashOf(size_t(0), seed));
*************** size_t hashOf(T)(scope const T val)
*** 586,591 ****
--- 598,604 ----
  if (!is(T == enum) && (is(T == interface) || is(T == class))
      && canBitwiseHash!T)
  {
+     pragma(inline, true);
      if (__ctfe) if (val is null) return 0;
      return hashOf(cast(const void*) val);
  }
*************** size_t hashOf(T)(scope const T val, size
*** 596,601 ****
--- 609,615 ----
  if (!is(T == enum) && (is(T == interface) || is(T == class))
      && canBitwiseHash!T)
  {
+     pragma(inline, true);
      if (__ctfe) if (val is null) return hashOf(size_t(0), seed);
      return hashOf(cast(const void*) val, seed);
  }
*************** size_t hashOf(T)(T aa, size_t seed) if (
*** 664,669 ****
--- 678,684 ----
  @system pure nothrow @nogc
  size_t bytesHash()(scope const(void)* buf, size_t len, size_t seed)
  {
+     pragma(inline, true);
      return bytesHashAlignedBy!ubyte((cast(const(ubyte)*) buf)[0 .. len], seed);
  }
  
*************** private alias smallBytesHash = fnv;
*** 702,707 ****
--- 717,723 ----
  // handle aligned reads, do the conversion here
  private uint get32bits()(scope const(ubyte)* x) @nogc nothrow pure @system
  {
+     pragma(inline, true);
      version (BigEndian)
      {
          return ((cast(uint) x[0]) << 24) | ((cast(uint) x[1]) << 16) | ((cast(uint) x[2]) << 8) | (cast(uint) x[3]);
*************** Params:
*** 717,723 ****
      dataKnownToBeAligned = whether the data is known at compile time to be uint-aligned.
  +/
  @nogc nothrow pure @trusted
! private size_t bytesHash(bool dataKnownToBeAligned)(scope const(ubyte)[] bytes, size_t seed)
  {
      auto len = bytes.length;
      auto data = bytes.ptr;
--- 733,739 ----
      dataKnownToBeAligned = whether the data is known at compile time to be uint-aligned.
  +/
  @nogc nothrow pure @trusted
! private size_t _bytesHash(bool dataKnownToBeAligned)(scope const(ubyte)[] bytes, size_t seed)
  {
      auto len = bytes.length;
      auto data = bytes.ptr;
*************** private size_t bytesHash(bool dataKnownT
*** 771,776 ****
--- 787,820 ----
      return h1;
  }
  
+ // precompile bytesHash into the runtime to also get optimized versions in debug builds
+ @nogc nothrow pure @trusted
+ private size_t _bytesHashAligned(scope const(ubyte)[] bytes, size_t seed)
+ {
+     pragma(inline, true);
+     return _bytesHash!true(bytes, seed);
+ }
+ @nogc nothrow pure @trusted
+ private size_t _bytesHashUnaligned(scope const(ubyte)[] bytes, size_t seed)
+ {
+     pragma(inline, true);
+     return _bytesHash!false(bytes, seed);
+ }
+ 
+ /+
+ Params:
+ dataKnownToBeAligned = whether the data is known at compile time to be uint-aligned.
+ +/
+ @nogc nothrow pure @trusted
+ private size_t bytesHash(bool dataKnownToBeAligned)(scope const(ubyte)[] bytes, size_t seed)
+ {
+     pragma(inline, true);
+     static if (dataKnownToBeAligned)
+         return _bytesHashAligned(bytes, seed);
+     else
+         return _bytesHashUnaligned(bytes, seed);
+ }
+ 
  //  Check that bytesHash works with CTFE
  pure nothrow @system @nogc unittest
  {
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/core/internal/lifetime.d gcc-16-20260201/libphobos/libdruntime/core/internal/lifetime.d
*** gcc-16-20260125/libphobos/libdruntime/core/internal/lifetime.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/core/internal/lifetime.d	Sun Feb  1 22:32:17 2026
*************** void swap(T)(ref T lhs, ref T rhs)
*** 202,204 ****
--- 202,238 ----
      moveEmplace(rhs, lhs);
      moveEmplace(tmp, rhs);
  }
+ 
+ void __doPostblit(T)(T[] arr)
+ {
+     // infer static postblit type, run postblit if any
+     static if (__traits(hasPostblit, T))
+     {
+         static if (__traits(isStaticArray, T) && is(T : E[], E))
+             __doPostblit(cast(E[]) arr);
+         else
+         {
+             import core.internal.traits : Unqual;
+             foreach (ref elem; (() @trusted => cast(Unqual!T[]) arr)())
+                 elem.__xpostblit();
+         }
+     }
+ }
+ 
+ // ditto, but with an index to keep track of how many elements have been postblitted
+ void __doPostblit(T)(T[] arr, ref size_t i)
+ {
+     // infer static postblit type, run postblit if any
+     static if (__traits(hasPostblit, T))
+     {
+         static if (__traits(isStaticArray, T) && is(T : E[], E))
+             __doPostblit(cast(E[]) arr, i);
+         else
+         {
+             i = 0;
+             import core.internal.traits : Unqual;
+             for(auto eptr = cast(Unqual!T*)&arr[0]; i < arr.length; ++i, ++eptr)
+                 eptr.__xpostblit();
+         }
+     }
+ }
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/core/internal/newaa.d gcc-16-20260201/libphobos/libdruntime/core/internal/newaa.d
*** gcc-16-20260125/libphobos/libdruntime/core/internal/newaa.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/core/internal/newaa.d	Sun Feb  1 22:32:17 2026
***************
*** 1,17 ****
  /**
!    Turn an Associative Array into a binary compatible struct for static initialization.
! 
!    This does not implement all the pieces of
!    the associative array type in druntime, just enough to create an AA from an
!    existing range of key/value pairs.
! 
!    Copyright: Copyright Digital Mars 2000 - 2015, Steven Schveighoffer 2022.
!    License:   $(HTTP www.boost.org/LICENSE_1_0.txt, Boost License 1.0).
!    Authors:   Martin Nowak, Steven Schveighoffer
! */
  module core.internal.newaa;
  
! import core.memory;
  
  // grow threshold
  private enum GROW_NUM = 4;
--- 1,21 ----
  /**
!  * template implementation of associative arrays.
!  *
!  * Copyright: Copyright Digital Mars 2000 - 2015, Steven Schveighoffer 2022.
!  * License:   $(HTTP www.boost.org/LICENSE_1_0.txt, Boost License 1.0).
!  * Authors:   Martin Nowak, Steven Schveighoffer, Rainer Schuetze
!  *
!  * Source: $(DRUNTIMESRC core/internal/_newaa.d)
!  *
!  * derived from rt/aaA.d
!  */
  module core.internal.newaa;
  
! /// AA version for debuggers, bump whenever changing the layout
! immutable int _aaVersion = 1;
! 
! import core.internal.util.math : min, max;
! import core.internal.traits : substInout;
  
  // grow threshold
  private enum GROW_NUM = 4;
*************** private enum INIT_DEN = SHRINK_DEN * GRO
*** 31,56 ****
  private enum INIT_NUM_BUCKETS = 8;
  // magic hash constants to distinguish empty, deleted, and filled buckets
  private enum HASH_EMPTY = 0;
  private enum HASH_FILLED_MARK = size_t(1) << 8 * size_t.sizeof - 1;
  
! private struct Bucket
  {
!     size_t hash;
!     void *entry;
  }
  
! struct Impl
  {
      Bucket[] buckets;
      uint used;
      uint deleted;
!     const(TypeInfo) entryTI;
      uint firstUsed;
!     immutable uint keysz;
!     immutable uint valsz;
!     immutable uint valoff;
!     Flags flags;
!     size_t delegate(scope const void*) nothrow hashFn;
  
      enum Flags : ubyte
      {
--- 35,259 ----
  private enum INIT_NUM_BUCKETS = 8;
  // magic hash constants to distinguish empty, deleted, and filled buckets
  private enum HASH_EMPTY = 0;
+ private enum HASH_DELETED = 0x1;
  private enum HASH_FILLED_MARK = size_t(1) << 8 * size_t.sizeof - 1;
  
! /// AA wrapper
! struct AA(K, V)
  {
!     Impl!(K,V)* impl;
!     alias impl this;
! 
!     @property bool empty() const pure nothrow @nogc @safe
!     {
!         pragma(inline, true);
!         return impl is null || !impl.length;
!     }
!     @property size_t length() const pure nothrow @nogc @safe
!     {
!         pragma(inline, true);
!         return impl is null ? 0 : impl.length;
!     }
  }
  
! /// like core.internal.traits.Unconst, but stripping inout, too
! private template Unconstify(T : const U, U)
! {
!     static if (is(U == inout V, V))
!         alias Unconstify = V;
!     else
!         alias Unconstify = U;
! }
! 
! ref _refAA(K, V)(ref V[K] aa) @trusted
! {
!     pragma(inline, true);
!     return *(cast(AA!(substInout!K, substInout!V)*)&aa);
! }
! 
! auto _toAA(K, V)(const V[K] aa) @trusted
! {
!     pragma(inline, true);
!     return *(cast(const(AA!(K, V))*)&aa);
! }
! 
! auto _toAA(K, V)(inout V[K] aa) @trusted
! {
!     pragma(inline, true);
!     return *(cast(inout(AA!(K, V))*)&aa);
! }
! 
! // for backward compatibility, but should be deprecated
! auto _toAA(K, V)(shared const V[K] aa) @trusted
! {
!     pragma(inline, true);
!     return *(cast(AA!(K, V)*)&aa);
! }
! 
! // for backward compatibility, but should be deprecated
! auto _toAA(K, V)(shared V[K] aa) @trusted
! {
!     pragma(inline, true);
!     return *(cast(AA!(K, V)*)&aa);
! }
! 
! // resolve ambiguity for immutable converting to const and shared const
! auto _toAA(K, V)(immutable V[K] aa) @trusted
! {
!     pragma(inline, true);
!     return *(cast(AA!(K, V)*)&aa);
! }
! 
! static struct Entry(K, V)
! {
!     K key;
!     V value;
! }
! 
! // backward compatibility conversions
! private ref compat_key(K, K2)(ref K2 key)
! {
!     pragma(inline, true);
!     static if (is(K2 == const(char)[]) && is(K == string))
!         return (ref (ref return K2 k2) @trusted => *cast(string*)&k2)(key);
!     else
!         return key;
! }
! 
! private void _aaMove(V)(ref V src, ref V dst) @trusted
! {
!     import core.stdc.string : memcpy, memset;
!     // move without postblit!?
!     memcpy(&dst, &src, V.sizeof);
!     static if (__traits(isZeroInit, V))
!         memset(&src, 0, V.sizeof);
!     else
!         memcpy(&src, &V.init, V.sizeof);
! }
! 
! // mimick behaviour of rt.aaA for initialization
! Entry!(K, V)* _newEntry(K, V)(ref K key, ref V value)
! {
!     static if (__traits(compiles, new Entry!(K, V)(key, value)))
!     {
!         auto entry = new Entry!(K, V)(key, value);
!     }
!     else static if (__traits(compiles, { K k; new Entry!(K, V)(k); }))
!     {
!         auto entry = new Entry!(K, V)(key);
!         _aaMove(value, entry.value);
!     }
!     else
!     {
!         auto entry = new Entry!(K, V);
!         _aaMove(key, entry.key);
!         _aaMove(value, entry.value);
!     }
!     return entry;
! }
! 
! // mimick behaviour of rt.aaA for initialization
! Entry!(K, V)* _newEntry(K, V, K2)(ref K2 key)
  {
+     static if (__traits(compiles, new Entry!(K, V)(key)) &&
+                !(is(V == struct) && __traits(isNested, V))) // not detected by "compiles"
+     {
+         auto entry = new Entry!(K, V)(key);
+     }
+     else static if (__traits(compiles, { K2 k; new Entry!(K, V)(k, V.init); }))
+     {
+         // with disabled ctor for V
+         auto entry = new Entry!(K, V)(key, V.init);
+     }
+     else
+     {
+         // with disabled ctor for K and V
+         auto entry = new Entry!(K, V);
+         entry.key = key;
+     }
+     static if (!__traits(isZeroInit, V))
+     {
+         () @trusted { (cast(ubyte*)&entry.value)[0..V.sizeof] = 0; }();
+     }
+     return entry;
+ }
+ 
+ template pure_hashOf(K)
+ {
+     static if (__traits(compiles, function hash_t(scope const ref K key) pure nothrow @nogc @trusted { return hashOf(cast()key); }))
+     {
+         // avoid wrapper call in debug builds if pure nothrow @nogc is inferred
+         pragma(inline, true)
+         hash_t pure_hashOf(scope const ref K key) @trusted { return hashOf(cast()key); }
+     }
+     else
+     {
+         // for backward compatibility, do not require const in hashOf()
+         hash_t wrap_hashOf(K)(scope const ref K key) @trusted { return hashOf(cast()key); }
+         enum pure_hashOf = cast(hash_t function(scope ref const K key) pure nothrow @nogc @safe) &wrap_hashOf!K;
+     }
+ }
+ 
+ // for backward compatibilty pretend the comparison is @safe, pure, etc
+ // this also breaks cyclic inference on recursive data types
+ template pure_keyEqual(K1, K2 = K1)
+ {
+     static if (__traits(compiles, function bool(ref const K1 k1, ref const K2 k2) pure nothrow @nogc @trusted { return cast()k1 == cast()k2; }))
+     {
+         // avoid wrapper call in debug builds if pure nothrow @nogc is inferred
+         pragma(inline, true)
+         bool pure_keyEqual(ref const K1 k1, ref const K2 k2) @trusted { return cast()k1 == cast()k2; }
+     }
+     else
+     {
+         bool keyEqual(ref const K1 k1, ref const K2 k2) @trusted { return cast()k1 == cast()k2; }
+         enum pure_keyEqual = cast(bool function(ref const K1, ref const K2) pure nothrow @nogc @safe) &keyEqual;
+     }
+ }
+ 
+ private struct Impl(K, V)
+ {
+ private:
+     alias Bucket = .Bucket!(K, V);
+ 
+     this(size_t sz /* = INIT_NUM_BUCKETS */) nothrow
+     {
+         buckets = allocBuckets(sz);
+         firstUsed = cast(uint) buckets.length;
+ 
+         // only for binary compatibility
+         version(D_TypeInfo)
+             entryTI = typeid(Entry!(K, V));
+         hashFn = delegate size_t (scope ref const K key) nothrow pure @nogc @safe {
+             return pure_hashOf!K(key);
+         };
+ 
+         keysz = cast(uint) K.sizeof;
+         valsz = cast(uint) V.sizeof;
+         valoff = cast(uint) talign(keysz, V.alignof);
+ 
+         enum ctflags = () {
+             import core.internal.traits;
+             Impl.Flags flags;
+             static if (__traits(hasPostblit, K))
+                 flags |= flags.keyHasPostblit;
+             static if (hasIndirections!K || hasIndirections!V)
+                 flags |= flags.hasPointers;
+             return flags;
+         } ();
+         flags = ctflags;
+     }
+ 
      Bucket[] buckets;
      uint used;
      uint deleted;
!     const(TypeInfo) entryTI; // only for binary compatibility
      uint firstUsed;
!     immutable uint keysz;    // only for binary compatibility
!     immutable uint valsz;    // only for binary compatibility
!     immutable uint valoff;   // only for binary compatibility
!     Flags flags;             // only for binary compatibility
!     size_t delegate(scope ref const K) nothrow pure @nogc @safe hashFn;
  
      enum Flags : ubyte
      {
*************** struct Impl
*** 58,70 ****
          keyHasPostblit = 0x1,
          hasPointers = 0x2,
      }
  }
  
! private struct AAShell
  {
!     Impl *impl;
  }
  
  private size_t mix(size_t h) @safe pure nothrow @nogc
  {
      // final mix function of MurmurHash2
--- 261,410 ----
          keyHasPostblit = 0x1,
          hasPointers = 0x2,
      }
+ 
+     @property size_t length() const pure nothrow @nogc @safe
+     {
+         pragma(inline, true);
+         assert(used >= deleted);
+         return used - deleted;
+     }
+ 
+     @property size_t dim() const pure nothrow @nogc @safe
+     {
+         pragma(inline, true);
+         return buckets.length;
+     }
+ 
+     @property size_t mask() const pure nothrow @nogc @safe
+     {
+         pragma(inline, true);
+         return dim - 1;
+     }
+ 
+     // find the first slot to insert a value with hash
+     size_t findSlotInsert(size_t hash) const pure nothrow @nogc @safe
+     {
+         for (size_t i = hash & mask, j = 1;; ++j)
+         {
+             if (!buckets[i].filled)
+                 return i;
+             i = (i + j) & mask;
+         }
+     }
+ 
+     // lookup a key
+     inout(Bucket)* findSlotLookup(K2)(size_t hash, scope ref const K2 key) inout pure @safe nothrow
+     {
+         for (size_t i = hash & mask, j = 1;; ++j)
+         {
+             auto b = &buckets[i]; // avoid multiple bounds checks
+             if (b.hash == hash && b.entry)
+                 if (pure_keyEqual!(K2, K)(key, b.entry.key))
+                     return b;
+             if (b.empty)
+                 return null;
+             i = (i + j) & mask;
+         }
+     }
+ 
+     void grow() pure nothrow @safe
+     {
+         // If there are so many deleted entries, that growing would push us
+         // below the shrink threshold, we just purge deleted entries instead.
+         if (length * SHRINK_DEN < GROW_FAC * dim * SHRINK_NUM)
+             resize(dim);
+         else
+             resize(GROW_FAC * dim);
+     }
+ 
+     void shrink() pure nothrow @safe
+     {
+         if (dim > INIT_NUM_BUCKETS)
+             resize(dim / GROW_FAC);
+     }
+ 
+     void resize(size_t ndim) pure nothrow @safe
+     {
+         auto obuckets = buckets;
+         buckets = allocBuckets(ndim);
+ 
+         foreach (ref b; obuckets[firstUsed .. $])
+             if (b.filled)
+                 buckets[findSlotInsert(b.hash)] = b;
+ 
+         firstUsed = 0;
+         used -= deleted;
+         deleted = 0;
+         obuckets.length = 0; // safe to free b/c impossible to reference, but doesn't really free
+     }
+ 
+     void clear() pure nothrow
+     {
+         // clear all data, but don't change bucket array length
+         buckets[firstUsed .. $] = Bucket.init;
+         deleted = used = 0;
+         firstUsed = cast(uint) dim;
+     }
+ 
+     size_t calcHash(K2)(ref K2 key) const nothrow pure @nogc @safe
+     {
+         static if(is(K2* : K*)) // ref compatible?
+             hash_t hash = pure_hashOf!K(key);
+         else
+             hash_t hash = pure_hashOf!K2(key);
+         // highest bit is set to distinguish empty/deleted from filled buckets
+         return mix(hash) | HASH_FILLED_MARK;
+     }
+ 
+     static Bucket[] allocBuckets(size_t dim) pure nothrow @safe
+     {
+         // could allocate with BlkAttr.NO_INTERIOR, but that does not combine
+         //  well with arrays and type info for precise scanning
+         return new Bucket[dim];
+     }
  }
  
! //==============================================================================
! // Bucket
! //------------------------------------------------------------------------------
! 
! private struct Bucket(K, V)
  {
! private pure nothrow @nogc:
!     size_t hash;
!     Entry!(K, V)* entry;
! 
!     @property bool empty() const
!     {
!         pragma(inline, true);
!         return hash == HASH_EMPTY;
!     }
! 
!     @property bool deleted() const
!     {
!         pragma(inline, true);
!         return hash == HASH_DELETED;
!     }
! 
!     @property bool filled() const @safe
!     {
!         pragma(inline, true);
!         return cast(ptrdiff_t) hash < 0;
!     }
! }
! 
! //==============================================================================
! // Helper functions
! //------------------------------------------------------------------------------
! 
! private size_t talign(size_t tsize, size_t algn) @safe pure nothrow @nogc
! {
!     immutable mask = algn - 1;
!     assert(!(mask & algn));
!     return (tsize + mask) & ~mask;
  }
  
+ // mix hash to "fix" bad hash functions
  private size_t mix(size_t h) @safe pure nothrow @nogc
  {
      // final mix function of MurmurHash2
*************** private size_t mix(size_t h) @safe pure
*** 75,148 ****
      return h;
  }
  
! // create a binary-compatible AA structure that can be used directly as an
! // associative array.
! // NOTE: this must only be called during CTFE
! AAShell makeAA(K, V)(V[K] src) @trusted
  {
!     assert(__ctfe, "makeAA Must only be called at compile time");
!     immutable srclen = src.length;
!     assert(srclen <= uint.max);
!     alias E = TypeInfo_AssociativeArray.Entry!(K, V);
!     if (srclen == 0)
!         return AAShell.init;
!     // first, determine the size that would be used if we grew the bucket list
!     // one element at a time using the standard AA algorithm.
!     size_t dim = INIT_NUM_BUCKETS;
!     while (srclen * GROW_DEN > dim * GROW_NUM)
!         dim = dim * GROW_FAC;
  
!     // used during runtime.
!     typeof(Impl.hashFn) hashFn = (scope const void* val) {
!         auto x = cast(K*)val;
!         return hashOf(*x);
!     };
  
!     Bucket[] buckets;
!     // Allocate and fill the buckets
!     if (__ctfe)
!         buckets = new Bucket[dim];
      else
!         assert(0);
  
!     assert(buckets.length >= dim);
  
!     immutable mask = dim - 1;
!     assert((dim & mask) == 0); // must be a power of 2
  
!     Bucket* findSlotInsert(immutable size_t hash)
      {
!         for (size_t i = hash & mask, j = 1;; ++j)
          {
!             if (buckets[i].hash == HASH_EMPTY)
!                 return &buckets[i];
!             i = (i + j) & mask;
          }
      }
  
!     uint firstUsed = cast(uint) buckets.length;
!     foreach (k, v; src)
      {
!         immutable h = hashOf(k).mix | HASH_FILLED_MARK;
!         auto location = findSlotInsert(h);
!         immutable nfu = cast(uint) (location - &buckets[0]);
!         if (nfu < firstUsed)
!             firstUsed = nfu;
!         *location = Bucket(h, new E(k, v));
      }
  
!     enum flags = () {
!         import core.internal.traits;
!         Impl.Flags flags;
!         static if (__traits(hasPostblit, K))
!             flags |= flags.keyHasPostblit;
!         static if (hasIndirections!E)
!             flags |= flags.hasPointers;
!         return flags;
!     } ();
!     // return the new implementation
!     return AAShell(new Impl(buckets, cast(uint)srclen, 0, typeid(E), firstUsed,
!             K.sizeof, V.sizeof, E.value.offsetof, flags, hashFn));
  }
  
  unittest
--- 415,1026 ----
      return h;
  }
  
! private size_t nextpow2(const size_t n) pure nothrow @nogc @safe
  {
!     import core.bitop : bsr;
  
!     if (!n)
!         return 1;
  
!     const isPowerOf2 = !((n - 1) & n);
!     return 1 << (bsr(n) + !isPowerOf2);
! }
! 
! pure nothrow @nogc unittest
! {
!     //                            0, 1, 2, 3, 4, 5, 6, 7, 8,  9
!     foreach (const n, const pow2; [1, 1, 2, 4, 4, 8, 8, 8, 8, 16])
!         assert(nextpow2(n) == pow2);
! }
! 
! //==============================================================================
! // API Implementation
! //------------------------------------------------------------------------------
! 
! /** Allocate associative array data.
!  * Called for `new SomeAA` expression.
!  * Returns:
!  *      A new associative array.
!  * Note:
!  *  not supported in CTFE
!  */
! V[K] _d_aaNew(K, V)()
! {
!     AA!(K, V) aa;
!     aa.impl = new Impl!(K,V)(INIT_NUM_BUCKETS);
!     return *cast(V[K]*)&aa;
! }
! 
! /// Determine number of entries in associative array.
! /// Note:
! ///  emulated by the compiler during CTFE
! size_t _d_aaLen(K, V)(inout V[K] a)
! {
!     auto aa = _toAA!(K, V)(a);
!     return aa ? aa.length : 0;
! }
! 
! /******************************
!  * Lookup key in aa.
!  * Called only from implementation of (aa[key]) expressions when value is mutable.
!  * Params:
!  *      aa = associative array
!  *      key = reference to the key value
!  *      found = returns whether the key was found or a new entry was added
!  * Returns:
!  *      if key was in the aa, a mutable pointer to the existing value.
!  *      If key was not in the aa, a mutable pointer to newly inserted value which
!  *      is set to zero
!  */
! V* _d_aaGetY(K, V, T : V1[K1], K1, V1, K2)(auto ref scope T aa, auto ref K2 key, out bool found)
! {
!     ref aax = cast(V[K])cast(V1[K1])aa; // remove outer const from T
!     return _aaGetX!(K, V)(aax, key, found);
! }
! 
! /******************************
!  * Lookup key in aa.
!  * Called only from implementation of require, update and _d_aaGetY
!  * Params:
!  *      a = associative array
!  *      key = reference to the key value
!  *      found = true if the value was found
!  * Returns:
!  *      if key was in the aa, a mutable pointer to the existing value.
!  *      If key was not in the aa, a mutable pointer to newly inserted value which
!  *      is set to V.init
!  */
! V* _aaGetX(K, V, K2)(auto ref scope V[K] a, auto ref K2 key, out bool found)
! {
!     ref aa = _refAA!(K, V)(a);
! 
!     // lazily alloc implementation
!     if (aa is null)
!     {
!         aa.impl = new Impl!(K, V)(INIT_NUM_BUCKETS);
!     }
! 
!     ref key2 = compat_key!(K)(key);
! 
!     // get hash and bucket for key
!     immutable hash = aa.calcHash(key2);
! 
!     // found a value => return it
!     if (auto p = aa.findSlotLookup(hash, key2))
!     {
!         found = true;
!         return &p.entry.value;
!     }
! 
!     auto pi = aa.findSlotInsert(hash);
!     if (aa.buckets[pi].deleted)
!         --aa.deleted;
!     // check load factor and possibly grow
!     else if (++aa.used * GROW_DEN > aa.dim * GROW_NUM)
!     {
!         aa.grow();
!         pi = aa.findSlotInsert(hash);
!         assert(aa.buckets[pi].empty);
!     }
! 
!     // update search cache and allocate entry
!     aa.firstUsed = min(aa.firstUsed, cast(uint)pi);
!     ref p = aa.buckets[pi];
!     p.hash = hash;
!     p.entry = _newEntry!(K, V)(key2);
!     return &p.entry.value;
! }
! 
! /******************************
!  * Lookup key in aa.
!  * Called only from implementation of (aa[key]) expressions when value is not mutable.
!  * Params:
!  *      aa = associative array
!  *      key = key value
!  * Returns:
!  *      pointer to value if present, null otherwise
!  */
! auto _d_aaGetRvalueX(K, V, K2)(inout V[K] aa, auto ref scope K2 key)
! {
!     return _d_aaIn(aa, key);
! }
! 
! /// ditto
! auto _d_aaGetRvalueX(K, V, K2)(shared(V[K]) aa, auto ref scope K2 key)
! {
!     // accept shared for backward compatibility, should be deprecated
!     return cast(shared(V)*)_d_aaIn(cast(V[K]) aa, key);
! }
! 
! /// ditto
! auto _d_aaGetRvalueX(K, V, K2)(shared const(V[K]) aa, auto ref scope K2 key)
! {
!     // accept shared for backward compatibility, should be deprecated
!     return cast(const shared(V)*)_d_aaIn(cast(V[K]) aa, key);
! }
! 
! /// ditto
! auto _d_aaGetRvalueX(K, V, K2)(immutable(V[K]) aa, auto ref scope K2 key)
! {
!     // resolve ambiguity for immutable converting to const and shared const
!     return _d_aaIn((() @trusted => cast(V[K]) aa) (), key);
! }
! 
! /***********************************
!  * Creates a new associative array of the same size and copies the contents of
!  * the associative array into it.
!  * Params:
!  *      a =     The associative array.
!  */
! auto _aaDup(T : V[K], K, V)(T a)
! {
!     auto aa = _toAA!(K, V)(a);
!     immutable len = aa.length;
!     if (len == 0)
!         return null;
! 
!     auto impl = new Impl!(K, V)(aa.dim);
!     // copy the entries
!     bool sameHash = aa.hashFn == impl.hashFn; // can be different if coming from template/rt
!     foreach (b; aa.buckets[aa.firstUsed .. $])
!     {
!         if (!b.filled)
!             continue;
!         hash_t hash = sameHash ? b.hash : impl.calcHash(b.entry.key);
!         auto pi = impl.findSlotInsert(hash);
!         auto p = &impl.buckets[pi];
!         p.hash = hash;
!         p.entry = new Entry!(K, V)(b.entry.key, b.entry.value);
!         impl.firstUsed = min(impl.firstUsed, cast(uint)pi);
!     }
!     impl.used = cast(uint) len;
!     return () @trusted { return *cast(Unconstify!V[K]*)&impl; }();
! }
! 
! /******************************
!  * Lookup key in aa.
!  * Called only from implementation of (key in aa) expressions.
!  * Params:
!  *      a = associative array opaque pointer
!  *      key = reference to the key value
!  * Returns:
!  *      pointer to value if present, null otherwise
!  */
! auto _d_aaIn(T : V[K], K, V, K2)(inout T a, auto ref scope K2 key)
! {
!     auto aa = _toAA!(K, V)(a);
!     if (aa.empty)
!         return null;
! 
!     ref key2 = compat_key!(K)(key);
! 
!     immutable hash = aa.calcHash(key2);
!     if (auto p = aa.findSlotLookup(hash, key2))
!         return &p.entry.value;
!     return null;
! }
! 
! // fake purity for backward compatibility with runtime hooks
! private extern(C) bool gc_inFinalizer() pure nothrow @safe;
! 
! /// Delete entry scope const AA, return true if it was present
! auto _d_aaDel(T : V[K], K, V, K2)(T a, auto ref K2 key)
! {
!     auto aa = _toAA!(K, V)(a);
!     if (aa.empty)
!         return false;
! 
!     ref key2 = compat_key!(K)(key);
! 
!     immutable hash = aa.calcHash(key2);
!     if (auto p = aa.findSlotLookup(hash, key2))
!     {
!         // clear entry
!         p.hash = HASH_DELETED;
!         p.entry = null;
! 
!         ++aa.deleted;
!         // `shrink` reallocates, and allocating from a finalizer leads to
!         // InvalidMemoryError: https://issues.dlang.org/show_bug.cgi?id=21442
!         if (aa.length * SHRINK_DEN < aa.dim * SHRINK_NUM && !__ctfe && !gc_inFinalizer())
!             aa.shrink();
! 
!         return true;
!     }
!     return false;
! }
! 
! /// Remove all elements from AA.
! void _aaClear(K, V)(V[K] a)
! {
!     auto aa = _toAA!(K, V)(a);
!     if (!aa.empty)
!     {
!         aa.clear();
!     }
! }
! 
! /// Rehash AA
! V[K] _aaRehash(K, V)(V[K] a)
! {
!     auto aa = _toAA!(K, V)(a);
!     if (!aa.empty)
!         aa.resize(nextpow2(INIT_DEN * aa.length / INIT_NUM));
!     return a;
! }
! 
! /// Return a GC allocated array of all values
! auto _aaValues(K, V)(inout V[K] a)
! {
!     auto aa = _toAA!(K, V)(a);
!     if (aa.empty)
!         return null;
! 
!     static if (__traits(compiles, { V val = aa.buckets[0].entry.value; } ))
!         V[] res; // if value has no const indirections
      else
!         typeof([aa.buckets[0].entry.value]) res; // as mutable as it can get
!     res = new typeof(res[0])[aa.length];
  
!     if (false) // never execute, but infer function attributes from this operation
!         res ~= aa.buckets[0].entry.value;
  
!     size_t i = 0;
!     foreach (b; aa.buckets[aa.firstUsed .. $])
!     {
!         if (!b.filled)
!             continue;
!         import core.lifetime;
!         () @trusted { copyEmplace(b.entry.value, res[i++]); }();
!     }
!     return res;
! }
  
! /// Return a GC allocated array of all keys
! auto _aaKeys(K, V)(inout V[K] a)
! {
!     auto aa = _toAA!(K, V)(a);
!     if (aa.empty)
!         return null;
! 
!     static if (__traits(compiles, { K key = aa.buckets[0].entry.key; } ))
!         K[] res; // if key has no const indirections
!     else
!         typeof([aa.buckets[0].entry.key]) res; // as mutable as it can get
!     res = new typeof(res[0])[aa.length];
! 
!     if (false) // never execute, but infer function attributes from this operation
!         res ~= aa.buckets[0].entry.key;
! 
!     size_t i = 0;
!     foreach (b; aa.buckets[aa.firstUsed .. $])
      {
!         if (!b.filled)
!             continue;
!         // res ~= b.entry.key;
!         import core.lifetime;
!         () @trusted { copyEmplace(b.entry.key, res[i++]); }();
!     }
!     return res;
! }
! 
! /// foreach opApply over all values
! /// Note:
! ///  emulated by the compiler during CTFE
! int _d_aaApply(K, V, DG)(inout V[K] a, DG dg)
! {
!     auto aa = () @trusted { return cast(AA!(K, V))_toAA!(K, V)(a); }();
!     if (aa.empty)
!         return 0;
! 
!     foreach (b; aa.buckets)
!     {
!         if (!b.filled)
!             continue;
!         if (auto res = dg(b.entry.value))
!             return res;
!     }
!     return 0;
! }
! 
! int _d_aaApply(K, V, DG)(shared V[K] a, DG dg)
! {
!     return _d_aaApply!(K, V, DG)(cast(V[K]) a, dg);
! }
! 
! int _d_aaApply(K, V, DG)(shared const V[K] a, DG dg)
! {
!     return _d_aaApply!(K, V, DG)(cast(const V[K]) a, dg);
! }
! 
! int _d_aaApply(K, V, DG)(immutable V[K] a, DG dg)
! {
!     return _d_aaApply!(K, V, DG)(cast(const V[K]) a, dg);
! }
! 
! /// foreach opApply over all key/value pairs
! /// Note:
! ///  emulated by the compiler during CTFE
! int _d_aaApply2(K, V, DG)(inout V[K] a, DG dg)
! {
!     auto aa = () @trusted { return cast(AA!(K, V))_toAA!(K, V)(a); }();
!     if (aa.empty)
!         return 0;
! 
!     foreach (b; aa.buckets)
!     {
!         if (!b.filled)
!             continue;
!         if (auto res = dg(b.entry.key, b.entry.value))
!             return res;
!     }
!     return 0;
! }
! 
! int _d_aaApply2(K, V, DG)(shared V[K] a, DG dg)
! {
!     return _d_aaApply2!(K, V, DG)(cast(V[K]) a, dg);
! }
! 
! int _d_aaApply2(K, V, DG)(shared const V[K] a, DG dg)
! {
!     return _d_aaApply2!(K, V, DG)(cast(const V[K]) a, dg);
! }
! 
! int _d_aaApply2(K, V, DG)(immutable V[K] a, DG dg)
! {
!     return _d_aaApply2!(K, V, DG)(cast(const V[K]) a, dg);
! }
! 
! /** Construct an associative array of type ti from corresponding keys and values.
!  * Called for an AA literal `[k1:v1, k2:v2]`.
!  * Params:
!  *      keys = array of keys
!  *      vals = array of values
!  * Returns:
!  *      A new associative array opaque pointer, or null if `keys` is empty.
!  */
! Impl!(K, V)* _d_assocarrayliteralTX(K, V)(K[] keys, V[] vals)
! {
!     assert(keys.length == vals.length);
! 
!     immutable length = keys.length;
! 
!     if (!length)
!         return null;
! 
!     auto aa = new Impl!(K, V)(nextpow2(INIT_DEN * length / INIT_NUM));
!     size_t duplicates = 0;
!     foreach (i; 0 .. length)
!     {
!         immutable hash = aa.calcHash(keys[i]);
! 
!         auto p = aa.findSlotLookup!K(hash, keys[i]);
!         if (p)
          {
!             static if (__traits(compiles, p.entry.value = vals[i])) // immutable?
!                 p.entry.value = vals[i];
!             else
!                 p.entry = _newEntry!(K, V)(keys[i], vals[i]);
!             duplicates++;
!             continue;
          }
+         auto pi = aa.findSlotInsert(hash);
+         p = &aa.buckets[pi];
+         p.hash = hash;
+         p.entry = _newEntry!(K, V)(keys[i], vals[i]); // todo: move key and value?
+         aa.firstUsed = min(aa.firstUsed, cast(uint)pi);
      }
+     aa.used = cast(uint) (length - duplicates);
+     return aa;
+ }
  
! /// compares 2 AAs for equality
! bool _aaEqual(T : AA!(K, V), K, V)(scope T aa1, scope T aa2)
! {
!     if (aa1 is aa2)
!         return true;
! 
!     immutable len = aa1.length;
!     if (len != aa2.length)
!         return false;
! 
!     if (!len) // both empty
!         return true;
! 
!     bool sameHash = aa1.hashFn == aa2.hashFn; // can be different if coming from template/rt
!     // compare the entries
!     foreach (b1; aa1.buckets[aa1.firstUsed .. $])
      {
!         if (!b1.filled)
!             continue;
!         hash_t hash = sameHash ? b1.hash : aa2.calcHash(b1.entry.key);
!         auto pb2 = aa2.findSlotLookup!K(hash, b1.entry.key);
!         if (pb2 is null || !pure_keyEqual!(V, V)(b1.entry.value, pb2.entry.value)) // rarely, inference on opEqual breaks builds here
!             return false;
      }
+     return true;
+ }
  
! /// compares 2 AAs for equality (compiler hook)
! bool _d_aaEqual(K, V)(scope const V[K] a1, scope const V[K] a2)
! {
!     scope aa1 = _toAA!(K, V)(a1);
!     scope aa2 = _toAA!(K, V)(a2);
!     return _aaEqual(aa1, aa2);
! }
! 
! /// callback from TypeInfo_AssociativeArray.equals (ignore const for now)
! bool _aaOpEqual(K, V)(scope /* const */ AA!(K, V)* aa1, scope /* const */ AA!(K, V)* aa2)
! {
!     return _aaEqual(*aa1, *aa2);
! }
! 
! /// compute a hash callback from TypeInfo_AssociativeArray.xtoHash (ignore scope const for now)
! hash_t _aaGetHash(K, V)(/* scope const */ AA!(K, V)* paa)
! {
!     const aa = *paa;
! 
!     if (aa.empty)
!         return 0;
! 
!     size_t h;
!     foreach (b; aa.buckets)
!     {
!         // use addition here, so that hash is independent of element order
!         if (b.filled)
!             h += hashOf(pure_hashOf!V(b.entry.value), pure_hashOf!K(b.entry.key));
!     }
! 
!     return h;
! }
! 
! /**
!  * _aaRange implements a ForwardRange
!  */
! struct AARange(K, V)
! {
!     alias Key = substInout!K;
!     alias Value = substInout!V;
! 
!     Impl!(Key, Value)* impl;
!     size_t idx;
!     alias impl this;
! }
! 
! AARange!(K, V) _aaRange(K, V)(V[K] a)
! {
!     auto aa = _toAA!(K, V)(a);
!     if (!aa)
!         return AARange!(K, V)();
! 
!     foreach (i; aa.firstUsed .. aa.dim)
!     {
!         if (aa.buckets[i].filled)
!             return AARange!(K, V)(aa, i);
!     }
!     return AARange!(K, V)(aa, aa.dim);
! }
! 
! bool _aaRangeEmpty(K, V)(AARange!(K, V) r)
! {
!     return r.impl is null || r.idx >= r.dim;
! }
! 
! K* _aaRangeFrontKey(K, V)(AARange!(K, V) r)
! {
!     assert(!_aaRangeEmpty(r));
!     if (r.idx >= r.dim)
!         return null;
!     auto entry = r.buckets[r.idx].entry;
!     return entry is null ? null : &r.buckets[r.idx].entry.key;
! }
! 
! V* _aaRangeFrontValue(K, V)(AARange!(K, V) r)
! {
!     assert(!_aaRangeEmpty(r));
!     if (r.idx >= r.dim)
!         return null;
! 
!     auto entry = r.buckets[r.idx].entry;
!     return entry is null ? null : &r.buckets[r.idx].entry.value;
! }
! 
! void _aaRangePopFront(K, V)(ref AARange!(K, V) r)
! {
!     if (r.idx >= r.dim) return;
!     for (++r.idx; r.idx < r.dim; ++r.idx)
!     {
!         if (r.buckets[r.idx].filled)
!             break;
!     }
! }
! 
! // test postblit for AA literals
! unittest
! {
!     import core.memory;
! 
!     static struct T
!     {
!         ubyte field;
!         static size_t postblit, dtor;
!         this(this)
!         {
!             ++postblit;
!         }
! 
!         ~this()
!         {
!             ++dtor;
!         }
!     }
! 
!     T t;
!     auto aa1 = [0 : t, 1 : t];
!     assert(T.dtor == 2 && T.postblit == 4);
!     aa1[0] = t;
!     assert(T.dtor == 3 && T.postblit == 5);
! 
!     T.dtor = 0;
!     T.postblit = 0;
! 
!     auto aa2 = [0 : t, 1 : t, 0 : t]; // literal with duplicate key => value overwritten
!     assert(T.dtor == 4 && T.postblit == 6);
! 
!     T.dtor = 0;
!     T.postblit = 0;
! 
!     auto aa3 = [t : 0];
!     assert(T.dtor == 1 && T.postblit == 2);
!     aa3[t] = 1;
!     assert(T.dtor == 1 && T.postblit == 2);
!     aa3.remove(t);
!     assert(T.dtor == 1 && T.postblit == 2);
!     aa3[t] = 2;
!     assert(T.dtor == 1 && T.postblit == 3);
! 
!     // dtor will be called by GC finalizers
!     aa1 = null;
!     aa2 = null;
!     aa3 = null;
!     auto dtor1 = typeid(TypeInfo_AssociativeArray.Entry!(int, T)).xdtor;
!     GC.runFinalizers((cast(char*)dtor1)[0 .. 1]);
!     auto dtor2 = typeid(TypeInfo_AssociativeArray.Entry!(T, int)).xdtor;
!     GC.runFinalizers((cast(char*)dtor2)[0 .. 1]);
!     assert(T.dtor == 7 && T.postblit == 3);
! }
! 
! // create a binary-compatible AA structure that can be used directly as an
! // associative array.
! // NOTE: this must only be called during CTFE
! AA!(K, V) makeAA(K, V)(V[K] src) @trusted
! {
!     assert(__ctfe, "makeAA Must only be called at compile time");
!     // keys and values are cheap operations in CTFE, so just reuse _d_assocarrayliteralTX
!     auto impl = _d_assocarrayliteralTX!(K, V)(cast(K[])src.keys, cast(V[])src.values);
!     auto aa = AA!(K, V)(impl);
!     return aa;
  }
  
  unittest
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/core/internal/traits.d gcc-16-20260201/libphobos/libdruntime/core/internal/traits.d
*** gcc-16-20260125/libphobos/libdruntime/core/internal/traits.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/core/internal/traits.d	Sun Feb  1 22:32:17 2026
*************** private template substInoutForm(T)
*** 107,117 ****
      {
          alias substInoutForm = T;   // prevent matching to the form of alias-this-ed type
      }
!     else static if (is(T : V[K], K, V))        alias substInoutForm = substInout!V[substInout!K];
!     else static if (is(T : U[n], U, size_t n)) alias substInoutForm = substInout!U[n];
!     else static if (is(T : U[], U))            alias substInoutForm = substInout!U[];
!     else static if (is(T : U*, U))             alias substInoutForm = substInout!U*;
!     else                                       alias substInoutForm = T;
  }
  
  /// used to declare an extern(D) function that is defined in a different module
--- 107,144 ----
      {
          alias substInoutForm = T;   // prevent matching to the form of alias-this-ed type
      }
!     else static if (is(T == V[K], K, V))        alias substInoutForm = substInout!V[substInout!K];
!     else static if (is(T == U[n], U, size_t n)) alias substInoutForm = substInout!U[n];
!     else static if (is(T == U[], U))            alias substInoutForm = substInout!U[];
!     else static if (is(T == U*, U))             alias substInoutForm = substInout!U*;
!     else                                        alias substInoutForm = T;
! }
! 
! unittest
! {
!     // https://github.com/dlang/dmd/issues/21452
!     struct S { int x; }
!     struct T { int x; alias x this; }
! 
!     enum EnumInt { a = 123 }
!     enum EnumUInt : uint { a = 123 }
!     enum EnumFloat : float { a = 123 }
!     enum EnumString : string { a = "123" }
!     enum EnumStringW : wstring { a = "123" }
!     enum EnumStruct : S { a = S(7) }
!     enum EnumAliasThis : T { a = T(7) }
!     enum EnumDArray : int[] { a = [1] }
!     enum EnumAArray : int[int] { a = [0 : 1] }
! 
!     static assert(substInout!(EnumInt).stringof                  == "EnumInt");
!     static assert(substInout!(inout(EnumUInt)).stringof          == "const(EnumUInt)");
!     static assert(substInout!(EnumFloat).stringof                == "EnumFloat");
!     static assert(substInout!(EnumString).stringof               == "EnumString");
!     static assert(substInout!(inout(EnumStringW)).stringof       == "const(EnumStringW)");
!     static assert(substInout!(EnumStruct).stringof               == "EnumStruct");
!     static assert(substInout!(EnumAliasThis).stringof            == "EnumAliasThis");
!     static assert(substInout!(EnumDArray).stringof               == "EnumDArray");
!     static assert(substInout!(inout(EnumAArray)[int]).stringof   == "const(EnumAArray)[int]");
  }
  
  /// used to declare an extern(D) function that is defined in a different module
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/core/stdc/config.d gcc-16-20260201/libphobos/libdruntime/core/stdc/config.d
*** gcc-16-20260125/libphobos/libdruntime/core/stdc/config.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/core/stdc/config.d	Sun Feb  1 22:32:17 2026
*************** else version (DigitalMars)
*** 260,265 ****
--- 260,282 ----
          else version (Darwin)
              alias real c_long_double;
      }
+     else version (AArch64)
+     {
+         version (linux)
+             alias real c_long_double;
+         else version (FreeBSD)
+             alias real c_long_double;
+         else version (OpenBSD)
+             alias real c_long_double;
+         else version (NetBSD)
+             alias real c_long_double;
+         else version (DragonFlyBSD)
+             alias real c_long_double;
+         else version (Solaris)
+             alias real c_long_double;
+         else version (Darwin)
+             alias real c_long_double;
+     }
  }
  
  static assert(is(c_long_double), "c_long_double needs to be declared for this platform/architecture.");
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/core/stdc/fenv.d gcc-16-20260201/libphobos/libdruntime/core/stdc/fenv.d
*** gcc-16-20260125/libphobos/libdruntime/core/stdc/fenv.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/core/stdc/fenv.d	Sun Feb  1 22:32:17 2026
*************** else version (CRuntime_Musl)
*** 440,445 ****
--- 440,450 ----
          }
          alias uint fexcept_t;
      }
+     else version (RICV64)
+     {
+         alias uint fenv_t;
+         alias uint fexcept_t;
+     }
      else
      {
          static assert(false, "Architecture not supported.");
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/core/stdc/math.d gcc-16-20260201/libphobos/libdruntime/core/stdc/math.d
*** gcc-16-20260125/libphobos/libdruntime/core/stdc/math.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/core/stdc/math.d	Sun Feb  1 22:32:17 2026
*************** extern (D)
*** 1509,1559 ****
  {
      //int isgreater(real-floating x, real-floating y);
      ///
!     pure int isgreater(float x, float y)        { return x > y; }
      ///
!     pure int isgreater(double x, double y)      { return x > y; }
      ///
!     pure int isgreater(real x, real y)          { return x > y; }
  
      //int isgreaterequal(real-floating x, real-floating y);
      ///
!     pure int isgreaterequal(float x, float y)   { return x >= y; }
      ///
!     pure int isgreaterequal(double x, double y) { return x >= y; }
      ///
!     pure int isgreaterequal(real x, real y)     { return x >= y; }
  
      //int isless(real-floating x, real-floating y);
      ///
!     pure int isless(float x, float y)           { return x < y; }
      ///
!     pure int isless(double x, double y)         { return x < y; }
      ///
!     pure int isless(real x, real y)             { return x < y; }
  
      //int islessequal(real-floating x, real-floating y);
      ///
!     pure int islessequal(float x, float y)      { return x <= y; }
      ///
!     pure int islessequal(double x, double y)    { return x <= y; }
      ///
!     pure int islessequal(real x, real y)        { return x <= y; }
  
      //int islessgreater(real-floating x, real-floating y);
      ///
!     pure int islessgreater(float x, float y)    { return x != y && !isunordered(x, y); }
      ///
!     pure int islessgreater(double x, double y)  { return x != y && !isunordered(x, y); }
      ///
!     pure int islessgreater(real x, real y)      { return x != y && !isunordered(x, y); }
  
      //int isunordered(real-floating x, real-floating y);
      ///
!     pure int isunordered(float x, float y)      { return isnan(x) || isnan(y); }
      ///
!     pure int isunordered(double x, double y)    { return isnan(x) || isnan(y); }
      ///
!     pure int isunordered(real x, real y)        { return isnan(x) || isnan(y); }
  }
  
  /* MS define some functions inline.
--- 1509,1559 ----
  {
      //int isgreater(real-floating x, real-floating y);
      ///
!     pure int isgreater()(float x, float y)        { return x > y; }
      ///
!     pure int isgreater()(double x, double y)      { return x > y; }
      ///
!     pure int isgreater()(real x, real y)          { return x > y; }
  
      //int isgreaterequal(real-floating x, real-floating y);
      ///
!     pure int isgreaterequal()(float x, float y)   { return x >= y; }
      ///
!     pure int isgreaterequal()(double x, double y) { return x >= y; }
      ///
!     pure int isgreaterequal()(real x, real y)     { return x >= y; }
  
      //int isless(real-floating x, real-floating y);
      ///
!     pure int isless()(float x, float y)           { return x < y; }
      ///
!     pure int isless()(double x, double y)         { return x < y; }
      ///
!     pure int isless()(real x, real y)             { return x < y; }
  
      //int islessequal(real-floating x, real-floating y);
      ///
!     pure int islessequal()(float x, float y)      { return x <= y; }
      ///
!     pure int islessequal()(double x, double y)    { return x <= y; }
      ///
!     pure int islessequal()(real x, real y)        { return x <= y; }
  
      //int islessgreater(real-floating x, real-floating y);
      ///
!     pure int islessgreater()(float x, float y)    { return x != y && !isunordered(x, y); }
      ///
!     pure int islessgreater()(double x, double y)  { return x != y && !isunordered(x, y); }
      ///
!     pure int islessgreater()(real x, real y)      { return x != y && !isunordered(x, y); }
  
      //int isunordered(real-floating x, real-floating y);
      ///
!     pure int isunordered()(float x, float y)      { return isnan(x) || isnan(y); }
      ///
!     pure int isunordered()(double x, double y)    { return isnan(x) || isnan(y); }
      ///
!     pure int isunordered()(real x, real y)        { return isnan(x) || isnan(y); }
  }
  
  /* MS define some functions inline.
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/core/stdc/stdarg.d gcc-16-20260201/libphobos/libdruntime/core/stdc/stdarg.d
*** gcc-16-20260125/libphobos/libdruntime/core/stdc/stdarg.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/core/stdc/stdarg.d	Sun Feb  1 22:32:17 2026
*************** else version (AAPCS32)
*** 130,135 ****
--- 130,137 ----
  else version (AAPCS64)
  {
      alias va_list = core.internal.vararg.aarch64.va_list;
+     version (DigitalMars)
+         public import core.internal.vararg.aarch64 : __va_list, __va_list_tag;
  }
  else version (RISCV_Any)
  {
*************** else version (LDC)
*** 316,322 ****
  }
  else version (DigitalMars)
  {
!     void va_end(va_list ap) {}
  }
  
  
--- 318,324 ----
  }
  else version (DigitalMars)
  {
!     void va_end()(va_list ap) {}
  }
  
  
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/core/stdcpp/string.d gcc-16-20260201/libphobos/libdruntime/core/stdcpp/string.d
*** gcc-16-20260125/libphobos/libdruntime/core/stdcpp/string.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/core/stdcpp/string.d	Sun Feb  1 22:32:17 2026
*************** extern(D):
*** 343,349 ****
          ///
          inout(T)* data() inout @safe                                        { return _Get_data()._Myptr; }
          ///
!         inout(T)[] as_array() scope return inout nothrow @trusted           { return _Get_data()._Myptr[0 .. _Get_data()._Mysize]; }
          ///
          ref inout(T) at(size_type i) inout nothrow @trusted                 { return _Get_data()._Myptr[0 .. _Get_data()._Mysize][i]; }
  
--- 343,349 ----
          ///
          inout(T)* data() inout @safe                                        { return _Get_data()._Myptr; }
          ///
!         inout(T)[] as_array() return ref scope inout nothrow @trusted       { return _Get_data()._Myptr[0 .. _Get_data()._Mysize]; }
          ///
          ref inout(T) at(size_type i) inout nothrow @trusted                 { return _Get_data()._Myptr[0 .. _Get_data()._Mysize][i]; }
  
*************** extern(D):
*** 1920,1926 ****
          ///
          inout(T)* data() inout @trusted                                     { return __get_pointer(); }
          ///
!         inout(T)[] as_array() scope return inout nothrow @trusted           { return __get_pointer()[0 .. size()]; }
          ///
          ref inout(T) at(size_type i) inout nothrow @trusted                 { return __get_pointer()[0 .. size()][i]; }
  
--- 1920,1926 ----
          ///
          inout(T)* data() inout @trusted                                     { return __get_pointer(); }
          ///
!         inout(T)[] as_array() return ref scope inout nothrow @trusted       { return __get_pointer()[0 .. size()]; }
          ///
          ref inout(T) at(size_type i) inout nothrow @trusted                 { return __get_pointer()[0 .. size()][i]; }
  
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/core/sys/bionic/err.d gcc-16-20260201/libphobos/libdruntime/core/sys/bionic/err.d
*** gcc-16-20260125/libphobos/libdruntime/core/sys/bionic/err.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/core/sys/bionic/err.d	Sun Feb  1 22:32:17 2026
***************
*** 3,9 ****
    *
    * Copyright: Copyright © 2019, The D Language Foundation
    * License: <a href="http://www.boost.org/LICENSE_1_0.txt">Boost License 1.0</a>.
!   * Authors: Ernesto Castellotti
    */
  module core.sys.bionic.err;
  import core.stdc.stdarg : va_list;
--- 3,9 ----
    *
    * Copyright: Copyright © 2019, The D Language Foundation
    * License: <a href="http://www.boost.org/LICENSE_1_0.txt">Boost License 1.0</a>.
!   * Authors: Emily Castellotti
    */
  module core.sys.bionic.err;
  import core.stdc.stdarg : va_list;
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/core/sys/bionic/string.d gcc-16-20260201/libphobos/libdruntime/core/sys/bionic/string.d
*** gcc-16-20260125/libphobos/libdruntime/core/sys/bionic/string.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/core/sys/bionic/string.d	Sun Feb  1 22:32:17 2026
***************
*** 3,9 ****
    *
    * Copyright: Copyright © 2019, The D Language Foundation
    * License: <a href="http://www.boost.org/LICENSE_1_0.txt">Boost License 1.0</a>.
!   * Authors: Ernesto Castellotti
    */
  module core.sys.bionic.string;
  
--- 3,9 ----
    *
    * Copyright: Copyright © 2019, The D Language Foundation
    * License: <a href="http://www.boost.org/LICENSE_1_0.txt">Boost License 1.0</a>.
!   * Authors: Emily Castellotti
    */
  module core.sys.bionic.string;
  
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/core/sys/darwin/err.d gcc-16-20260201/libphobos/libdruntime/core/sys/darwin/err.d
*** gcc-16-20260125/libphobos/libdruntime/core/sys/darwin/err.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/core/sys/darwin/err.d	Sun Feb  1 22:32:17 2026
***************
*** 3,9 ****
    *
    * Copyright: Copyright © 2019, The D Language Foundation
    * License: <a href="http://www.boost.org/LICENSE_1_0.txt">Boost License 1.0</a>.
!   * Authors: Ernesto Castellotti
    */
  module core.sys.darwin.err;
  import core.stdc.stdarg : va_list;
--- 3,9 ----
    *
    * Copyright: Copyright © 2019, The D Language Foundation
    * License: <a href="http://www.boost.org/LICENSE_1_0.txt">Boost License 1.0</a>.
!   * Authors: Emily Castellotti
    */
  module core.sys.darwin.err;
  import core.stdc.stdarg : va_list;
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/core/sys/darwin/string.d gcc-16-20260201/libphobos/libdruntime/core/sys/darwin/string.d
*** gcc-16-20260125/libphobos/libdruntime/core/sys/darwin/string.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/core/sys/darwin/string.d	Sun Feb  1 22:32:17 2026
***************
*** 3,9 ****
    *
    * Copyright: Copyright © 2019, The D Language Foundation
    * License: <a href="http://www.boost.org/LICENSE_1_0.txt">Boost License 1.0</a>.
!   * Authors: Ernesto Castellotti
    */
  module core.sys.darwin.string;
  
--- 3,9 ----
    *
    * Copyright: Copyright © 2019, The D Language Foundation
    * License: <a href="http://www.boost.org/LICENSE_1_0.txt">Boost License 1.0</a>.
!   * Authors: Emily Castellotti
    */
  module core.sys.darwin.string;
  
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/core/sys/dragonflybsd/err.d gcc-16-20260201/libphobos/libdruntime/core/sys/dragonflybsd/err.d
*** gcc-16-20260125/libphobos/libdruntime/core/sys/dragonflybsd/err.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/core/sys/dragonflybsd/err.d	Sun Feb  1 22:32:17 2026
***************
*** 3,9 ****
    *
    * Copyright: Copyright © 2019, The D Language Foundation
    * License: <a href="http://www.boost.org/LICENSE_1_0.txt">Boost License 1.0</a>.
!   * Authors: Ernesto Castellotti
    */
  module core.sys.dragonflybsd.err;
  import core.stdc.stdarg : va_list;
--- 3,9 ----
    *
    * Copyright: Copyright © 2019, The D Language Foundation
    * License: <a href="http://www.boost.org/LICENSE_1_0.txt">Boost License 1.0</a>.
!   * Authors: Emily Castellotti
    */
  module core.sys.dragonflybsd.err;
  import core.stdc.stdarg : va_list;
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/core/sys/dragonflybsd/string.d gcc-16-20260201/libphobos/libdruntime/core/sys/dragonflybsd/string.d
*** gcc-16-20260125/libphobos/libdruntime/core/sys/dragonflybsd/string.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/core/sys/dragonflybsd/string.d	Sun Feb  1 22:32:17 2026
***************
*** 3,9 ****
    *
    * Copyright: Copyright © 2019, The D Language Foundation
    * License: <a href="http://www.boost.org/LICENSE_1_0.txt">Boost License 1.0</a>.
!   * Authors: Ernesto Castellotti
    */
  module core.sys.dragonflybsd.string;
  
--- 3,9 ----
    *
    * Copyright: Copyright © 2019, The D Language Foundation
    * License: <a href="http://www.boost.org/LICENSE_1_0.txt">Boost License 1.0</a>.
!   * Authors: Emily Castellotti
    */
  module core.sys.dragonflybsd.string;
  
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/core/sys/freebsd/err.d gcc-16-20260201/libphobos/libdruntime/core/sys/freebsd/err.d
*** gcc-16-20260125/libphobos/libdruntime/core/sys/freebsd/err.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/core/sys/freebsd/err.d	Sun Feb  1 22:32:17 2026
***************
*** 3,9 ****
    *
    * Copyright: Copyright © 2019, The D Language Foundation
    * License: <a href="http://www.boost.org/LICENSE_1_0.txt">Boost License 1.0</a>.
!   * Authors: Ernesto Castellotti
    */
  module core.sys.freebsd.err;
  import core.stdc.stdarg : va_list;
--- 3,9 ----
    *
    * Copyright: Copyright © 2019, The D Language Foundation
    * License: <a href="http://www.boost.org/LICENSE_1_0.txt">Boost License 1.0</a>.
!   * Authors: Emily Castellotti
    */
  module core.sys.freebsd.err;
  import core.stdc.stdarg : va_list;
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/core/sys/freebsd/string.d gcc-16-20260201/libphobos/libdruntime/core/sys/freebsd/string.d
*** gcc-16-20260125/libphobos/libdruntime/core/sys/freebsd/string.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/core/sys/freebsd/string.d	Sun Feb  1 22:32:17 2026
***************
*** 3,9 ****
    *
    * Copyright: Copyright © 2019, The D Language Foundation
    * License: <a href="http://www.boost.org/LICENSE_1_0.txt">Boost License 1.0</a>.
!   * Authors: Ernesto Castellotti
    */
  module core.sys.freebsd.string;
  
--- 3,9 ----
    *
    * Copyright: Copyright © 2019, The D Language Foundation
    * License: <a href="http://www.boost.org/LICENSE_1_0.txt">Boost License 1.0</a>.
!   * Authors: Emily Castellotti
    */
  module core.sys.freebsd.string;
  
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/core/sys/linux/err.d gcc-16-20260201/libphobos/libdruntime/core/sys/linux/err.d
*** gcc-16-20260125/libphobos/libdruntime/core/sys/linux/err.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/core/sys/linux/err.d	Sun Feb  1 22:32:17 2026
***************
*** 3,9 ****
    *
    * Copyright: Copyright © 2019, The D Language Foundation
    * License: <a href="http://www.boost.org/LICENSE_1_0.txt">Boost License 1.0</a>.
!   * Authors: Ernesto Castellotti
    */
  module core.sys.linux.err;
  import core.stdc.stdarg : va_list;
--- 3,9 ----
    *
    * Copyright: Copyright © 2019, The D Language Foundation
    * License: <a href="http://www.boost.org/LICENSE_1_0.txt">Boost License 1.0</a>.
!   * Authors: Emily Castellotti
    */
  module core.sys.linux.err;
  import core.stdc.stdarg : va_list;
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/core/sys/linux/linux/if_packet.d gcc-16-20260201/libphobos/libdruntime/core/sys/linux/linux/if_packet.d
*** gcc-16-20260125/libphobos/libdruntime/core/sys/linux/linux/if_packet.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/core/sys/linux/linux/if_packet.d	Sun Feb  1 22:32:17 2026
*************** struct tpacket_hdr
*** 169,175 ****
  }
  
  enum TPACKET_ALIGNMENT = 16;
! size_t TPACKET_ALIGN(size_t x) { return (x + TPACKET_ALIGNMENT - 1) &~ (TPACKET_ALIGNMENT - 1); }
  enum TPACKET_HDRLEN = TPACKET_ALIGN(tpacket_hdr.sizeof) + sockaddr_ll.sizeof;
  
  struct tpacket2_hdr
--- 169,175 ----
  }
  
  enum TPACKET_ALIGNMENT = 16;
! size_t TPACKET_ALIGN()(size_t x) { return (x + TPACKET_ALIGNMENT - 1) &~ (TPACKET_ALIGNMENT - 1); }
  enum TPACKET_HDRLEN = TPACKET_ALIGN(tpacket_hdr.sizeof) + sockaddr_ll.sizeof;
  
  struct tpacket2_hdr
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/core/sys/linux/netinet/in_.d gcc-16-20260201/libphobos/libdruntime/core/sys/linux/netinet/in_.d
*** gcc-16-20260125/libphobos/libdruntime/core/sys/linux/netinet/in_.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/core/sys/linux/netinet/in_.d	Sun Feb  1 22:32:17 2026
*************** version (linux_libc)
*** 82,109 ****
  
      enum IPPORT_USERRESERVED = 5000;
  
!     extern(D) bool IN_CLASSA(in_addr_t i) pure @safe { return (i & 0x80000000) == 0; }
      enum IN_CLASSA_NET    = 0xff000000;
      enum IN_CLASSA_NSHIFT = 24;
      enum IN_CLASSA_HOST   = 0xffffffff & ~IN_CLASSA_NET;
      enum IN_CLASSA_MAX    = 128;
  
!     extern(D) bool IN_CLASSB(in_addr_t i) pure @safe { return (i & 0xc0000000) == 0x80000000; }
      enum IN_CLASSB_NET    = 0xffff0000;
      enum IN_CLASSB_NSHIFT = 16;
      enum IN_CLASSB_HOST   = 0xffffffff & ~IN_CLASSB_NET;
      enum IN_CLASSB_MAX    = 65536;
  
!     extern(D) bool IN_CLASSC(in_addr_t i) pure @safe { return (i & 0xe0000000) == 0xc0000000; }
      enum IN_CLASSC_NET    = 0xffffff00;
      enum IN_CLASSC_NSHIFT = 8;
      enum IN_CLASSC_HOST   = 0xffffffff & ~IN_CLASSC_NET;
  
!     extern(D) bool IN_CLASSD(in_addr_t i) pure @safe { return (i & 0xf0000000) == 0xe0000000; }
!     extern(D) bool IN_MULTICAST(in_addr_t i) { return IN_CLASSD(i); }
  
!     extern(D) bool IN_EXPERIMENTAL(in_addr_t i) pure @safe { return (i & 0xe0000000) == 0xe0000000; }
!     extern(D) bool IN_BADCLASS(in_addr_t i) pure @safe { return (i & 0xf0000000) == 0xf0000000; }
  
      enum IN_LOOPBACKNET = 127;
  
--- 82,109 ----
  
      enum IPPORT_USERRESERVED = 5000;
  
!     extern(D) bool IN_CLASSA()(in_addr_t i) pure @safe { return (i & 0x80000000) == 0; }
      enum IN_CLASSA_NET    = 0xff000000;
      enum IN_CLASSA_NSHIFT = 24;
      enum IN_CLASSA_HOST   = 0xffffffff & ~IN_CLASSA_NET;
      enum IN_CLASSA_MAX    = 128;
  
!     extern(D) bool IN_CLASSB()(in_addr_t i) pure @safe { return (i & 0xc0000000) == 0x80000000; }
      enum IN_CLASSB_NET    = 0xffff0000;
      enum IN_CLASSB_NSHIFT = 16;
      enum IN_CLASSB_HOST   = 0xffffffff & ~IN_CLASSB_NET;
      enum IN_CLASSB_MAX    = 65536;
  
!     extern(D) bool IN_CLASSC()(in_addr_t i) pure @safe { return (i & 0xe0000000) == 0xc0000000; }
      enum IN_CLASSC_NET    = 0xffffff00;
      enum IN_CLASSC_NSHIFT = 8;
      enum IN_CLASSC_HOST   = 0xffffffff & ~IN_CLASSC_NET;
  
!     extern(D) bool IN_CLASSD()(in_addr_t i) pure @safe { return (i & 0xf0000000) == 0xe0000000; }
!     extern(D) bool IN_MULTICAST()(in_addr_t i) { return IN_CLASSD(i); }
  
!     extern(D) bool IN_EXPERIMENTAL()(in_addr_t i) pure @safe { return (i & 0xe0000000) == 0xe0000000; }
!     extern(D) bool IN_BADCLASS()(in_addr_t i) pure @safe { return (i & 0xf0000000) == 0xf0000000; }
  
      enum IN_LOOPBACKNET = 127;
  
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/core/sys/linux/perf_event.d gcc-16-20260201/libphobos/libdruntime/core/sys/linux/perf_event.d
*** gcc-16-20260125/libphobos/libdruntime/core/sys/linux/perf_event.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/core/sys/linux/perf_event.d	Sun Feb  1 22:32:17 2026
*************** nothrow:
*** 13,94 ****
  import core.sys.posix.sys.ioctl;
  import core.sys.posix.unistd;
  
- version (HPPA)    version = HPPA_Any;
- version (HPPA64)  version = HPPA_Any;
- version (PPC)     version = PPC_Any;
- version (PPC64)   version = PPC_Any;
- version (RISCV32) version = RISCV_Any;
- version (RISCV64) version = RISCV_Any;
- version (S390)    version = IBMZ_Any;
- version (SPARC)   version = SPARC_Any;
- version (SPARC64) version = SPARC_Any;
- version (SystemZ) version = IBMZ_Any;
- 
- version (X86_64)
- {
-     version (D_X32)
-         enum __NR_perf_event_open = 0x40000000 + 298;
-     else
-         enum __NR_perf_event_open = 298;
- }
- else version (X86)
- {
-         enum __NR_perf_event_open = 336;
- }
- else version (ARM)
- {
-         enum __NR_perf_event_open = 364;
- }
- else version (AArch64)
- {
-         enum __NR_perf_event_open = 241;
- }
- else version (HPPA_Any)
- {
-         enum __NR_perf_event_open = 318;
- }
- else version (IBMZ_Any)
- {
-         enum __NR_perf_event_open = 331;
- }
- else version (MIPS32)
- {
-         enum __NR_perf_event_open = 4333;
- }
- else version (MIPS64)
- {
-     version (MIPS_N32)
-         enum __NR_perf_event_open = 6296;
-     else version (MIPS_N64)
-         enum __NR_perf_event_open = 5292;
-     else
-         static assert(0, "Architecture not supported");
- }
- else version (PPC_Any)
- {
-         enum __NR_perf_event_open = 319;
- }
- else version (RISCV_Any)
- {
-         enum __NR_perf_event_open = 241;
- }
- else version (SPARC_Any)
- {
-         enum __NR_perf_event_open = 327;
- }
- else version (LoongArch64)
- {
-         enum __NR_perf_event_open = 241;
- }
- else
- {
-         static assert(0, "Architecture not supported");
- }
- extern (C) extern long syscall(long __sysno, ...);
  static long perf_event_open(perf_event_attr* hw_event, pid_t pid, int cpu, int group_fd, ulong flags)
  {
!         return syscall(__NR_perf_event_open, hw_event, pid, cpu, group_fd, flags);
  }
  /*
   * User-space ABI bits:
   */
--- 13,25 ----
  import core.sys.posix.sys.ioctl;
  import core.sys.posix.unistd;
  
  static long perf_event_open(perf_event_attr* hw_event, pid_t pid, int cpu, int group_fd, ulong flags)
  {
!     import core.sys.linux.unistd : syscall;
!     import core.sys.linux.syscall : __NR_perf_event_open;
!     return syscall(__NR_perf_event_open, hw_event, pid, cpu, group_fd, flags);
  }
+ 
  /*
   * User-space ABI bits:
   */
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/core/sys/linux/sched.d gcc-16-20260201/libphobos/libdruntime/core/sys/linux/sched.d
*** gcc-16-20260125/libphobos/libdruntime/core/sys/linux/sched.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/core/sys/linux/sched.d	Sun Feb  1 22:32:17 2026
*************** private // helpers
*** 41,71 ****
      /* Macros */
  
      /* Basic access functions.  */
!     size_t __CPUELT(size_t cpu) pure
      {
          return cpu / __NCPUBITS;
      }
!     cpu_mask __CPUMASK(size_t cpu) pure
      {
          return 1UL << (cpu % __NCPUBITS);
      }
  
!     cpu_set_t* __CPU_ALLOC(size_t count)
      {
          return cast(cpu_set_t*) malloc(__CPU_ALLOC_SIZE(count));
      }
  
!     size_t __CPU_ALLOC_SIZE(size_t count) pure
      {
          return ((count + __NCPUBITS - 1) / __NCPUBITS) * cpu_mask.sizeof;
      }
  
!     void __CPU_FREE(cpu_set_t* set)
      {
          free(cast(void*) set);
      }
  
!     cpu_mask __CPU_SET_S(size_t cpu, size_t setsize, cpu_set_t* cpusetp) pure
      {
          if (cpu < 8 * setsize)
          {
--- 41,71 ----
      /* Macros */
  
      /* Basic access functions.  */
!     size_t __CPUELT()(size_t cpu) pure
      {
          return cpu / __NCPUBITS;
      }
!     cpu_mask __CPUMASK()(size_t cpu) pure
      {
          return 1UL << (cpu % __NCPUBITS);
      }
  
!     cpu_set_t* __CPU_ALLOC()(size_t count)
      {
          return cast(cpu_set_t*) malloc(__CPU_ALLOC_SIZE(count));
      }
  
!     size_t __CPU_ALLOC_SIZE()(size_t count) pure
      {
          return ((count + __NCPUBITS - 1) / __NCPUBITS) * cpu_mask.sizeof;
      }
  
!     void __CPU_FREE()(cpu_set_t* set)
      {
          free(cast(void*) set);
      }
  
!     cpu_mask __CPU_SET_S()(size_t cpu, size_t setsize, cpu_set_t* cpusetp) pure
      {
          if (cpu < 8 * setsize)
          {
*************** private // helpers
*** 76,89 ****
          return 0;
      }
  
!     bool __CPU_ISSET_S(size_t cpu, size_t setsize, cpu_set_t* cpusetp) pure
      {
          if (cpu < 8 * setsize)
              return (cpusetp.__bits[__CPUELT(cpu)] & __CPUMASK(cpu)) != 0;
          return false;
      }
  
!     int __CPU_COUNT_S(size_t setsize, cpu_set_t* cpusetp) pure
      {
          int s = 0;
          foreach (i; cpusetp.__bits[0 .. (setsize / cpu_mask.sizeof)])
--- 76,89 ----
          return 0;
      }
  
!     bool __CPU_ISSET_S()(size_t cpu, size_t setsize, cpu_set_t* cpusetp) pure
      {
          if (cpu < 8 * setsize)
              return (cpusetp.__bits[__CPUELT(cpu)] & __CPUMASK(cpu)) != 0;
          return false;
      }
  
!     int __CPU_COUNT_S()(size_t setsize, cpu_set_t* cpusetp) pure
      {
          int s = 0;
          foreach (i; cpusetp.__bits[0 .. (setsize / cpu_mask.sizeof)])
*************** struct cpu_set_t
*** 103,139 ****
  
  /// Access macros for 'cpu_set' (missing a lot of them)
  
! cpu_set_t* CPU_ALLOC(size_t count)
  {
      return __CPU_ALLOC(count);
  }
  
! size_t CPU_ALLOC_SIZE(size_t count) pure
  {
      return __CPU_ALLOC_SIZE(count);
  }
  
! void CPU_FREE(cpu_set_t* set)
  {
      __CPU_FREE(set);
  }
  
! cpu_mask CPU_SET(size_t cpu, cpu_set_t* cpusetp) pure
  {
       return __CPU_SET_S(cpu, cpu_set_t.sizeof, cpusetp);
  }
  
! bool CPU_ISSET(size_t cpu, cpu_set_t* cpusetp) pure
  {
      return __CPU_ISSET_S(cpu, cpu_set_t.sizeof, cpusetp);
  }
  
! int CPU_COUNT(cpu_set_t* cpusetp) pure
  {
      return __CPU_COUNT_S(cpu_set_t.sizeof, cpusetp);
  }
  
! int CPU_COUNT_S(size_t setsize, cpu_set_t* cpusetp) pure
  {
      return __CPU_COUNT_S(setsize, cpusetp);
  }
--- 103,139 ----
  
  /// Access macros for 'cpu_set' (missing a lot of them)
  
! cpu_set_t* CPU_ALLOC()(size_t count)
  {
      return __CPU_ALLOC(count);
  }
  
! size_t CPU_ALLOC_SIZE()(size_t count) pure
  {
      return __CPU_ALLOC_SIZE(count);
  }
  
! void CPU_FREE()(cpu_set_t* set)
  {
      __CPU_FREE(set);
  }
  
! cpu_mask CPU_SET()(size_t cpu, cpu_set_t* cpusetp) pure
  {
       return __CPU_SET_S(cpu, cpu_set_t.sizeof, cpusetp);
  }
  
! bool CPU_ISSET()(size_t cpu, cpu_set_t* cpusetp) pure
  {
      return __CPU_ISSET_S(cpu, cpu_set_t.sizeof, cpusetp);
  }
  
! int CPU_COUNT()(cpu_set_t* cpusetp) pure
  {
      return __CPU_COUNT_S(cpu_set_t.sizeof, cpusetp);
  }
  
! int CPU_COUNT_S()(size_t setsize, cpu_set_t* cpusetp) pure
  {
      return __CPU_COUNT_S(setsize, cpusetp);
  }
*************** version (CRuntime_Glibc)
*** 151,156 ****
--- 151,160 ----
      /* Determine CPU on which the calling thread is running */
      int sched_getcpu();
  }
+ else version (CRuntime_Musl)
+ {
+     int sched_getcpu();
+ }
  
  /* Reassociate the calling thread with namespace referred to by fd */
  int setns(int fd, int nstype);
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/core/sys/linux/string.d gcc-16-20260201/libphobos/libdruntime/core/sys/linux/string.d
*** gcc-16-20260125/libphobos/libdruntime/core/sys/linux/string.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/core/sys/linux/string.d	Sun Feb  1 22:32:17 2026
***************
*** 3,9 ****
    *
    * Copyright: Copyright © 2019, The D Language Foundation
    * License: <a href="http://www.boost.org/LICENSE_1_0.txt">Boost License 1.0</a>.
!   * Authors: Ernesto Castellotti
    */
  module core.sys.linux.string;
  
--- 3,9 ----
    *
    * Copyright: Copyright © 2019, The D Language Foundation
    * License: <a href="http://www.boost.org/LICENSE_1_0.txt">Boost License 1.0</a>.
!   * Authors: Emily Castellotti
    */
  module core.sys.linux.string;
  
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/core/sys/linux/sys/syscall.d gcc-16-20260201/libphobos/libdruntime/core/sys/linux/sys/syscall.d
*** gcc-16-20260125/libphobos/libdruntime/core/sys/linux/sys/syscall.d	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/libphobos/libdruntime/core/sys/linux/sys/syscall.d	Sun Feb  1 22:32:17 2026
***************
*** 0 ****
--- 1,127 ----
+ /**
+  * D header file for GNU/Linux
+  *
+  * $(LINK2 https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/sys/syscall.h, glibc sys/syscall.h)
+  */
+ 
+ module core.sys.linux.sys.syscall;
+ 
+ version (linux):
+ extern (C):
+ @nogc:
+ nothrow:
+ 
+ version (HPPA)    version = HPPA_Any;
+ version (HPPA64)  version = HPPA_Any;
+ version (PPC)     version = PPC_Any;
+ version (PPC64)   version = PPC_Any;
+ version (RISCV32) version = RISCV_Any;
+ version (RISCV64) version = RISCV_Any;
+ version (S390)    version = IBMZ_Any;
+ version (SPARC)   version = SPARC_Any;
+ version (SPARC64) version = SPARC_Any;
+ version (SystemZ) version = IBMZ_Any;
+ 
+ /+
+     Check out the following links for handy tables:
+ 
+     - <https://gpages.juszkiewicz.com.pl/syscalls-table/syscalls.html>
+     - <https://github.com/hrw/syscalls-table>
+  +/
+ 
+ // <asm/unistd.h>
+ // List the numbers of the system calls the system knows.
+ version (X86_64)
+ {
+     version (D_X32)
+     {
+         private enum __X32_SYSCALL_BIT = 0x40000000;
+ 
+         enum __NR_getrandom = __X32_SYSCALL_BIT + 318;
+         enum __NR_perf_event_open = __X32_SYSCALL_BIT + 298;
+     }
+     else
+     {
+         enum __NR_getrandom = 318;
+         enum __NR_perf_event_open = 298;
+     }
+ }
+ else version (X86)
+ {
+     enum __NR_getrandom = 355;
+     enum __NR_perf_event_open = 336;
+ }
+ else version (ARM)
+ {
+     enum __NR_getrandom = 384;
+     enum __NR_perf_event_open = 364;
+ }
+ else version (AArch64)
+ {
+     enum __NR_getrandom = 278;
+     enum __NR_perf_event_open = 241;
+ }
+ else version (HPPA_Any)
+ {
+     enum __NR_getrandom = 339;
+     enum __NR_perf_event_open = 318;
+ }
+ else version (IBMZ_Any)
+ {
+     enum __NR_getrandom = 349;
+     enum __NR_perf_event_open = 331;
+ }
+ else version (MIPS32)
+ {
+     enum __NR_getrandom = 4353;
+     enum __NR_perf_event_open = 4333;
+ }
+ else version (MIPS64)
+ {
+     version (MIPS_N32)
+     {
+         enum __NR_getrandom = 6317;
+         enum __NR_perf_event_open = 6296;
+     }
+     else version (MIPS_N64)
+     {
+         enum __NR_getrandom = 5313;
+         enum __NR_perf_event_open = 5292;
+     }
+     else
+         static assert(0, "Architecture not supported");
+ }
+ else version (PPC_Any)
+ {
+     enum __NR_getrandom = 359;
+     enum __NR_perf_event_open = 319;
+ }
+ else version (RISCV_Any)
+ {
+     enum __NR_getrandom = 278;
+     enum __NR_perf_event_open = 241;
+ }
+ else version (SPARC_Any)
+ {
+     enum __NR_getrandom = 347;
+     enum __NR_perf_event_open = 327;
+ }
+ else version (LoongArch64)
+ {
+     enum __NR_getrandom = 278;
+     enum __NR_perf_event_open = 241;
+ }
+ else version (Xtensa)
+ {
+     enum __NR_getrandom = 338;
+     enum __NR_perf_event_open = 327;
+ }
+ else
+ {
+     static assert(0, "Architecture not supported");
+ }
+ 
+ // <bits/syscall.h>
+ // Defines SYS_* names for the __NR_* numbers of known names.
+ enum SYS_getrandom = __NR_getrandom;
+ enum SYS_perf_event_open = __NR_perf_event_open;
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/core/sys/linux/sys/time.d gcc-16-20260201/libphobos/libdruntime/core/sys/linux/sys/time.d
*** gcc-16-20260125/libphobos/libdruntime/core/sys/linux/sys/time.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/core/sys/linux/sys/time.d	Sun Feb  1 22:32:17 2026
*************** version (linux):
*** 23,29 ****
   */
  extern (D) pure @safe @nogc nothrow {
  
!     void timeradd(const timeval* a, const timeval* b,
              timeval* result)
      {
          result.tv_sec = a.tv_sec + b.tv_sec;
--- 23,29 ----
   */
  extern (D) pure @safe @nogc nothrow {
  
!     void timeradd()(const timeval* a, const timeval* b,
              timeval* result)
      {
          result.tv_sec = a.tv_sec + b.tv_sec;
*************** extern (D) pure @safe @nogc nothrow {
*** 35,41 ****
          }
      }
  
!     void timersub(const timeval* a, const timeval* b,
              timeval *result)
      {
          result.tv_sec = a.tv_sec - b.tv_sec;
--- 35,41 ----
          }
      }
  
!     void timersub()(const timeval* a, const timeval* b,
              timeval *result)
      {
          result.tv_sec = a.tv_sec - b.tv_sec;
*************** extern (D) pure @safe @nogc nothrow {
*** 46,57 ****
          }
      }
  
!     void timerclear(timeval* tvp)
      {
          (tvp.tv_sec = tvp.tv_usec = 0);
      }
  
!     int timerisset(timeval* tvp)
      {
          return cast(int) (tvp.tv_sec || tvp.tv_usec);
      }
--- 46,57 ----
          }
      }
  
!     void timerclear()(timeval* tvp)
      {
          (tvp.tv_sec = tvp.tv_usec = 0);
      }
  
!     int timerisset()(timeval* tvp)
      {
          return cast(int) (tvp.tv_sec || tvp.tv_usec);
      }
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/core/sys/linux/syscall.d gcc-16-20260201/libphobos/libdruntime/core/sys/linux/syscall.d
*** gcc-16-20260125/libphobos/libdruntime/core/sys/linux/syscall.d	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/libphobos/libdruntime/core/sys/linux/syscall.d	Sun Feb  1 22:32:17 2026
***************
*** 0 ****
--- 1,14 ----
+ /**
+  * D header file for GNU/Linux
+  *
+  * $(LINK2 https://sourceware.org/git/?p=glibc.git;a=blob;f=misc/syscall.h, glibc syscall.h)
+  */
+ 
+ module core.sys.linux.syscall;
+ 
+ version (linux):
+ extern (C):
+ @nogc:
+ nothrow:
+ 
+ public import core.sys.linux.sys.syscall;
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/core/sys/linux/unistd.d gcc-16-20260201/libphobos/libdruntime/core/sys/linux/unistd.d
*** gcc-16-20260125/libphobos/libdruntime/core/sys/linux/unistd.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/core/sys/linux/unistd.d	Sun Feb  1 22:32:17 2026
*************** extern(C):
*** 7,12 ****
--- 7,14 ----
  nothrow:
  @nogc:
  
+ import core.stdc.config : c_long;
+ 
  // Additional seek constants for sparse file handling
  // from Linux's unistd.h, stdio.h, and linux/fs.h
  // (see http://man7.org/linux/man-pages/man2/lseek.2.html)
*************** void exit_group(int status);
*** 25,27 ****
--- 27,32 ----
  
  /// Close all open file descriptors greater or equal to `lowfd`
  void closefrom(int lowfd);
+ 
+ /// Invoke system call number `sysno`, passing it the remaining arguments.
+ c_long syscall(c_long sysno, ...);
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/core/sys/netbsd/err.d gcc-16-20260201/libphobos/libdruntime/core/sys/netbsd/err.d
*** gcc-16-20260125/libphobos/libdruntime/core/sys/netbsd/err.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/core/sys/netbsd/err.d	Sun Feb  1 22:32:17 2026
***************
*** 3,9 ****
    *
    * Copyright: Copyright © 2019, The D Language Foundation
    * License: <a href="http://www.boost.org/LICENSE_1_0.txt">Boost License 1.0</a>.
!   * Authors: Ernesto Castellotti
    */
  module core.sys.netbsd.err;
  import core.stdc.stdarg : va_list;
--- 3,9 ----
    *
    * Copyright: Copyright © 2019, The D Language Foundation
    * License: <a href="http://www.boost.org/LICENSE_1_0.txt">Boost License 1.0</a>.
!   * Authors: Emily Castellotti
    */
  module core.sys.netbsd.err;
  import core.stdc.stdarg : va_list;
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/core/sys/netbsd/string.d gcc-16-20260201/libphobos/libdruntime/core/sys/netbsd/string.d
*** gcc-16-20260125/libphobos/libdruntime/core/sys/netbsd/string.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/core/sys/netbsd/string.d	Sun Feb  1 22:32:17 2026
***************
*** 3,9 ****
    *
    * Copyright: Copyright © 2019, The D Language Foundation
    * License: <a href="http://www.boost.org/LICENSE_1_0.txt">Boost License 1.0</a>.
!   * Authors: Ernesto Castellotti
    */
  module core.sys.netbsd.string;
  
--- 3,9 ----
    *
    * Copyright: Copyright © 2019, The D Language Foundation
    * License: <a href="http://www.boost.org/LICENSE_1_0.txt">Boost License 1.0</a>.
!   * Authors: Emily Castellotti
    */
  module core.sys.netbsd.string;
  
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/core/sys/netbsd/sys/featuretest.d gcc-16-20260201/libphobos/libdruntime/core/sys/netbsd/sys/featuretest.d
*** gcc-16-20260125/libphobos/libdruntime/core/sys/netbsd/sys/featuretest.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/core/sys/netbsd/sys/featuretest.d	Sun Feb  1 22:32:17 2026
***************
*** 3,9 ****
    *
    * Copyright: Copyright © 2019, The D Language Foundation
    * License: <a href="http://www.boost.org/LICENSE_1_0.txt">Boost License 1.0</a>.
!   * Authors: Ernesto Castellotti
    */
  module core.sys.netbsd.sys.featuretest;
  
--- 3,9 ----
    *
    * Copyright: Copyright © 2019, The D Language Foundation
    * License: <a href="http://www.boost.org/LICENSE_1_0.txt">Boost License 1.0</a>.
!   * Authors: Emily Castellotti
    */
  module core.sys.netbsd.sys.featuretest;
  
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/core/sys/openbsd/err.d gcc-16-20260201/libphobos/libdruntime/core/sys/openbsd/err.d
*** gcc-16-20260125/libphobos/libdruntime/core/sys/openbsd/err.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/core/sys/openbsd/err.d	Sun Feb  1 22:32:17 2026
***************
*** 3,9 ****
    *
    * Copyright: Copyright © 2019, The D Language Foundation
    * License: <a href="http://www.boost.org/LICENSE_1_0.txt">Boost License 1.0</a>.
!   * Authors: Ernesto Castellotti
    */
  module core.sys.openbsd.err;
  import core.stdc.stdarg : va_list;
--- 3,9 ----
    *
    * Copyright: Copyright © 2019, The D Language Foundation
    * License: <a href="http://www.boost.org/LICENSE_1_0.txt">Boost License 1.0</a>.
!   * Authors: Emily Castellotti
    */
  module core.sys.openbsd.err;
  import core.stdc.stdarg : va_list;
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/core/sys/openbsd/string.d gcc-16-20260201/libphobos/libdruntime/core/sys/openbsd/string.d
*** gcc-16-20260125/libphobos/libdruntime/core/sys/openbsd/string.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/core/sys/openbsd/string.d	Sun Feb  1 22:32:17 2026
***************
*** 3,9 ****
    *
    * Copyright: Copyright © 2019, The D Language Foundation
    * License: <a href="http://www.boost.org/LICENSE_1_0.txt">Boost License 1.0</a>.
!   * Authors: Ernesto Castellotti
    */
  module core.sys.openbsd.string;
  
--- 3,9 ----
    *
    * Copyright: Copyright © 2019, The D Language Foundation
    * License: <a href="http://www.boost.org/LICENSE_1_0.txt">Boost License 1.0</a>.
!   * Authors: Emily Castellotti
    */
  module core.sys.openbsd.string;
  
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/core/sys/posix/dirent.d gcc-16-20260201/libphobos/libdruntime/core/sys/posix/dirent.d
*** gcc-16-20260125/libphobos/libdruntime/core/sys/posix/dirent.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/core/sys/posix/dirent.d	Sun Feb  1 22:32:17 2026
*************** else version (CRuntime_Musl)
*** 394,409 ****
  
      struct DIR
      {
      }
  
!     static if ( __USE_FILE_OFFSET64 )
!     {
!         dirent* readdir64(DIR*);
!         alias   readdir64 readdir;
!     }
!     else
      {
!         dirent* readdir(DIR*);
      }
  }
  else version (CRuntime_UClibc)
--- 394,407 ----
  
      struct DIR
      {
+         // Managed by OS
      }
  
!     dirent* readdir(DIR*);
! 
!     static if (__USE_LARGEFILE64)
      {
!         alias readdir64 = readdir;
      }
  }
  else version (CRuntime_UClibc)
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/core/sys/posix/dlfcn.d gcc-16-20260201/libphobos/libdruntime/core/sys/posix/dlfcn.d
*** gcc-16-20260125/libphobos/libdruntime/core/sys/posix/dlfcn.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/core/sys/posix/dlfcn.d	Sun Feb  1 22:32:17 2026
*************** version (CRuntime_Glibc)
*** 189,196 ****
          void* dli_saddr;
      }
  }
! else
! version (CRuntime_Musl)
  {
      enum RTLD_LAZY   = 1;
      enum RTLD_NOW    = 2;
--- 189,195 ----
          void* dli_saddr;
      }
  }
! else version (CRuntime_Musl)
  {
      enum RTLD_LAZY   = 1;
      enum RTLD_NOW    = 2;
*************** else version (CRuntime_Bionic)
*** 397,426 ****
      struct Dl_info
      {
          const(char)* dli_fname;
-         void*        dli_fbase;
-         const(char)* dli_sname;
-         void*        dli_saddr;
-     }
- }
- else version (CRuntime_Musl)
- {
-     enum {
-         RTLD_LAZY     = 1,
-         RTLD_NOW      = 2,
-         RTLD_NOLOAD   = 4,
-         RTLD_NODELETE = 4096,
-         RTLD_GLOBAL   = 256,
-         RTLD_LOCAL    = 0,
-     }
-     int          dlclose(void*);
-     const(char)* dlerror();
-     void*        dlopen(const scope char*, int);
-     void*        dlsym(void*, const scope char*);
- 
-     int dladdr(scope const void *addr, Dl_info *info);
-     struct Dl_info
-     {
-         const(char)* dli_fname;
          void*        dli_fbase;
          const(char)* dli_sname;
          void*        dli_saddr;
--- 396,401 ----
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/core/sys/posix/endian.d gcc-16-20260201/libphobos/libdruntime/core/sys/posix/endian.d
*** gcc-16-20260125/libphobos/libdruntime/core/sys/posix/endian.d	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/libphobos/libdruntime/core/sys/posix/endian.d	Sun Feb  1 22:32:17 2026
***************
*** 0 ****
--- 1,60 ----
+ /**
+  * D header file for POSIX.
+  *
+  * $(LINK2 https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/endian.h.html posix endian.h)
+  *
+  * Standards: The Open Group Base Specifications Issue 8, IEEE Std 1003.1, 2024 Edition
+  */
+ module core.sys.posix.endian;
+ 
+ version (Posix):
+ nothrow:
+ @safe:
+ @nogc:
+ 
+ import core.bitop;
+ 
+ enum LITTLE_ENDIAN = 1234;
+ enum BIG_ENDIAN = 4321;
+ enum PDP_ENDIAN = 3412;
+ 
+ version (LittleEndian)
+ {
+     enum BYTE_ORDER = LITTLE_ENDIAN;
+ 
+     pragma(inline, true):
+     ushort htobe16(ushort x) => core.bitop.byteswap(x);
+     ushort htole16(ushort x) => x;
+     ushort be16toh(ushort x) => core.bitop.byteswap(x);
+     ushort le16toh(ushort x) => x;
+ 
+     uint htobe32(uint x) => core.bitop.bswap(x);
+     uint htole32(uint x) => x;
+     uint be32toh(uint x) => core.bitop.bswap(x);
+     uint le32toh(uint x) => x;
+ 
+     ulong htobe64(ulong x) => core.bitop.bswap(x);
+     ulong htole64(ulong x) => x;
+     ulong be64toh(ulong x) => core.bitop.bswap(x);
+     ulong le64toh(ulong x) => x;
+ }
+ else
+ {
+     enum BYTE_ORDER = BIG_ENDIAN;
+ 
+     pragma(inline, true):
+     ushort htobe16(ushort x) => x;
+     ushort htole16(ushort x) => core.bitop.byteswap(x);
+     ushort be16toh(ushort x) => x;
+     ushort le16toh(ushort x) => core.bitop.byteswap(x);
+ 
+     uint htobe32(uint x) => x;
+     uint htole32(uint x) => core.bitop.bswap(x);
+     uint be32toh(uint x) => x;
+     uint le32toh(uint x) => core.bitop.bswap(x);
+ 
+     ulong htobe64(ulong x) => x;
+     ulong htole64(ulong x) => core.bitop.bswap(x);
+     ulong be64toh(ulong x) => x;
+     ulong le64toh(ulong x) => core.bitop.bswap(x);
+ }
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/core/sys/posix/netdb.d gcc-16-20260201/libphobos/libdruntime/core/sys/posix/netdb.d
*** gcc-16-20260125/libphobos/libdruntime/core/sys/posix/netdb.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/core/sys/posix/netdb.d	Sun Feb  1 22:32:17 2026
*************** version (CRuntime_Glibc)
*** 153,159 ****
          int     h_addrtype;
          int     h_length;
          char**  h_addr_list;
!         char*   h_addr() @property { return h_addr_list[0]; } // non-standard
      }
  
      struct netent
--- 153,159 ----
          int     h_addrtype;
          int     h_length;
          char**  h_addr_list;
!         char*   h_addr()() @property { return h_addr_list[0]; } // non-standard
      }
  
      struct netent
*************** else version (Darwin)
*** 237,243 ****
          int     h_addrtype;
          int     h_length;
          char**  h_addr_list;
!         char*   h_addr() @property { return h_addr_list[0]; } // non-standard
      }
  
      struct netent
--- 237,243 ----
          int     h_addrtype;
          int     h_length;
          char**  h_addr_list;
!         char*   h_addr()() @property { return h_addr_list[0]; } // non-standard
      }
  
      struct netent
*************** else version (FreeBSD)
*** 321,327 ****
          int     h_addrtype;
          int     h_length;
          char**  h_addr_list;
!         extern (D) char* h_addr() @property { return h_addr_list[0]; } // non-standard
      }
  
      struct netent
--- 321,327 ----
          int     h_addrtype;
          int     h_length;
          char**  h_addr_list;
!         extern (D) char* h_addr()() @property { return h_addr_list[0]; } // non-standard
      }
  
      struct netent
*************** else version (NetBSD)
*** 405,411 ****
          int     h_addrtype;
          int     h_length;
          char**  h_addr_list;
!         extern (D) char* h_addr() @property { return h_addr_list[0]; } // non-standard
      }
  
      struct netent
--- 405,411 ----
          int     h_addrtype;
          int     h_length;
          char**  h_addr_list;
!         extern (D) char* h_addr()() @property { return h_addr_list[0]; } // non-standard
      }
  
      struct netent
*************** else version (OpenBSD)
*** 512,518 ****
          int       h_addrtype;
          int       h_length;
          char**    h_addr_list;
!         extern (D) char* h_addr() @property { return h_addr_list[0]; } // non-standard
      }
  
      struct netent
--- 512,518 ----
          int       h_addrtype;
          int       h_length;
          char**    h_addr_list;
!         extern (D) char* h_addr()() @property { return h_addr_list[0]; } // non-standard
      }
  
      struct netent
*************** else version (DragonFlyBSD)
*** 608,614 ****
          int     h_addrtype;
          int     h_length;
          char**  h_addr_list;
!         extern (D) char* h_addr() @property { return h_addr_list[0]; } // non-standard
      }
  
      struct netent
--- 608,614 ----
          int     h_addrtype;
          int     h_length;
          char**  h_addr_list;
!         extern (D) char* h_addr()() @property { return h_addr_list[0]; } // non-standard
      }
  
      struct netent
*************** else version (Solaris)
*** 706,712 ****
          int h_length;
          char** h_addr_list;
  
!         extern (D) char* h_addr() @property { return h_addr_list[0]; } // non-standard
      }
  
      struct netent
--- 706,712 ----
          int h_length;
          char** h_addr_list;
  
!         extern (D) char* h_addr()() @property { return h_addr_list[0]; } // non-standard
      }
  
      struct netent
*************** else version (CRuntime_Bionic)
*** 793,799 ****
          int     h_addrtype;
          int     h_length;
          char**  h_addr_list;
!         extern (D) char* h_addr() @property { return h_addr_list[0]; } // non-standard
      }
  
      struct netent
--- 793,799 ----
          int     h_addrtype;
          int     h_length;
          char**  h_addr_list;
!         extern (D) char* h_addr()() @property { return h_addr_list[0]; } // non-standard
      }
  
      struct netent
*************** else version (CRuntime_Musl)
*** 874,880 ****
          int     h_addrtype;
          int     h_length;
          char**  h_addr_list;
!         char*   h_addr() @property { return h_addr_list[0]; } // non-standard
      }
  
      struct netent
--- 874,880 ----
          int     h_addrtype;
          int     h_length;
          char**  h_addr_list;
!         char*   h_addr()() @property { return h_addr_list[0]; } // non-standard
      }
  
      struct netent
*************** else version (CRuntime_UClibc)
*** 952,958 ****
          int     h_addrtype;
          int     h_length;
          char**  h_addr_list;
!         extern (D) char* h_addr() @property { return h_addr_list[0]; } // non-standard
      }
  
      struct netent
--- 952,958 ----
          int     h_addrtype;
          int     h_length;
          char**  h_addr_list;
!         extern (D) char* h_addr()() @property { return h_addr_list[0]; } // non-standard
      }
  
      struct netent
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/core/sys/posix/netinet/in_.d gcc-16-20260201/libphobos/libdruntime/core/sys/posix/netinet/in_.d
*** gcc-16-20260125/libphobos/libdruntime/core/sys/posix/netinet/in_.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/core/sys/posix/netinet/in_.d	Sun Feb  1 22:32:17 2026
*************** version (CRuntime_Glibc)
*** 547,553 ****
      }
  
      // macros
!     extern (D) int IN6_IS_ADDR_UNSPECIFIED( const scope in6_addr* addr ) pure
      {
          return (cast(uint32_t*) addr)[0] == 0 &&
                 (cast(uint32_t*) addr)[1] == 0 &&
--- 547,553 ----
      }
  
      // macros
!     extern (D) int IN6_IS_ADDR_UNSPECIFIED()(const scope in6_addr* add) pure
      {
          return (cast(uint32_t*) addr)[0] == 0 &&
                 (cast(uint32_t*) addr)[1] == 0 &&
*************** version (CRuntime_Glibc)
*** 555,561 ****
                 (cast(uint32_t*) addr)[3] == 0;
      }
  
!     extern (D) int IN6_IS_ADDR_LOOPBACK( const scope in6_addr* addr ) pure
      {
          return (cast(uint32_t*) addr)[0] == 0  &&
                 (cast(uint32_t*) addr)[1] == 0  &&
--- 555,561 ----
                 (cast(uint32_t*) addr)[3] == 0;
      }
  
!     extern (D) int IN6_IS_ADDR_LOOPBACK()(const scope in6_addr* add) pure
      {
          return (cast(uint32_t*) addr)[0] == 0  &&
                 (cast(uint32_t*) addr)[1] == 0  &&
*************** version (CRuntime_Glibc)
*** 563,591 ****
                 (cast(uint32_t*) addr)[3] == htonl( 1 );
      }
  
!     extern (D) int IN6_IS_ADDR_MULTICAST( const scope in6_addr* addr ) pure
      {
          return (cast(uint8_t*) addr)[0] == 0xff;
      }
  
!     extern (D) int IN6_IS_ADDR_LINKLOCAL( const scope in6_addr* addr ) pure
      {
          return ((cast(uint32_t*) addr)[0] & htonl( 0xffc00000 )) == htonl( 0xfe800000 );
      }
  
!     extern (D) int IN6_IS_ADDR_SITELOCAL( const scope in6_addr* addr ) pure
      {
          return ((cast(uint32_t*) addr)[0] & htonl( 0xffc00000 )) == htonl( 0xfec00000 );
      }
  
!     extern (D) int IN6_IS_ADDR_V4MAPPED( const scope in6_addr* addr ) pure
      {
          return (cast(uint32_t*) addr)[0] == 0 &&
                 (cast(uint32_t*) addr)[1] == 0 &&
                 (cast(uint32_t*) addr)[2] == htonl( 0xffff );
      }
  
!     extern (D) int IN6_IS_ADDR_V4COMPAT( const scope in6_addr* addr ) pure
      {
          return (cast(uint32_t*) addr)[0] == 0 &&
                 (cast(uint32_t*) addr)[1] == 0 &&
--- 563,591 ----
                 (cast(uint32_t*) addr)[3] == htonl( 1 );
      }
  
!     extern (D) int IN6_IS_ADDR_MULTICAST()(const scope in6_addr* add) pure
      {
          return (cast(uint8_t*) addr)[0] == 0xff;
      }
  
!     extern (D) int IN6_IS_ADDR_LINKLOCAL()(const scope in6_addr* add) pure
      {
          return ((cast(uint32_t*) addr)[0] & htonl( 0xffc00000 )) == htonl( 0xfe800000 );
      }
  
!     extern (D) int IN6_IS_ADDR_SITELOCAL()(const scope in6_addr* add) pure
      {
          return ((cast(uint32_t*) addr)[0] & htonl( 0xffc00000 )) == htonl( 0xfec00000 );
      }
  
!     extern (D) int IN6_IS_ADDR_V4MAPPED()(const scope in6_addr* add) pure
      {
          return (cast(uint32_t*) addr)[0] == 0 &&
                 (cast(uint32_t*) addr)[1] == 0 &&
                 (cast(uint32_t*) addr)[2] == htonl( 0xffff );
      }
  
!     extern (D) int IN6_IS_ADDR_V4COMPAT()(const scope in6_addr* add) pure
      {
          return (cast(uint32_t*) addr)[0] == 0 &&
                 (cast(uint32_t*) addr)[1] == 0 &&
*************** version (CRuntime_Glibc)
*** 593,623 ****
                 ntohl( (cast(uint32_t*) addr)[3] ) > 1;
      }
  
!     extern (D) int IN6_IS_ADDR_MC_NODELOCAL( const scope in6_addr* addr ) pure
      {
          return IN6_IS_ADDR_MULTICAST( addr ) &&
                 ((cast(uint8_t*) addr)[1] & 0xf) == 0x1;
      }
  
!     extern (D) int IN6_IS_ADDR_MC_LINKLOCAL( const scope in6_addr* addr ) pure
      {
          return IN6_IS_ADDR_MULTICAST( addr ) &&
                 ((cast(uint8_t*) addr)[1] & 0xf) == 0x2;
      }
  
!     extern (D) int IN6_IS_ADDR_MC_SITELOCAL( const scope in6_addr* addr ) pure
      {
          return IN6_IS_ADDR_MULTICAST(addr) &&
                 ((cast(uint8_t*) addr)[1] & 0xf) == 0x5;
      }
  
!     extern (D) int IN6_IS_ADDR_MC_ORGLOCAL( const scope in6_addr* addr ) pure
      {
          return IN6_IS_ADDR_MULTICAST( addr) &&
                 ((cast(uint8_t*) addr)[1] & 0xf) == 0x8;
      }
  
!     extern (D) int IN6_IS_ADDR_MC_GLOBAL( const scope in6_addr* addr ) pure
      {
          return IN6_IS_ADDR_MULTICAST( addr ) &&
                 ((cast(uint8_t*) addr)[1] & 0xf) == 0xe;
--- 593,623 ----
                 ntohl( (cast(uint32_t*) addr)[3] ) > 1;
      }
  
!     extern (D) int IN6_IS_ADDR_MC_NODELOCAL()(const scope in6_addr* add) pure
      {
          return IN6_IS_ADDR_MULTICAST( addr ) &&
                 ((cast(uint8_t*) addr)[1] & 0xf) == 0x1;
      }
  
!     extern (D) int IN6_IS_ADDR_MC_LINKLOCAL()(const scope in6_addr* add) pure
      {
          return IN6_IS_ADDR_MULTICAST( addr ) &&
                 ((cast(uint8_t*) addr)[1] & 0xf) == 0x2;
      }
  
!     extern (D) int IN6_IS_ADDR_MC_SITELOCAL()(const scope in6_addr* add) pure
      {
          return IN6_IS_ADDR_MULTICAST(addr) &&
                 ((cast(uint8_t*) addr)[1] & 0xf) == 0x5;
      }
  
!     extern (D) int IN6_IS_ADDR_MC_ORGLOCAL()(const scope in6_addr* add) pure
      {
          return IN6_IS_ADDR_MULTICAST( addr) &&
                 ((cast(uint8_t*) addr)[1] & 0xf) == 0x8;
      }
  
!     extern (D) int IN6_IS_ADDR_MC_GLOBAL()(const scope in6_addr* add) pure
      {
          return IN6_IS_ADDR_MULTICAST( addr ) &&
                 ((cast(uint8_t*) addr)[1] & 0xf) == 0xe;
*************** else version (Darwin)
*** 670,676 ****
      }
  
      // macros
!     extern (D) int IN6_IS_ADDR_UNSPECIFIED( const scope in6_addr* addr ) pure
      {
          return (cast(uint32_t*) addr)[0] == 0 &&
                 (cast(uint32_t*) addr)[1] == 0 &&
--- 670,676 ----
      }
  
      // macros
!     extern (D) int IN6_IS_ADDR_UNSPECIFIED()(const scope in6_addr* add) pure
      {
          return (cast(uint32_t*) addr)[0] == 0 &&
                 (cast(uint32_t*) addr)[1] == 0 &&
*************** else version (Darwin)
*** 678,684 ****
                 (cast(uint32_t*) addr)[3] == 0;
      }
  
!     extern (D) int IN6_IS_ADDR_LOOPBACK( const scope in6_addr* addr ) pure
      {
          return (cast(uint32_t*) addr)[0] == 0  &&
                 (cast(uint32_t*) addr)[1] == 0  &&
--- 678,684 ----
                 (cast(uint32_t*) addr)[3] == 0;
      }
  
!     extern (D) int IN6_IS_ADDR_LOOPBACK()(const scope in6_addr* add) pure
      {
          return (cast(uint32_t*) addr)[0] == 0  &&
                 (cast(uint32_t*) addr)[1] == 0  &&
*************** else version (Darwin)
*** 686,714 ****
                 (cast(uint32_t*) addr)[3] == ntohl( 1 );
      }
  
!     extern (D) int IN6_IS_ADDR_MULTICAST( const scope in6_addr* addr ) pure
      {
          return addr.s6_addr[0] == 0xff;
      }
  
!     extern (D) int IN6_IS_ADDR_LINKLOCAL( const scope in6_addr* addr ) pure
      {
          return addr.s6_addr[0] == 0xfe && (addr.s6_addr[1] & 0xc0) == 0x80;
      }
  
!     extern (D) int IN6_IS_ADDR_SITELOCAL( const scope in6_addr* addr ) pure
      {
          return addr.s6_addr[0] == 0xfe && (addr.s6_addr[1] & 0xc0) == 0xc0;
      }
  
!     extern (D) int IN6_IS_ADDR_V4MAPPED( const scope in6_addr* addr ) pure
      {
          return (cast(uint32_t*) addr)[0] == 0 &&
                 (cast(uint32_t*) addr)[1] == 0 &&
                 (cast(uint32_t*) addr)[2] == ntohl( 0x0000ffff );
      }
  
!     extern (D) int IN6_IS_ADDR_V4COMPAT( const scope in6_addr* addr ) pure
      {
          return (cast(uint32_t*) addr)[0] == 0 &&
                 (cast(uint32_t*) addr)[1] == 0 &&
--- 686,714 ----
                 (cast(uint32_t*) addr)[3] == ntohl( 1 );
      }
  
!     extern (D) int IN6_IS_ADDR_MULTICAST()(const scope in6_addr* add) pure
      {
          return addr.s6_addr[0] == 0xff;
      }
  
!     extern (D) int IN6_IS_ADDR_LINKLOCAL()(const scope in6_addr* add) pure
      {
          return addr.s6_addr[0] == 0xfe && (addr.s6_addr[1] & 0xc0) == 0x80;
      }
  
!     extern (D) int IN6_IS_ADDR_SITELOCAL()(const scope in6_addr* add) pure
      {
          return addr.s6_addr[0] == 0xfe && (addr.s6_addr[1] & 0xc0) == 0xc0;
      }
  
!     extern (D) int IN6_IS_ADDR_V4MAPPED()(const scope in6_addr* add) pure
      {
          return (cast(uint32_t*) addr)[0] == 0 &&
                 (cast(uint32_t*) addr)[1] == 0 &&
                 (cast(uint32_t*) addr)[2] == ntohl( 0x0000ffff );
      }
  
!     extern (D) int IN6_IS_ADDR_V4COMPAT()(const scope in6_addr* add) pure
      {
          return (cast(uint32_t*) addr)[0] == 0 &&
                 (cast(uint32_t*) addr)[1] == 0 &&
*************** else version (Darwin)
*** 717,747 ****
                 (cast(uint32_t*) addr)[3] != ntohl( 1 );
      }
  
!     extern (D) int IN6_IS_ADDR_MC_NODELOCAL( const scope in6_addr* addr ) pure
      {
          return IN6_IS_ADDR_MULTICAST( addr ) &&
                 ((cast(uint8_t*) addr)[1] & 0xf) == 0x1;
      }
  
!     extern (D) int IN6_IS_ADDR_MC_LINKLOCAL( const scope in6_addr* addr ) pure
      {
          return IN6_IS_ADDR_MULTICAST( addr ) &&
                 ((cast(uint8_t*) addr)[1] & 0xf) == 0x2;
      }
  
!     extern (D) int IN6_IS_ADDR_MC_SITELOCAL( const scope in6_addr* addr ) pure
      {
          return IN6_IS_ADDR_MULTICAST(addr) &&
                 ((cast(uint8_t*) addr)[1] & 0xf) == 0x5;
      }
  
!     extern (D) int IN6_IS_ADDR_MC_ORGLOCAL( const scope in6_addr* addr ) pure
      {
          return IN6_IS_ADDR_MULTICAST( addr) &&
                 ((cast(uint8_t*) addr)[1] & 0xf) == 0x8;
      }
  
!     extern (D) int IN6_IS_ADDR_MC_GLOBAL( const scope in6_addr* addr ) pure
      {
          return IN6_IS_ADDR_MULTICAST( addr ) &&
                 ((cast(uint8_t*) addr)[1] & 0xf) == 0xe;
--- 717,747 ----
                 (cast(uint32_t*) addr)[3] != ntohl( 1 );
      }
  
!     extern (D) int IN6_IS_ADDR_MC_NODELOCAL()(const scope in6_addr* add) pure
      {
          return IN6_IS_ADDR_MULTICAST( addr ) &&
                 ((cast(uint8_t*) addr)[1] & 0xf) == 0x1;
      }
  
!     extern (D) int IN6_IS_ADDR_MC_LINKLOCAL()(const scope in6_addr* add) pure
      {
          return IN6_IS_ADDR_MULTICAST( addr ) &&
                 ((cast(uint8_t*) addr)[1] & 0xf) == 0x2;
      }
  
!     extern (D) int IN6_IS_ADDR_MC_SITELOCAL()(const scope in6_addr* add) pure
      {
          return IN6_IS_ADDR_MULTICAST(addr) &&
                 ((cast(uint8_t*) addr)[1] & 0xf) == 0x5;
      }
  
!     extern (D) int IN6_IS_ADDR_MC_ORGLOCAL()(const scope in6_addr* add) pure
      {
          return IN6_IS_ADDR_MULTICAST( addr) &&
                 ((cast(uint8_t*) addr)[1] & 0xf) == 0x8;
      }
  
!     extern (D) int IN6_IS_ADDR_MC_GLOBAL()(const scope in6_addr* add) pure
      {
          return IN6_IS_ADDR_MULTICAST( addr ) &&
                 ((cast(uint8_t*) addr)[1] & 0xf) == 0xe;
*************** else version (FreeBSD)
*** 804,810 ****
      }
  
      // macros
!     extern (D) int IN6_IS_ADDR_UNSPECIFIED( const scope in6_addr* a ) pure
      {
          return (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[0]) == 0) &&
                 (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[4]) == 0) &&
--- 804,810 ----
      }
  
      // macros
!     extern (D) int IN6_IS_ADDR_UNSPECIFIED()( const scope in6_addr* a) pure
      {
          return (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[0]) == 0) &&
                 (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[4]) == 0) &&
*************** else version (FreeBSD)
*** 812,818 ****
                 (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[12]) == 0);
      }
  
!     extern (D) int IN6_IS_ADDR_LOOPBACK( const scope in6_addr* a ) pure
      {
          return (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[0]) == 0) &&
                 (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[4]) == 0) &&
--- 812,818 ----
                 (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[12]) == 0);
      }
  
!     extern (D) int IN6_IS_ADDR_LOOPBACK()( const scope in6_addr* a) pure
      {
          return (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[0]) == 0) &&
                 (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[4]) == 0) &&
*************** else version (FreeBSD)
*** 820,826 ****
                 (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[12]) == ntohl(1));
      }
  
!     extern (D) int IN6_IS_ADDR_V4COMPAT( const scope in6_addr* a ) pure
      {
          return (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[0]) == 0) &&
                 (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[4]) == 0) &&
--- 820,826 ----
                 (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[12]) == ntohl(1));
      }
  
!     extern (D) int IN6_IS_ADDR_V4COMPAT()( const scope in6_addr* a) pure
      {
          return (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[0]) == 0) &&
                 (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[4]) == 0) &&
*************** else version (FreeBSD)
*** 829,886 ****
                 (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[12]) != ntohl(1));
      }
  
!     extern (D) int IN6_IS_ADDR_V4MAPPED( const scope in6_addr* a ) pure
      {
          return (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[0]) == 0) &&
                 (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[4]) == 0) &&
                 (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[8]) == ntohl(0x0000ffff));
      }
  
!     extern (D) int IN6_IS_ADDR_LINKLOCAL( const scope in6_addr* a ) pure
      {
          return a.s6_addr[0] == 0xfe && (a.s6_addr[1] & 0xc0) == 0x80;
      }
  
!     extern (D) int IN6_IS_ADDR_SITELOCAL( const scope in6_addr* a ) pure
      {
          return a.s6_addr[0] == 0xfe && (a.s6_addr[1] & 0xc0) == 0xc0;
      }
  
!     extern (D) int IN6_IS_ADDR_MULTICAST( const scope in6_addr* a ) pure
      {
          return a.s6_addr[0] == 0xff;
      }
  
!     extern (D) uint8_t __IPV6_ADDR_MC_SCOPE( const scope in6_addr* a ) pure
      {
          return a.s6_addr[1] & 0x0f;
      }
  
!     extern (D) int IN6_IS_ADDR_MC_NODELOCAL( const scope in6_addr* a ) pure
      {
          return IN6_IS_ADDR_MULTICAST(a) &&
                 __IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_NODELOCAL;
      }
  
!     extern (D) int IN6_IS_ADDR_MC_LINKLOCAL( const scope in6_addr* a ) pure
      {
          return IN6_IS_ADDR_MULTICAST(a) &&
                 __IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_LINKLOCAL;
      }
  
!     extern (D) int IN6_IS_ADDR_MC_SITELOCAL( const scope in6_addr* a ) pure
      {
          return IN6_IS_ADDR_MULTICAST(a) &&
                 __IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_SITELOCAL;
      }
  
!     extern (D) int IN6_IS_ADDR_MC_ORGLOCAL( const scope in6_addr* a ) pure
      {
          return IN6_IS_ADDR_MULTICAST(a) &&
                 __IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_ORGLOCAL;
      }
  
!     extern (D) int IN6_IS_ADDR_MC_GLOBAL( const scope in6_addr* a ) pure
      {
          return IN6_IS_ADDR_MULTICAST(a) &&
                 __IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_GLOBAL;
--- 829,886 ----
                 (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[12]) != ntohl(1));
      }
  
!     extern (D) int IN6_IS_ADDR_V4MAPPED()( const scope in6_addr* a) pure
      {
          return (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[0]) == 0) &&
                 (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[4]) == 0) &&
                 (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[8]) == ntohl(0x0000ffff));
      }
  
!     extern (D) int IN6_IS_ADDR_LINKLOCAL()( const scope in6_addr* a) pure
      {
          return a.s6_addr[0] == 0xfe && (a.s6_addr[1] & 0xc0) == 0x80;
      }
  
!     extern (D) int IN6_IS_ADDR_SITELOCAL()( const scope in6_addr* a) pure
      {
          return a.s6_addr[0] == 0xfe && (a.s6_addr[1] & 0xc0) == 0xc0;
      }
  
!     extern (D) int IN6_IS_ADDR_MULTICAST()( const scope in6_addr* a) pure
      {
          return a.s6_addr[0] == 0xff;
      }
  
!     extern (D) uint8_t __IPV6_ADDR_MC_SCOPE()( const scope in6_addr* a) pure
      {
          return a.s6_addr[1] & 0x0f;
      }
  
!     extern (D) int IN6_IS_ADDR_MC_NODELOCAL()( const scope in6_addr* a) pure
      {
          return IN6_IS_ADDR_MULTICAST(a) &&
                 __IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_NODELOCAL;
      }
  
!     extern (D) int IN6_IS_ADDR_MC_LINKLOCAL()( const scope in6_addr* a) pure
      {
          return IN6_IS_ADDR_MULTICAST(a) &&
                 __IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_LINKLOCAL;
      }
  
!     extern (D) int IN6_IS_ADDR_MC_SITELOCAL()( const scope in6_addr* a) pure
      {
          return IN6_IS_ADDR_MULTICAST(a) &&
                 __IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_SITELOCAL;
      }
  
!     extern (D) int IN6_IS_ADDR_MC_ORGLOCAL()( const scope in6_addr* a) pure
      {
          return IN6_IS_ADDR_MULTICAST(a) &&
                 __IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_ORGLOCAL;
      }
  
!     extern (D) int IN6_IS_ADDR_MC_GLOBAL()( const scope in6_addr* a) pure
      {
          return IN6_IS_ADDR_MULTICAST(a) &&
                 __IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_GLOBAL;
*************** else version (NetBSD)
*** 943,949 ****
      }
  
      // macros
!     extern (D) int IN6_IS_ADDR_UNSPECIFIED( const scope in6_addr* a ) pure
      {
          return (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[0]) == 0) &&
                 (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[4]) == 0) &&
--- 943,949 ----
      }
  
      // macros
!     extern (D) int IN6_IS_ADDR_UNSPECIFIED()( const scope in6_addr* a) pure
      {
          return (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[0]) == 0) &&
                 (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[4]) == 0) &&
*************** else version (NetBSD)
*** 951,957 ****
                 (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[12]) == 0);
      }
  
!     extern (D) int IN6_IS_ADDR_LOOPBACK( const scope in6_addr* a ) pure
      {
          return (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[0]) == 0) &&
                 (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[4]) == 0) &&
--- 951,957 ----
                 (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[12]) == 0);
      }
  
!     extern (D) int IN6_IS_ADDR_LOOPBACK()( const scope in6_addr* a) pure
      {
          return (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[0]) == 0) &&
                 (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[4]) == 0) &&
*************** else version (NetBSD)
*** 959,965 ****
                 (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[12]) == ntohl(1));
      }
  
!     extern (D) int IN6_IS_ADDR_V4COMPAT( const scope in6_addr* a ) pure
      {
          return (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[0]) == 0) &&
                 (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[4]) == 0) &&
--- 959,965 ----
                 (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[12]) == ntohl(1));
      }
  
!     extern (D) int IN6_IS_ADDR_V4COMPAT()( const scope in6_addr* a) pure
      {
          return (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[0]) == 0) &&
                 (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[4]) == 0) &&
*************** else version (NetBSD)
*** 968,1025 ****
                 (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[12]) != ntohl(1));
      }
  
!     extern (D) int IN6_IS_ADDR_V4MAPPED( const scope in6_addr* a ) pure
      {
          return (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[0]) == 0) &&
                 (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[4]) == 0) &&
                 (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[8]) == ntohl(0x0000ffff));
      }
  
!     extern (D) int IN6_IS_ADDR_LINKLOCAL( const scope in6_addr* a ) pure
      {
          return a.s6_addr[0] == 0xfe && (a.s6_addr[1] & 0xc0) == 0x80;
      }
  
!     extern (D) int IN6_IS_ADDR_SITELOCAL( const scope in6_addr* a ) pure
      {
          return a.s6_addr[0] == 0xfe && (a.s6_addr[1] & 0xc0) == 0xc0;
      }
  
!     extern (D) int IN6_IS_ADDR_MULTICAST( const scope in6_addr* a ) pure
      {
          return a.s6_addr[0] == 0xff;
      }
  
!     extern (D) uint8_t __IPV6_ADDR_MC_SCOPE( const scope in6_addr* a ) pure
      {
          return a.s6_addr[1] & 0x0f;
      }
  
!     extern (D) int IN6_IS_ADDR_MC_NODELOCAL( const scope in6_addr* a ) pure
      {
          return IN6_IS_ADDR_MULTICAST(a) &&
                 __IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_NODELOCAL;
      }
  
!     extern (D) int IN6_IS_ADDR_MC_LINKLOCAL( const scope in6_addr* a ) pure
      {
          return IN6_IS_ADDR_MULTICAST(a) &&
                 __IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_LINKLOCAL;
      }
  
!     extern (D) int IN6_IS_ADDR_MC_SITELOCAL( const scope in6_addr* a ) pure
      {
          return IN6_IS_ADDR_MULTICAST(a) &&
                 __IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_SITELOCAL;
      }
  
!     extern (D) int IN6_IS_ADDR_MC_ORGLOCAL( const scope in6_addr* a ) pure
      {
          return IN6_IS_ADDR_MULTICAST(a) &&
                 __IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_ORGLOCAL;
      }
  
!     extern (D) int IN6_IS_ADDR_MC_GLOBAL( const scope in6_addr* a ) pure
      {
          return IN6_IS_ADDR_MULTICAST(a) &&
                 __IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_GLOBAL;
--- 968,1025 ----
                 (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[12]) != ntohl(1));
      }
  
!     extern (D) int IN6_IS_ADDR_V4MAPPED()( const scope in6_addr* a) pure
      {
          return (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[0]) == 0) &&
                 (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[4]) == 0) &&
                 (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[8]) == ntohl(0x0000ffff));
      }
  
!     extern (D) int IN6_IS_ADDR_LINKLOCAL()( const scope in6_addr* a) pure
      {
          return a.s6_addr[0] == 0xfe && (a.s6_addr[1] & 0xc0) == 0x80;
      }
  
!     extern (D) int IN6_IS_ADDR_SITELOCAL()( const scope in6_addr* a) pure
      {
          return a.s6_addr[0] == 0xfe && (a.s6_addr[1] & 0xc0) == 0xc0;
      }
  
!     extern (D) int IN6_IS_ADDR_MULTICAST()( const scope in6_addr* a) pure
      {
          return a.s6_addr[0] == 0xff;
      }
  
!     extern (D) uint8_t __IPV6_ADDR_MC_SCOPE()( const scope in6_addr* a) pure
      {
          return a.s6_addr[1] & 0x0f;
      }
  
!     extern (D) int IN6_IS_ADDR_MC_NODELOCAL()( const scope in6_addr* a) pure
      {
          return IN6_IS_ADDR_MULTICAST(a) &&
                 __IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_NODELOCAL;
      }
  
!     extern (D) int IN6_IS_ADDR_MC_LINKLOCAL()( const scope in6_addr* a) pure
      {
          return IN6_IS_ADDR_MULTICAST(a) &&
                 __IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_LINKLOCAL;
      }
  
!     extern (D) int IN6_IS_ADDR_MC_SITELOCAL()( const scope in6_addr* a) pure
      {
          return IN6_IS_ADDR_MULTICAST(a) &&
                 __IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_SITELOCAL;
      }
  
!     extern (D) int IN6_IS_ADDR_MC_ORGLOCAL()( const scope in6_addr* a) pure
      {
          return IN6_IS_ADDR_MULTICAST(a) &&
                 __IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_ORGLOCAL;
      }
  
!     extern (D) int IN6_IS_ADDR_MC_GLOBAL()( const scope in6_addr* a) pure
      {
          return IN6_IS_ADDR_MULTICAST(a) &&
                 __IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_GLOBAL;
*************** else version (OpenBSD)
*** 1082,1088 ****
      }
  
      // macros
!     extern (D) int IN6_IS_ADDR_UNSPECIFIED( const scope in6_addr* a ) pure
      {
          return (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[0]) == 0) &&
                 (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[4]) == 0) &&
--- 1082,1088 ----
      }
  
      // macros
!     extern (D) int IN6_IS_ADDR_UNSPECIFIED()( const scope in6_addr* a) pure
      {
          return (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[0]) == 0) &&
                 (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[4]) == 0) &&
*************** else version (OpenBSD)
*** 1090,1096 ****
                 (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[12]) == 0);
      }
  
!     extern (D) int IN6_IS_ADDR_LOOPBACK( const scope in6_addr* a ) pure
      {
          return (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[0]) == 0) &&
                 (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[4]) == 0) &&
--- 1090,1096 ----
                 (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[12]) == 0);
      }
  
!     extern (D) int IN6_IS_ADDR_LOOPBACK()( const scope in6_addr* a) pure
      {
          return (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[0]) == 0) &&
                 (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[4]) == 0) &&
*************** else version (OpenBSD)
*** 1098,1104 ****
                 (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[12]) == ntohl(1));
      }
  
!     extern (D) int IN6_IS_ADDR_V4COMPAT( const scope in6_addr* a ) pure
      {
          return (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[0]) == 0) &&
                 (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[4]) == 0) &&
--- 1098,1104 ----
                 (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[12]) == ntohl(1));
      }
  
!     extern (D) int IN6_IS_ADDR_V4COMPAT()( const scope in6_addr* a) pure
      {
          return (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[0]) == 0) &&
                 (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[4]) == 0) &&
*************** else version (OpenBSD)
*** 1107,1164 ****
                 (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[12]) != ntohl(1));
      }
  
!     extern (D) int IN6_IS_ADDR_V4MAPPED( const scope in6_addr* a ) pure
      {
          return (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[0]) == 0) &&
                 (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[4]) == 0) &&
                 (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[8]) == ntohl(0x0000ffff));
      }
  
!     extern (D) int IN6_IS_ADDR_LINKLOCAL( const scope in6_addr* a ) pure
      {
          return a.s6_addr[0] == 0xfe && (a.s6_addr[1] & 0xc0) == 0x80;
      }
  
!     extern (D) int IN6_IS_ADDR_SITELOCAL( const scope in6_addr* a ) pure
      {
          return a.s6_addr[0] == 0xfe && (a.s6_addr[1] & 0xc0) == 0xc0;
      }
  
!     extern (D) int IN6_IS_ADDR_MULTICAST( const scope in6_addr* a ) pure
      {
          return a.s6_addr[0] == 0xff;
      }
  
!     extern (D) uint8_t __IPV6_ADDR_MC_SCOPE( const scope in6_addr* a ) pure
      {
          return a.s6_addr[1] & 0x0f;
      }
  
!     extern (D) int IN6_IS_ADDR_MC_NODELOCAL( const scope in6_addr* a ) pure
      {
          return IN6_IS_ADDR_MULTICAST(a) &&
                 __IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_NODELOCAL;
      }
  
!     extern (D) int IN6_IS_ADDR_MC_LINKLOCAL( const scope in6_addr* a ) pure
      {
          return IN6_IS_ADDR_MULTICAST(a) &&
                 __IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_LINKLOCAL;
      }
  
!     extern (D) int IN6_IS_ADDR_MC_SITELOCAL( const scope in6_addr* a ) pure
      {
          return IN6_IS_ADDR_MULTICAST(a) &&
                 __IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_SITELOCAL;
      }
  
!     extern (D) int IN6_IS_ADDR_MC_ORGLOCAL( const scope in6_addr* a ) pure
      {
          return IN6_IS_ADDR_MULTICAST(a) &&
                 __IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_ORGLOCAL;
      }
  
!     extern (D) int IN6_IS_ADDR_MC_GLOBAL( const scope in6_addr* a ) pure
      {
          return IN6_IS_ADDR_MULTICAST(a) &&
                 __IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_GLOBAL;
--- 1107,1164 ----
                 (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[12]) != ntohl(1));
      }
  
!     extern (D) int IN6_IS_ADDR_V4MAPPED()( const scope in6_addr* a) pure
      {
          return (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[0]) == 0) &&
                 (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[4]) == 0) &&
                 (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[8]) == ntohl(0x0000ffff));
      }
  
!     extern (D) int IN6_IS_ADDR_LINKLOCAL()( const scope in6_addr* a) pure
      {
          return a.s6_addr[0] == 0xfe && (a.s6_addr[1] & 0xc0) == 0x80;
      }
  
!     extern (D) int IN6_IS_ADDR_SITELOCAL()( const scope in6_addr* a) pure
      {
          return a.s6_addr[0] == 0xfe && (a.s6_addr[1] & 0xc0) == 0xc0;
      }
  
!     extern (D) int IN6_IS_ADDR_MULTICAST()( const scope in6_addr* a) pure
      {
          return a.s6_addr[0] == 0xff;
      }
  
!     extern (D) uint8_t __IPV6_ADDR_MC_SCOPE()( const scope in6_addr* a) pure
      {
          return a.s6_addr[1] & 0x0f;
      }
  
!     extern (D) int IN6_IS_ADDR_MC_NODELOCAL()( const scope in6_addr* a) pure
      {
          return IN6_IS_ADDR_MULTICAST(a) &&
                 __IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_NODELOCAL;
      }
  
!     extern (D) int IN6_IS_ADDR_MC_LINKLOCAL()( const scope in6_addr* a) pure
      {
          return IN6_IS_ADDR_MULTICAST(a) &&
                 __IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_LINKLOCAL;
      }
  
!     extern (D) int IN6_IS_ADDR_MC_SITELOCAL()( const scope in6_addr* a) pure
      {
          return IN6_IS_ADDR_MULTICAST(a) &&
                 __IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_SITELOCAL;
      }
  
!     extern (D) int IN6_IS_ADDR_MC_ORGLOCAL()( const scope in6_addr* a) pure
      {
          return IN6_IS_ADDR_MULTICAST(a) &&
                 __IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_ORGLOCAL;
      }
  
!     extern (D) int IN6_IS_ADDR_MC_GLOBAL()( const scope in6_addr* a) pure
      {
          return IN6_IS_ADDR_MULTICAST(a) &&
                 __IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_GLOBAL;
*************** else version (DragonFlyBSD)
*** 1221,1227 ****
      }
  
      // macros
!     extern (D) int IN6_IS_ADDR_UNSPECIFIED( const scope in6_addr* a ) pure
      {
          return (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[0]) == 0) &&
                 (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[4]) == 0) &&
--- 1221,1227 ----
      }
  
      // macros
!     extern (D) int IN6_IS_ADDR_UNSPECIFIED()( const scope in6_addr* a) pure
      {
          return (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[0]) == 0) &&
                 (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[4]) == 0) &&
*************** else version (DragonFlyBSD)
*** 1229,1235 ****
                 (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[12]) == 0);
      }
  
!     extern (D) int IN6_IS_ADDR_LOOPBACK( const scope in6_addr* a ) pure
      {
          return (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[0]) == 0) &&
                 (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[4]) == 0) &&
--- 1229,1235 ----
                 (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[12]) == 0);
      }
  
!     extern (D) int IN6_IS_ADDR_LOOPBACK()( const scope in6_addr* a) pure
      {
          return (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[0]) == 0) &&
                 (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[4]) == 0) &&
*************** else version (DragonFlyBSD)
*** 1237,1243 ****
                 (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[12]) == ntohl(1));
      }
  
!     extern (D) int IN6_IS_ADDR_V4COMPAT( const scope in6_addr* a ) pure
      {
          return (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[0]) == 0) &&
                 (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[4]) == 0) &&
--- 1237,1243 ----
                 (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[12]) == ntohl(1));
      }
  
!     extern (D) int IN6_IS_ADDR_V4COMPAT()( const scope in6_addr* a) pure
      {
          return (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[0]) == 0) &&
                 (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[4]) == 0) &&
*************** else version (DragonFlyBSD)
*** 1246,1303 ****
                 (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[12]) != ntohl(1));
      }
  
!     extern (D) int IN6_IS_ADDR_V4MAPPED( const scope in6_addr* a ) pure
      {
          return (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[0]) == 0) &&
                 (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[4]) == 0) &&
                 (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[8]) == ntohl(0x0000ffff));
      }
  
!     extern (D) int IN6_IS_ADDR_LINKLOCAL( const scope in6_addr* a ) pure
      {
          return a.s6_addr[0] == 0xfe && (a.s6_addr[1] & 0xc0) == 0x80;
      }
  
!     extern (D) int IN6_IS_ADDR_SITELOCAL( const scope in6_addr* a ) pure
      {
          return a.s6_addr[0] == 0xfe && (a.s6_addr[1] & 0xc0) == 0xc0;
      }
  
!     extern (D) int IN6_IS_ADDR_MULTICAST( const scope in6_addr* a ) pure
      {
          return a.s6_addr[0] == 0xff;
      }
  
!     extern (D) uint8_t __IPV6_ADDR_MC_SCOPE( const scope in6_addr* a ) pure
      {
          return a.s6_addr[1] & 0x0f;
      }
  
!     extern (D) int IN6_IS_ADDR_MC_NODELOCAL( const scope in6_addr* a ) pure
      {
          return IN6_IS_ADDR_MULTICAST(a) &&
                 __IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_NODELOCAL;
      }
  
!     extern (D) int IN6_IS_ADDR_MC_LINKLOCAL( const scope in6_addr* a ) pure
      {
          return IN6_IS_ADDR_MULTICAST(a) &&
                 __IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_LINKLOCAL;
      }
  
!     extern (D) int IN6_IS_ADDR_MC_SITELOCAL( const scope in6_addr* a ) pure
      {
          return IN6_IS_ADDR_MULTICAST(a) &&
                 __IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_SITELOCAL;
      }
  
!     extern (D) int IN6_IS_ADDR_MC_ORGLOCAL( const scope in6_addr* a ) pure
      {
          return IN6_IS_ADDR_MULTICAST(a) &&
                 __IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_ORGLOCAL;
      }
  
!     extern (D) int IN6_IS_ADDR_MC_GLOBAL( const scope in6_addr* a ) pure
      {
          return IN6_IS_ADDR_MULTICAST(a) &&
                 __IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_GLOBAL;
--- 1246,1303 ----
                 (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[12]) != ntohl(1));
      }
  
!     extern (D) int IN6_IS_ADDR_V4MAPPED()( const scope in6_addr* a) pure
      {
          return (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[0]) == 0) &&
                 (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[4]) == 0) &&
                 (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[8]) == ntohl(0x0000ffff));
      }
  
!     extern (D) int IN6_IS_ADDR_LINKLOCAL()( const scope in6_addr* a) pure
      {
          return a.s6_addr[0] == 0xfe && (a.s6_addr[1] & 0xc0) == 0x80;
      }
  
!     extern (D) int IN6_IS_ADDR_SITELOCAL()( const scope in6_addr* a) pure
      {
          return a.s6_addr[0] == 0xfe && (a.s6_addr[1] & 0xc0) == 0xc0;
      }
  
!     extern (D) int IN6_IS_ADDR_MULTICAST()( const scope in6_addr* a) pure
      {
          return a.s6_addr[0] == 0xff;
      }
  
!     extern (D) uint8_t __IPV6_ADDR_MC_SCOPE()( const scope in6_addr* a) pure
      {
          return a.s6_addr[1] & 0x0f;
      }
  
!     extern (D) int IN6_IS_ADDR_MC_NODELOCAL()( const scope in6_addr* a) pure
      {
          return IN6_IS_ADDR_MULTICAST(a) &&
                 __IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_NODELOCAL;
      }
  
!     extern (D) int IN6_IS_ADDR_MC_LINKLOCAL()( const scope in6_addr* a) pure
      {
          return IN6_IS_ADDR_MULTICAST(a) &&
                 __IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_LINKLOCAL;
      }
  
!     extern (D) int IN6_IS_ADDR_MC_SITELOCAL()( const scope in6_addr* a) pure
      {
          return IN6_IS_ADDR_MULTICAST(a) &&
                 __IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_SITELOCAL;
      }
  
!     extern (D) int IN6_IS_ADDR_MC_ORGLOCAL()( const scope in6_addr* a) pure
      {
          return IN6_IS_ADDR_MULTICAST(a) &&
                 __IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_ORGLOCAL;
      }
  
!     extern (D) int IN6_IS_ADDR_MC_GLOBAL()( const scope in6_addr* a) pure
      {
          return IN6_IS_ADDR_MULTICAST(a) &&
                 __IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_GLOBAL;
*************** else version (Solaris)
*** 1350,1416 ****
      }
  
      // macros
!     extern (D) int IN6_IS_ADDR_UNSPECIFIED( const scope in6_addr* a ) pure
      {
          return (a.s6_addr32[0] == 0) && (a.s6_addr32[1] == 0) &&
                 (a.s6_addr32[2] == 0) && (a.s6_addr32[3] == 0);
      }
  
!     extern (D) int IN6_IS_ADDR_LOOPBACK( const scope in6_addr* a ) pure
      {
          return (a.s6_addr32[0] == 0) && (a.s6_addr32[1] == 0) &&
                 (a.s6_addr32[2] == 0) && (a.s6_addr32[3] == ntohl(1));
      }
  
!     extern (D) int IN6_IS_ADDR_V4COMPAT( const scope in6_addr* a ) pure
      {
          return (a.s6_addr32[0] == 0) && (a.s6_addr32[1] == 0) &&
                 (a.s6_addr32[2] == 0) && (a.s6_addr32[3] != 0) &&
                 (a.s6_addr32[3] != ntohl(1));
      }
  
!     extern (D) int IN6_IS_ADDR_V4MAPPED( const scope in6_addr* a ) pure
      {
          return (a.s6_addr32[0] == 0) && (a.s6_addr32[1] == 0) &&
                 (a.s6_addr32[2] == ntohl(0x0000ffff));
      }
  
!     extern (D) int IN6_IS_ADDR_LINKLOCAL( const scope in6_addr* a ) pure
      {
          return a.s6_addr8[0] == 0xfe && (a.s6_addr8[1] & 0xc0) == 0x80;
      }
  
!     extern (D) int IN6_IS_ADDR_SITELOCAL( const scope in6_addr* a ) pure
      {
          return a.s6_addr8[0] == 0xfe && (a.s6_addr8[1] & 0xc0) == 0xc0;
      }
  
!     extern (D) int IN6_IS_ADDR_MULTICAST( const scope in6_addr* a ) pure
      {
          return a.s6_addr8[0] == 0xff;
      }
  
!     extern (D) int IN6_IS_ADDR_MC_NODELOCAL( const scope in6_addr* a ) pure
      {
          return a.s6_addr8[0] == 0xff && (a.s6_addr8[1] & 0x0f) == 0x01;
      }
  
!     extern (D) int IN6_IS_ADDR_MC_LINKLOCAL( const scope in6_addr* a ) pure
      {
          return a.s6_addr8[0] == 0xff && (a.s6_addr8[1] & 0x0f) == 0x02;
      }
  
!     extern (D) int IN6_IS_ADDR_MC_SITELOCAL( const scope in6_addr* a ) pure
      {
          return a.s6_addr8[0] == 0xff && (a.s6_addr8[1] & 0x0f) == 0x05;
      }
  
!     extern (D) int IN6_IS_ADDR_MC_ORGLOCAL( const scope in6_addr* a ) pure
      {
          return a.s6_addr8[0] == 0xff && (a.s6_addr8[1] & 0x0f) == 0x08;
      }
  
!     extern (D) int IN6_IS_ADDR_MC_GLOBAL( const scope in6_addr* a ) pure
      {
          return a.s6_addr8[0] == 0xff && (a.s6_addr8[1] & 0x0f) == 0x0e;
      }
--- 1350,1416 ----
      }
  
      // macros
!     extern (D) int IN6_IS_ADDR_UNSPECIFIED()( const scope in6_addr* a) pure
      {
          return (a.s6_addr32[0] == 0) && (a.s6_addr32[1] == 0) &&
                 (a.s6_addr32[2] == 0) && (a.s6_addr32[3] == 0);
      }
  
!     extern (D) int IN6_IS_ADDR_LOOPBACK()( const scope in6_addr* a) pure
      {
          return (a.s6_addr32[0] == 0) && (a.s6_addr32[1] == 0) &&
                 (a.s6_addr32[2] == 0) && (a.s6_addr32[3] == ntohl(1));
      }
  
!     extern (D) int IN6_IS_ADDR_V4COMPAT()( const scope in6_addr* a) pure
      {
          return (a.s6_addr32[0] == 0) && (a.s6_addr32[1] == 0) &&
                 (a.s6_addr32[2] == 0) && (a.s6_addr32[3] != 0) &&
                 (a.s6_addr32[3] != ntohl(1));
      }
  
!     extern (D) int IN6_IS_ADDR_V4MAPPED()( const scope in6_addr* a) pure
      {
          return (a.s6_addr32[0] == 0) && (a.s6_addr32[1] == 0) &&
                 (a.s6_addr32[2] == ntohl(0x0000ffff));
      }
  
!     extern (D) int IN6_IS_ADDR_LINKLOCAL()( const scope in6_addr* a) pure
      {
          return a.s6_addr8[0] == 0xfe && (a.s6_addr8[1] & 0xc0) == 0x80;
      }
  
!     extern (D) int IN6_IS_ADDR_SITELOCAL()( const scope in6_addr* a) pure
      {
          return a.s6_addr8[0] == 0xfe && (a.s6_addr8[1] & 0xc0) == 0xc0;
      }
  
!     extern (D) int IN6_IS_ADDR_MULTICAST()( const scope in6_addr* a) pure
      {
          return a.s6_addr8[0] == 0xff;
      }
  
!     extern (D) int IN6_IS_ADDR_MC_NODELOCAL()( const scope in6_addr* a) pure
      {
          return a.s6_addr8[0] == 0xff && (a.s6_addr8[1] & 0x0f) == 0x01;
      }
  
!     extern (D) int IN6_IS_ADDR_MC_LINKLOCAL()( const scope in6_addr* a) pure
      {
          return a.s6_addr8[0] == 0xff && (a.s6_addr8[1] & 0x0f) == 0x02;
      }
  
!     extern (D) int IN6_IS_ADDR_MC_SITELOCAL()( const scope in6_addr* a) pure
      {
          return a.s6_addr8[0] == 0xff && (a.s6_addr8[1] & 0x0f) == 0x05;
      }
  
!     extern (D) int IN6_IS_ADDR_MC_ORGLOCAL()( const scope in6_addr* a) pure
      {
          return a.s6_addr8[0] == 0xff && (a.s6_addr8[1] & 0x0f) == 0x08;
      }
  
!     extern (D) int IN6_IS_ADDR_MC_GLOBAL()( const scope in6_addr* a) pure
      {
          return a.s6_addr8[0] == 0xff && (a.s6_addr8[1] & 0x0f) == 0x0e;
      }
*************** else version (CRuntime_UClibc)
*** 1640,1646 ****
      }
  
      // macros
!     extern (D) int IN6_IS_ADDR_UNSPECIFIED( in6_addr* addr ) pure
      {
          return (cast(uint32_t*) addr)[0] == 0 &&
                 (cast(uint32_t*) addr)[1] == 0 &&
--- 1640,1646 ----
      }
  
      // macros
!     extern (D) int IN6_IS_ADDR_UNSPECIFIED()( in6_addr* addr) pure
      {
          return (cast(uint32_t*) addr)[0] == 0 &&
                 (cast(uint32_t*) addr)[1] == 0 &&
*************** else version (CRuntime_UClibc)
*** 1648,1654 ****
                 (cast(uint32_t*) addr)[3] == 0;
      }
  
!     extern (D) int IN6_IS_ADDR_LOOPBACK( in6_addr* addr ) pure
      {
          return (cast(uint32_t*) addr)[0] == 0  &&
                 (cast(uint32_t*) addr)[1] == 0  &&
--- 1648,1654 ----
                 (cast(uint32_t*) addr)[3] == 0;
      }
  
!     extern (D) int IN6_IS_ADDR_LOOPBACK()( in6_addr* addr) pure
      {
          return (cast(uint32_t*) addr)[0] == 0  &&
                 (cast(uint32_t*) addr)[1] == 0  &&
*************** else version (CRuntime_UClibc)
*** 1656,1684 ****
                 (cast(uint32_t*) addr)[3] == htonl( 1 );
      }
  
!     extern (D) int IN6_IS_ADDR_MULTICAST( in6_addr* addr ) pure
      {
          return (cast(uint8_t*) addr)[0] == 0xff;
      }
  
!     extern (D) int IN6_IS_ADDR_LINKLOCAL( in6_addr* addr ) pure
      {
          return ((cast(uint32_t*) addr)[0] & htonl( 0xffc00000 )) == htonl( 0xfe800000 );
      }
  
!     extern (D) int IN6_IS_ADDR_SITELOCAL( in6_addr* addr ) pure
      {
          return ((cast(uint32_t*) addr)[0] & htonl( 0xffc00000 )) == htonl( 0xfec00000 );
      }
  
!     extern (D) int IN6_IS_ADDR_V4MAPPED( in6_addr* addr ) pure
      {
          return (cast(uint32_t*) addr)[0] == 0 &&
                 (cast(uint32_t*) addr)[1] == 0 &&
                 (cast(uint32_t*) addr)[2] == htonl( 0xffff );
      }
  
!     extern (D) int IN6_IS_ADDR_V4COMPAT( in6_addr* addr ) pure
      {
          return (cast(uint32_t*) addr)[0] == 0 &&
                 (cast(uint32_t*) addr)[1] == 0 &&
--- 1656,1684 ----
                 (cast(uint32_t*) addr)[3] == htonl( 1 );
      }
  
!     extern (D) int IN6_IS_ADDR_MULTICAST()( in6_addr* addr) pure
      {
          return (cast(uint8_t*) addr)[0] == 0xff;
      }
  
!     extern (D) int IN6_IS_ADDR_LINKLOCAL()( in6_addr* addr) pure
      {
          return ((cast(uint32_t*) addr)[0] & htonl( 0xffc00000 )) == htonl( 0xfe800000 );
      }
  
!     extern (D) int IN6_IS_ADDR_SITELOCAL()( in6_addr* addr) pure
      {
          return ((cast(uint32_t*) addr)[0] & htonl( 0xffc00000 )) == htonl( 0xfec00000 );
      }
  
!     extern (D) int IN6_IS_ADDR_V4MAPPED()( in6_addr* addr) pure
      {
          return (cast(uint32_t*) addr)[0] == 0 &&
                 (cast(uint32_t*) addr)[1] == 0 &&
                 (cast(uint32_t*) addr)[2] == htonl( 0xffff );
      }
  
!     extern (D) int IN6_IS_ADDR_V4COMPAT()( in6_addr* addr) pure
      {
          return (cast(uint32_t*) addr)[0] == 0 &&
                 (cast(uint32_t*) addr)[1] == 0 &&
*************** else version (CRuntime_UClibc)
*** 1686,1692 ****
                 ntohl( (cast(uint32_t*) addr)[3] ) > 1;
      }
  
!     extern (D) int IN6_ARE_ADDR_EQUAL( in6_addr* a, in6_addr* b ) pure
      {
          return (cast(uint32_t*) a)[0] == (cast(uint32_t*) b)[0] &&
                 (cast(uint32_t*) a)[1] == (cast(uint32_t*) b)[1] &&
--- 1686,1692 ----
                 ntohl( (cast(uint32_t*) addr)[3] ) > 1;
      }
  
!     extern (D) int IN6_ARE_ADDR_EQUAL()( in6_addr* a, in6_addr* b) pure
      {
          return (cast(uint32_t*) a)[0] == (cast(uint32_t*) b)[0] &&
                 (cast(uint32_t*) a)[1] == (cast(uint32_t*) b)[1] &&
*************** else version (CRuntime_UClibc)
*** 1694,1724 ****
                 (cast(uint32_t*) a)[3] == (cast(uint32_t*) b)[3];
      }
  
!     extern (D) int IN6_IS_ADDR_MC_NODELOCAL( in6_addr* addr ) pure
      {
          return IN6_IS_ADDR_MULTICAST( addr ) &&
                 ((cast(uint8_t*) addr)[1] & 0xf) == 0x1;
      }
  
!     extern (D) int IN6_IS_ADDR_MC_LINKLOCAL( in6_addr* addr ) pure
      {
          return IN6_IS_ADDR_MULTICAST( addr ) &&
                 ((cast(uint8_t*) addr)[1] & 0xf) == 0x2;
      }
  
!     extern (D) int IN6_IS_ADDR_MC_SITELOCAL( in6_addr* addr ) pure
      {
          return IN6_IS_ADDR_MULTICAST(addr) &&
                 ((cast(uint8_t*) addr)[1] & 0xf) == 0x5;
      }
  
!     extern (D) int IN6_IS_ADDR_MC_ORGLOCAL( in6_addr* addr ) pure
      {
          return IN6_IS_ADDR_MULTICAST( addr) &&
                 ((cast(uint8_t*) addr)[1] & 0xf) == 0x8;
      }
  
!     extern (D) int IN6_IS_ADDR_MC_GLOBAL( in6_addr* addr ) pure
      {
          return IN6_IS_ADDR_MULTICAST( addr ) &&
                 ((cast(uint8_t*) addr)[1] & 0xf) == 0xe;
--- 1694,1724 ----
                 (cast(uint32_t*) a)[3] == (cast(uint32_t*) b)[3];
      }
  
!     extern (D) int IN6_IS_ADDR_MC_NODELOCAL()( in6_addr* addr) pure
      {
          return IN6_IS_ADDR_MULTICAST( addr ) &&
                 ((cast(uint8_t*) addr)[1] & 0xf) == 0x1;
      }
  
!     extern (D) int IN6_IS_ADDR_MC_LINKLOCAL()( in6_addr* addr) pure
      {
          return IN6_IS_ADDR_MULTICAST( addr ) &&
                 ((cast(uint8_t*) addr)[1] & 0xf) == 0x2;
      }
  
!     extern (D) int IN6_IS_ADDR_MC_SITELOCAL()( in6_addr* addr) pure
      {
          return IN6_IS_ADDR_MULTICAST(addr) &&
                 ((cast(uint8_t*) addr)[1] & 0xf) == 0x5;
      }
  
!     extern (D) int IN6_IS_ADDR_MC_ORGLOCAL()( in6_addr* addr) pure
      {
          return IN6_IS_ADDR_MULTICAST( addr) &&
                 ((cast(uint8_t*) addr)[1] & 0xf) == 0x8;
      }
  
!     extern (D) int IN6_IS_ADDR_MC_GLOBAL()( in6_addr* addr) pure
      {
          return IN6_IS_ADDR_MULTICAST( addr ) &&
                 ((cast(uint8_t*) addr)[1] & 0xf) == 0xe;
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/core/sys/posix/sched.d gcc-16-20260201/libphobos/libdruntime/core/sys/posix/sched.d
*** gcc-16-20260125/libphobos/libdruntime/core/sys/posix/sched.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/core/sys/posix/sched.d	Sun Feb  1 22:32:17 2026
*************** version (linux)
*** 66,74 ****
              int sched_priority;
              int __reserved1;
              static if (muslRedirTime64)
!                 c_long[2] __reserved2;
              else
!                 timespec[2] __reserved2;
              int __reserved3;
          }
      }
--- 66,81 ----
              int sched_priority;
              int __reserved1;
              static if (muslRedirTime64)
!                 c_long[4] __reserved2;
              else
!             {
!                 struct __timespec32
!                 {
!                     time_t __reserved_1;
!                     c_long __reserved_2;
!                 }
!                 __timespec32[2] __reserved2;
!             }
              int __reserved3;
          }
      }
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/core/sys/posix/signal.d gcc-16-20260201/libphobos/libdruntime/core/sys/posix/signal.d
*** gcc-16-20260125/libphobos/libdruntime/core/sys/posix/signal.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/core/sys/posix/signal.d	Sun Feb  1 22:32:17 2026
*************** else version (linux)
*** 179,185 ****
          int __libc_current_sigrtmax();
      }
  
!     @property int SIGRTMIN() nothrow @nogc {
          __gshared int sig = -1;
          if (sig == -1) {
              sig = __libc_current_sigrtmin();
--- 179,185 ----
          int __libc_current_sigrtmax();
      }
  
!     @property int SIGRTMIN()() nothrow @nogc {
          __gshared int sig = -1;
          if (sig == -1) {
              sig = __libc_current_sigrtmin();
*************** else version (linux)
*** 187,193 ****
          return sig;
      }
  
!     @property int SIGRTMAX() nothrow @nogc {
          __gshared int sig = -1;
          if (sig == -1) {
              sig = __libc_current_sigrtmax();
--- 187,193 ----
          return sig;
      }
  
!     @property int SIGRTMAX()() nothrow @nogc {
          __gshared int sig = -1;
          if (sig == -1) {
              sig = __libc_current_sigrtmax();
*************** version (linux)
*** 1012,1023 ****
          } _sifields_t _sifields;
  
      nothrow @nogc:
!         @property ref pid_t si_pid() return { return _sifields._kill.si_pid; }
!         @property ref uid_t si_uid() return { return _sifields._kill.si_uid; }
!         @property ref void* si_addr() return { return _sifields._sigfault.si_addr; }
!         @property ref int si_status() return { return _sifields._sigchld.si_status; }
!         @property ref c_long si_band() return { return _sifields._sigpoll.si_band; }
!         @property ref sigval si_value() return { return _sifields._rt.si_sigval; }
      }
  
      enum
--- 1012,1023 ----
          } _sifields_t _sifields;
  
      nothrow @nogc:
!         @property ref pid_t si_pid()() { return _sifields._kill.si_pid; }
!         @property ref uid_t si_uid()() { return _sifields._kill.si_uid; }
!         @property ref void* si_addr()() { return _sifields._sigfault.si_addr; }
!         @property ref int si_status()() { return _sifields._sigchld.si_status; }
!         @property ref c_long si_band()() { return _sifields._sigpoll.si_band; }
!         @property ref sigval si_value()() { return _sifields._rt.si_sigval; }
      }
  
      enum
*************** else version (CRuntime_Musl)
*** 2763,2768 ****
--- 2763,2773 ----
          enum MINSIGSTKSZ = 4096;
          enum SIGSTKSZ    = 16384;
      }
+     else version (RISCV64)
+     {
+         enum MINSIGSTKSZ = 2048;
+         enum SIGSTKSZ    = 8192;
+     }
      else
          static assert(0, "unimplemented");
  
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/core/sys/posix/stdio.d gcc-16-20260201/libphobos/libdruntime/core/sys/posix/stdio.d
*** gcc-16-20260125/libphobos/libdruntime/core/sys/posix/stdio.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/core/sys/posix/stdio.d	Sun Feb  1 22:32:17 2026
*************** else version (CRuntime_UClibc)
*** 182,214 ****
  }
  else version (CRuntime_Musl)
  {
!     static if ( __USE_FILE_OFFSET64 )
!     {
!         int   fgetpos64(FILE*, fpos_t *);
!         alias fgetpos64 fgetpos;
! 
!         FILE* fopen64(const scope char*, const scope char*);
!         alias fopen64 fopen;
! 
!         FILE* freopen64(const scope char*, const scope char*, FILE*);
!         alias freopen64 freopen;
! 
!         int   fseek(FILE*, c_long, int);
! 
!         int   fsetpos64(FILE*, const scope fpos_t*);
!         alias fsetpos64 fsetpos;
  
!         FILE* tmpfile64();
!         alias tmpfile64 tmpfile;
!     }
!     else
      {
!         int   fgetpos(FILE*, fpos_t *);
!         FILE* fopen(const scope char*, const scope char*);
!         FILE* freopen(const scope char*, const scope char*, FILE*);
!         int   fseek(FILE*, c_long, int);
!         int   fsetpos(FILE*, const scope fpos_t*);
!         FILE* tmpfile();
      }
  }
  else version (Solaris)
--- 182,201 ----
  }
  else version (CRuntime_Musl)
  {
!     int   fgetpos(FILE*, fpos_t *);
!     FILE* fopen(const scope char*, const scope char*);
!     FILE* freopen(const scope char*, const scope char*, FILE*);
!     int   fseek(FILE*, c_long, int);
!     int   fsetpos(FILE*, const scope fpos_t*);
!     FILE* tmpfile();
  
!     static if (__USE_LARGEFILE64)
      {
!         alias fgetpos64 = fgetpos;
!         alias fopen64 = fopen;
!         alias freopen64 = freopen;
!         alias fsetpos64 = fsetpos;
!         alias tmpfile64 = tmpfile;
      }
  }
  else version (Solaris)
*************** else version (CRuntime_Musl)
*** 320,343 ****
  {
      enum L_ctermid = 20;
  
!     static if ( __USE_FILE_OFFSET64 )
!     {
!         int   fseeko64(FILE*, off_t, int);
!         alias fseeko64 fseeko;
!     }
!     else
!     {
!         int   fseeko(FILE*, off_t, int);
!     }
  
!     static if ( __USE_FILE_OFFSET64 )
!     {
!         off_t ftello64(FILE*);
!         alias ftello64 ftello;
!     }
!     else
      {
!         off_t ftello(FILE*);
      }
  
      ssize_t getdelim(char**, size_t*, int, FILE*);
--- 307,319 ----
  {
      enum L_ctermid = 20;
  
!     int   fseeko(FILE*, off_t, int);
!     off_t ftello(FILE*);
  
!     static if (__USE_LARGEFILE64)
      {
!         alias fseeko64 = fseeko;
!         alias ftello64 = ftello;
      }
  
      ssize_t getdelim(char**, size_t*, int, FILE*);
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/core/sys/posix/stdlib.d gcc-16-20260201/libphobos/libdruntime/core/sys/posix/stdlib.d
*** gcc-16-20260125/libphobos/libdruntime/core/sys/posix/stdlib.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/core/sys/posix/stdlib.d	Sun Feb  1 22:32:17 2026
*************** else version (CRuntime_Musl)
*** 603,619 ****
      void   srand48(c_long);
      void   srandom(uint);
      int    unlockpt(int);
- 
-   static if ( __USE_LARGEFILE64 )
-   {
-     int    mkstemp64(char*);
-     alias  mkstemp64 mkstemp;
-   }
-   else
-   {
      int    mkstemp(char*);
-   }
  
  }
  else version (Solaris)
  {
--- 603,614 ----
      void   srand48(c_long);
      void   srandom(uint);
      int    unlockpt(int);
      int    mkstemp(char*);
  
+     static if (__USE_LARGEFILE64)
+     {
+         alias mkstemp64 = mkstemp;
+     }
  }
  else version (Solaris)
  {
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/core/sys/posix/sys/ioctl.d gcc-16-20260201/libphobos/libdruntime/core/sys/posix/sys/ioctl.d
*** gcc-16-20260125/libphobos/libdruntime/core/sys/posix/sys/ioctl.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/core/sys/posix/sys/ioctl.d	Sun Feb  1 22:32:17 2026
*************** version (linux)
*** 61,67 ****
                 (is(T == typeof(null)) ? 0 : T.sizeof << _IOC_SIZESHIFT);
      }
  
!     extern (D) int _IO(int type, int nr)
      {
          return _IOC(_IOC_NONE, type, nr);
      }
--- 61,67 ----
                 (is(T == typeof(null)) ? 0 : T.sizeof << _IOC_SIZESHIFT);
      }
  
!     extern (D) int _IO()(int type, int nr)
      {
          return _IOC(_IOC_NONE, type, nr);
      }
*************** version (linux)
*** 81,102 ****
          return _IOC!T(_IOC_READ | _IOC_WRITE, type, nr);
      }
  
!     extern (D) int _IOC_DIR(int nr)
      {
          return (nr >> _IOC_DIRSHIFT) & _IOC_DIRMASK;
      }
  
!     extern (D) int _IOC_TYPE(int nr)
      {
          return (nr >> _IOC_TYPESHIFT) & _IOC_TYPEMASK;
      }
  
!     extern (D) int _IOC_NR(int nr)
      {
          return (nr >> _IOC_NRSHIFT) & _IOC_NRMASK;
      }
  
!     extern (D) int _IOC_SIZE(int nr)
      {
          return (nr >> _IOC_SIZESHIFT) & _IOC_SIZEMASK;
      }
--- 81,102 ----
          return _IOC!T(_IOC_READ | _IOC_WRITE, type, nr);
      }
  
!     extern (D) int _IOC_DIR()(int nr)
      {
          return (nr >> _IOC_DIRSHIFT) & _IOC_DIRMASK;
      }
  
!     extern (D) int _IOC_TYPE()(int nr)
      {
          return (nr >> _IOC_TYPESHIFT) & _IOC_TYPEMASK;
      }
  
!     extern (D) int _IOC_NR()(int nr)
      {
          return (nr >> _IOC_NRSHIFT) & _IOC_NRMASK;
      }
  
!     extern (D) int _IOC_SIZE()(int nr)
      {
          return (nr >> _IOC_SIZESHIFT) & _IOC_SIZEMASK;
      }
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/core/sys/posix/sys/mman.d gcc-16-20260201/libphobos/libdruntime/core/sys/posix/sys/mman.d
*** gcc-16-20260125/libphobos/libdruntime/core/sys/posix/sys/mman.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/core/sys/posix/sys/mman.d	Sun Feb  1 22:32:17 2026
*************** else version (CRuntime_Bionic)
*** 293,304 ****
  }
  else version (CRuntime_Musl)
  {
!     static if (__USE_LARGEFILE64) void* mmap64(void*, size_t, int, int, int, off_t);
!     static if (__USE_FILE_OFFSET64)
!         alias mmap = mmap64;
!     else
!         void* mmap(void*, size_t, int, int, int, off_t);
      int munmap(void*, size_t);
  }
  else version (CRuntime_UClibc)
  {
--- 293,305 ----
  }
  else version (CRuntime_Musl)
  {
!     void* mmap(void*, size_t, int, int, int, off_t);
      int munmap(void*, size_t);
+ 
+     static if (__USE_LARGEFILE64)
+     {
+         alias mmap64 = mmap;
+     }
  }
  else version (CRuntime_UClibc)
  {
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/core/sys/posix/sys/select.d gcc-16-20260201/libphobos/libdruntime/core/sys/posix/sys/select.d
*** gcc-16-20260125/libphobos/libdruntime/core/sys/posix/sys/select.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/core/sys/posix/sys/select.d	Sun Feb  1 22:32:17 2026
*************** version (CRuntime_Glibc)
*** 57,68 ****
          alias c_long __fd_mask;
          enum uint __NFDBITS = 8 * __fd_mask.sizeof;
  
!         extern (D) auto __FDELT( int d ) pure
          {
              return d / __NFDBITS;
          }
  
!         extern (D) auto __FDMASK( int d ) pure
          {
              return cast(__fd_mask) 1 << ( d % __NFDBITS );
          }
--- 57,68 ----
          alias c_long __fd_mask;
          enum uint __NFDBITS = 8 * __fd_mask.sizeof;
  
!         extern (D) auto __FDELT()( int d ) pure
          {
              return d / __NFDBITS;
          }
  
!         extern (D) auto __FDMASK()( int d ) pure
          {
              return cast(__fd_mask) 1 << ( d % __NFDBITS );
          }
*************** version (CRuntime_Glibc)
*** 75,96 ****
          __fd_mask[FD_SETSIZE / __NFDBITS] fds_bits;
      }
  
!     extern (D) void FD_CLR( int fd, fd_set* fdset ) pure
      {
          fdset.fds_bits[__FDELT( fd )] &= ~__FDMASK( fd );
      }
  
!     extern (D) bool FD_ISSET( int fd, const(fd_set)* fdset ) pure
      {
          return (fdset.fds_bits[__FDELT( fd )] & __FDMASK( fd )) != 0;
      }
  
!     extern (D) void FD_SET( int fd, fd_set* fdset ) pure
      {
          fdset.fds_bits[__FDELT( fd )] |= __FDMASK( fd );
      }
  
!     extern (D) void FD_ZERO( fd_set* fdset ) pure
      {
          fdset.fds_bits[0 .. $] = 0;
      }
--- 75,96 ----
          __fd_mask[FD_SETSIZE / __NFDBITS] fds_bits;
      }
  
!     extern (D) void FD_CLR()( int fd, fd_set* fdset ) pure
      {
          fdset.fds_bits[__FDELT( fd )] &= ~__FDMASK( fd );
      }
  
!     extern (D) bool FD_ISSET()( int fd, const(fd_set)* fdset ) pure
      {
          return (fdset.fds_bits[__FDELT( fd )] & __FDMASK( fd )) != 0;
      }
  
!     extern (D) void FD_SET()( int fd, fd_set* fdset ) pure
      {
          fdset.fds_bits[__FDELT( fd )] |= __FDMASK( fd );
      }
  
!     extern (D) void FD_ZERO()( fd_set* fdset ) pure
      {
          fdset.fds_bits[0 .. $] = 0;
      }
*************** else version (Darwin)
*** 148,169 ****
          int[(FD_SETSIZE + (__DARWIN_NFDBITS - 1)) / __DARWIN_NFDBITS] fds_bits;
      }
  
!     extern (D) void FD_CLR( int fd, fd_set* fdset ) pure
      {
          fdset.fds_bits[fd / __DARWIN_NFDBITS] &= ~(1 << (fd % __DARWIN_NFDBITS));
      }
  
!     extern (D) bool FD_ISSET( int fd, const(fd_set)* fdset ) pure
      {
          return (fdset.fds_bits[fd / __DARWIN_NFDBITS] & (1 << (fd % __DARWIN_NFDBITS))) != 0;
      }
  
!     extern (D) void FD_SET( int fd, fd_set* fdset ) pure
      {
          fdset.fds_bits[fd / __DARWIN_NFDBITS] |= 1 << (fd % __DARWIN_NFDBITS);
      }
  
!     extern (D) void FD_ZERO( fd_set* fdset ) pure
      {
          fdset.fds_bits[0 .. $] = 0;
      }
--- 148,169 ----
          int[(FD_SETSIZE + (__DARWIN_NFDBITS - 1)) / __DARWIN_NFDBITS] fds_bits;
      }
  
!     extern (D) void FD_CLR()( int fd, fd_set* fdset ) pure
      {
          fdset.fds_bits[fd / __DARWIN_NFDBITS] &= ~(1 << (fd % __DARWIN_NFDBITS));
      }
  
!     extern (D) bool FD_ISSET()( int fd, const(fd_set)* fdset ) pure
      {
          return (fdset.fds_bits[fd / __DARWIN_NFDBITS] & (1 << (fd % __DARWIN_NFDBITS))) != 0;
      }
  
!     extern (D) void FD_SET()( int fd, fd_set* fdset ) pure
      {
          fdset.fds_bits[fd / __DARWIN_NFDBITS] |= 1 << (fd % __DARWIN_NFDBITS);
      }
  
!     extern (D) void FD_ZERO()( fd_set* fdset ) pure
      {
          fdset.fds_bits[0 .. $] = 0;
      }
*************** else version (FreeBSD)
*** 187,213 ****
          deprecated("druntime incorrectly named fds_bits __fds_bits") alias __fds_bits = fds_bits;
      }
  
!     extern (D) __fd_mask __fdset_mask(uint n) pure
      {
          return cast(__fd_mask) 1 << (n % _NFDBITS);
      }
  
!     extern (D) void FD_CLR( int n, fd_set* p ) pure
      {
          p.fds_bits[n / _NFDBITS] &= ~__fdset_mask(n);
      }
  
!     extern (D) bool FD_ISSET( int n, const(fd_set)* p ) pure
      {
          return (p.fds_bits[n / _NFDBITS] & __fdset_mask(n)) != 0;
      }
  
!     extern (D) void FD_SET( int n, fd_set* p ) pure
      {
          p.fds_bits[n / _NFDBITS] |= __fdset_mask(n);
      }
  
!     extern (D) void FD_ZERO( fd_set* p ) pure
      {
          fd_set *_p;
          size_t _n;
--- 187,213 ----
          deprecated("druntime incorrectly named fds_bits __fds_bits") alias __fds_bits = fds_bits;
      }
  
!     extern (D) __fd_mask __fdset_mask()(uint n) pure
      {
          return cast(__fd_mask) 1 << (n % _NFDBITS);
      }
  
!     extern (D) void FD_CLR()( int n, fd_set* p ) pure
      {
          p.fds_bits[n / _NFDBITS] &= ~__fdset_mask(n);
      }
  
!     extern (D) bool FD_ISSET()( int n, const(fd_set)* p ) pure
      {
          return (p.fds_bits[n / _NFDBITS] & __fdset_mask(n)) != 0;
      }
  
!     extern (D) void FD_SET()( int n, fd_set* p ) pure
      {
          p.fds_bits[n / _NFDBITS] |= __fdset_mask(n);
      }
  
!     extern (D) void FD_ZERO()( fd_set* p ) pure
      {
          fd_set *_p;
          size_t _n;
*************** else version (NetBSD)
*** 237,263 ****
          deprecated("druntime incorrectly named fds_bits __fds_bits") alias __fds_bits = fds_bits;
      }
  
!     extern (D) __fd_mask __fdset_mask(uint n) pure
      {
          return cast(__fd_mask) 1 << (n % _NFDBITS);
      }
  
!     extern (D) void FD_CLR( int n, fd_set* p ) pure
      {
          p.fds_bits[n / _NFDBITS] &= ~__fdset_mask(n);
      }
  
!     extern (D) bool FD_ISSET( int n, const(fd_set)* p ) pure
      {
          return (p.fds_bits[n / _NFDBITS] & __fdset_mask(n)) != 0;
      }
  
!     extern (D) void FD_SET( int n, fd_set* p ) pure
      {
          p.fds_bits[n / _NFDBITS] |= __fdset_mask(n);
      }
  
!     extern (D) void FD_ZERO( fd_set* p ) pure
      {
          fd_set *_p;
          size_t _n;
--- 237,263 ----
          deprecated("druntime incorrectly named fds_bits __fds_bits") alias __fds_bits = fds_bits;
      }
  
!     extern (D) __fd_mask __fdset_mask()(uint n) pure
      {
          return cast(__fd_mask) 1 << (n % _NFDBITS);
      }
  
!     extern (D) void FD_CLR()( int n, fd_set* p ) pure
      {
          p.fds_bits[n / _NFDBITS] &= ~__fdset_mask(n);
      }
  
!     extern (D) bool FD_ISSET()( int n, const(fd_set)* p ) pure
      {
          return (p.fds_bits[n / _NFDBITS] & __fdset_mask(n)) != 0;
      }
  
!     extern (D) void FD_SET()( int n, fd_set* p ) pure
      {
          p.fds_bits[n / _NFDBITS] |= __fdset_mask(n);
      }
  
!     extern (D) void FD_ZERO()( fd_set* p ) pure
      {
          fd_set *_p;
          size_t _n;
*************** else version (OpenBSD)
*** 287,313 ****
          deprecated("druntime incorrectly named fds_bits __fds_bits") alias __fds_bits = fds_bits;
      }
  
!     extern (D) __fd_mask __fdset_mask(uint n) pure
      {
          return cast(__fd_mask) 1 << (n % _NFDBITS);
      }
  
!     extern (D) void FD_CLR(int n, fd_set* p) pure
      {
          p.fds_bits[n / _NFDBITS] &= ~__fdset_mask(n);
      }
  
!     extern (D) bool FD_ISSET(int n, const(fd_set)* p) pure
      {
          return (p.fds_bits[n / _NFDBITS] & __fdset_mask(n)) != 0;
      }
  
!     extern (D) void FD_SET(int n, fd_set* p) pure
      {
          p.fds_bits[n / _NFDBITS] |= __fdset_mask(n);
      }
  
!     extern (D) void FD_ZERO(fd_set* p) pure
      {
          fd_set *_p = p;
          size_t _n = (FD_SETSIZE + (_NFDBITS - 1)) / _NFDBITS;
--- 287,313 ----
          deprecated("druntime incorrectly named fds_bits __fds_bits") alias __fds_bits = fds_bits;
      }
  
!     extern (D) __fd_mask __fdset_mask()(uint n) pure
      {
          return cast(__fd_mask) 1 << (n % _NFDBITS);
      }
  
!     extern (D) void FD_CLR()(int n, fd_set* p) pure
      {
          p.fds_bits[n / _NFDBITS] &= ~__fdset_mask(n);
      }
  
!     extern (D) bool FD_ISSET()(int n, const(fd_set)* p) pure
      {
          return (p.fds_bits[n / _NFDBITS] & __fdset_mask(n)) != 0;
      }
  
!     extern (D) void FD_SET()(int n, fd_set* p) pure
      {
          p.fds_bits[n / _NFDBITS] |= __fdset_mask(n);
      }
  
!     extern (D) void FD_ZERO()(fd_set* p) pure
      {
          fd_set *_p = p;
          size_t _n = (FD_SETSIZE + (_NFDBITS - 1)) / _NFDBITS;
*************** else version (DragonFlyBSD)
*** 335,361 ****
          deprecated("druntime incorrectly named fds_bits __fds_bits") alias __fds_bits = fds_bits;
      }
  
!     extern (D) __fd_mask __fdset_mask(uint n) pure
      {
          return cast(__fd_mask) 1 << (n % _NFDBITS);
      }
  
!     extern (D) void FD_CLR( int n, fd_set* p ) pure
      {
          p.fds_bits[n / _NFDBITS] &= ~__fdset_mask(n);
      }
  
!     extern (D) bool FD_ISSET( int n, const(fd_set)* p ) pure
      {
          return (p.fds_bits[n / _NFDBITS] & __fdset_mask(n)) != 0;
      }
  
!     extern (D) void FD_SET( int n, fd_set* p ) pure
      {
          p.fds_bits[n / _NFDBITS] |= __fdset_mask(n);
      }
  
!     extern (D) void FD_ZERO( fd_set* p ) pure
      {
          fd_set *_p;
          size_t _n;
--- 335,361 ----
          deprecated("druntime incorrectly named fds_bits __fds_bits") alias __fds_bits = fds_bits;
      }
  
!     extern (D) __fd_mask __fdset_mask()(uint n) pure
      {
          return cast(__fd_mask) 1 << (n % _NFDBITS);
      }
  
!     extern (D) void FD_CLR()( int n, fd_set* p ) pure
      {
          p.fds_bits[n / _NFDBITS] &= ~__fdset_mask(n);
      }
  
!     extern (D) bool FD_ISSET()( int n, const(fd_set)* p ) pure
      {
          return (p.fds_bits[n / _NFDBITS] & __fdset_mask(n)) != 0;
      }
  
!     extern (D) void FD_SET()( int n, fd_set* p ) pure
      {
          p.fds_bits[n / _NFDBITS] |= __fdset_mask(n);
      }
  
!     extern (D) void FD_ZERO()( fd_set* p ) pure
      {
          fd_set *_p;
          size_t _n;
*************** else version (Solaris)
*** 389,410 ****
          c_long[(FD_SETSIZE + (FD_NFDBITS - 1)) / FD_NFDBITS] fds_bits;
      }
  
!     extern (D) void FD_SET(int __n, fd_set* __p) pure
      {
          __p.fds_bits[__n / FD_NFDBITS] |= 1UL << (__n % FD_NFDBITS);
      }
  
!     extern (D) void FD_CLR(int __n, fd_set* __p) pure
      {
          __p.fds_bits[__n / FD_NFDBITS] &= ~(1UL << (__n % FD_NFDBITS));
      }
  
!     extern (D) bool FD_ISSET(int __n, const(fd_set)* __p) pure
      {
          return (__p.fds_bits[__n / FD_NFDBITS] & (1UL << (__n % FD_NFDBITS))) != 0;
      }
  
!     extern (D) void FD_ZERO(fd_set* __p) pure
      {
          __p.fds_bits[0 .. $] = 0;
      }
--- 389,410 ----
          c_long[(FD_SETSIZE + (FD_NFDBITS - 1)) / FD_NFDBITS] fds_bits;
      }
  
!     extern (D) void FD_SET()(int __n, fd_set* __p) pure
      {
          __p.fds_bits[__n / FD_NFDBITS] |= 1UL << (__n % FD_NFDBITS);
      }
  
!     extern (D) void FD_CLR()(int __n, fd_set* __p) pure
      {
          __p.fds_bits[__n / FD_NFDBITS] &= ~(1UL << (__n % FD_NFDBITS));
      }
  
!     extern (D) bool FD_ISSET()(int __n, const(fd_set)* __p) pure
      {
          return (__p.fds_bits[__n / FD_NFDBITS] & (1UL << (__n % FD_NFDBITS))) != 0;
      }
  
!     extern (D) void FD_ZERO()(fd_set* __p) pure
      {
          __p.fds_bits[0 .. $] = 0;
      }
*************** else version (CRuntime_Bionic)
*** 419,430 ****
          alias c_ulong __fd_mask;
          enum uint __NFDBITS = 8 * __fd_mask.sizeof;
  
!         extern (D) auto __FDELT( int d ) pure
          {
              return d / __NFDBITS;
          }
  
!         extern (D) auto __FDMASK( int d ) pure
          {
              return cast(__fd_mask) 1 << ( d % __NFDBITS );
          }
--- 419,430 ----
          alias c_ulong __fd_mask;
          enum uint __NFDBITS = 8 * __fd_mask.sizeof;
  
!         extern (D) auto __FDELT()( int d ) pure
          {
              return d / __NFDBITS;
          }
  
!         extern (D) auto __FDMASK()( int d ) pure
          {
              return cast(__fd_mask) 1 << ( d % __NFDBITS );
          }
*************** else version (CRuntime_Bionic)
*** 438,459 ****
      }
  
      // These functions are generated in assembly in bionic.
!     extern (D) void FD_CLR( int fd, fd_set* fdset ) pure
      {
          fdset.fds_bits[__FDELT( fd )] &= ~__FDMASK( fd );
      }
  
!     extern (D) bool FD_ISSET( int fd, const(fd_set)* fdset ) pure
      {
          return (fdset.fds_bits[__FDELT( fd )] & __FDMASK( fd )) != 0;
      }
  
!     extern (D) void FD_SET( int fd, fd_set* fdset ) pure
      {
          fdset.fds_bits[__FDELT( fd )] |= __FDMASK( fd );
      }
  
!     extern (D) void FD_ZERO( fd_set* fdset ) pure
      {
          fdset.fds_bits[0 .. $] = 0;
      }
--- 438,459 ----
      }
  
      // These functions are generated in assembly in bionic.
!     extern (D) void FD_CLR()( int fd, fd_set* fdset ) pure
      {
          fdset.fds_bits[__FDELT( fd )] &= ~__FDMASK( fd );
      }
  
!     extern (D) bool FD_ISSET()( int fd, const(fd_set)* fdset ) pure
      {
          return (fdset.fds_bits[__FDELT( fd )] & __FDMASK( fd )) != 0;
      }
  
!     extern (D) void FD_SET()( int fd, fd_set* fdset ) pure
      {
          fdset.fds_bits[__FDELT( fd )] |= __FDMASK( fd );
      }
  
!     extern (D) void FD_ZERO()( fd_set* fdset ) pure
      {
          fdset.fds_bits[0 .. $] = 0;
      }
*************** else version (CRuntime_Musl)
*** 471,482 ****
      {
          enum uint __NFDBITS = 8 * fd_mask.sizeof;
  
!         extern (D) auto __FDELT( int d ) pure
          {
              return d / __NFDBITS;
          }
  
!         extern (D) auto __FDMASK( int d ) pure
          {
              return cast(fd_mask) 1 << ( d % __NFDBITS );
          }
--- 471,482 ----
      {
          enum uint __NFDBITS = 8 * fd_mask.sizeof;
  
!         extern (D) auto __FDELT()( int d ) pure
          {
              return d / __NFDBITS;
          }
  
!         extern (D) auto __FDMASK()( int d ) pure
          {
              return cast(fd_mask) 1 << ( d % __NFDBITS );
          }
*************** else version (CRuntime_Musl)
*** 486,507 ****
          ulong[FD_SETSIZE / 8 / long.sizeof] fds_bits;
      }
  
!     extern (D) void FD_CLR( int fd, fd_set* fdset ) pure
      {
          fdset.fds_bits[__FDELT( fd )] &= ~__FDMASK( fd );
      }
  
!     extern (D) bool FD_ISSET( int fd, const(fd_set)* fdset ) pure
      {
          return (fdset.fds_bits[__FDELT( fd )] & __FDMASK( fd )) != 0;
      }
  
!     extern (D) void FD_SET( int fd, fd_set* fdset ) pure
      {
          fdset.fds_bits[__FDELT( fd )] |= __FDMASK( fd );
      }
  
!     extern (D) void FD_ZERO( fd_set* fdset ) pure
      {
          fdset.fds_bits[0 .. $] = 0;
      }
--- 486,507 ----
          ulong[FD_SETSIZE / 8 / long.sizeof] fds_bits;
      }
  
!     extern (D) void FD_CLR()( int fd, fd_set* fdset ) pure
      {
          fdset.fds_bits[__FDELT( fd )] &= ~__FDMASK( fd );
      }
  
!     extern (D) bool FD_ISSET()( int fd, const(fd_set)* fdset ) pure
      {
          return (fdset.fds_bits[__FDELT( fd )] & __FDMASK( fd )) != 0;
      }
  
!     extern (D) void FD_SET()( int fd, fd_set* fdset ) pure
      {
          fdset.fds_bits[__FDELT( fd )] |= __FDMASK( fd );
      }
  
!     extern (D) void FD_ZERO()( fd_set* fdset ) pure
      {
          fdset.fds_bits[0 .. $] = 0;
      }
*************** else version (CRuntime_UClibc)
*** 517,528 ****
          alias c_long __fd_mask;
          enum uint __NFDBITS = 8 * __fd_mask.sizeof;
  
!         extern (D) auto __FDELT( int d ) pure
          {
              return d / __NFDBITS;
          }
  
!         extern (D) auto __FDMASK( int d ) pure
          {
              return cast(__fd_mask) 1 << ( d % __NFDBITS );
          }
--- 517,528 ----
          alias c_long __fd_mask;
          enum uint __NFDBITS = 8 * __fd_mask.sizeof;
  
!         extern (D) auto __FDELT()( int d ) pure
          {
              return d / __NFDBITS;
          }
  
!         extern (D) auto __FDMASK()( int d ) pure
          {
              return cast(__fd_mask) 1 << ( d % __NFDBITS );
          }
*************** else version (CRuntime_UClibc)
*** 535,556 ****
          __fd_mask[FD_SETSIZE / __NFDBITS] fds_bits;
      }
  
!     extern (D) void FD_CLR( int fd, fd_set* fdset ) pure
      {
          fdset.fds_bits[__FDELT( fd )] &= ~__FDMASK( fd );
      }
  
!     extern (D) bool FD_ISSET( int fd, const(fd_set)* fdset ) pure
      {
          return (fdset.fds_bits[__FDELT( fd )] & __FDMASK( fd )) != 0;
      }
  
!     extern (D) void FD_SET( int fd, fd_set* fdset ) pure
      {
          fdset.fds_bits[__FDELT( fd )] |= __FDMASK( fd );
      }
  
!     extern (D) void FD_ZERO( fd_set* fdset ) pure
      {
          fdset.fds_bits[0 .. $] = 0;
      }
--- 535,556 ----
          __fd_mask[FD_SETSIZE / __NFDBITS] fds_bits;
      }
  
!     extern (D) void FD_CLR()( int fd, fd_set* fdset ) pure
      {
          fdset.fds_bits[__FDELT( fd )] &= ~__FDMASK( fd );
      }
  
!     extern (D) bool FD_ISSET()( int fd, const(fd_set)* fdset ) pure
      {
          return (fdset.fds_bits[__FDELT( fd )] & __FDMASK( fd )) != 0;
      }
  
!     extern (D) void FD_SET()( int fd, fd_set* fdset ) pure
      {
          fdset.fds_bits[__FDELT( fd )] |= __FDMASK( fd );
      }
  
!     extern (D) void FD_ZERO()( fd_set* fdset ) pure
      {
          fdset.fds_bits[0 .. $] = 0;
      }
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/core/sys/posix/sys/socket.d gcc-16-20260201/libphobos/libdruntime/core/sys/posix/sys/socket.d
*** gcc-16-20260125/libphobos/libdruntime/core/sys/posix/sys/socket.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/core/sys/posix/sys/socket.d	Sun Feb  1 22:32:17 2026
*************** version (linux)
*** 233,244 ****
  
      extern (D)
      {
!         size_t CMSG_ALIGN( size_t len ) pure nothrow @nogc
          {
              return (len + size_t.sizeof - 1) & cast(size_t) (~(size_t.sizeof - 1));
          }
  
!         size_t CMSG_LEN( size_t len ) pure nothrow @nogc
          {
              return CMSG_ALIGN(cmsghdr.sizeof) + len;
          }
--- 233,244 ----
  
      extern (D)
      {
!         size_t CMSG_ALIGN()( size_t len ) pure nothrow @nogc
          {
              return (len + size_t.sizeof - 1) & cast(size_t) (~(size_t.sizeof - 1));
          }
  
!         size_t CMSG_LEN()( size_t len ) pure nothrow @nogc
          {
              return CMSG_ALIGN(cmsghdr.sizeof) + len;
          }
*************** else version (Darwin)
*** 668,680 ****
  
      extern (D)
      {
!         socklen_t CMSG_ALIGN(socklen_t len) pure nothrow @nogc { return (len + socklen_t.sizeof - 1) & cast(socklen_t) (~(socklen_t.sizeof - 1)); }
!         socklen_t CMSG_SPACE(socklen_t len) pure nothrow @nogc { return CMSG_ALIGN(len) + CMSG_ALIGN(cmsghdr.sizeof); }
!         socklen_t CMSG_LEN(socklen_t len) pure nothrow @nogc { return CMSG_ALIGN(cmsghdr.sizeof) + len; }
  
!         inout(ubyte)*   CMSG_DATA( return scope inout(cmsghdr)* cmsg ) pure nothrow @nogc { return cast(ubyte*)( cmsg + 1 ); }
  
!         inout(cmsghdr)* CMSG_FIRSTHDR( inout(msghdr)* mhdr ) pure nothrow @nogc
          {
              return ( cast(socklen_t)mhdr.msg_controllen >= cmsghdr.sizeof ? cast(inout(cmsghdr)*) mhdr.msg_control : cast(inout(cmsghdr)*) null );
          }
--- 668,680 ----
  
      extern (D)
      {
!         socklen_t CMSG_ALIGN()(socklen_t len) pure nothrow @nogc { return (len + socklen_t.sizeof - 1) & cast(socklen_t) (~(socklen_t.sizeof - 1)); }
!         socklen_t CMSG_SPACE()(socklen_t len) pure nothrow @nogc { return CMSG_ALIGN(len) + CMSG_ALIGN(cmsghdr.sizeof); }
!         socklen_t CMSG_LEN()(socklen_t len) pure nothrow @nogc { return CMSG_ALIGN(cmsghdr.sizeof) + len; }
  
!         inout(ubyte)*   CMSG_DATA()( return scope inout(cmsghdr)* cmsg ) pure nothrow @nogc { return cast(ubyte*)( cmsg + 1 ); }
  
!         inout(cmsghdr)* CMSG_FIRSTHDR()( inout(msghdr)* mhdr ) pure nothrow @nogc
          {
              return ( cast(socklen_t)mhdr.msg_controllen >= cmsghdr.sizeof ? cast(inout(cmsghdr)*) mhdr.msg_control : cast(inout(cmsghdr)*) null );
          }
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/core/sys/posix/sys/stat.d gcc-16-20260201/libphobos/libdruntime/core/sys/posix/sys/stat.d
*** gcc-16-20260125/libphobos/libdruntime/core/sys/posix/sys/stat.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/core/sys/posix/sys/stat.d	Sun Feb  1 22:32:17 2026
*************** version (linux)
*** 263,270 ****
      {
          struct stat_t
          {
!             c_ulong     st_dev;
!             c_long[3]   st_pad1;
              ino_t       st_ino;
              mode_t      st_mode;
              nlink_t     st_nlink;
--- 263,278 ----
      {
          struct stat_t
          {
!             version (CRuntime_Musl)
!             {
!                 dev_t       st_dev;
!                 c_long[2]   st_pad1;
!             }
!             else
!             {
!                 c_ulong     st_dev;
!                 c_long[3]   st_pad1;
!             }
              ino_t       st_ino;
              mode_t      st_mode;
              nlink_t     st_nlink;
*************** version (CRuntime_Glibc)
*** 1464,1482 ****
  
      private
      {
!         extern (D) bool S_ISTYPE( mode_t mode, uint mask )
          {
              return ( mode & S_IFMT ) == mask;
          }
      }
  
!     extern (D) bool S_ISBLK( mode_t mode )  { return S_ISTYPE( mode, S_IFBLK );  }
!     extern (D) bool S_ISCHR( mode_t mode )  { return S_ISTYPE( mode, S_IFCHR );  }
!     extern (D) bool S_ISDIR( mode_t mode )  { return S_ISTYPE( mode, S_IFDIR );  }
!     extern (D) bool S_ISFIFO( mode_t mode ) { return S_ISTYPE( mode, S_IFIFO );  }
!     extern (D) bool S_ISREG( mode_t mode )  { return S_ISTYPE( mode, S_IFREG );  }
!     extern (D) bool S_ISLNK( mode_t mode )  { return S_ISTYPE( mode, S_IFLNK );  }
!     extern (D) bool S_ISSOCK( mode_t mode ) { return S_ISTYPE( mode, S_IFSOCK ); }
  
      int utimensat(int dirfd, const char *pathname,
          ref const(timespec)[2] times, int flags);
--- 1472,1490 ----
  
      private
      {
!         extern (D) bool S_ISTYPE()( mode_t mode, uint mask )
          {
              return ( mode & S_IFMT ) == mask;
          }
      }
  
!     extern (D) bool S_ISBLK()( mode_t mode )  { return S_ISTYPE( mode, S_IFBLK );  }
!     extern (D) bool S_ISCHR()( mode_t mode )  { return S_ISTYPE( mode, S_IFCHR );  }
!     extern (D) bool S_ISDIR()( mode_t mode )  { return S_ISTYPE( mode, S_IFDIR );  }
!     extern (D) bool S_ISFIFO()( mode_t mode ) { return S_ISTYPE( mode, S_IFIFO );  }
!     extern (D) bool S_ISREG()( mode_t mode )  { return S_ISTYPE( mode, S_IFREG );  }
!     extern (D) bool S_ISLNK()( mode_t mode )  { return S_ISTYPE( mode, S_IFLNK );  }
!     extern (D) bool S_ISSOCK()( mode_t mode ) { return S_ISTYPE( mode, S_IFSOCK ); }
  
      int utimensat(int dirfd, const char *pathname,
          ref const(timespec)[2] times, int flags);
*************** else version (Darwin)
*** 1501,1519 ****
  
      private
      {
!         extern (D) bool S_ISTYPE( mode_t mode, uint mask )
          {
              return ( mode & S_IFMT ) == mask;
          }
      }
  
!     extern (D) bool S_ISBLK( mode_t mode )  { return S_ISTYPE( mode, S_IFBLK );  }
!     extern (D) bool S_ISCHR( mode_t mode )  { return S_ISTYPE( mode, S_IFCHR );  }
!     extern (D) bool S_ISDIR( mode_t mode )  { return S_ISTYPE( mode, S_IFDIR );  }
!     extern (D) bool S_ISFIFO( mode_t mode ) { return S_ISTYPE( mode, S_IFIFO );  }
!     extern (D) bool S_ISREG( mode_t mode )  { return S_ISTYPE( mode, S_IFREG );  }
!     extern (D) bool S_ISLNK( mode_t mode )  { return S_ISTYPE( mode, S_IFLNK );  }
!     extern (D) bool S_ISSOCK( mode_t mode ) { return S_ISTYPE( mode, S_IFSOCK ); }
  }
  else version (FreeBSD)
  {
--- 1509,1527 ----
  
      private
      {
!         extern (D) bool S_ISTYPE()( mode_t mode, uint mask )
          {
              return ( mode & S_IFMT ) == mask;
          }
      }
  
!     extern (D) bool S_ISBLK()( mode_t mode )  { return S_ISTYPE( mode, S_IFBLK );  }
!     extern (D) bool S_ISCHR()( mode_t mode )  { return S_ISTYPE( mode, S_IFCHR );  }
!     extern (D) bool S_ISDIR()( mode_t mode )  { return S_ISTYPE( mode, S_IFDIR );  }
!     extern (D) bool S_ISFIFO()( mode_t mode ) { return S_ISTYPE( mode, S_IFIFO );  }
!     extern (D) bool S_ISREG()( mode_t mode )  { return S_ISTYPE( mode, S_IFREG );  }
!     extern (D) bool S_ISLNK()( mode_t mode )  { return S_ISTYPE( mode, S_IFLNK );  }
!     extern (D) bool S_ISSOCK()( mode_t mode ) { return S_ISTYPE( mode, S_IFSOCK ); }
  }
  else version (FreeBSD)
  {
*************** else version (FreeBSD)
*** 1534,1552 ****
  
      private
      {
!         extern (D) bool S_ISTYPE( mode_t mode, uint mask )
          {
              return ( mode & S_IFMT ) == mask;
          }
      }
  
!     extern (D) bool S_ISBLK( mode_t mode )  { return S_ISTYPE( mode, S_IFBLK );  }
!     extern (D) bool S_ISCHR( mode_t mode )  { return S_ISTYPE( mode, S_IFCHR );  }
!     extern (D) bool S_ISDIR( mode_t mode )  { return S_ISTYPE( mode, S_IFDIR );  }
!     extern (D) bool S_ISFIFO( mode_t mode ) { return S_ISTYPE( mode, S_IFIFO );  }
!     extern (D) bool S_ISREG( mode_t mode )  { return S_ISTYPE( mode, S_IFREG );  }
!     extern (D) bool S_ISLNK( mode_t mode )  { return S_ISTYPE( mode, S_IFLNK );  }
!     extern (D) bool S_ISSOCK( mode_t mode ) { return S_ISTYPE( mode, S_IFSOCK ); }
  
      // Since FreeBSD 11:
      version (none)
--- 1542,1560 ----
  
      private
      {
!         extern (D) bool S_ISTYPE()( mode_t mode, uint mask )
          {
              return ( mode & S_IFMT ) == mask;
          }
      }
  
!     extern (D) bool S_ISBLK()( mode_t mode )  { return S_ISTYPE( mode, S_IFBLK );  }
!     extern (D) bool S_ISCHR()( mode_t mode )  { return S_ISTYPE( mode, S_IFCHR );  }
!     extern (D) bool S_ISDIR()( mode_t mode )  { return S_ISTYPE( mode, S_IFDIR );  }
!     extern (D) bool S_ISFIFO()( mode_t mode ) { return S_ISTYPE( mode, S_IFIFO );  }
!     extern (D) bool S_ISREG()( mode_t mode )  { return S_ISTYPE( mode, S_IFREG );  }
!     extern (D) bool S_ISLNK()( mode_t mode )  { return S_ISTYPE( mode, S_IFLNK );  }
!     extern (D) bool S_ISSOCK()( mode_t mode ) { return S_ISTYPE( mode, S_IFSOCK ); }
  
      // Since FreeBSD 11:
      version (none)
*************** else version (NetBSD)
*** 1575,1593 ****
  
      private
      {
!         extern (D) bool S_ISTYPE( mode_t mode, uint mask )
          {
              return ( mode & S_IFMT ) == mask;
          }
      }
  
!     extern (D) bool S_ISBLK( mode_t mode )  { return S_ISTYPE( mode, S_IFBLK );  }
!     extern (D) bool S_ISCHR( mode_t mode )  { return S_ISTYPE( mode, S_IFCHR );  }
!     extern (D) bool S_ISDIR( mode_t mode )  { return S_ISTYPE( mode, S_IFDIR );  }
!     extern (D) bool S_ISFIFO( mode_t mode ) { return S_ISTYPE( mode, S_IFIFO );  }
!     extern (D) bool S_ISREG( mode_t mode )  { return S_ISTYPE( mode, S_IFREG );  }
!     extern (D) bool S_ISLNK( mode_t mode )  { return S_ISTYPE( mode, S_IFLNK );  }
!     extern (D) bool S_ISSOCK( mode_t mode ) { return S_ISTYPE( mode, S_IFSOCK ); }
  }
  else version (OpenBSD)
  {
--- 1583,1601 ----
  
      private
      {
!         extern (D) bool S_ISTYPE()( mode_t mode, uint mask )
          {
              return ( mode & S_IFMT ) == mask;
          }
      }
  
!     extern (D) bool S_ISBLK()( mode_t mode )  { return S_ISTYPE( mode, S_IFBLK );  }
!     extern (D) bool S_ISCHR()( mode_t mode )  { return S_ISTYPE( mode, S_IFCHR );  }
!     extern (D) bool S_ISDIR()( mode_t mode )  { return S_ISTYPE( mode, S_IFDIR );  }
!     extern (D) bool S_ISFIFO()( mode_t mode ) { return S_ISTYPE( mode, S_IFIFO );  }
!     extern (D) bool S_ISREG()( mode_t mode )  { return S_ISTYPE( mode, S_IFREG );  }
!     extern (D) bool S_ISLNK()( mode_t mode )  { return S_ISTYPE( mode, S_IFLNK );  }
!     extern (D) bool S_ISSOCK()( mode_t mode ) { return S_ISTYPE( mode, S_IFSOCK ); }
  }
  else version (OpenBSD)
  {
*************** else version (OpenBSD)
*** 1606,1618 ****
      enum S_IXOTH    = 0x1; // 0000001
      enum S_IRWXO    = 0x7; // 0000007
  
!     extern (D) bool S_ISBLK(mode_t mode)  { return (mode & S_IFMT) == S_IFBLK;  }
!     extern (D) bool S_ISCHR(mode_t mode)  { return (mode & S_IFMT) == S_IFCHR;  }
!     extern (D) bool S_ISDIR(mode_t mode)  { return (mode & S_IFMT) == S_IFDIR;  }
!     extern (D) bool S_ISFIFO(mode_t mode) { return (mode & S_IFMT) == S_IFIFO;  }
!     extern (D) bool S_ISREG(mode_t mode)  { return (mode & S_IFMT) == S_IFREG;  }
!     extern (D) bool S_ISLNK(mode_t mode)  { return (mode & S_IFMT) == S_IFLNK;  }
!     extern (D) bool S_ISSOCK(mode_t mode) { return (mode & S_IFMT) == S_IFSOCK; }
  }
  else version (DragonFlyBSD)
  {
--- 1614,1626 ----
      enum S_IXOTH    = 0x1; // 0000001
      enum S_IRWXO    = 0x7; // 0000007
  
!     extern (D) bool S_ISBLK()(mode_t mode)  { return (mode & S_IFMT) == S_IFBLK;  }
!     extern (D) bool S_ISCHR()(mode_t mode)  { return (mode & S_IFMT) == S_IFCHR;  }
!     extern (D) bool S_ISDIR()(mode_t mode)  { return (mode & S_IFMT) == S_IFDIR;  }
!     extern (D) bool S_ISFIFO()(mode_t mode) { return (mode & S_IFMT) == S_IFIFO;  }
!     extern (D) bool S_ISREG()(mode_t mode)  { return (mode & S_IFMT) == S_IFREG;  }
!     extern (D) bool S_ISLNK()(mode_t mode)  { return (mode & S_IFMT) == S_IFLNK;  }
!     extern (D) bool S_ISSOCK()(mode_t mode) { return (mode & S_IFMT) == S_IFSOCK; }
  }
  else version (DragonFlyBSD)
  {
*************** else version (DragonFlyBSD)
*** 1633,1651 ****
  
      private
      {
!         extern (D) bool S_ISTYPE( mode_t mode, uint mask )
          {
              return ( mode & S_IFMT ) == mask;
          }
      }
  
!     extern (D) bool S_ISBLK( mode_t mode )  { return S_ISTYPE( mode, S_IFBLK );  }
!     extern (D) bool S_ISCHR( mode_t mode )  { return S_ISTYPE( mode, S_IFCHR );  }
!     extern (D) bool S_ISDIR( mode_t mode )  { return S_ISTYPE( mode, S_IFDIR );  }
!     extern (D) bool S_ISFIFO( mode_t mode ) { return S_ISTYPE( mode, S_IFIFO );  }
!     extern (D) bool S_ISREG( mode_t mode )  { return S_ISTYPE( mode, S_IFREG );  }
!     extern (D) bool S_ISLNK( mode_t mode )  { return S_ISTYPE( mode, S_IFLNK );  }
!     extern (D) bool S_ISSOCK( mode_t mode ) { return S_ISTYPE( mode, S_IFSOCK ); }
  }
  else version (Solaris)
  {
--- 1641,1659 ----
  
      private
      {
!         extern (D) bool S_ISTYPE()( mode_t mode, uint mask )
          {
              return ( mode & S_IFMT ) == mask;
          }
      }
  
!     extern (D) bool S_ISBLK()( mode_t mode )  { return S_ISTYPE( mode, S_IFBLK );  }
!     extern (D) bool S_ISCHR()( mode_t mode )  { return S_ISTYPE( mode, S_IFCHR );  }
!     extern (D) bool S_ISDIR()( mode_t mode )  { return S_ISTYPE( mode, S_IFDIR );  }
!     extern (D) bool S_ISFIFO()( mode_t mode ) { return S_ISTYPE( mode, S_IFIFO );  }
!     extern (D) bool S_ISREG()( mode_t mode )  { return S_ISTYPE( mode, S_IFREG );  }
!     extern (D) bool S_ISLNK()( mode_t mode )  { return S_ISTYPE( mode, S_IFLNK );  }
!     extern (D) bool S_ISSOCK()( mode_t mode ) { return S_ISTYPE( mode, S_IFSOCK ); }
  }
  else version (Solaris)
  {
*************** else version (Solaris)
*** 1666,1686 ****
  
      private
      {
!         extern (D) bool S_ISTYPE(mode_t mode, uint mask)
          {
              return (mode & S_IFMT) == mask;
          }
      }
  
!     extern (D) bool S_ISBLK(mode_t mode) { return S_ISTYPE(mode, S_IFBLK); }
!     extern (D) bool S_ISCHR(mode_t mode) { return S_ISTYPE(mode, S_IFCHR); }
!     extern (D) bool S_ISDIR(mode_t mode) { return S_ISTYPE(mode, S_IFDIR); }
!     extern (D) bool S_ISFIFO(mode_t mode) { return S_ISTYPE(mode, S_IFIFO); }
!     extern (D) bool S_ISREG(mode_t mode) { return S_ISTYPE(mode, S_IFREG); }
!     extern (D) bool S_ISLNK(mode_t mode) { return S_ISTYPE(mode, S_IFLNK); }
!     extern (D) bool S_ISSOCK(mode_t mode) { return S_ISTYPE(mode, S_IFSOCK); }
!     extern (D) bool S_ISDOOR(mode_t mode) { return S_ISTYPE(mode, S_IFDOOR); }
!     extern (D) bool S_ISPORT(mode_t mode) { return S_ISTYPE(mode, S_IFPORT); }
  }
  else version (CRuntime_Bionic)
  {
--- 1674,1694 ----
  
      private
      {
!         extern (D) bool S_ISTYPE()(mode_t mode, uint mask)
          {
              return (mode & S_IFMT) == mask;
          }
      }
  
!     extern (D) bool S_ISBLK()(mode_t mode) { return S_ISTYPE(mode, S_IFBLK); }
!     extern (D) bool S_ISCHR()(mode_t mode) { return S_ISTYPE(mode, S_IFCHR); }
!     extern (D) bool S_ISDIR()(mode_t mode) { return S_ISTYPE(mode, S_IFDIR); }
!     extern (D) bool S_ISFIFO()(mode_t mode) { return S_ISTYPE(mode, S_IFIFO); }
!     extern (D) bool S_ISREG()(mode_t mode) { return S_ISTYPE(mode, S_IFREG); }
!     extern (D) bool S_ISLNK()(mode_t mode) { return S_ISTYPE(mode, S_IFLNK); }
!     extern (D) bool S_ISSOCK()(mode_t mode) { return S_ISTYPE(mode, S_IFSOCK); }
!     extern (D) bool S_ISDOOR()(mode_t mode) { return S_ISTYPE(mode, S_IFDOOR); }
!     extern (D) bool S_ISPORT()(mode_t mode) { return S_ISTYPE(mode, S_IFPORT); }
  }
  else version (CRuntime_Bionic)
  {
*************** else version (CRuntime_Bionic)
*** 1701,1719 ****
  
      private
      {
!         extern (D) bool S_ISTYPE( uint mode, uint mask )
          {
              return ( mode & S_IFMT ) == mask;
          }
      }
  
!     extern (D) bool S_ISBLK( uint mode )  { return S_ISTYPE( mode, S_IFBLK );  }
!     extern (D) bool S_ISCHR( uint mode )  { return S_ISTYPE( mode, S_IFCHR );  }
!     extern (D) bool S_ISDIR( uint mode )  { return S_ISTYPE( mode, S_IFDIR );  }
!     extern (D) bool S_ISFIFO( uint mode ) { return S_ISTYPE( mode, S_IFIFO );  }
!     extern (D) bool S_ISREG( uint mode )  { return S_ISTYPE( mode, S_IFREG );  }
!     extern (D) bool S_ISLNK( uint mode )  { return S_ISTYPE( mode, S_IFLNK );  }
!     extern (D) bool S_ISSOCK( uint mode ) { return S_ISTYPE( mode, S_IFSOCK ); }
  
      // Added since Lollipop
      int utimensat(int dirfd, const char *pathname,
--- 1709,1727 ----
  
      private
      {
!         extern (D) bool S_ISTYPE()( uint mode, uint mask )
          {
              return ( mode & S_IFMT ) == mask;
          }
      }
  
!     extern (D) bool S_ISBLK()( uint mode )  { return S_ISTYPE( mode, S_IFBLK );  }
!     extern (D) bool S_ISCHR()( uint mode )  { return S_ISTYPE( mode, S_IFCHR );  }
!     extern (D) bool S_ISDIR()( uint mode )  { return S_ISTYPE( mode, S_IFDIR );  }
!     extern (D) bool S_ISFIFO()( uint mode ) { return S_ISTYPE( mode, S_IFIFO );  }
!     extern (D) bool S_ISREG()( uint mode )  { return S_ISTYPE( mode, S_IFREG );  }
!     extern (D) bool S_ISLNK()( uint mode )  { return S_ISTYPE( mode, S_IFLNK );  }
!     extern (D) bool S_ISSOCK()( uint mode ) { return S_ISTYPE( mode, S_IFSOCK ); }
  
      // Added since Lollipop
      int utimensat(int dirfd, const char *pathname,
*************** else version (CRuntime_Musl)
*** 1740,1758 ****
  
      private
      {
!         extern (D) bool S_ISTYPE( mode_t mode, uint mask )
          {
              return ( mode & S_IFMT ) == mask;
          }
      }
  
!     extern (D) bool S_ISBLK( mode_t mode )  { return S_ISTYPE( mode, S_IFBLK );  }
!     extern (D) bool S_ISCHR( mode_t mode )  { return S_ISTYPE( mode, S_IFCHR );  }
!     extern (D) bool S_ISDIR( mode_t mode )  { return S_ISTYPE( mode, S_IFDIR );  }
!     extern (D) bool S_ISFIFO( mode_t mode ) { return S_ISTYPE( mode, S_IFIFO );  }
!     extern (D) bool S_ISREG( mode_t mode )  { return S_ISTYPE( mode, S_IFREG );  }
!     extern (D) bool S_ISLNK( mode_t mode )  { return S_ISTYPE( mode, S_IFLNK );  }
!     extern (D) bool S_ISSOCK( mode_t mode ) { return S_ISTYPE( mode, S_IFSOCK ); }
  
      int utimensat(int dirfd, const char *pathname,
          ref const(timespec)[2] times, int flags);
--- 1748,1766 ----
  
      private
      {
!         extern (D) bool S_ISTYPE()( mode_t mode, uint mask )
          {
              return ( mode & S_IFMT ) == mask;
          }
      }
  
!     extern (D) bool S_ISBLK()( mode_t mode )  { return S_ISTYPE( mode, S_IFBLK );  }
!     extern (D) bool S_ISCHR()( mode_t mode )  { return S_ISTYPE( mode, S_IFCHR );  }
!     extern (D) bool S_ISDIR()( mode_t mode )  { return S_ISTYPE( mode, S_IFDIR );  }
!     extern (D) bool S_ISFIFO()( mode_t mode ) { return S_ISTYPE( mode, S_IFIFO );  }
!     extern (D) bool S_ISREG()( mode_t mode )  { return S_ISTYPE( mode, S_IFREG );  }
!     extern (D) bool S_ISLNK()( mode_t mode )  { return S_ISTYPE( mode, S_IFLNK );  }
!     extern (D) bool S_ISSOCK()( mode_t mode ) { return S_ISTYPE( mode, S_IFSOCK ); }
  
      int utimensat(int dirfd, const char *pathname,
          ref const(timespec)[2] times, int flags);
*************** else version (CRuntime_UClibc)
*** 1776,1794 ****
  
      private
      {
!         extern (D) bool S_ISTYPE( mode_t mode, uint mask )
          {
              return ( mode & S_IFMT ) == mask;
          }
      }
  
!     extern (D) bool S_ISBLK( mode_t mode )  { return S_ISTYPE( mode, S_IFBLK );  }
!     extern (D) bool S_ISCHR( mode_t mode )  { return S_ISTYPE( mode, S_IFCHR );  }
!     extern (D) bool S_ISDIR( mode_t mode )  { return S_ISTYPE( mode, S_IFDIR );  }
!     extern (D) bool S_ISFIFO( mode_t mode ) { return S_ISTYPE( mode, S_IFIFO );  }
!     extern (D) bool S_ISREG( mode_t mode )  { return S_ISTYPE( mode, S_IFREG );  }
!     extern (D) bool S_ISLNK( mode_t mode )  { return S_ISTYPE( mode, S_IFLNK );  }
!     extern (D) bool S_ISSOCK( mode_t mode ) { return S_ISTYPE( mode, S_IFSOCK ); }
  
      int utimensat(int dirfd, const char *pathname,
      ref const(timespec)[2] times, int flags);
--- 1784,1802 ----
  
      private
      {
!         extern (D) bool S_ISTYPE()( mode_t mode, uint mask )
          {
              return ( mode & S_IFMT ) == mask;
          }
      }
  
!     extern (D) bool S_ISBLK()( mode_t mode )  { return S_ISTYPE( mode, S_IFBLK );  }
!     extern (D) bool S_ISCHR()( mode_t mode )  { return S_ISTYPE( mode, S_IFCHR );  }
!     extern (D) bool S_ISDIR()( mode_t mode )  { return S_ISTYPE( mode, S_IFDIR );  }
!     extern (D) bool S_ISFIFO()( mode_t mode ) { return S_ISTYPE( mode, S_IFIFO );  }
!     extern (D) bool S_ISREG()( mode_t mode )  { return S_ISTYPE( mode, S_IFREG );  }
!     extern (D) bool S_ISLNK()( mode_t mode )  { return S_ISTYPE( mode, S_IFLNK );  }
!     extern (D) bool S_ISSOCK()( mode_t mode ) { return S_ISTYPE( mode, S_IFSOCK ); }
  
      int utimensat(int dirfd, const char *pathname,
      ref const(timespec)[2] times, int flags);
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/core/sys/posix/sys/statvfs.d gcc-16-20260201/libphobos/libdruntime/core/sys/posix/sys/statvfs.d
*** gcc-16-20260125/libphobos/libdruntime/core/sys/posix/sys/statvfs.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/core/sys/posix/sys/statvfs.d	Sun Feb  1 22:32:17 2026
*************** else version (CRuntime_Musl)
*** 97,103 ****
          fsfilcnt_t f_files;
          fsfilcnt_t f_ffree;
          fsfilcnt_t f_favail;
!         static if (true /+__BYTE_ORDER == __LITTLE_ENDIAN+/)
          {
              c_ulong f_fsid;
              byte[2*int.sizeof-c_long.sizeof] __padding;
--- 97,103 ----
          fsfilcnt_t f_files;
          fsfilcnt_t f_ffree;
          fsfilcnt_t f_favail;
!         version (LittleEndian)
          {
              c_ulong f_fsid;
              byte[2*int.sizeof-c_long.sizeof] __padding;
*************** else version (CRuntime_Musl)
*** 133,140 ****
      int statvfs (const char * file, statvfs_t* buf);
      int fstatvfs (int fildes, statvfs_t *buf);
  
!     alias statvfs statvfs64;
!     alias fstatvfs fstatvfs64;
  }
  else version (NetBSD)
  {
--- 133,140 ----
      int statvfs (const char * file, statvfs_t* buf);
      int fstatvfs (int fildes, statvfs_t *buf);
  
!     alias statvfs64 = statvfs;
!     alias fstatvfs64 = fstatvfs;
  }
  else version (NetBSD)
  {
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/core/sys/posix/sys/wait.d gcc-16-20260201/libphobos/libdruntime/core/sys/posix/sys/wait.d
*** gcc-16-20260125/libphobos/libdruntime/core/sys/posix/sys/wait.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/core/sys/posix/sys/wait.d	Sun Feb  1 22:32:17 2026
*************** version (CRuntime_Glibc)
*** 127,133 ****
  
      private
      {
!         extern (D) int __WTERMSIG( int status ) { return status & 0x7F; }
      }
  
      //
--- 127,133 ----
  
      private
      {
!         extern (D) int __WTERMSIG()(int status) { return status & 0x7F; }
      }
  
      //
*************** version (CRuntime_Glibc)
*** 135,262 ****
      //       C headers as the parameter definition there is different and
      //       much more complicated.
      //
!     extern (D) int  WEXITSTATUS( int status )  { return ( status & 0xFF00 ) >> 8;   }
!     extern (D) int  WIFCONTINUED( int status ) { return status == __W_CONTINUED;    }
!     extern (D) bool WIFEXITED( int status )    { return __WTERMSIG( status ) == 0;  }
!     extern (D) bool WIFSIGNALED( int status )
      {
          return ( cast(byte) ( ( status & 0x7F ) + 1 ) >> 1 ) > 0;
      }
!     extern (D) bool WIFSTOPPED( int status )   { return ( status & 0xFF ) == 0x7F;  }
!     extern (D) int  WSTOPSIG( int status )     { return WEXITSTATUS( status );      }
!     extern (D) int  WTERMSIG( int status )     { return status & 0x7F;              }
  }
  else version (Darwin)
  {
      @safe pure:
  
!     extern (D) int _WSTATUS(int status)         { return (status & 0x7F);           }
!     extern (D) int  WEXITSTATUS( int status )   { return (status >> 8);             }
!     extern (D) int  WIFCONTINUED( int status )  { return status == 0x13;            }
!     extern (D) bool WIFEXITED( int status )     { return _WSTATUS(status) == 0;     }
!     extern (D) bool WIFSIGNALED( int status )
      {
          return _WSTATUS( status ) != _WSTOPPED && _WSTATUS( status ) != 0;
      }
!     extern (D) bool WIFSTOPPED( int status )   { return _WSTATUS( status ) == _WSTOPPED; }
!     extern (D) int  WSTOPSIG( int status )     { return status >> 8;                     }
!     extern (D) int  WTERMSIG( int status )     { return _WSTATUS( status );              }
  }
  else version (FreeBSD)
  {
      @safe pure:
  
!     extern (D) int _WSTATUS(int status)         { return (status & 0x7F);           }
!     extern (D) int  WEXITSTATUS( int status )   { return (status >> 8);             }
!     extern (D) int  WIFCONTINUED( int status )  { return status == 0x13;            }
!     extern (D) bool WIFEXITED( int status )     { return _WSTATUS(status) == 0;     }
!     extern (D) bool WIFSIGNALED( int status )
      {
          return _WSTATUS( status ) != _WSTOPPED && _WSTATUS( status ) != 0;
      }
!     extern (D) bool WIFSTOPPED( int status )   { return _WSTATUS( status ) == _WSTOPPED; }
!     extern (D) int  WSTOPSIG( int status )     { return status >> 8;                     }
!     extern (D) int  WTERMSIG( int status )     { return _WSTATUS( status );              }
  }
  else version (NetBSD)
  {
      @safe pure:
  
!     extern (D) int _WSTATUS(int status)         { return (status & 0x7F);           }
!     extern (D) int  WEXITSTATUS( int status )   { return (status >> 8);             }
!     extern (D) int  WIFCONTINUED( int status )  { return status == 0x13;            }
!     extern (D) bool WIFEXITED( int status )     { return _WSTATUS(status) == 0;     }
!     extern (D) bool WIFSIGNALED( int status )
      {
          return _WSTATUS( status ) != _WSTOPPED && _WSTATUS( status ) != 0;
      }
!     extern (D) bool WIFSTOPPED( int status )   { return _WSTATUS( status ) == _WSTOPPED; }
!     extern (D) int  WSTOPSIG( int status )     { return status >> 8;                     }
!     extern (D) int  WTERMSIG( int status )     { return _WSTATUS( status );              }
  }
  else version (OpenBSD)
  {
      @safe pure:
  
!     extern (D) int _WSTATUS(int status)         { return (status & 0x7F);                     }
!     extern (D) int  WEXITSTATUS(int status)   { return (status >> 8) & 0xFF;                  }
!     extern (D) int  WIFCONTINUED(int status)  { return (status & _WCONTINUED) == _WCONTINUED; }
!     extern (D) bool WIFEXITED(int status)     { return _WSTATUS(status) == 0;                 }
!     extern (D) bool WIFSIGNALED(int status)
      {
          return _WSTATUS(status) != _WSTOPPED && _WSTATUS(status) != 0;
      }
!     extern (D) bool WIFSTOPPED(int status)   { return (status & 0xFF) == _WSTOPPED; }
!     extern (D) int  WSTOPSIG(int status)     { return (status >> 8) & 0xFF;         }
!     extern (D) int  WTERMSIG(int status)     { return _WSTATUS(status);             }
  }
  else version (DragonFlyBSD)
  {
      @safe pure:
  
!     extern (D) int _WSTATUS(int status)         { return (status & 0x7F);           }
!     extern (D) int  WEXITSTATUS( int status )   { return (status >> 8);             }
!     extern (D) int  WIFCONTINUED( int status )  { return status == 0x13;            }
!     extern (D) bool WIFEXITED( int status )     { return _WSTATUS(status) == 0;     }
!     extern (D) bool WIFSIGNALED( int status )
      {
          return _WSTATUS( status ) != _WSTOPPED && _WSTATUS( status ) != 0;
      }
!     extern (D) bool WIFSTOPPED( int status )   { return _WSTATUS( status ) == _WSTOPPED; }
!     extern (D) int  WSTOPSIG( int status )     { return status >> 8;                     }
!     extern (D) int  WTERMSIG( int status )     { return _WSTATUS( status );              }
  }
  else version (Solaris)
  {
      @safe pure:
  
!     extern (D) int WEXITSTATUS(int status) { return (status >> 8) & 0xff; }
!     extern (D) int WIFCONTINUED(int status) { return (status & 0xffff) == 0xffff; }
!     extern (D) bool WIFEXITED(int status) { return (status & 0xff) == 0;     }
!     extern (D) bool WIFSIGNALED(int status) { return (status & 0xff) > 0 && (status & 0xff00) == 0; }
!     extern (D) bool WIFSTOPPED(int status) { return (status & 0xff) == 0x7f && (status & 0xff00) != 0; }
!     extern (D) int WSTOPSIG(int status) { return (status >> 8) & 0x7f; }
!     extern (D) int WTERMSIG(int status) { return (status & 0x7f); }
  }
  else version (CRuntime_Bionic)
  {
      @safe pure:
!     extern (D) int  WEXITSTATUS( int status ) { return ( status & 0xFF00 ) >> 8; }
!     extern (D) bool WIFEXITED( int status ) { return WTERMSIG(status) == 0; }
!     extern (D) bool WIFSIGNALED( int status ) { return WTERMSIG(status + 1) >= 2; }
!     extern (D) bool WIFSTOPPED( int status ) { return WTERMSIG(status) == 0x7F; }
!     extern (D) int  WSTOPSIG( int status ) { return WEXITSTATUS(status); }
!     extern (D) int  WTERMSIG( int status ) { return status & 0x7F; }
  }
  else version (CRuntime_Musl)
  {
      @safe pure:
!     extern (D) int  WEXITSTATUS( int status ) { return ( status & 0xFF00 ) >> 8; }
!     extern (D) int  WIFCONTINUED( int status ) { return status == 0xffff; }
!     extern (D) bool WIFEXITED( int status ) { return WTERMSIG( status ) == 0; }
!     extern (D) bool WIFSIGNALED( int status ) { return (status&0xffff)-1U < 0xffU; }
!     extern (D) bool WIFSTOPPED( int status ) { return cast(short)(((status&0xffff)*0x10001)>>8) > 0x7f00; }
!     extern (D) int  WTERMSIG( int status ) { return status & 0x7F; }
      alias WEXITSTATUS WSTOPSIG;
  }
  else version (CRuntime_UClibc)
--- 135,262 ----
      //       C headers as the parameter definition there is different and
      //       much more complicated.
      //
!     extern (D) int  WEXITSTATUS()( int status )  { return ( status & 0xFF00 ) >> 8;   }
!     extern (D) int  WIFCONTINUED()( int status ) { return status == __W_CONTINUED;    }
!     extern (D) bool WIFEXITED()( int status )    { return __WTERMSIG( status ) == 0;  }
!     extern (D) bool WIFSIGNALED()( int status )
      {
          return ( cast(byte) ( ( status & 0x7F ) + 1 ) >> 1 ) > 0;
      }
!     extern (D) bool WIFSTOPPED()( int status )   { return ( status & 0xFF ) == 0x7F;  }
!     extern (D) int  WSTOPSIG()( int status )     { return WEXITSTATUS( status );      }
!     extern (D) int  WTERMSIG()( int status )     { return status & 0x7F;              }
  }
  else version (Darwin)
  {
      @safe pure:
  
!     extern (D) int _WSTATUS()(int status)         { return (status & 0x7F);           }
!     extern (D) int  WEXITSTATUS()( int status )   { return (status >> 8);             }
!     extern (D) int  WIFCONTINUED()( int status )  { return status == 0x13;            }
!     extern (D) bool WIFEXITED()( int status )     { return _WSTATUS(status) == 0;     }
!     extern (D) bool WIFSIGNALED()( int status )
      {
          return _WSTATUS( status ) != _WSTOPPED && _WSTATUS( status ) != 0;
      }
!     extern (D) bool WIFSTOPPED()( int status )   { return _WSTATUS( status ) == _WSTOPPED; }
!     extern (D) int  WSTOPSIG()( int status )     { return status >> 8;                     }
!     extern (D) int  WTERMSIG()( int status )     { return _WSTATUS( status );              }
  }
  else version (FreeBSD)
  {
      @safe pure:
  
!     extern (D) int _WSTATUS()(int status)         { return (status & 0x7F);           }
!     extern (D) int  WEXITSTATUS()( int status )   { return (status >> 8);             }
!     extern (D) int  WIFCONTINUED()( int status )  { return status == 0x13;            }
!     extern (D) bool WIFEXITED()( int status )     { return _WSTATUS(status) == 0;     }
!     extern (D) bool WIFSIGNALED()( int status )
      {
          return _WSTATUS( status ) != _WSTOPPED && _WSTATUS( status ) != 0;
      }
!     extern (D) bool WIFSTOPPED()( int status )   { return _WSTATUS( status ) == _WSTOPPED; }
!     extern (D) int  WSTOPSIG()( int status )     { return status >> 8;                     }
!     extern (D) int  WTERMSIG()( int status )     { return _WSTATUS( status );              }
  }
  else version (NetBSD)
  {
      @safe pure:
  
!     extern (D) int _WSTATUS()(int status)         { return (status & 0x7F);           }
!     extern (D) int  WEXITSTATUS()( int status )   { return (status >> 8);             }
!     extern (D) int  WIFCONTINUED()( int status )  { return status == 0x13;            }
!     extern (D) bool WIFEXITED()( int status )     { return _WSTATUS(status) == 0;     }
!     extern (D) bool WIFSIGNALED()( int status )
      {
          return _WSTATUS( status ) != _WSTOPPED && _WSTATUS( status ) != 0;
      }
!     extern (D) bool WIFSTOPPED()( int status )   { return _WSTATUS( status ) == _WSTOPPED; }
!     extern (D) int  WSTOPSIG()( int status )     { return status >> 8;                     }
!     extern (D) int  WTERMSIG()( int status )     { return _WSTATUS( status );              }
  }
  else version (OpenBSD)
  {
      @safe pure:
  
!     extern (D) int _WSTATUS()(int status)         { return (status & 0x7F);                     }
!     extern (D) int  WEXITSTATUS()(int status)   { return (status >> 8) & 0xFF;                  }
!     extern (D) int  WIFCONTINUED()(int status)  { return (status & _WCONTINUED) == _WCONTINUED; }
!     extern (D) bool WIFEXITED()(int status)     { return _WSTATUS(status) == 0;                 }
!     extern (D) bool WIFSIGNALED()(int status)
      {
          return _WSTATUS(status) != _WSTOPPED && _WSTATUS(status) != 0;
      }
!     extern (D) bool WIFSTOPPED()(int status)   { return (status & 0xFF) == _WSTOPPED; }
!     extern (D) int  WSTOPSIG()(int status)     { return (status >> 8) & 0xFF;         }
!     extern (D) int  WTERMSIG()(int status)     { return _WSTATUS(status);             }
  }
  else version (DragonFlyBSD)
  {
      @safe pure:
  
!     extern (D) int _WSTATUS()(int status)         { return (status & 0x7F);           }
!     extern (D) int  WEXITSTATUS()( int status )   { return (status >> 8);             }
!     extern (D) int  WIFCONTINUED()( int status )  { return status == 0x13;            }
!     extern (D) bool WIFEXITED()( int status )     { return _WSTATUS(status) == 0;     }
!     extern (D) bool WIFSIGNALED()( int status )
      {
          return _WSTATUS( status ) != _WSTOPPED && _WSTATUS( status ) != 0;
      }
!     extern (D) bool WIFSTOPPED()( int status )   { return _WSTATUS( status ) == _WSTOPPED; }
!     extern (D) int  WSTOPSIG()( int status )     { return status >> 8;                     }
!     extern (D) int  WTERMSIG()( int status )     { return _WSTATUS( status );              }
  }
  else version (Solaris)
  {
      @safe pure:
  
!     extern (D) int WEXITSTATUS()(int status) { return (status >> 8) & 0xff; }
!     extern (D) int WIFCONTINUED()(int status) { return (status & 0xffff) == 0xffff; }
!     extern (D) bool WIFEXITED()(int status) { return (status & 0xff) == 0;     }
!     extern (D) bool WIFSIGNALED()(int status) { return (status & 0xff) > 0 && (status & 0xff00) == 0; }
!     extern (D) bool WIFSTOPPED()(int status) { return (status & 0xff) == 0x7f && (status & 0xff00) != 0; }
!     extern (D) int WSTOPSIG()(int status) { return (status >> 8) & 0x7f; }
!     extern (D) int WTERMSIG()(int status) { return (status & 0x7f); }
  }
  else version (CRuntime_Bionic)
  {
      @safe pure:
!     extern (D) int  WEXITSTATUS()( int status ) { return ( status & 0xFF00 ) >> 8; }
!     extern (D) bool WIFEXITED()( int status ) { return WTERMSIG(status) == 0; }
!     extern (D) bool WIFSIGNALED()( int status ) { return WTERMSIG(status + 1) >= 2; }
!     extern (D) bool WIFSTOPPED()( int status ) { return WTERMSIG(status) == 0x7F; }
!     extern (D) int  WSTOPSIG()( int status ) { return WEXITSTATUS(status); }
!     extern (D) int  WTERMSIG()( int status ) { return status & 0x7F; }
  }
  else version (CRuntime_Musl)
  {
      @safe pure:
!     extern (D) int  WEXITSTATUS()( int status ) { return ( status & 0xFF00 ) >> 8; }
!     extern (D) int  WIFCONTINUED()( int status ) { return status == 0xffff; }
!     extern (D) bool WIFEXITED()( int status ) { return WTERMSIG( status ) == 0; }
!     extern (D) bool WIFSIGNALED()( int status ) { return (status&0xffff)-1U < 0xffU; }
!     extern (D) bool WIFSTOPPED()( int status ) { return cast(short)(((status&0xffff)*0x10001)>>8) > 0x7f00; }
!     extern (D) int  WTERMSIG()( int status ) { return status & 0x7F; }
      alias WEXITSTATUS WSTOPSIG;
  }
  else version (CRuntime_UClibc)
*************** else version (CRuntime_UClibc)
*** 265,271 ****
  
      private
      {
!         extern (D) int __WTERMSIG( int status ) { return status & 0x7F; }
      }
  
      //
--- 265,271 ----
  
      private
      {
!         extern (D) int __WTERMSIG()( int status ) { return status & 0x7F; }
      }
  
      //
*************** else version (CRuntime_UClibc)
*** 273,295 ****
      //       C headers as the parameter definition there is different and
      //       much more complicated.
      //
!     extern (D) int  WEXITSTATUS( int status )  { return ( status & 0xFF00 ) >> 8;   }
!     extern (D) int  WIFCONTINUED( int status ) { return status == __W_CONTINUED;    }
!     extern (D) bool WIFEXITED( int status )    { return __WTERMSIG( status ) == 0;  }
!     extern (D) bool WIFSIGNALED( int status )
      {
          return ( cast(ulong) ( ( status & 0xffff ) - 1U ) >> 1 ) < 0xffU;
      }
      version (MIPS32)
      {
!         extern (D) bool WIFSTOPPED( int status )   { return ( status & 0xFF ) == 0x7F;  }
      }
      else
      {
!         extern (D) bool WIFSTOPPED( int status )   { return ( status & 0xFF ) == 0x7F && ( status & 0xFF00 );  }
      }
!     extern (D) int  WSTOPSIG( int status )     { return WEXITSTATUS( status );      }
!     extern (D) int  WTERMSIG( int status )     { return status & 0x7F;              }
  }
  else
  {
--- 273,295 ----
      //       C headers as the parameter definition there is different and
      //       much more complicated.
      //
!     extern (D) int  WEXITSTATUS()( int status )  { return ( status & 0xFF00 ) >> 8;   }
!     extern (D) int  WIFCONTINUED()( int status ) { return status == __W_CONTINUED;    }
!     extern (D) bool WIFEXITED()( int status )    { return __WTERMSIG( status ) == 0;  }
!     extern (D) bool WIFSIGNALED()( int status )
      {
          return ( cast(ulong) ( ( status & 0xffff ) - 1U ) >> 1 ) < 0xffU;
      }
      version (MIPS32)
      {
!         extern (D) bool WIFSTOPPED()( int status )   { return ( status & 0xFF ) == 0x7F;  }
      }
      else
      {
!         extern (D) bool WIFSTOPPED()( int status )   { return ( status & 0xFF ) == 0x7F && ( status & 0xFF00 );  }
      }
!     extern (D) int  WSTOPSIG()( int status )     { return WEXITSTATUS( status );      }
!     extern (D) int  WTERMSIG()( int status )     { return status & 0x7F;              }
  }
  else
  {
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/core/sys/solaris/err.d gcc-16-20260201/libphobos/libdruntime/core/sys/solaris/err.d
*** gcc-16-20260125/libphobos/libdruntime/core/sys/solaris/err.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/core/sys/solaris/err.d	Sun Feb  1 22:32:17 2026
***************
*** 3,9 ****
    *
    * Copyright: Copyright © 2019, The D Language Foundation
    * License: <a href="http://www.boost.org/LICENSE_1_0.txt">Boost License 1.0</a>.
!   * Authors: Ernesto Castellotti
    */
  module core.sys.solaris.err;
  import core.stdc.stdarg : va_list;
--- 3,9 ----
    *
    * Copyright: Copyright © 2019, The D Language Foundation
    * License: <a href="http://www.boost.org/LICENSE_1_0.txt">Boost License 1.0</a>.
!   * Authors: Emily Castellotti
    */
  module core.sys.solaris.err;
  import core.stdc.stdarg : va_list;
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/core/sys/windows/basetsd.d gcc-16-20260201/libphobos/libdruntime/core/sys/windows/basetsd.d
*** gcc-16-20260125/libphobos/libdruntime/core/sys/windows/basetsd.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/core/sys/windows/basetsd.d	Sun Feb  1 22:32:17 2026
*************** enum ulong ADDRESS_TAG_BIT = 0x400000000
*** 44,63 ****
      alias uint UHALF_PTR;
      alias uint* PUHALF_PTR;
  
!     uint HandleToULong(void* h) { return(cast(uint) cast(ULONG_PTR) h); }
!     int HandleToLong(void* h)   { return(cast(int) cast(LONG_PTR) h); }
!     void* ULongToHandle(uint h) { return(cast(void*) cast(UINT_PTR) h); }
!     void* LongToHandle(int h)   { return(cast(void*) cast(INT_PTR) h); }
!     uint PtrToUlong(void* p)    { return(cast(uint) cast(ULONG_PTR) p); }
!     uint PtrToUint(void* p)     { return(cast(uint) cast(UINT_PTR) p); }
!     ushort PtrToUshort(void* p) { return(cast(ushort) cast(uint) cast(ULONG_PTR) p); }
!     int PtrToLong(void* p)      { return(cast(int) cast(LONG_PTR) p); }
!     int PtrToInt(void* p)       { return(cast(int) cast(INT_PTR) p); }
!     short PtrToShort(void* p)   { return(cast(short) cast(int) cast(LONG_PTR) p); }
!     void* IntToPtr(int i)       { return(cast(void*) cast(INT_PTR) i); }
!     void* UIntToPtr(uint ui)    { return(cast(void*) cast(UINT_PTR) ui); }
!     void* LongToPtr(int l)      { return(cast(void*) cast(LONG_PTR) l); }
!     void* ULongToPtr(uint ul)   { return(cast(void*) cast(ULONG_PTR) ul); }
  
  } else {
      alias int __int3264;
--- 44,63 ----
      alias uint UHALF_PTR;
      alias uint* PUHALF_PTR;
  
!     uint HandleToULong()(void* h) { return(cast(uint) cast(ULONG_PTR) h); }
!     int HandleToLong()(void* h)   { return(cast(int) cast(LONG_PTR) h); }
!     void* ULongToHandle()(uint h) { return(cast(void*) cast(UINT_PTR) h); }
!     void* LongToHandle()(int h)   { return(cast(void*) cast(INT_PTR) h); }
!     uint PtrToUlong()(void* p)    { return(cast(uint) cast(ULONG_PTR) p); }
!     uint PtrToUint()(void* p)     { return(cast(uint) cast(UINT_PTR) p); }
!     ushort PtrToUshort()(void* p) { return(cast(ushort) cast(uint) cast(ULONG_PTR) p); }
!     int PtrToLong()(void* p)      { return(cast(int) cast(LONG_PTR) p); }
!     int PtrToInt()(void* p)       { return(cast(int) cast(INT_PTR) p); }
!     short PtrToShort()(void* p)   { return(cast(short) cast(int) cast(LONG_PTR) p); }
!     void* IntToPtr()(int i)       { return(cast(void*) cast(INT_PTR) i); }
!     void* UIntToPtr()(uint ui)    { return(cast(void*) cast(UINT_PTR) ui); }
!     void* LongToPtr()(int l)      { return(cast(void*) cast(LONG_PTR) l); }
!     void* ULongToPtr()(uint ul)   { return(cast(void*) cast(ULONG_PTR) ul); }
  
  } else {
      alias int __int3264;
*************** enum uint ADDRESS_TAG_BIT = 0x80000000;
*** 72,87 ****
      alias ushort UHALF_PTR;
      alias ushort* PUHALF_PTR;
  
!     uint HandleToUlong(HANDLE h)      { return cast(uint) h; }
!     int HandleToLong(HANDLE h)        { return cast(int) h; }
!     HANDLE LongToHandle(LONG_PTR h)   { return cast(HANDLE)h; }
      uint PtrToUlong(const(void)* p)    { return cast(uint) p; }
      uint PtrToUint(const(void)* p)     { return cast(uint) p; }
      int PtrToInt(const(void)* p)       { return cast(int) p; }
      ushort PtrToUshort(const(void)* p) { return cast(ushort) p; }
      short PtrToShort(const(void)* p)   { return cast(short) p; }
!     void* IntToPtr(int i)             { return cast(void*) i; }
!     void* UIntToPtr(uint ui)          { return cast(void*) ui; }
      alias IntToPtr LongToPtr;
      alias UIntToPtr ULongToPtr;
  }
--- 72,87 ----
      alias ushort UHALF_PTR;
      alias ushort* PUHALF_PTR;
  
!     uint HandleToUlong()(HANDLE h)      { return cast(uint) h; }
!     int HandleToLong()(HANDLE h)        { return cast(int) h; }
!     HANDLE LongToHandle()(LONG_PTR h)   { return cast(HANDLE)h; }
      uint PtrToUlong(const(void)* p)    { return cast(uint) p; }
      uint PtrToUint(const(void)* p)     { return cast(uint) p; }
      int PtrToInt(const(void)* p)       { return cast(int) p; }
      ushort PtrToUshort(const(void)* p) { return cast(ushort) p; }
      short PtrToShort(const(void)* p)   { return cast(short) p; }
!     void* IntToPtr()(int i)             { return cast(void*) i; }
!     void* UIntToPtr()(uint ui)          { return cast(void*) ui; }
      alias IntToPtr LongToPtr;
      alias UIntToPtr ULongToPtr;
  }
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/core/sys/windows/commctrl.d gcc-16-20260201/libphobos/libdruntime/core/sys/windows/commctrl.d
*** gcc-16-20260125/libphobos/libdruntime/core/sys/windows/commctrl.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/core/sys/windows/commctrl.d	Sun Feb  1 22:32:17 2026
*************** static if (_WIN32_WINNT >= 0x501) {
*** 4937,4944 ****
      alias NMLINK* PNMLINK;
  }
  
! uint INDEXTOOVERLAYMASK(uint i) { return i << 8; }
! uint INDEXTOSTATEIMAGEMASK(uint i) { return i << 12; }
  
  template HANDLE_WM_NOTIFY(R) {
      private alias _prm_HANDLE_WM_NOTIFY = extern (Windows)
--- 4937,4944 ----
      alias NMLINK* PNMLINK;
  }
  
! uint INDEXTOOVERLAYMASK()(uint i) { return i << 8; }
! uint INDEXTOSTATEIMAGEMASK()(uint i) { return i << 12; }
  
  template HANDLE_WM_NOTIFY(R) {
      private alias _prm_HANDLE_WM_NOTIFY = extern (Windows)
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/core/sys/windows/dde.d gcc-16-20260201/libphobos/libdruntime/core/sys/windows/dde.d
*** gcc-16-20260125/libphobos/libdruntime/core/sys/windows/dde.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/core/sys/windows/dde.d	Sun Feb  1 22:32:17 2026
*************** struct DDEACK {
*** 31,37 ****
      ubyte bAppReturnCode;
      ubyte _bf;
  
!     @property ubyte reserved() { return cast(ubyte) (_bf & 0x3F); }
      @property bool  fBusy()    { return cast(bool)  (_bf & 0x40); }
      @property bool  fAck()     { return cast(bool)  (_bf & 0x80); }
  
--- 31,37 ----
      ubyte bAppReturnCode;
      ubyte _bf;
  
!     @property ubyte reserved()() { return cast(ubyte) (_bf & 0x3F); }
      @property bool  fBusy()    { return cast(bool)  (_bf & 0x40); }
      @property bool  fAck()     { return cast(bool)  (_bf & 0x80); }
  
*************** struct DDEADVISE {
*** 49,55 ****
      short  cfFormat;
  
      @property ushort reserved()  { return cast(ushort) (_bf & 0x3FFF); }
!     @property bool   fDeferUpd() { return cast(bool)   (_bf & 0x4000); }
      @property bool   fAckReq()   { return cast(bool)   (_bf & 0x8000); }
  
      @property ushort reserved(ushort r) {
--- 49,55 ----
      short  cfFormat;
  
      @property ushort reserved()  { return cast(ushort) (_bf & 0x3FFF); }
!     @property bool   fDeferUpd()() { return cast(bool)   (_bf & 0x4000); }
      @property bool   fAckReq()   { return cast(bool)   (_bf & 0x8000); }
  
      @property ushort reserved(ushort r) {
*************** struct DDEDATA {
*** 67,78 ****
      byte   _Value;
  
      @property ushort unused()    { return cast(ushort) (_bf & 0x0FFF); }
!     @property bool   fResponse() { return cast(bool)   (_bf & 0x1000); }
      @property bool   fRelease()  { return cast(bool)   (_bf & 0x2000); }
      @property bool   reserved()  { return cast(bool)   (_bf & 0x4000); }
      @property bool   fAckReq()   { return cast(bool)   (_bf & 0x8000); }
  
!     @property byte*  Value() return { return &_Value; }
  
      @property ushort unused(ushort r) {
          _bf = cast(ushort) ((_bf & ~0x0FFF) | (r & 0x0FFF));
--- 67,78 ----
      byte   _Value;
  
      @property ushort unused()    { return cast(ushort) (_bf & 0x0FFF); }
!     @property bool   fResponse()() { return cast(bool)   (_bf & 0x1000); }
      @property bool   fRelease()  { return cast(bool)   (_bf & 0x2000); }
      @property bool   reserved()  { return cast(bool)   (_bf & 0x4000); }
      @property bool   fAckReq()   { return cast(bool)   (_bf & 0x8000); }
  
!     @property byte*  Value() { return &_Value; }
  
      @property ushort unused(ushort r) {
          _bf = cast(ushort) ((_bf & ~0x0FFF) | (r & 0x0FFF));
*************** struct DDEPOKE {
*** 90,127 ****
      short  cfFormat;
      byte   _Value;
  
!     @property ushort unused()    { return cast(ushort) (_bf & 0x1FFF); }
!     @property bool   fRelease()  { return cast(bool)   (_bf & 0x2000); }
!     @property ubyte  fReserved() { return cast(ubyte)  ((_bf & 0xC000) >>> 14); }
  
!     @property byte*  Value() return { return &_Value; }
  
!     @property ushort unused(ushort u) {
          _bf = cast(ushort) ((_bf & ~0x1FFF) | (u & 0x1FFF));
          return cast(ushort)(u & 0x1FFF);
      }
  
!     @property bool   fRelease(bool f)   { _bf = cast(ushort) ((_bf & ~0x2000) | (f << 13)); return f; }
!     @property ubyte  fReserved(ubyte r) { _bf = cast(ushort) ((_bf & ~0xC000) | (r << 14)); return r; }
  }
  
  deprecated struct DDELN {
      ushort _bf;
      short  cfFormat;
  
!     @property ushort unused()    { return cast(ushort) (_bf & 0x1FFF); }
!     @property bool   fRelease()  { return cast(bool)   (_bf & 0x2000); }
!     @property bool   fDeferUpd() { return cast(bool)   (_bf & 0x4000); }
!     @property bool   fAckReq()   { return cast(bool)   (_bf & 0x8000); }
  
!     @property ushort unused(ushort u) {
          _bf = cast(ushort)((_bf & ~0x1FFF) | (u & 0x1FFF));
          return cast(ushort)(u & 0x1FFF);
      }
  
!     @property bool   fRelease(bool f)  { _bf = cast(ushort) ((_bf & ~0x2000) | (f << 13)); return f; }
!     @property bool   fDeferUpd(bool f) { _bf = cast(ushort) ((_bf & ~0x4000) | (f << 14)); return f; }
!     @property bool   fAckReq(bool f)   { _bf = cast(ushort) ((_bf & ~0x8000) | (f << 15)); return f; }
  }
  
  deprecated struct DDEUP {
--- 90,127 ----
      short  cfFormat;
      byte   _Value;
  
!     @property ushort unused()()    { return cast(ushort) (_bf & 0x1FFF); }
!     @property bool   fRelease()()  { return cast(bool)   (_bf & 0x2000); }
!     @property ubyte  fReserved()() { return cast(ubyte)  ((_bf & 0xC000) >>> 14); }
  
!     @property byte*  Value() { return &_Value; }
  
!     @property ushort unused()(ushort u) {
          _bf = cast(ushort) ((_bf & ~0x1FFF) | (u & 0x1FFF));
          return cast(ushort)(u & 0x1FFF);
      }
  
!     @property bool   fRelease()(bool f)   { _bf = cast(ushort) ((_bf & ~0x2000) | (f << 13)); return f; }
!     @property ubyte  fReserved()(ubyte r) { _bf = cast(ushort) ((_bf & ~0xC000) | (r << 14)); return r; }
  }
  
  deprecated struct DDELN {
      ushort _bf;
      short  cfFormat;
  
!     @property ushort unused()()    { return cast(ushort) (_bf & 0x1FFF); }
!     @property bool   fRelease()()  { return cast(bool)   (_bf & 0x2000); }
!     @property bool   fDeferUpd()() { return cast(bool)   (_bf & 0x4000); }
!     @property bool   fAckReq()()   { return cast(bool)   (_bf & 0x8000); }
  
!     @property ushort unused()(ushort u) {
          _bf = cast(ushort)((_bf & ~0x1FFF) | (u & 0x1FFF));
          return cast(ushort)(u & 0x1FFF);
      }
  
!     @property bool   fRelease()(bool f)  { _bf = cast(ushort) ((_bf & ~0x2000) | (f << 13)); return f; }
!     @property bool   fDeferUpd()(bool f) { _bf = cast(ushort) ((_bf & ~0x4000) | (f << 14)); return f; }
!     @property bool   fAckReq()(bool f)   { _bf = cast(ushort) ((_bf & ~0x8000) | (f << 15)); return f; }
  }
  
  deprecated struct DDEUP {
*************** deprecated struct DDEUP {
*** 129,151 ****
      short  cfFormat;
      byte   _rgb;
  
!     @property ushort unused()    { return cast(ushort) (_bf & 0x0FFF); }
!     @property bool   fAck()      { return cast(bool)   (_bf & 0x1000); }
!     @property bool   fRelease()  { return cast(bool)   (_bf & 0x2000); }
!     @property bool   fReserved() { return cast(bool)   (_bf & 0x4000); }
!     @property bool   fAckReq()   { return cast(bool)   (_bf & 0x8000); }
  
!     @property byte*  rgb() return { return &_rgb; }
  
!     @property ushort unused(ushort r) {
          _bf = cast(ushort) ((_bf & ~0x0FFF) | (r & 0x0FFF));
          return cast(ushort)(r & 0x0FFF);
      }
  
!     @property bool   fAck(bool f)      { _bf = cast(ushort) ((_bf & ~0x1000) | (f << 12)); return f; }
!     @property bool   fRelease(bool f)  { _bf = cast(ushort) ((_bf & ~0x2000) | (f << 13)); return f; }
!     @property bool   fReserved(bool f) { _bf = cast(ushort) ((_bf & ~0x4000) | (f << 14)); return f; }
!     @property bool   fAckReq(bool f)   { _bf = cast(ushort) ((_bf & ~0x8000) | (f << 15)); return f; }
  }
  
  extern (Windows) nothrow @nogc {
--- 129,151 ----
      short  cfFormat;
      byte   _rgb;
  
!     @property ushort unused()()    { return cast(ushort) (_bf & 0x0FFF); }
!     @property bool   fAck()()      { return cast(bool)   (_bf & 0x1000); }
!     @property bool   fRelease()()  { return cast(bool)   (_bf & 0x2000); }
!     @property bool   fReserved()() { return cast(bool)   (_bf & 0x4000); }
!     @property bool   fAckReq()()   { return cast(bool)   (_bf & 0x8000); }
  
!     @property byte*  rgb()()       { return &_rgb; }
  
!     @property ushort unused()(ushort r) {
          _bf = cast(ushort) ((_bf & ~0x0FFF) | (r & 0x0FFF));
          return cast(ushort)(r & 0x0FFF);
      }
  
!     @property bool   fAck()(bool f)      { _bf = cast(ushort) ((_bf & ~0x1000) | (f << 12)); return f; }
!     @property bool   fRelease()(bool f)  { _bf = cast(ushort) ((_bf & ~0x2000) | (f << 13)); return f; }
!     @property bool   fReserved()(bool f) { _bf = cast(ushort) ((_bf & ~0x4000) | (f << 14)); return f; }
!     @property bool   fAckReq()(bool f)   { _bf = cast(ushort) ((_bf & ~0x8000) | (f << 15)); return f; }
  }
  
  extern (Windows) nothrow @nogc {
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/core/sys/windows/mmsystem.d gcc-16-20260201/libphobos/libdruntime/core/sys/windows/mmsystem.d
*** gcc-16-20260125/libphobos/libdruntime/core/sys/windows/mmsystem.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/core/sys/windows/mmsystem.d	Sun Feb  1 22:32:17 2026
*************** enum MEVT_F_SHORT=0;
*** 283,290 ****
  enum MEVT_F_LONG=0x80000000;
  enum MEVT_F_CALLBACK=0x40000000;
  
! BYTE MEVT_EVENTTYPE(DWORD x) { return cast(BYTE)((x>>24) &0xFF); }
! DWORD MEVT_EVENTPARM(DWORD x) { return x & 0xFFFFFF; }
  
  enum MEVT_SHORTMSG=0;
  enum MEVT_TEMPO=1;
--- 283,290 ----
  enum MEVT_F_LONG=0x80000000;
  enum MEVT_F_CALLBACK=0x40000000;
  
! BYTE MEVT_EVENTTYPE()(DWORD x) { return cast(BYTE)((x>>24) &0xFF); }
! DWORD MEVT_EVENTPARM()(DWORD x) { return x & 0xFFFFFF; }
  
  enum MEVT_SHORTMSG=0;
  enum MEVT_TEMPO=1;
*************** enum MCI_FORMAT_TMSF=10;
*** 766,787 ****
  
  
  // Macros
! BYTE MCI_HMS_HOUR(DWORD t) { return cast(BYTE)(t); }
! BYTE MCI_HMS_MINUTE(DWORD t) { return cast(BYTE)(t>>>8); }
! BYTE MCI_HMS_SECOND(DWORD t) { return cast(BYTE)( t>>>16); }
! DWORD MCI_MAKE_HMS(BYTE h, BYTE m, BYTE s) { return h |(m<<8)|(cast(DWORD)(s)<<16); }
! DWORD MCI_MAKE_MSF(BYTE m, BYTE s, BYTE f) { return m |(s<<8)|(cast(DWORD)(f)<<16); }
  DWORD MCI_MAKE_TMSF(BYTE t, BYTE m, BYTE s, BYTE f) {
   return t |(m<<8)|(s<<16)|(cast(DWORD)(f)<< 24); }
  
! BYTE MCI_MSF_MINUTE(DWORD t) { return cast(BYTE)(t); }
! BYTE MCI_MSF_SECOND(DWORD t) { return cast(BYTE)(t >>> 8); }
  BYTE MCI_MSF_FRAME(DWORD t)  {  return cast(BYTE)(t >>> 16); }
  
! BYTE MCI_TMSF_TRACK(DWORD t)  { return cast(BYTE)(t); }
! BYTE MCI_TMSF_MINUTE(DWORD t) { return cast(BYTE)(t>>8); }
! BYTE MCI_TMSF_SECOND(DWORD t) { return cast(BYTE)(t>>16); }
! BYTE MCI_TMSF_FRAME(DWORD t)  { return cast(BYTE)(t>>24); }
  
  
  enum MCI_NOTIFY_SUCCESSFUL=1;
--- 766,787 ----
  
  
  // Macros
! BYTE MCI_HMS_HOUR()(DWORD t) { return cast(BYTE)(t); }
! BYTE MCI_HMS_MINUTE()(DWORD t) { return cast(BYTE)(t>>>8); }
! BYTE MCI_HMS_SECOND()(DWORD t) { return cast(BYTE)( t>>>16); }
! DWORD MCI_MAKE_HMS()(BYTE h, BYTE m, BYTE s) { return h |(m<<8)|(cast(DWORD)(s)<<16); }
! DWORD MCI_MAKE_MSF()(BYTE m, BYTE s, BYTE f) { return m |(s<<8)|(cast(DWORD)(f)<<16); }
  DWORD MCI_MAKE_TMSF(BYTE t, BYTE m, BYTE s, BYTE f) {
   return t |(m<<8)|(s<<16)|(cast(DWORD)(f)<< 24); }
  
! BYTE MCI_MSF_MINUTE()(DWORD t) { return cast(BYTE)(t); }
! BYTE MCI_MSF_SECOND()(DWORD t) { return cast(BYTE)(t >>> 8); }
  BYTE MCI_MSF_FRAME(DWORD t)  {  return cast(BYTE)(t >>> 16); }
  
! BYTE MCI_TMSF_TRACK()(DWORD t)  { return cast(BYTE)(t); }
! BYTE MCI_TMSF_MINUTE()(DWORD t) { return cast(BYTE)(t>>8); }
! BYTE MCI_TMSF_SECOND()(DWORD t) { return cast(BYTE)(t>>16); }
! BYTE MCI_TMSF_FRAME()(DWORD t)  { return cast(BYTE)(t>>24); }
  
  
  enum MCI_NOTIFY_SUCCESSFUL=1;
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/core/sys/windows/ntdef.d gcc-16-20260201/libphobos/libdruntime/core/sys/windows/ntdef.d
*** gcc-16-20260125/libphobos/libdruntime/core/sys/windows/ntdef.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/core/sys/windows/ntdef.d	Sun Feb  1 22:32:17 2026
*************** void InitializeObjectAttributes(OBJECT_A
*** 34,43 ****
  }
  
  pragma(inline, true) @safe pure nothrow @nogc {
!     bool NT_SUCCESS(NTSTATUS Status)     { return Status >= 0; }
!     bool NT_INFORMATION(NTSTATUS Status) { return ((cast(ULONG) Status) >> 30) == 1; }
!     bool NT_WARNING(NTSTATUS Status)     { return ((cast(ULONG) Status) >> 30) == 2; }
!     bool NT_ERROR(NTSTATUS Status)       { return ((cast(ULONG) Status) >> 30) == 3; }
  }
  
  /*  In MinGW, NTSTATUS, UNICODE_STRING, STRING and their associated pointer
--- 34,43 ----
  }
  
  pragma(inline, true) @safe pure nothrow @nogc {
!     bool NT_SUCCESS()(NTSTATUS Status)     { return Status >= 0; }
!     bool NT_INFORMATION()(NTSTATUS Status) { return ((cast(ULONG) Status) >> 30) == 1; }
!     bool NT_WARNING()(NTSTATUS Status)     { return ((cast(ULONG) Status) >> 30) == 2; }
!     bool NT_ERROR()(NTSTATUS Status)       { return ((cast(ULONG) Status) >> 30) == 3; }
  }
  
  /*  In MinGW, NTSTATUS, UNICODE_STRING, STRING and their associated pointer
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/core/sys/windows/ntsecapi.d gcc-16-20260201/libphobos/libdruntime/core/sys/windows/ntsecapi.d
*** gcc-16-20260125/libphobos/libdruntime/core/sys/windows/ntsecapi.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/core/sys/windows/ntsecapi.d	Sun Feb  1 22:32:17 2026
*************** enum {
*** 40,46 ****
      LSA_MODE_LOG_FULL
  }
  
! bool LSA_SUCCESS(int x) { return x >= 0; }
  
  /*  TOTHINKABOUT: These constants don't have ANSI/Unicode versioned
   *  aliases.  Should we merge them anyway?
--- 40,46 ----
      LSA_MODE_LOG_FULL
  }
  
! bool LSA_SUCCESS()(int x) { return x >= 0; }
  
  /*  TOTHINKABOUT: These constants don't have ANSI/Unicode versioned
   *  aliases.  Should we merge them anyway?
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/core/sys/windows/oleauto.d gcc-16-20260201/libphobos/libdruntime/core/sys/windows/oleauto.d
*** gcc-16-20260125/libphobos/libdruntime/core/sys/windows/oleauto.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/core/sys/windows/oleauto.d	Sun Feb  1 22:32:17 2026
*************** enum DISPATCH_PROPERTYGET = 2;
*** 41,47 ****
  enum DISPATCH_PROPERTYPUT = 4;
  enum DISPATCH_PROPERTYPUTREF = 8;
  
! //ULONG LHashValOfName(LCID l, OLECHAR* n) { return LHashValOfNameSys(SYSKIND.SYS_WIN32, l, n); }
  
  // DAC: These aren't in the 2003 SDK.
  //MACRO #define WHashValOfLHashVal(h) ((unsigned short)(0x0000ffff&(h)))
--- 41,47 ----
  enum DISPATCH_PROPERTYPUT = 4;
  enum DISPATCH_PROPERTYPUTREF = 8;
  
! //ULONG LHashValOfName()(LCID l, OLECHAR* n) { return LHashValOfNameSys(SYSKIND.SYS_WIN32, l, n); }
  
  // DAC: These aren't in the 2003 SDK.
  //MACRO #define WHashValOfLHashVal(h) ((unsigned short)(0x0000ffff&(h)))
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/core/sys/windows/shlobj.d gcc-16-20260201/libphobos/libdruntime/core/sys/windows/shlobj.d
*** gcc-16-20260125/libphobos/libdruntime/core/sys/windows/shlobj.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/core/sys/windows/shlobj.d	Sun Feb  1 22:32:17 2026
*************** struct SHELLFLAGSTATE {
*** 1034,1068 ****
      BOOL fHideIcons : 1;
      UINT fRestFlags : 3;
  */
!     @property bool fShowAllObjects()       { return cast(bool) (_bf & 0x0001); }
!     @property bool fShowExtensions()       { return cast(bool) (_bf & 0x0002); }
!     @property bool fNoConfirmRecycle()     { return cast(bool) (_bf & 0x0004); }
!     @property bool fShowSysFiles()         { return cast(bool) (_bf & 0x0008); }
!     @property bool fShowCompColor()        { return cast(bool) (_bf & 0x0010); }
!     @property bool fDoubleClickInWebView() { return cast(bool) (_bf & 0x0020); }
!     @property bool fDesktopHTML()          { return cast(bool) (_bf & 0x0040); }
!     @property bool fWin95Classic()         { return cast(bool) (_bf & 0x0080); }
!     @property bool fDontPrettyPath()       { return cast(bool) (_bf & 0x0100); }
!     @property bool fShowAttribCol()        { return cast(bool) (_bf & 0x0200); }
!     @property bool fMapNetDrvBtn()         { return cast(bool) (_bf & 0x0400); }
!     @property bool fShowInfoTip()          { return cast(bool) (_bf & 0x0800); }
!     @property bool fHideIcons()            { return cast(bool) (_bf & 0x1000); }
!     @property ubyte fRestFlags()           { return cast(ubyte) (_bf >> 13); }
  
!     @property bool fShowAllObjects(bool f)       { _bf = cast(ushort) ((_bf & ~0xFFFE) | f);        return f; }
!     @property bool fShowExtensions(bool f)       { _bf = cast(ushort) ((_bf & ~0xFFFD) | (f <<  1)); return f; }
!     @property bool fNoConfirmRecycle(bool f)     { _bf = cast(ushort) ((_bf & ~0xFFFB) | (f <<  2)); return f; }
!     @property bool fShowSysFiles(bool f)         { _bf = cast(ushort) ((_bf & ~0xFFF8) | (f <<  3)); return f; }
!     @property bool fShowCompColor(bool f)        { _bf = cast(ushort) ((_bf & ~0xFFEF) | (f <<  4)); return f; }
!     @property bool fDoubleClickInWebView(bool f) { _bf = cast(ushort) ((_bf & ~0xFFDF) | (f <<  5)); return f; }
!     @property bool fDesktopHTML(bool f)          { _bf = cast(ushort) ((_bf & ~0xFFBF) | (f <<  6)); return f; }
!     @property bool fWin95Classic(bool f)         { _bf = cast(ushort) ((_bf & ~0xFF8F) | (f <<  7)); return f; }
!     @property bool fDontPrettyPath(bool f)       { _bf = cast(ushort) ((_bf & ~0xFEFF) | (f <<  8)); return f; }
!     @property bool fShowAttribCol(bool f)        { _bf = cast(ushort) ((_bf & ~0xFDFF) | (f <<  9)); return f; }
!     @property bool fMapNetDrvBtn(bool f)         { _bf = cast(ushort) ((_bf & ~0xFBFF) | (f << 10)); return f; }
!     @property bool fShowInfoTip(bool f)          { _bf = cast(ushort) ((_bf & ~0xF8FF) | (f << 11)); return f; }
!     @property bool fHideIcons(bool f)            { _bf = cast(ushort) ((_bf & ~0xEFFF) | (f << 12)); return f; }
!     @property ubyte fRestFlags(ubyte f)          { _bf = cast(ushort) ((_bf & ~0x1FFF) | (f << 13)); return cast(ubyte) (f & 7); }
  }
  alias SHELLFLAGSTATE* LPSHELLFLAGSTATE;
  
--- 1034,1068 ----
      BOOL fHideIcons : 1;
      UINT fRestFlags : 3;
  */
!     @property bool fShowAllObjects()()       { return cast(bool) (_bf & 0x0001); }
!     @property bool fShowExtensions()()       { return cast(bool) (_bf & 0x0002); }
!     @property bool fNoConfirmRecycle()()     { return cast(bool) (_bf & 0x0004); }
!     @property bool fShowSysFiles()()         { return cast(bool) (_bf & 0x0008); }
!     @property bool fShowCompColor()()        { return cast(bool) (_bf & 0x0010); }
!     @property bool fDoubleClickInWebView()() { return cast(bool) (_bf & 0x0020); }
!     @property bool fDesktopHTML()()          { return cast(bool) (_bf & 0x0040); }
!     @property bool fWin95Classic()()         { return cast(bool) (_bf & 0x0080); }
!     @property bool fDontPrettyPath()()       { return cast(bool) (_bf & 0x0100); }
!     @property bool fShowAttribCol()()        { return cast(bool) (_bf & 0x0200); }
!     @property bool fMapNetDrvBtn()()         { return cast(bool) (_bf & 0x0400); }
!     @property bool fShowInfoTip()()          { return cast(bool) (_bf & 0x0800); }
!     @property bool fHideIcons()()            { return cast(bool) (_bf & 0x1000); }
!     @property ubyte fRestFlags()()           { return cast(ubyte) (_bf >> 13); }
  
!     @property bool fShowAllObjects()(bool f)       { _bf = cast(ushort) ((_bf & ~0xFFFE) | f);        return f; }
!     @property bool fShowExtensions()(bool f)       { _bf = cast(ushort) ((_bf & ~0xFFFD) | (f <<  1)); return f; }
!     @property bool fNoConfirmRecycle()(bool f)     { _bf = cast(ushort) ((_bf & ~0xFFFB) | (f <<  2)); return f; }
!     @property bool fShowSysFiles()(bool f)         { _bf = cast(ushort) ((_bf & ~0xFFF8) | (f <<  3)); return f; }
!     @property bool fShowCompColor()(bool f)        { _bf = cast(ushort) ((_bf & ~0xFFEF) | (f <<  4)); return f; }
!     @property bool fDoubleClickInWebView()(bool f) { _bf = cast(ushort) ((_bf & ~0xFFDF) | (f <<  5)); return f; }
!     @property bool fDesktopHTML()(bool f)          { _bf = cast(ushort) ((_bf & ~0xFFBF) | (f <<  6)); return f; }
!     @property bool fWin95Classic()(bool f)         { _bf = cast(ushort) ((_bf & ~0xFF8F) | (f <<  7)); return f; }
!     @property bool fDontPrettyPath()(bool f)       { _bf = cast(ushort) ((_bf & ~0xFEFF) | (f <<  8)); return f; }
!     @property bool fShowAttribCol()(bool f)        { _bf = cast(ushort) ((_bf & ~0xFDFF) | (f <<  9)); return f; }
!     @property bool fMapNetDrvBtn()(bool f)         { _bf = cast(ushort) ((_bf & ~0xFBFF) | (f << 10)); return f; }
!     @property bool fShowInfoTip()(bool f)          { _bf = cast(ushort) ((_bf & ~0xF8FF) | (f << 11)); return f; }
!     @property bool fHideIcons()(bool f)            { _bf = cast(ushort) ((_bf & ~0xEFFF) | (f << 12)); return f; }
!     @property ubyte fRestFlags()(ubyte f)          { _bf = cast(ushort) ((_bf & ~0x1FFF) | (f << 13)); return cast(ubyte) (f & 7); }
  }
  alias SHELLFLAGSTATE* LPSHELLFLAGSTATE;
  
*************** static if (_WIN32_WINNT >= 0x500) {
*** 1118,1173 ****
          BOOL fShowSuperHidden : 1;
          BOOL fNoNetCrawling : 1;
      */
!         @property bool fShowAllObjects()       { return cast(bool) (_bf1 & 0x00000001); }
!         @property bool fShowExtensions()       { return cast(bool) (_bf1 & 0x00000002); }
!         @property bool fNoConfirmRecycle()     { return cast(bool) (_bf1 & 0x00000004); }
!         @property bool fShowSysFiles()         { return cast(bool) (_bf1 & 0x00000008); }
!         @property bool fShowCompColor()        { return cast(bool) (_bf1 & 0x00000010); }
!         @property bool fDoubleClickInWebView() { return cast(bool) (_bf1 & 0x00000020); }
!         @property bool fDesktopHTML()          { return cast(bool) (_bf1 & 0x00000040); }
!         @property bool fWin95Classic()         { return cast(bool) (_bf1 & 0x00000080); }
!         @property bool fDontPrettyPath()       { return cast(bool) (_bf1 & 0x00000100); }
!         @property bool fShowAttribCol()        { return cast(bool) (_bf1 & 0x00000200); }
!         @property bool fMapNetDrvBtn()         { return cast(bool) (_bf1 & 0x00000400); }
!         @property bool fShowInfoTip()          { return cast(bool) (_bf1 & 0x00000800); }
!         @property bool fHideIcons()            { return cast(bool) (_bf1 & 0x00001000); }
!         @property bool fWebView()              { return cast(bool) (_bf1 & 0x00002000); }
!         @property bool fFilter()               { return cast(bool) (_bf1 & 0x00004000); }
!         @property bool fShowSuperHidden()      { return cast(bool) (_bf1 & 0x00008000); }
!         @property bool fNoNetCrawling()        { return cast(bool) (_bf1 & 0x00010000); }
  
!         @property bool fShowAllObjects(bool f)       { _bf1 = cast(uint) ((_bf1 & ~0xFFFFFFFE) | f);         return f; }
!         @property bool fShowExtensions(bool f)       { _bf1 = cast(uint) ((_bf1 & ~0xFFFFFFFD) | (f <<  1)); return f; }
!         @property bool fNoConfirmRecycle(bool f)     { _bf1 = cast(uint) ((_bf1 & ~0xFFFFFFFB) | (f <<  2)); return f; }
!         @property bool fShowSysFiles(bool f)         { _bf1 = cast(uint) ((_bf1 & ~0xFFFFFFF8) | (f <<  3)); return f; }
!         @property bool fShowCompColor(bool f)        { _bf1 = cast(uint) ((_bf1 & ~0xFFFFFFEF) | (f <<  4)); return f; }
!         @property bool fDoubleClickInWebView(bool f) { _bf1 = cast(uint) ((_bf1 & ~0xFFFFFFDF) | (f <<  5)); return f; }
!         @property bool fDesktopHTML(bool f)          { _bf1 = cast(uint) ((_bf1 & ~0xFFFFFFBF) | (f <<  6)); return f; }
!         @property bool fWin95Classic(bool f)         { _bf1 = cast(uint) ((_bf1 & ~0xFFFFFF8F) | (f <<  7)); return f; }
!         @property bool fDontPrettyPath(bool f)       { _bf1 = cast(uint) ((_bf1 & ~0xFFFFFEFF) | (f <<  8)); return f; }
!         @property bool fShowAttribCol(bool f)        { _bf1 = cast(uint) ((_bf1 & ~0xFFFFFDFF) | (f <<  9)); return f; }
!         @property bool fMapNetDrvBtn(bool f)         { _bf1 = cast(uint) ((_bf1 & ~0xFFFFFBFF) | (f << 10)); return f; }
!         @property bool fShowInfoTip(bool f)          { _bf1 = cast(uint) ((_bf1 & ~0xFFFFF8FF) | (f << 11)); return f; }
!         @property bool fHideIcons(bool f)            { _bf1 = cast(uint) ((_bf1 & ~0xFFFFEFFF) | (f << 12)); return f; }
!         @property bool fWebView(bool f)              { _bf1 = cast(uint) ((_bf1 & ~0xFFFFDFFF) | (f << 13)); return f; }
!         @property bool fFilter(bool f)               { _bf1 = cast(uint) ((_bf1 & ~0xFFFFBFFF) | (f << 14)); return f; }
!         @property bool fShowSuperHidden(bool f)      { _bf1 = cast(uint) ((_bf1 & ~0xFFFF8FFF) | (f << 15)); return f; }
!         @property bool fNoNetCrawling(bool f)        { _bf1 = cast(uint) ((_bf1 & ~0xFFFEFFFF) | (f << 16)); return f; }
      /*
          BOOL fSepProcess : 1;
          BOOL fStartPanelOn : 1;
          BOOL fShowStartPage : 1;
          UINT fSpareFlags : 13;
      */
!         @property bool fSepProcess()           { return cast(bool) (_bf2 & 0x00000001); }
!         @property bool fStartPanelOn()         { return cast(bool) (_bf2 & 0x00000002); }
!         @property bool fShowStartPage()        { return cast(bool) (_bf2 & 0x00000004); }
!         @property ushort fSpareFlags()         { return cast(ushort) ((_bf2 & 0x0000FFF8) >> 3); }
  
!         @property bool fSepProcess(bool f)     { _bf2 = cast(uint) ((_bf2 & ~0xFFFFFFFE) | f);        return f; }
!         @property bool fStartPanelOn(bool f)   { _bf2 = cast(uint) ((_bf2 & ~0xFFFFFFFD) | (f << 1)); return f; }
!         @property bool fShowStartPage(bool f)  { _bf2 = cast(uint) ((_bf2 & ~0xFFFFFFFB) | (f << 2)); return f; }
!         @property ushort fSpareFlags(ushort f) {
              _bf2 = cast(ushort) ((_bf2 & ~0xFFFF0007) | ((f & 0x1FFF) << 3));
              return cast(ushort) (f & 0x1FFF);
          }
--- 1118,1173 ----
          BOOL fShowSuperHidden : 1;
          BOOL fNoNetCrawling : 1;
      */
!         @property bool fShowAllObjects()()       { return cast(bool) (_bf1 & 0x00000001); }
!         @property bool fShowExtensions()()       { return cast(bool) (_bf1 & 0x00000002); }
!         @property bool fNoConfirmRecycle()()     { return cast(bool) (_bf1 & 0x00000004); }
!         @property bool fShowSysFiles()()         { return cast(bool) (_bf1 & 0x00000008); }
!         @property bool fShowCompColor()()        { return cast(bool) (_bf1 & 0x00000010); }
!         @property bool fDoubleClickInWebView()() { return cast(bool) (_bf1 & 0x00000020); }
!         @property bool fDesktopHTML()()          { return cast(bool) (_bf1 & 0x00000040); }
!         @property bool fWin95Classic()()         { return cast(bool) (_bf1 & 0x00000080); }
!         @property bool fDontPrettyPath()()       { return cast(bool) (_bf1 & 0x00000100); }
!         @property bool fShowAttribCol()()        { return cast(bool) (_bf1 & 0x00000200); }
!         @property bool fMapNetDrvBtn()()         { return cast(bool) (_bf1 & 0x00000400); }
!         @property bool fShowInfoTip()()          { return cast(bool) (_bf1 & 0x00000800); }
!         @property bool fHideIcons()()            { return cast(bool) (_bf1 & 0x00001000); }
!         @property bool fWebView()()              { return cast(bool) (_bf1 & 0x00002000); }
!         @property bool fFilter()()               { return cast(bool) (_bf1 & 0x00004000); }
!         @property bool fShowSuperHidden()()      { return cast(bool) (_bf1 & 0x00008000); }
!         @property bool fNoNetCrawling()()        { return cast(bool) (_bf1 & 0x00010000); }
  
!         @property bool fShowAllObjects()(bool f)       { _bf1 = cast(uint) ((_bf1 & ~0xFFFFFFFE) | f);         return f; }
!         @property bool fShowExtensions()(bool f)       { _bf1 = cast(uint) ((_bf1 & ~0xFFFFFFFD) | (f <<  1)); return f; }
!         @property bool fNoConfirmRecycle()(bool f)     { _bf1 = cast(uint) ((_bf1 & ~0xFFFFFFFB) | (f <<  2)); return f; }
!         @property bool fShowSysFiles()(bool f)         { _bf1 = cast(uint) ((_bf1 & ~0xFFFFFFF8) | (f <<  3)); return f; }
!         @property bool fShowCompColor()(bool f)        { _bf1 = cast(uint) ((_bf1 & ~0xFFFFFFEF) | (f <<  4)); return f; }
!         @property bool fDoubleClickInWebView()(bool f) { _bf1 = cast(uint) ((_bf1 & ~0xFFFFFFDF) | (f <<  5)); return f; }
!         @property bool fDesktopHTML()(bool f)          { _bf1 = cast(uint) ((_bf1 & ~0xFFFFFFBF) | (f <<  6)); return f; }
!         @property bool fWin95Classic()(bool f)         { _bf1 = cast(uint) ((_bf1 & ~0xFFFFFF8F) | (f <<  7)); return f; }
!         @property bool fDontPrettyPath()(bool f)       { _bf1 = cast(uint) ((_bf1 & ~0xFFFFFEFF) | (f <<  8)); return f; }
!         @property bool fShowAttribCol()(bool f)        { _bf1 = cast(uint) ((_bf1 & ~0xFFFFFDFF) | (f <<  9)); return f; }
!         @property bool fMapNetDrvBtn()(bool f)         { _bf1 = cast(uint) ((_bf1 & ~0xFFFFFBFF) | (f << 10)); return f; }
!         @property bool fShowInfoTip()(bool f)          { _bf1 = cast(uint) ((_bf1 & ~0xFFFFF8FF) | (f << 11)); return f; }
!         @property bool fHideIcons()(bool f)            { _bf1 = cast(uint) ((_bf1 & ~0xFFFFEFFF) | (f << 12)); return f; }
!         @property bool fWebView()(bool f)              { _bf1 = cast(uint) ((_bf1 & ~0xFFFFDFFF) | (f << 13)); return f; }
!         @property bool fFilter()(bool f)               { _bf1 = cast(uint) ((_bf1 & ~0xFFFFBFFF) | (f << 14)); return f; }
!         @property bool fShowSuperHidden()(bool f)      { _bf1 = cast(uint) ((_bf1 & ~0xFFFF8FFF) | (f << 15)); return f; }
!         @property bool fNoNetCrawling()(bool f)        { _bf1 = cast(uint) ((_bf1 & ~0xFFFEFFFF) | (f << 16)); return f; }
      /*
          BOOL fSepProcess : 1;
          BOOL fStartPanelOn : 1;
          BOOL fShowStartPage : 1;
          UINT fSpareFlags : 13;
      */
!         @property bool fSepProcess()()           { return cast(bool) (_bf2 & 0x00000001); }
!         @property bool fStartPanelOn()()         { return cast(bool) (_bf2 & 0x00000002); }
!         @property bool fShowStartPage()()        { return cast(bool) (_bf2 & 0x00000004); }
!         @property ushort fSpareFlags()()         { return cast(ushort) ((_bf2 & 0x0000FFF8) >> 3); }
  
!         @property bool fSepProcess()(bool f)     { _bf2 = cast(uint) ((_bf2 & ~0xFFFFFFFE) | f);        return f; }
!         @property bool fStartPanelOn()(bool f)   { _bf2 = cast(uint) ((_bf2 & ~0xFFFFFFFD) | (f << 1)); return f; }
!         @property bool fShowStartPage()(bool f)  { _bf2 = cast(uint) ((_bf2 & ~0xFFFFFFFB) | (f << 2)); return f; }
!         @property ushort fSpareFlags()(ushort f) {
              _bf2 = cast(ushort) ((_bf2 & ~0xFFFF0007) | ((f & 0x1FFF) << 3));
              return cast(ushort) (f & 0x1FFF);
          }
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/core/sys/windows/stat.d gcc-16-20260201/libphobos/libdruntime/core/sys/windows/stat.d
*** gcc-16-20260125/libphobos/libdruntime/core/sys/windows/stat.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/core/sys/windows/stat.d	Sun Feb  1 22:32:17 2026
*************** enum S_IFNAM  = 0x5000;
*** 24,34 ****
  
  @safe pure
  {
! int S_ISREG(int m)  { return (m & S_IFMT) == S_IFREG; }
! int S_ISBLK(int m)  { return (m & S_IFMT) == S_IFBLK; }
! int S_ISNAM(int m)  { return (m & S_IFMT) == S_IFNAM; }
! int S_ISDIR(int m)  { return (m & S_IFMT) == S_IFDIR; }
! int S_ISCHR(int m)  { return (m & S_IFMT) == S_IFCHR; }
  }
  
  version (CRuntime_Microsoft)
--- 24,34 ----
  
  @safe pure
  {
! int S_ISREG()(int m)  { return (m & S_IFMT) == S_IFREG; }
! int S_ISBLK()(int m)  { return (m & S_IFMT) == S_IFBLK; }
! int S_ISNAM()(int m)  { return (m & S_IFMT) == S_IFNAM; }
! int S_ISDIR()(int m)  { return (m & S_IFMT) == S_IFDIR; }
! int S_ISCHR()(int m)  { return (m & S_IFMT) == S_IFCHR; }
  }
  
  version (CRuntime_Microsoft)
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/core/sys/windows/threadaux.d gcc-16-20260201/libphobos/libdruntime/core/sys/windows/threadaux.d
*** gcc-16-20260125/libphobos/libdruntime/core/sys/windows/threadaux.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/core/sys/windows/threadaux.d	Sun Feb  1 22:32:17 2026
*************** struct thread_aux
*** 311,318 ****
              enum TEB_offset_TlsSlots = 0xE10;
              enum TEB_offset_TlsExpansionSlots = 0xF94;
          }
!         void* tlsSlotsAdr(void** teb) { return cast(void*) teb + TEB_offset_TlsSlots; }
!         ref void* tlsExpansionSlots(void** teb) { return *cast(void**)(cast(void*) teb + TEB_offset_TlsExpansionSlots); }
  
          import core.stdc.string;
          void*[64] slots = void;
--- 311,318 ----
              enum TEB_offset_TlsSlots = 0xE10;
              enum TEB_offset_TlsExpansionSlots = 0xF94;
          }
!         void* tlsSlotsAdr()(void** teb) { return cast(void*) teb + TEB_offset_TlsSlots; }
!         ref void* tlsExpansionSlots()(void** teb) { return *cast(void**)(cast(void*) teb + TEB_offset_TlsExpansionSlots); }
  
          import core.stdc.string;
          void*[64] slots = void;
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/core/sys/windows/vfw.d gcc-16-20260201/libphobos/libdruntime/core/sys/windows/vfw.d
*** gcc-16-20260125/libphobos/libdruntime/core/sys/windows/vfw.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/core/sys/windows/vfw.d	Sun Feb  1 22:32:17 2026
*************** enum {
*** 2115,2189 ****
   * message wrapper
   */
  
! BOOL capSetCallbackOnError(HWND hWnd, LPVOID fpProc)                { return cast(BOOL)AVICapSM(hWnd, WM_CAP_SET_CALLBACK_ERROR, 0, cast(LPARAM)fpProc); }
! BOOL capSetCallbackOnStatus(HWND hWnd, LPVOID fpProc)               { return cast(BOOL)AVICapSM(hWnd, WM_CAP_SET_CALLBACK_STATUS, 0, cast(LPARAM)fpProc); }
! BOOL capSetCallbackOnYield(HWND hWnd, LPVOID fpProc)                { return cast(BOOL)AVICapSM(hWnd, WM_CAP_SET_CALLBACK_YIELD, 0, cast(LPARAM)fpProc); }
! BOOL capSetCallbackOnFrame(HWND hWnd, LPVOID fpProc)                { return cast(BOOL)AVICapSM(hWnd, WM_CAP_SET_CALLBACK_FRAME, 0, cast(LPARAM)fpProc); }
! BOOL capSetCallbackOnVideoStream(HWND hWnd, LPVOID fpProc)          { return cast(BOOL)AVICapSM(hWnd, WM_CAP_SET_CALLBACK_VIDEOSTREAM, 0, cast(LPARAM)fpProc); }
! BOOL capSetCallbackOnWaveStream(HWND hWnd, LPVOID fpProc)           { return cast(BOOL)AVICapSM(hWnd, WM_CAP_SET_CALLBACK_WAVESTREAM, 0, cast(LPARAM)fpProc); }
! BOOL capSetCallbackOnCapControl(HWND hWnd, LPVOID fpProc)           { return cast(BOOL)AVICapSM(hWnd, WM_CAP_SET_CALLBACK_CAPCONTROL, 0, cast(LPARAM)fpProc); }
  
! BOOL capSetUserData(HWND hWnd, LPARAM lUser)                        { return cast(BOOL)AVICapSM(hWnd, WM_CAP_SET_USER_DATA, 0, lUser); }
! BOOL capGetUserData(HWND hWnd)                                      { return cast(BOOL)AVICapSM(hWnd, WM_CAP_GET_USER_DATA, 0, 0); }
  
! BOOL capDriverConnect(HWND hWnd, WPARAM i)                          { return cast(BOOL)AVICapSM(hWnd, WM_CAP_DRIVER_CONNECT, i, 0); }
! BOOL capDriverDisconnect(HWND hWnd)                                 { return cast(BOOL)AVICapSM(hWnd, WM_CAP_DRIVER_DISCONNECT, 0, 0); }
! BOOL capDriverGetName(HWND hWnd, LPTSTR szName, WPARAM wSize)       { return cast(BOOL)AVICapSM(hWnd, WM_CAP_DRIVER_GET_NAME, wSize, cast(LPARAM)szName); }
! BOOL capDriverGetVersion(HWND hWnd, LPTSTR szVer, WPARAM wSize)     { return cast(BOOL)AVICapSM(hWnd, WM_CAP_DRIVER_GET_VERSION, wSize, cast(LPARAM)szVer); }
! BOOL capDriverGetCaps(HWND hWnd, LPCAPDRIVERCAPS s, WPARAM wSize)   { return cast(BOOL)AVICapSM(hWnd, WM_CAP_DRIVER_GET_CAPS, wSize, cast(LPARAM)s); }
  
! BOOL capFileSetCaptureFile(HWND hWnd, LPTSTR szName)                { return cast(BOOL)AVICapSM(hWnd, WM_CAP_FILE_SET_CAPTURE_FILE, 0, cast(LPARAM)szName); }
! BOOL capFileGetCaptureFile(HWND hWnd, LPTSTR szName, WPARAM wSize)  { return cast(BOOL)AVICapSM(hWnd, WM_CAP_FILE_GET_CAPTURE_FILE, wSize, cast(LPARAM)szName); }
! BOOL capFileAlloc(HWND hWnd, WPARAM wSize)                          { return cast(BOOL)AVICapSM(hWnd, WM_CAP_FILE_ALLOCATE, wSize, 0); }
! BOOL capFileSaveAs(HWND hWnd, LPTSTR szName)                        { return cast(BOOL)AVICapSM(hWnd, WM_CAP_FILE_SAVEAS, 0, cast(LPARAM)szName); }
! BOOL capFileSetInfoChunk(HWND hWnd, LPCAPINFOCHUNK lpInfoChunk)     { return cast(BOOL)AVICapSM(hWnd, WM_CAP_FILE_SET_INFOCHUNK, 0, cast(LPARAM)lpInfoChunk); }
! BOOL capFileSaveDIB(HWND hWnd, LPTSTR szName)                       { return cast(BOOL)AVICapSM(hWnd, WM_CAP_FILE_SAVEDIB, 0, cast(LPARAM)szName); }
  
! BOOL capEditCopy(HWND hWnd)                                         { return cast(BOOL)AVICapSM(hWnd, WM_CAP_EDIT_COPY, 0, 0); }
  
! BOOL capSetAudioFormat(HWND hWnd, LPWAVEFORMATEX s, WPARAM wSize)   { return cast(BOOL)AVICapSM(hWnd, WM_CAP_SET_AUDIOFORMAT, wSize, cast(LPARAM)s); }
! DWORD capGetAudioFormat(HWND hWnd, LPWAVEFORMATEX s, WPARAM wSize)  { return cast(DWORD)AVICapSM(hWnd, WM_CAP_GET_AUDIOFORMAT, wSize, cast(LPARAM)s); }
! DWORD capGetAudioFormatSize(HWND hWnd)                              { return cast(DWORD)AVICapSM(hWnd, WM_CAP_GET_AUDIOFORMAT, 0, 0); }
  
! BOOL capDlgVideoFormat(HWND hWnd)                                   { return cast(BOOL)AVICapSM(hWnd, WM_CAP_DLG_VIDEOFORMAT, 0, 0); }
! BOOL capDlgVideoSource(HWND hWnd)                                   { return cast(BOOL)AVICapSM(hWnd, WM_CAP_DLG_VIDEOSOURCE, 0, 0); }
! BOOL capDlgVideoDisplay(HWND hWnd)                                  { return cast(BOOL)AVICapSM(hWnd, WM_CAP_DLG_VIDEODISPLAY, 0, 0); }
! BOOL capDlgVideoCompression(HWND hWnd)                              { return cast(BOOL)AVICapSM(hWnd, WM_CAP_DLG_VIDEOCOMPRESSION, 0, 0); }
  
! DWORD capGetVideoFormat(HWND hWnd, void* s, WPARAM wSize)           { return cast(DWORD)AVICapSM(hWnd, WM_CAP_GET_VIDEOFORMAT, wSize, cast(LPARAM)s); }
! DWORD capGetVideoFormatSize(HWND hWnd)                              { return cast(DWORD)AVICapSM(hWnd, WM_CAP_GET_VIDEOFORMAT, 0, 0); }
! BOOL capSetVideoFormat(HWND hWnd, void* s, WPARAM wSize)            { return cast(BOOL)AVICapSM(hWnd, WM_CAP_SET_VIDEOFORMAT, wSize, cast(LPARAM)s); }
  
! BOOL capPreview(HWND hWnd, BOOL f)                                  { return cast(BOOL)AVICapSM(hWnd, WM_CAP_SET_PREVIEW, cast(WPARAM)f, 0); }
! BOOL capPreviewRate(HWND hWnd, WPARAM wMS)                          { return cast(BOOL)AVICapSM(hWnd, WM_CAP_SET_PREVIEWRATE, wMS, 0); }
! BOOL capOverlay(HWND hWnd, BOOL f)                                  { return cast(BOOL)AVICapSM(hWnd, WM_CAP_SET_OVERLAY, cast(WPARAM)f, 0); }
! BOOL capPreviewScale(HWND hWnd, BOOL f)                             { return cast(BOOL)AVICapSM(hWnd, WM_CAP_SET_SCALE, cast(WPARAM)f, 0); }
! BOOL capGetStatus(HWND hWnd, LPCAPSTATUS s, WPARAM wSize)           { return cast(BOOL)AVICapSM(hWnd, WM_CAP_GET_STATUS, wSize, cast(LPARAM)s); }
! BOOL capSetScrollPos(HWND hWnd, LPPOINT lpP)                        { return cast(BOOL)AVICapSM(hWnd, WM_CAP_SET_SCROLL, 0, cast(LPARAM)lpP); }
  
! BOOL capGrabFrame(HWND hWnd)                                        { return cast(BOOL)AVICapSM(hWnd, WM_CAP_GRAB_FRAME, 0, 0); }
! BOOL capGrabFrameNoStop(HWND hWnd)                                  { return cast(BOOL)AVICapSM(hWnd, WM_CAP_GRAB_FRAME_NOSTOP, 0, 0); }
  
! BOOL capCaptureSequence(HWND hWnd)                                  { return cast(BOOL)AVICapSM(hWnd, WM_CAP_SEQUENCE, 0, 0); }
! BOOL capCaptureSequenceNoFile(HWND hWnd)                            { return cast(BOOL)AVICapSM(hWnd, WM_CAP_SEQUENCE_NOFILE, 0, 0); }
! BOOL capCaptureStop(HWND hWnd)                                      { return cast(BOOL)AVICapSM(hWnd, WM_CAP_STOP, 0, 0); }
! BOOL capCaptureAbort(HWND hWnd)                                     { return cast(BOOL)AVICapSM(hWnd, WM_CAP_ABORT, 0, 0); }
  
! BOOL capCaptureSingleFrameOpen(HWND hWnd)                           { return cast(BOOL)AVICapSM(hWnd, WM_CAP_SINGLE_FRAME_OPEN, 0, 0); }
! BOOL capCaptureSingleFrameClose(HWND hWnd)                          { return cast(BOOL)AVICapSM(hWnd, WM_CAP_SINGLE_FRAME_CLOSE, 0, 0); }
! BOOL capCaptureSingleFrame(HWND hWnd)                               { return cast(BOOL)AVICapSM(hWnd, WM_CAP_SINGLE_FRAME, 0, 0); }
  
! BOOL capCaptureGetSetup(HWND hWnd, LPCAPTUREPARMS s, WPARAM wSize)  { return cast(BOOL)AVICapSM(hWnd, WM_CAP_GET_SEQUENCE_SETUP, wSize, cast(LPARAM)s); }
! BOOL capCaptureSetSetup(HWND hWnd, LPCAPTUREPARMS s, WPARAM wSize)  { return cast(BOOL)AVICapSM(hWnd, WM_CAP_SET_SEQUENCE_SETUP, wSize, cast(LPARAM)s); }
  
! BOOL capSetMCIDeviceName(HWND hWnd, LPTSTR szName)                  { return cast(BOOL)AVICapSM(hWnd, WM_CAP_SET_MCI_DEVICE, 0, cast(LPARAM)szName); }
! BOOL capGetMCIDeviceName(HWND hWnd, LPTSTR szName, WPARAM wSize)    { return cast(BOOL)AVICapSM(hWnd, WM_CAP_GET_MCI_DEVICE, wSize, cast(LPARAM)szName); }
  
! BOOL capPaletteOpen(HWND hWnd, LPTSTR szName)                       { return cast(BOOL)AVICapSM(hWnd, WM_CAP_PAL_OPEN, 0, cast(LPARAM)szName); }
! BOOL capPaletteSave(HWND hWnd, LPTSTR szName)                       { return cast(BOOL)AVICapSM(hWnd, WM_CAP_PAL_SAVE, 0, cast(LPARAM)szName); }
! BOOL capPalettePaste(HWND hWnd)                                     { return cast(BOOL)AVICapSM(hWnd, WM_CAP_PAL_PASTE, 0, 0); }
! BOOL capPaletteAuto(HWND hWnd, WPARAM iFrames, LPARAM iColors)      { return cast(BOOL)AVICapSM(hWnd, WM_CAP_PAL_AUTOCREATE, iFrames, iColors); }
! BOOL capPaletteManual(HWND hWnd, WPARAM fGrab, LPARAM iColors)      { return cast(BOOL)AVICapSM(hWnd, WM_CAP_PAL_MANUALCREATE, fGrab, iColors); }
  
  /**
   * structs
--- 2115,2189 ----
   * message wrapper
   */
  
! BOOL capSetCallbackOnError()(HWND hWnd, LPVOID fpProc)                { return cast(BOOL)AVICapSM(hWnd, WM_CAP_SET_CALLBACK_ERROR, 0, cast(LPARAM)fpProc); }
! BOOL capSetCallbackOnStatus()(HWND hWnd, LPVOID fpProc)               { return cast(BOOL)AVICapSM(hWnd, WM_CAP_SET_CALLBACK_STATUS, 0, cast(LPARAM)fpProc); }
! BOOL capSetCallbackOnYield()(HWND hWnd, LPVOID fpProc)                { return cast(BOOL)AVICapSM(hWnd, WM_CAP_SET_CALLBACK_YIELD, 0, cast(LPARAM)fpProc); }
! BOOL capSetCallbackOnFrame()(HWND hWnd, LPVOID fpProc)                { return cast(BOOL)AVICapSM(hWnd, WM_CAP_SET_CALLBACK_FRAME, 0, cast(LPARAM)fpProc); }
! BOOL capSetCallbackOnVideoStream()(HWND hWnd, LPVOID fpProc)          { return cast(BOOL)AVICapSM(hWnd, WM_CAP_SET_CALLBACK_VIDEOSTREAM, 0, cast(LPARAM)fpProc); }
! BOOL capSetCallbackOnWaveStream()(HWND hWnd, LPVOID fpProc)           { return cast(BOOL)AVICapSM(hWnd, WM_CAP_SET_CALLBACK_WAVESTREAM, 0, cast(LPARAM)fpProc); }
! BOOL capSetCallbackOnCapControl()(HWND hWnd, LPVOID fpProc)           { return cast(BOOL)AVICapSM(hWnd, WM_CAP_SET_CALLBACK_CAPCONTROL, 0, cast(LPARAM)fpProc); }
  
! BOOL capSetUserData()(HWND hWnd, LPARAM lUser)                        { return cast(BOOL)AVICapSM(hWnd, WM_CAP_SET_USER_DATA, 0, lUser); }
! BOOL capGetUserData()(HWND hWnd)                                      { return cast(BOOL)AVICapSM(hWnd, WM_CAP_GET_USER_DATA, 0, 0); }
  
! BOOL capDriverConnect()(HWND hWnd, WPARAM i)                          { return cast(BOOL)AVICapSM(hWnd, WM_CAP_DRIVER_CONNECT, i, 0); }
! BOOL capDriverDisconnect()(HWND hWnd)                                 { return cast(BOOL)AVICapSM(hWnd, WM_CAP_DRIVER_DISCONNECT, 0, 0); }
! BOOL capDriverGetName()(HWND hWnd, LPTSTR szName, WPARAM wSize)       { return cast(BOOL)AVICapSM(hWnd, WM_CAP_DRIVER_GET_NAME, wSize, cast(LPARAM)szName); }
! BOOL capDriverGetVersion()(HWND hWnd, LPTSTR szVer, WPARAM wSize)     { return cast(BOOL)AVICapSM(hWnd, WM_CAP_DRIVER_GET_VERSION, wSize, cast(LPARAM)szVer); }
! BOOL capDriverGetCaps()(HWND hWnd, LPCAPDRIVERCAPS s, WPARAM wSize)   { return cast(BOOL)AVICapSM(hWnd, WM_CAP_DRIVER_GET_CAPS, wSize, cast(LPARAM)s); }
  
! BOOL capFileSetCaptureFile()(HWND hWnd, LPTSTR szName)                { return cast(BOOL)AVICapSM(hWnd, WM_CAP_FILE_SET_CAPTURE_FILE, 0, cast(LPARAM)szName); }
! BOOL capFileGetCaptureFile()(HWND hWnd, LPTSTR szName, WPARAM wSize)  { return cast(BOOL)AVICapSM(hWnd, WM_CAP_FILE_GET_CAPTURE_FILE, wSize, cast(LPARAM)szName); }
! BOOL capFileAlloc()(HWND hWnd, WPARAM wSize)                          { return cast(BOOL)AVICapSM(hWnd, WM_CAP_FILE_ALLOCATE, wSize, 0); }
! BOOL capFileSaveAs()(HWND hWnd, LPTSTR szName)                        { return cast(BOOL)AVICapSM(hWnd, WM_CAP_FILE_SAVEAS, 0, cast(LPARAM)szName); }
! BOOL capFileSetInfoChunk()(HWND hWnd, LPCAPINFOCHUNK lpInfoChunk)     { return cast(BOOL)AVICapSM(hWnd, WM_CAP_FILE_SET_INFOCHUNK, 0, cast(LPARAM)lpInfoChunk); }
! BOOL capFileSaveDIB()(HWND hWnd, LPTSTR szName)                       { return cast(BOOL)AVICapSM(hWnd, WM_CAP_FILE_SAVEDIB, 0, cast(LPARAM)szName); }
  
! BOOL capEditCopy()(HWND hWnd)                                         { return cast(BOOL)AVICapSM(hWnd, WM_CAP_EDIT_COPY, 0, 0); }
  
! BOOL capSetAudioFormat()(HWND hWnd, LPWAVEFORMATEX s, WPARAM wSize)   { return cast(BOOL)AVICapSM(hWnd, WM_CAP_SET_AUDIOFORMAT, wSize, cast(LPARAM)s); }
! DWORD capGetAudioFormat()(HWND hWnd, LPWAVEFORMATEX s, WPARAM wSize)  { return cast(DWORD)AVICapSM(hWnd, WM_CAP_GET_AUDIOFORMAT, wSize, cast(LPARAM)s); }
! DWORD capGetAudioFormatSize()(HWND hWnd)                              { return cast(DWORD)AVICapSM(hWnd, WM_CAP_GET_AUDIOFORMAT, 0, 0); }
  
! BOOL capDlgVideoFormat()(HWND hWnd)                                   { return cast(BOOL)AVICapSM(hWnd, WM_CAP_DLG_VIDEOFORMAT, 0, 0); }
! BOOL capDlgVideoSource()(HWND hWnd)                                   { return cast(BOOL)AVICapSM(hWnd, WM_CAP_DLG_VIDEOSOURCE, 0, 0); }
! BOOL capDlgVideoDisplay()(HWND hWnd)                                  { return cast(BOOL)AVICapSM(hWnd, WM_CAP_DLG_VIDEODISPLAY, 0, 0); }
! BOOL capDlgVideoCompression()(HWND hWnd)                              { return cast(BOOL)AVICapSM(hWnd, WM_CAP_DLG_VIDEOCOMPRESSION, 0, 0); }
  
! DWORD capGetVideoFormat()(HWND hWnd, void* s, WPARAM wSize)           { return cast(DWORD)AVICapSM(hWnd, WM_CAP_GET_VIDEOFORMAT, wSize, cast(LPARAM)s); }
! DWORD capGetVideoFormatSize()(HWND hWnd)                              { return cast(DWORD)AVICapSM(hWnd, WM_CAP_GET_VIDEOFORMAT, 0, 0); }
! BOOL capSetVideoFormat()(HWND hWnd, void* s, WPARAM wSize)            { return cast(BOOL)AVICapSM(hWnd, WM_CAP_SET_VIDEOFORMAT, wSize, cast(LPARAM)s); }
  
! BOOL capPreview()(HWND hWnd, BOOL f)                                  { return cast(BOOL)AVICapSM(hWnd, WM_CAP_SET_PREVIEW, cast(WPARAM)f, 0); }
! BOOL capPreviewRate()(HWND hWnd, WPARAM wMS)                          { return cast(BOOL)AVICapSM(hWnd, WM_CAP_SET_PREVIEWRATE, wMS, 0); }
! BOOL capOverlay()(HWND hWnd, BOOL f)                                  { return cast(BOOL)AVICapSM(hWnd, WM_CAP_SET_OVERLAY, cast(WPARAM)f, 0); }
! BOOL capPreviewScale()(HWND hWnd, BOOL f)                             { return cast(BOOL)AVICapSM(hWnd, WM_CAP_SET_SCALE, cast(WPARAM)f, 0); }
! BOOL capGetStatus()(HWND hWnd, LPCAPSTATUS s, WPARAM wSize)           { return cast(BOOL)AVICapSM(hWnd, WM_CAP_GET_STATUS, wSize, cast(LPARAM)s); }
! BOOL capSetScrollPos()(HWND hWnd, LPPOINT lpP)                        { return cast(BOOL)AVICapSM(hWnd, WM_CAP_SET_SCROLL, 0, cast(LPARAM)lpP); }
  
! BOOL capGrabFrame()(HWND hWnd)                                        { return cast(BOOL)AVICapSM(hWnd, WM_CAP_GRAB_FRAME, 0, 0); }
! BOOL capGrabFrameNoStop()(HWND hWnd)                                  { return cast(BOOL)AVICapSM(hWnd, WM_CAP_GRAB_FRAME_NOSTOP, 0, 0); }
  
! BOOL capCaptureSequence()(HWND hWnd)                                  { return cast(BOOL)AVICapSM(hWnd, WM_CAP_SEQUENCE, 0, 0); }
! BOOL capCaptureSequenceNoFile()(HWND hWnd)                            { return cast(BOOL)AVICapSM(hWnd, WM_CAP_SEQUENCE_NOFILE, 0, 0); }
! BOOL capCaptureStop()(HWND hWnd)                                      { return cast(BOOL)AVICapSM(hWnd, WM_CAP_STOP, 0, 0); }
! BOOL capCaptureAbort()(HWND hWnd)                                     { return cast(BOOL)AVICapSM(hWnd, WM_CAP_ABORT, 0, 0); }
  
! BOOL capCaptureSingleFrameOpen()(HWND hWnd)                           { return cast(BOOL)AVICapSM(hWnd, WM_CAP_SINGLE_FRAME_OPEN, 0, 0); }
! BOOL capCaptureSingleFrameClose()(HWND hWnd)                          { return cast(BOOL)AVICapSM(hWnd, WM_CAP_SINGLE_FRAME_CLOSE, 0, 0); }
! BOOL capCaptureSingleFrame()(HWND hWnd)                               { return cast(BOOL)AVICapSM(hWnd, WM_CAP_SINGLE_FRAME, 0, 0); }
  
! BOOL capCaptureGetSetup()(HWND hWnd, LPCAPTUREPARMS s, WPARAM wSize)  { return cast(BOOL)AVICapSM(hWnd, WM_CAP_GET_SEQUENCE_SETUP, wSize, cast(LPARAM)s); }
! BOOL capCaptureSetSetup()(HWND hWnd, LPCAPTUREPARMS s, WPARAM wSize)  { return cast(BOOL)AVICapSM(hWnd, WM_CAP_SET_SEQUENCE_SETUP, wSize, cast(LPARAM)s); }
  
! BOOL capSetMCIDeviceName()(HWND hWnd, LPTSTR szName)                  { return cast(BOOL)AVICapSM(hWnd, WM_CAP_SET_MCI_DEVICE, 0, cast(LPARAM)szName); }
! BOOL capGetMCIDeviceName()(HWND hWnd, LPTSTR szName, WPARAM wSize)    { return cast(BOOL)AVICapSM(hWnd, WM_CAP_GET_MCI_DEVICE, wSize, cast(LPARAM)szName); }
  
! BOOL capPaletteOpen()(HWND hWnd, LPTSTR szName)                       { return cast(BOOL)AVICapSM(hWnd, WM_CAP_PAL_OPEN, 0, cast(LPARAM)szName); }
! BOOL capPaletteSave()(HWND hWnd, LPTSTR szName)                       { return cast(BOOL)AVICapSM(hWnd, WM_CAP_PAL_SAVE, 0, cast(LPARAM)szName); }
! BOOL capPalettePaste()(HWND hWnd)                                     { return cast(BOOL)AVICapSM(hWnd, WM_CAP_PAL_PASTE, 0, 0); }
! BOOL capPaletteAuto()(HWND hWnd, WPARAM iFrames, LPARAM iColors)      { return cast(BOOL)AVICapSM(hWnd, WM_CAP_PAL_AUTOCREATE, iFrames, iColors); }
! BOOL capPaletteManual()(HWND hWnd, WPARAM fGrab, LPARAM iColors)      { return cast(BOOL)AVICapSM(hWnd, WM_CAP_PAL_MANUALCREATE, fGrab, iColors); }
  
  /**
   * structs
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/core/sys/windows/winbase.d gcc-16-20260201/libphobos/libdruntime/core/sys/windows/winbase.d
*** gcc-16-20260125/libphobos/libdruntime/core/sys/windows/winbase.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/core/sys/windows/winbase.d	Sun Feb  1 22:32:17 2026
*************** struct DCB {
*** 963,969 ****
      bool fOutxDsrFlow()      { return cast(bool) (_bf & 8); }
      byte fDtrControl()       { return cast(byte) ((_bf & (32+16))>>4); }
      bool fDsrSensitivity()   { return cast(bool) (_bf & 64); }
!     bool fTXContinueOnXoff() { return cast(bool) (_bf & 128); }
      bool fOutX()             { return cast(bool) (_bf & 256); }
      bool fInX()              { return cast(bool) (_bf & 512); }
      bool fErrorChar()        { return cast(bool) (_bf & 1024); }
--- 963,969 ----
      bool fOutxDsrFlow()      { return cast(bool) (_bf & 8); }
      byte fDtrControl()       { return cast(byte) ((_bf & (32+16))>>4); }
      bool fDsrSensitivity()   { return cast(bool) (_bf & 64); }
!     bool fTXContinueOnXoff()() { return cast(bool) (_bf & 128); }
      bool fOutX()             { return cast(bool) (_bf & 256); }
      bool fInX()              { return cast(bool) (_bf & 512); }
      bool fErrorChar()        { return cast(bool) (_bf & 1024); }
*************** struct COMSTAT {
*** 1031,1039 ****
  
      bool fCtsHold()  { return cast(bool) (_bf & 1); }
      bool fDsrHold()  { return cast(bool) (_bf & 2); }
!     bool fRlsdHold() { return cast(bool) (_bf & 4); }
!     bool fXoffHold() { return cast(bool) (_bf & 8); }
!     bool fXoffSent() { return cast(bool) (_bf & 16); }
      bool fEof()      { return cast(bool) (_bf & 32); }
      bool fTxim()     { return cast(bool) (_bf & 64); }
  
--- 1031,1039 ----
  
      bool fCtsHold()  { return cast(bool) (_bf & 1); }
      bool fDsrHold()  { return cast(bool) (_bf & 2); }
!     bool fRlsdHold()() { return cast(bool) (_bf & 4); }
!     bool fXoffHold()() { return cast(bool) (_bf & 8); }
!     bool fXoffSent()() { return cast(bool) (_bf & 16); }
      bool fEof()      { return cast(bool) (_bf & 32); }
      bool fTxim()     { return cast(bool) (_bf & 64); }
  
*************** struct LDT_ENTRY {
*** 1494,1501 ****
  
          byte LimitHi()     { return cast(byte) (Flags2 & 0x0F); }
          bool Sys()         { return cast(bool) (Flags2 & 0x10); }
!         bool Default_Big() { return cast(bool) (Flags2 & 0x40); }
!         bool Granularity() { return cast(bool) (Flags2 & 0x80); }
      }
  /+
      union  HighWord {
--- 1494,1501 ----
  
          byte LimitHi()     { return cast(byte) (Flags2 & 0x0F); }
          bool Sys()         { return cast(bool) (Flags2 & 0x10); }
!         bool Default_Big()() { return cast(bool) (Flags2 & 0x40); }
!         bool Granularity()() { return cast(bool) (Flags2 & 0x80); }
      }
  /+
      union  HighWord {
*************** WINBASEAPI BOOL WINAPI SetEvent(HANDLE);
*** 2567,2574 ****
  // For compatibility with old core.sys.windows.windows:
  version (LittleEndian) nothrow @nogc
  {
!     BOOL QueryPerformanceCounter(long* lpPerformanceCount) { return QueryPerformanceCounter(cast(PLARGE_INTEGER)lpPerformanceCount); }
!     BOOL QueryPerformanceFrequency(long* lpFrequency) { return QueryPerformanceFrequency(cast(PLARGE_INTEGER)lpFrequency); }
  }
  
  mixin DECLARE_AW!("STARTUPINFO");
--- 2567,2574 ----
  // For compatibility with old core.sys.windows.windows:
  version (LittleEndian) nothrow @nogc
  {
!     BOOL QueryPerformanceCounter()(long* lpPerformanceCount) { return QueryPerformanceCounter(cast(PLARGE_INTEGER)lpPerformanceCount); }
!     BOOL QueryPerformanceFrequency()(long* lpFrequency) { return QueryPerformanceFrequency(cast(PLARGE_INTEGER)lpFrequency); }
  }
  
  mixin DECLARE_AW!("STARTUPINFO");
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/core/sys/windows/wincrypt.d gcc-16-20260201/libphobos/libdruntime/core/sys/windows/wincrypt.d
*** gcc-16-20260125/libphobos/libdruntime/core/sys/windows/wincrypt.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/core/sys/windows/wincrypt.d	Sun Feb  1 22:32:17 2026
*************** const TCHAR[] MS_ENH_RSA_AES_PROV
*** 44,52 ****
        = "Microsoft Enhanced RSA and AES Cryptographic Provider (Prototype)";
  }
  
! ALG_ID GET_ALG_CLASS(ALG_ID x) { return x & 0xE000; }
! ALG_ID GET_ALG_TYPE (ALG_ID x) { return x & 0x1E00; }
! ALG_ID GET_ALG_SID  (ALG_ID x) { return x & 0x01FF; }
  
  enum : ALG_ID {
      ALG_CLASS_ANY           = 0,
--- 44,52 ----
        = "Microsoft Enhanced RSA and AES Cryptographic Provider (Prototype)";
  }
  
! ALG_ID GET_ALG_CLASS()(ALG_ID x) { return x & 0xE000; }
! ALG_ID GET_ALG_TYPE ()(ALG_ID x) { return x & 0x1E00; }
! ALG_ID GET_ALG_SID  ()(ALG_ID x) { return x & 0x01FF; }
  
  enum : ALG_ID {
      ALG_CLASS_ANY           = 0,
*************** enum {
*** 214,221 ****
      CRYPT_SUCCEED = TRUE,
  }
  
! bool RCRYPT_SUCCEEDED(BOOL r) { return r==CRYPT_SUCCEED; }
! bool RCRYPT_FAILED(BOOL r) { return r==CRYPT_FAILED; }
  
  enum {
      PP_ENUMALGS = 1,
--- 214,221 ----
      CRYPT_SUCCEED = TRUE,
  }
  
! bool RCRYPT_SUCCEEDED()(BOOL r) { return r==CRYPT_SUCCEED; }
! bool RCRYPT_FAILED()(BOOL r) { return r==CRYPT_FAILED; }
  
  enum {
      PP_ENUMALGS = 1,
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/core/sys/windows/winnt.d gcc-16-20260201/libphobos/libdruntime/core/sys/windows/winnt.d
*** gcc-16-20260125/libphobos/libdruntime/core/sys/windows/winnt.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/core/sys/windows/winnt.d	Sun Feb  1 22:32:17 2026
*************** enum : WORD {
*** 858,873 ****
  }
  
  pure nothrow @nogc {
!     WORD MAKELANGID(/*USHORT*/uint p, /*USHORT*/ uint s) { return cast(WORD)((s << 10) | p); }
!     WORD PRIMARYLANGID(/*WORD*/uint lgid) { return cast(WORD)(lgid & 0x3FF); }
!     WORD SUBLANGID(/*WORD*/uint lgid) { return cast(WORD)(lgid >>> 10); }
  
!     DWORD MAKELCID(/*WORD*/uint lgid, /*WORD*/uint srtid) { return (cast(DWORD) srtid << 16) | cast(DWORD) lgid; }
      // ???
!     //DWORD MAKESORTLCID(WORD lgid, WORD srtid, WORD ver) { return (MAKELCID(lgid, srtid)) | ((cast(DWORD)ver) << 20); }
!     WORD LANGIDFROMLCID(LCID lcid) { return cast(WORD) lcid; }
!     WORD SORTIDFROMLCID(LCID lcid) { return cast(WORD) ((lcid >>> 16) & 0x0F); }
!     WORD SORTVERSIONFROMLCID(LCID lcid) { return cast(WORD) ((lcid >>> 20) & 0x0F); }
  }
  
  enum WORD LANG_SYSTEM_DEFAULT = (SUBLANG_SYS_DEFAULT << 10) | LANG_NEUTRAL;
--- 858,873 ----
  }
  
  pure nothrow @nogc {
!     WORD MAKELANGID()(/*USHORT*/uint p, /*USHORT*/ uint s) { return cast(WORD)((s << 10) | p); }
!     WORD PRIMARYLANGID()(/*WORD*/uint lgid) { return cast(WORD)(lgid & 0x3FF); }
!     WORD SUBLANGID()(/*WORD*/uint lgid) { return cast(WORD)(lgid >>> 10); }
  
!     DWORD MAKELCID()(/*WORD*/uint lgid, /*WORD*/uint srtid) { return (cast(DWORD) srtid << 16) | cast(DWORD) lgid; }
      // ???
!     //DWORD MAKESORTLCID()(WORD lgid, WORD srtid, WORD ver) { return (MAKELCID(lgid, srtid)) | ((cast(DWORD)ver) << 20); }
!     WORD LANGIDFROMLCID()(LCID lcid) { return cast(WORD) lcid; }
!     WORD SORTIDFROMLCID()(LCID lcid) { return cast(WORD) ((lcid >>> 16) & 0x0F); }
!     WORD SORTVERSIONFROMLCID()(LCID lcid) { return cast(WORD) ((lcid >>> 20) & 0x0F); }
  }
  
  enum WORD LANG_SYSTEM_DEFAULT = (SUBLANG_SYS_DEFAULT << 10) | LANG_NEUTRAL;
*************** const TCHAR[]
*** 1555,1562 ****
  
  enum IMAGE_ORDINAL_FLAG32 = 0x80000000;
  
! ulong IMAGE_ORDINAL64(ulong Ordinal) { return Ordinal & 0xFFFF; }
! uint IMAGE_ORDINAL32(uint Ordinal)   { return Ordinal & 0xFFFF; }
  
  bool IMAGE_SNAP_BY_ORDINAL32(uint Ordinal) {
      return (Ordinal & IMAGE_ORDINAL_FLAG32) != 0;
--- 1555,1562 ----
  
  enum IMAGE_ORDINAL_FLAG32 = 0x80000000;
  
! ulong IMAGE_ORDINAL64()(ulong Ordinal) { return Ordinal & 0xFFFF; }
! uint IMAGE_ORDINAL32()(uint Ordinal)   { return Ordinal & 0xFFFF; }
  
  bool IMAGE_SNAP_BY_ORDINAL32(uint Ordinal) {
      return (Ordinal & IMAGE_ORDINAL_FLAG32) != 0;
*************** static if (_WIN32_WINNT >= 0x501) {
*** 1919,1928 ****
  }
  
  // Macros
! BYTE BTYPE(BYTE x) { return cast(BYTE) (x & N_BTMASK); }
! bool ISPTR(uint x) { return (x & N_TMASK) == (IMAGE_SYM_DTYPE_POINTER << N_BTSHFT); }
! bool ISFCN(uint x) { return (x & N_TMASK) == (IMAGE_SYM_DTYPE_FUNCTION << N_BTSHFT); }
! bool ISARY(uint x) { return (x & N_TMASK) == (IMAGE_SYM_DTYPE_ARRAY << N_BTSHFT); }
  bool ISTAG(uint x) {
      return x == IMAGE_SYM_CLASS_STRUCT_TAG
          || x == IMAGE_SYM_CLASS_UNION_TAG
--- 1919,1928 ----
  }
  
  // Macros
! BYTE BTYPE()(BYTE x) { return cast(BYTE) (x & N_BTMASK); }
! bool ISPTR()(uint x) { return (x & N_TMASK) == (IMAGE_SYM_DTYPE_POINTER << N_BTSHFT); }
! bool ISFCN()(uint x) { return (x & N_TMASK) == (IMAGE_SYM_DTYPE_FUNCTION << N_BTSHFT); }
! bool ISARY()(uint x) { return (x & N_TMASK) == (IMAGE_SYM_DTYPE_ARRAY << N_BTSHFT); }
  bool ISTAG(uint x) {
      return x == IMAGE_SYM_CLASS_STRUCT_TAG
          || x == IMAGE_SYM_CLASS_UNION_TAG
*************** uint INCREF(uint x) {
*** 1932,1938 ****
      return ((x & ~N_BTMASK) << N_TSHIFT) | (IMAGE_SYM_DTYPE_POINTER << N_BTSHFT)
        | (x & N_BTMASK);
  }
! uint DECREF(uint x) { return ((x >>> N_TSHIFT) & ~N_BTMASK) | (x & N_BTMASK); }
  
  enum DWORD TLS_MINIMUM_AVAILABLE = 64;
  
--- 1932,1938 ----
      return ((x & ~N_BTMASK) << N_TSHIFT) | (IMAGE_SYM_DTYPE_POINTER << N_BTSHFT)
        | (x & N_BTMASK);
  }
! uint DECREF()(uint x) { return ((x >>> N_TSHIFT) & ~N_BTMASK) | (x & N_BTMASK); }
  
  enum DWORD TLS_MINIMUM_AVAILABLE = 64;
  
*************** enum ULONG
*** 1948,1956 ****
  /*  Although these are semantically boolean, they are documented and
   *  implemented to return ULONG; this behaviour is preserved for compatibility
   */
! ULONG IsReparseTagMicrosoft(ULONG x)     { return x & 0x80000000; }
! ULONG IsReparseTagHighLatency(ULONG x)   { return x & 0x40000000; }
! ULONG IsReparseTagNameSurrogate(ULONG x) { return x & 0x20000000; }
  
  bool IsReparseTagValid(ULONG x) {
      return !(x & ~IO_REPARSE_TAG_VALID_VALUES) && (x > IO_REPARSE_TAG_RESERVED_RANGE);
--- 1948,1956 ----
  /*  Although these are semantically boolean, they are documented and
   *  implemented to return ULONG; this behaviour is preserved for compatibility
   */
! ULONG IsReparseTagMicrosoft()(ULONG x)     { return x & 0x80000000; }
! ULONG IsReparseTagHighLatency()(ULONG x)   { return x & 0x40000000; }
! ULONG IsReparseTagNameSurrogate()(ULONG x) { return x & 0x20000000; }
  
  bool IsReparseTagValid(ULONG x) {
      return !(x & ~IO_REPARSE_TAG_VALID_VALUES) && (x > IO_REPARSE_TAG_RESERVED_RANGE);
*************** struct IMAGE_RESOURCE_DIRECTORY_ENTRY {
*** 3380,3386 ****
  
      uint NameOffset()        { return Name & 0x7FFFFFFF; }
      bool NameIsString()      { return cast(bool)(Name & 0x80000000); }
!     uint OffsetToDirectory() { return OffsetToData & 0x7FFFFFFF; }
      bool DataIsDirectory()   { return cast(bool)(OffsetToData & 0x80000000); }
  
      uint NameOffset(uint n) {
--- 3380,3386 ----
  
      uint NameOffset()        { return Name & 0x7FFFFFFF; }
      bool NameIsString()      { return cast(bool)(Name & 0x80000000); }
!     uint OffsetToDirectory()() { return OffsetToData & 0x7FFFFFFF; }
      bool DataIsDirectory()   { return cast(bool)(OffsetToData & 0x80000000); }
  
      uint NameOffset(uint n) {
*************** struct IMAGE_CE_RUNTIME_FUNCTION_ENTRY {
*** 3498,3504 ****
  +/
      uint FuncLen()       { return (_bf >> 8) & 0x3FFFFF; }
      bool ThirtyTwoBit()  { return cast(bool)(_bf & 0x40000000); }
!     bool ExceptionFlag() { return cast(bool)(_bf & 0x80000000); }
  
      uint FuncLen(uint f) {
          _bf = (_bf & ~0x3FFFFF00) | ((f & 0x3FFFFF) << 8); return f & 0x3FFFFF;
--- 3498,3504 ----
  +/
      uint FuncLen()       { return (_bf >> 8) & 0x3FFFFF; }
      bool ThirtyTwoBit()  { return cast(bool)(_bf & 0x40000000); }
!     bool ExceptionFlag()() { return cast(bool)(_bf & 0x80000000); }
  
      uint FuncLen(uint f) {
          _bf = (_bf & ~0x3FFFFF00) | ((f & 0x3FFFFF) << 8); return f & 0x3FFFFF;
*************** struct FPO_DATA {
*** 3543,3550 ****
      ubyte cbRegs()  { return cast(ubyte)(_bf & 0x07); }
      bool fHasSEH()  { return cast(bool)(_bf & 0x08); }
      bool fUseBP()   { return cast(bool)(_bf & 0x10); }
!     bool reserved() { return cast(bool)(_bf & 0x20); }
!     ubyte cbFrame() { return cast(ubyte)(_bf >> 6); }
  
      ubyte cbRegs(ubyte c) {
          _bf = cast(ubyte) ((_bf & ~0x07) | (c & 0x07));
--- 3543,3550 ----
      ubyte cbRegs()  { return cast(ubyte)(_bf & 0x07); }
      bool fHasSEH()  { return cast(bool)(_bf & 0x08); }
      bool fUseBP()   { return cast(bool)(_bf & 0x10); }
!     bool reserved()() { return cast(bool)(_bf & 0x20); }
!     ubyte cbFrame()() { return cast(ubyte)(_bf >> 6); }
  
      ubyte cbRegs(ubyte c) {
          _bf = cast(ubyte) ((_bf & ~0x07) | (c & 0x07));
*************** struct PROCESSOR_POWER_POLICY_INFO {
*** 4108,4114 ****
      uint     _bf;
  
      bool AllowDemotion()  { return cast(bool)(_bf & 1); }
!     bool AllowPromotion() { return cast(bool)(_bf & 2); }
  
      bool AllowDemotion(bool a)  { _bf = (_bf & ~1) | a; return a; }
      bool AllowPromotion(bool a) { _bf = (_bf & ~2) | (a << 1); return a; }
--- 4108,4114 ----
      uint     _bf;
  
      bool AllowDemotion()  { return cast(bool)(_bf & 1); }
!     bool AllowPromotion()() { return cast(bool)(_bf & 2); }
  
      bool AllowDemotion(bool a)  { _bf = (_bf & ~1) | a; return a; }
      bool AllowPromotion(bool a) { _bf = (_bf & ~2) | (a << 1); return a; }
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/core/sys/windows/winuser.d gcc-16-20260201/libphobos/libdruntime/core/sys/windows/winuser.d
*** gcc-16-20260125/libphobos/libdruntime/core/sys/windows/winuser.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/core/sys/windows/winuser.d	Sun Feb  1 22:32:17 2026
*************** struct MENUBARINFO {
*** 3275,3284 ****
      byte bf_; // Simulated bitfield
  //  BOOL  fBarFocused:1;
  //  BOOL  fFocused:1;
!     bool fBarFocused()       { return (bf_ & 1) == 1; }
!     bool fFocused()          { return (bf_ & 2) == 2; }
!     bool fBarFocused(bool b) { bf_ = cast(byte) ((bf_ & 0xFE) | b);           return b; }
!     bool fFocused(bool b)    { bf_ = cast(byte) (b ? (bf_ | 2) : bf_ & 0xFD); return b; }
  }
  alias MENUBARINFO* PMENUBARINFO;
  
--- 3275,3284 ----
      byte bf_; // Simulated bitfield
  //  BOOL  fBarFocused:1;
  //  BOOL  fFocused:1;
!     bool fBarFocused()()       { return (bf_ & 1) == 1; }
!     bool fFocused()()          { return (bf_ & 2) == 2; }
!     bool fBarFocused()(bool b) { bf_ = cast(byte) ((bf_ & 0xFE) | b);           return b; }
!     bool fFocused()(bool b)    { bf_ = cast(byte) (b ? (bf_ | 2) : bf_ & 0xFD); return b; }
  }
  alias MENUBARINFO* PMENUBARINFO;
  
*************** int BroadcastSystemMessageW(DWORD, LPDWO
*** 4424,4432 ****
  UINT SendInput(UINT, LPINPUT, int);
  BOOL EnumDisplayMonitors(HDC, LPCRECT, MONITORENUMPROC, LPARAM);
  BOOL GetMonitorInfoA(HMONITOR, LPMONITORINFO);
! extern(D) BOOL GetMonitorInfoA(HMONITOR m, LPMONITORINFOEXA mi) { return GetMonitorInfoA(m, cast(LPMONITORINFO)mi); }
  BOOL GetMonitorInfoW(HMONITOR, LPMONITORINFO);
! extern(D) BOOL GetMonitorInfoW(HMONITOR m, LPMONITORINFOEXW mi) { return GetMonitorInfoW(m, cast(LPMONITORINFO)mi); }
  HMONITOR MonitorFromPoint(POINT, DWORD);
  HMONITOR MonitorFromRect(LPCRECT, DWORD);
  HMONITOR MonitorFromWindow(HWND, DWORD);
--- 4424,4432 ----
  UINT SendInput(UINT, LPINPUT, int);
  BOOL EnumDisplayMonitors(HDC, LPCRECT, MONITORENUMPROC, LPARAM);
  BOOL GetMonitorInfoA(HMONITOR, LPMONITORINFO);
! extern(D) BOOL GetMonitorInfoA()(HMONITOR m, LPMONITORINFOEXA mi) { return GetMonitorInfoA(m, cast(LPMONITORINFO)mi); }
  BOOL GetMonitorInfoW(HMONITOR, LPMONITORINFO);
! extern(D) BOOL GetMonitorInfoW()(HMONITOR m, LPMONITORINFOEXW mi) { return GetMonitorInfoW(m, cast(LPMONITORINFO)mi); }
  HMONITOR MonitorFromPoint(POINT, DWORD);
  HMONITOR MonitorFromRect(LPCRECT, DWORD);
  HMONITOR MonitorFromWindow(HWND, DWORD);
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/core/thread/threadbase.d gcc-16-20260201/libphobos/libdruntime/core/thread/threadbase.d
*** gcc-16-20260125/libphobos/libdruntime/core/thread/threadbase.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/core/thread/threadbase.d	Sun Feb  1 22:32:17 2026
*************** class ThreadBase
*** 136,141 ****
--- 136,145 ----
      package void tlsRTdataInit() nothrow @nogc
      {
          m_tlsrtdata = rt_tlsgc_init();
+ 
+         // Let the selected GC initialize anything it needs.
+         import core.internal.gc.proxy : gc_getProxy;
+         gc_getProxy().initThread(this);
      }
  
      package void initDataStorage() nothrow
*************** class ThreadBase
*** 149,154 ****
--- 153,162 ----
  
      package void destroyDataStorage() nothrow @nogc
      {
+         // allow the GC to clean up any resources it allocated for this thread.
+         import core.internal.gc.proxy : gc_getProxy;
+         gc_getProxy().cleanupThread(this);
+ 
          rt_tlsgc_destroy(m_tlsrtdata);
          m_tlsrtdata = null;
      }
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/core/volatile.d gcc-16-20260201/libphobos/libdruntime/core/volatile.d
*** gcc-16-20260125/libphobos/libdruntime/core/volatile.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/core/volatile.d	Sun Feb  1 22:32:17 2026
***************
*** 3,9 ****
   *
   * Copyright: Copyright © 2019, The D Language Foundation
   * License:   $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost License 1.0)
!  * Authors:   Walter Bright, Ernesto Castellotti
   * Source:    $(DRUNTIMESRC core/volatile.d)
   */
  
--- 3,9 ----
   *
   * Copyright: Copyright © 2019, The D Language Foundation
   * License:   $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost License 1.0)
!  * Authors:   Walter Bright, Emily Castellotti
   * Source:    $(DRUNTIMESRC core/volatile.d)
   */
  
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/object.d gcc-16-20260201/libphobos/libdruntime/object.d
*** gcc-16-20260125/libphobos/libdruntime/object.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/object.d	Sun Feb  1 22:32:17 2026
*************** class TypeInfo_AssociativeArray : TypeIn
*** 1301,1312 ****
  
      override bool equals(in void* p1, in void* p2) @trusted const
      {
!         return !!_aaEqual(this, *cast(const AA*) p1, *cast(const AA*) p2);
      }
  
      override hash_t getHash(scope const void* p) nothrow @trusted const
      {
!         return _aaGetHash(cast(AA*)p, this);
      }
  
      // BUG: need to add the rest of the functions
--- 1301,1312 ----
  
      override bool equals(in void* p1, in void* p2) @trusted const
      {
!         return xopEquals(p1, p2);
      }
  
      override hash_t getHash(scope const void* p) nothrow @trusted const
      {
!         return xtoHash(p);
      }
  
      // BUG: need to add the rest of the functions
*************** class TypeInfo_AssociativeArray : TypeIn
*** 1325,1340 ****
      override @property uint flags() nothrow pure const { return 1; }
  
      // TypeInfo entry is generated from the type of this template to help rt/aaA.d
!     static struct Entry(K, V)
!     {
!         K key;
!         V value;
!     }
  
      TypeInfo value;
      TypeInfo key;
      TypeInfo entry;
  
      override @property size_t talign() nothrow pure const
      {
          return (char[int]).alignof;
--- 1325,1343 ----
      override @property uint flags() nothrow pure const { return 1; }
  
      // TypeInfo entry is generated from the type of this template to help rt/aaA.d
!     private static import core.internal.newaa;
!     alias Entry(K, V) = core.internal.newaa.Entry!(K, V);
  
      TypeInfo value;
      TypeInfo key;
      TypeInfo entry;
  
+     bool function(scope const void* p1, scope const void* p2) nothrow @safe xopEquals;
+     hash_t function(scope const void*) nothrow @safe xtoHash;
+ 
+     alias aaOpEqual(K, V) = core.internal.newaa._aaOpEqual!(K, V);
+     alias aaGetHash(K, V) = core.internal.newaa._aaGetHash!(K, V);
+ 
      override @property size_t talign() nothrow pure const
      {
          return (char[int]).alignof;
*************** class TypeInfo_Delegate : TypeInfo
*** 1572,1579 ****
  }
  
  private extern (C) Object _d_newclass(const TypeInfo_Class ci);
! private extern (C) int _d_isbaseof(scope TypeInfo_Class child,
!     scope const TypeInfo_Class parent) @nogc nothrow pure @safe; // rt.cast_
  
  /**
   * Runtime type information about a class.
--- 1575,1631 ----
  }
  
  private extern (C) Object _d_newclass(const TypeInfo_Class ci);
! 
! extern(C) int _d_isbaseof(scope ClassInfo oc, scope const ClassInfo c) @nogc nothrow pure @safe
! {
!     import core.internal.cast_ : areClassInfosEqual;
! 
!     if (areClassInfosEqual(oc, c))
!         return true;
! 
!     do
!     {
!         if (oc.base && areClassInfosEqual(oc.base, c))
!             return true;
! 
!         // Bugzilla 2013: Use depth-first search to calculate offset
!         // from the derived (oc) to the base (c).
!         foreach (iface; oc.interfaces)
!         {
!             if (areClassInfosEqual(iface.classinfo, c) || _d_isbaseof(iface.classinfo, c))
!                 return true;
!         }
! 
!         oc = oc.base;
!     } while (oc);
! 
!     return false;
! }
! 
! /******************************************
!  * Given a pointer:
!  *      If it is an Object, return that Object.
!  *      If it is an interface, return the Object implementing the interface.
!  *      If it is null, return null.
!  *      Else, undefined crash
!  */
! extern(C) Object _d_toObject(return scope void* p) @nogc nothrow pure @trusted
! {
!     if (!p)
!         return null;
! 
!     Object o = cast(Object) p;
!     Interface* pi = **cast(Interface***) p;
! 
!     /* Interface.offset lines up with ClassInfo.name.ptr,
!      * so we rely on pointers never being less than 64K,
!      * and Objects never being greater.
!      */
!     if (pi.offset < 0x10000)
!         return cast(Object)(p - pi.offset);
! 
!     return o;
! }
  
  /**
   * Runtime type information about a class.
*************** class Throwable : Object
*** 2535,2542 ****
       * $(D Throwable) is thrown from inside a $(D catch) block. The originally
       * caught $(D Exception) will be chained to the new $(D Throwable) via this
       * field.
       */
!     private Throwable   nextInChain;
  
      private uint _refcount;     // 0 : allocated by GC
                                  // 1 : allocated by _d_newThrowable()
--- 2587,2613 ----
       * $(D Throwable) is thrown from inside a $(D catch) block. The originally
       * caught $(D Exception) will be chained to the new $(D Throwable) via this
       * field.
+      *
+      * If the 0 bit is set in this, it means the next exception is refcounted,
+      * meaning this object owns that object and should destroy it on
+      * destruction.
+      *
+      * WARNING: This means we are storing an interior pointer to the next in
+      * chain, to signify that the next in the chain is actually reference
+      * counted. We rely on the fact that a pointer to a Throwable is not 1-byte
+      * aligned. It is important to use a local field to indicate reference
+      * counting since we are not allowed to look at GC-allocated references
+      * inside the destructor. It is very important to store this as a void*,
+      * since optimizers can consider an unaligned pointer to not exist.
       */
!     private void*   _nextInChainPtr;
! 
!     private @property bool _nextIsRefcounted() @trusted scope pure nothrow @nogc const
!     {
!         if (__ctfe)
!             return false;
!         return (cast(size_t)_nextInChainPtr) & 1;
!     }
  
      private uint _refcount;     // 0 : allocated by GC
                                  // 1 : allocated by _d_newThrowable()
*************** class Throwable : Object
*** 2549,2572 ****
       * caught $(D Exception) will be chained to the new $(D Throwable) via this
       * field.
       */
!     @property inout(Throwable) next() @safe inout return scope pure nothrow @nogc { return nextInChain; }
  
      /**
       * Replace next in chain with `tail`.
       * Use `chainTogether` instead if at all possible.
       */
!     @property void next(Throwable tail) @safe scope pure nothrow @nogc
      {
          if (tail && tail._refcount)
              ++tail._refcount;           // increment the replacement *first*
  
!         auto n = nextInChain;
!         nextInChain = null;             // sever the tail before deleting it
  
!         if (n && n._refcount)
              _d_delThrowable(n);         // now delete the old tail
  
!         nextInChain = tail;             // and set the new tail
      }
  
      /**
--- 2620,2655 ----
       * caught $(D Exception) will be chained to the new $(D Throwable) via this
       * field.
       */
!     @property inout(Throwable) next() @trusted inout return scope pure nothrow @nogc
!     {
!         if (__ctfe)
!             return cast(inout(Throwable)) _nextInChainPtr;
! 
!         return cast(inout(Throwable)) (_nextInChainPtr - _nextIsRefcounted);
!     }
! 
  
      /**
       * Replace next in chain with `tail`.
       * Use `chainTogether` instead if at all possible.
       */
!     @property void next(Throwable tail) @trusted scope pure nothrow @nogc
      {
+         void* newTail = cast(void*)tail;
          if (tail && tail._refcount)
+         {
              ++tail._refcount;           // increment the replacement *first*
+             ++newTail;                  // indicate ref counting is used
+         }
  
!         auto n = next;
!         auto nrc = _nextIsRefcounted;
!         _nextInChainPtr = null;          // sever the tail before deleting it
  
!         if (nrc)
              _d_delThrowable(n);         // now delete the old tail
  
!         _nextInChainPtr = newTail;       // and set the new tail
      }
  
      /**
*************** class Throwable : Object
*** 2585,2591 ****
      int opApply(scope int delegate(Throwable) dg)
      {
          int result = 0;
!         for (Throwable t = this; t; t = t.nextInChain)
          {
              result = dg(t);
              if (result)
--- 2668,2674 ----
      int opApply(scope int delegate(Throwable) dg)
      {
          int result = 0;
!         for (Throwable t = this; t; t = t.next)
          {
              result = dg(t);
              if (result)
*************** class Throwable : Object
*** 2608,2621 ****
              return e2;
          if (!e2)
              return e1;
-         if (e2.refcount())
-             ++e2.refcount();
  
!         for (auto e = e1; 1; e = e.nextInChain)
          {
!             if (!e.nextInChain)
              {
!                 e.nextInChain = e2;
                  break;
              }
          }
--- 2691,2702 ----
              return e2;
          if (!e2)
              return e1;
  
!         for (auto e = e1; 1; e = e.next)
          {
!             if (!e.next)
              {
!                 e.next = e2;
                  break;
              }
          }
*************** class Throwable : Object
*** 2625,2633 ****
      @nogc @safe pure nothrow this(string msg, Throwable nextInChain = null)
      {
          this.msg = msg;
!         this.nextInChain = nextInChain;
!         if (nextInChain && nextInChain._refcount)
!             ++nextInChain._refcount;
          //this.info = _d_traceContext();
      }
  
--- 2706,2712 ----
      @nogc @safe pure nothrow this(string msg, Throwable nextInChain = null)
      {
          this.msg = msg;
!         this.next = nextInChain;
          //this.info = _d_traceContext();
      }
  
*************** class Throwable : Object
*** 2641,2648 ****
  
      @trusted nothrow ~this()
      {
!         if (nextInChain && nextInChain._refcount)
!             _d_delThrowable(nextInChain);
          // handle owned traceinfo
          if (infoDeallocator !is null)
          {
--- 2720,2728 ----
  
      @trusted nothrow ~this()
      {
!         if (_nextIsRefcounted)
!             _d_delThrowable(next);
! 
          // handle owned traceinfo
          if (infoDeallocator !is null)
          {
*************** class Exception : Throwable
*** 2771,2777 ****
          auto e = new Exception("msg");
          assert(e.file == __FILE__);
          assert(e.line == __LINE__ - 2);
!         assert(e.nextInChain is null);
          assert(e.msg == "msg");
      }
  
--- 2851,2857 ----
          auto e = new Exception("msg");
          assert(e.file == __FILE__);
          assert(e.line == __LINE__ - 2);
!         assert(e._nextInChainPtr is null);
          assert(e.msg == "msg");
      }
  
*************** class Exception : Throwable
*** 2779,2785 ****
          auto e = new Exception("msg", new Exception("It's an Exception!"), "hello", 42);
          assert(e.file == "hello");
          assert(e.line == 42);
!         assert(e.nextInChain !is null);
          assert(e.msg == "msg");
      }
  
--- 2859,2865 ----
          auto e = new Exception("msg", new Exception("It's an Exception!"), "hello", 42);
          assert(e.file == "hello");
          assert(e.line == 42);
!         assert(e._nextInChainPtr !is null);
          assert(e.msg == "msg");
      }
  
*************** class Exception : Throwable
*** 2787,2793 ****
          auto e = new Exception("msg", "hello", 42, new Exception("It's an Exception!"));
          assert(e.file == "hello");
          assert(e.line == 42);
!         assert(e.nextInChain !is null);
          assert(e.msg == "msg");
      }
  
--- 2867,2873 ----
          auto e = new Exception("msg", "hello", 42, new Exception("It's an Exception!"));
          assert(e.file == "hello");
          assert(e.line == 42);
!         assert(e._nextInChainPtr !is null);
          assert(e.msg == "msg");
      }
  
*************** class Error : Throwable
*** 2854,2860 ****
          auto e = new Error("msg");
          assert(e.file is null);
          assert(e.line == 0);
!         assert(e.nextInChain is null);
          assert(e.msg == "msg");
          assert(e.bypassedException is null);
      }
--- 2934,2940 ----
          auto e = new Error("msg");
          assert(e.file is null);
          assert(e.line == 0);
!         assert(e._nextInChainPtr is null);
          assert(e.msg == "msg");
          assert(e.bypassedException is null);
      }
*************** class Error : Throwable
*** 2863,2869 ****
          auto e = new Error("msg", new Exception("It's an Exception!"));
          assert(e.file is null);
          assert(e.line == 0);
!         assert(e.nextInChain !is null);
          assert(e.msg == "msg");
          assert(e.bypassedException is null);
      }
--- 2943,2949 ----
          auto e = new Error("msg", new Exception("It's an Exception!"));
          assert(e.file is null);
          assert(e.line == 0);
!         assert(e._nextInChainPtr !is null);
          assert(e.msg == "msg");
          assert(e.bypassedException is null);
      }
*************** class Error : Throwable
*** 2872,2931 ****
          auto e = new Error("msg", "hello", 42, new Exception("It's an Exception!"));
          assert(e.file == "hello");
          assert(e.line == 42);
!         assert(e.nextInChain !is null);
          assert(e.msg == "msg");
          assert(e.bypassedException is null);
      }
  }
  
! extern (C)
! {
!     // from druntime/src/rt/aaA.d
! 
!     private struct AA { void* impl; }
!     // size_t _aaLen(in AA aa) pure nothrow @nogc;
!     private void* _aaGetY(scope AA* paa, const TypeInfo_AssociativeArray ti, const size_t valsz, const scope void* pkey) pure nothrow;
!     private void* _aaGetX(scope AA* paa, const TypeInfo_AssociativeArray ti, const size_t valsz, const scope void* pkey, out bool found) pure nothrow;
!     // inout(void)* _aaGetRvalueX(inout AA aa, in TypeInfo keyti, in size_t valsz, in void* pkey);
!     inout(void[]) _aaValues(inout AA aa, const size_t keysz, const size_t valsz, const TypeInfo tiValueArray) pure nothrow;
!     inout(void[]) _aaKeys(inout AA aa, const size_t keysz, const TypeInfo tiKeyArray) pure nothrow;
!     void* _aaRehash(AA* paa, const scope TypeInfo keyti) pure nothrow;
!     void _aaClear(AA aa) pure nothrow;
! 
!     // alias _dg_t = extern(D) int delegate(void*);
!     // int _aaApply(AA aa, size_t keysize, _dg_t dg);
! 
!     // alias _dg2_t = extern(D) int delegate(void*, void*);
!     // int _aaApply2(AA aa, size_t keysize, _dg2_t dg);
! 
!     private struct AARange { AA impl; size_t idx; }
!     AARange _aaRange(AA aa) pure nothrow @nogc @safe;
!     bool _aaRangeEmpty(AARange r) pure nothrow @nogc @safe;
!     void* _aaRangeFrontKey(AARange r) pure nothrow @nogc @safe;
!     void* _aaRangeFrontValue(AARange r) pure nothrow @nogc @safe;
!     void _aaRangePopFront(ref AARange r) pure nothrow @nogc @safe;
! 
!     int _aaEqual(scope const TypeInfo tiRaw, scope const AA aa1, scope const AA aa2);
!     hash_t _aaGetHash(scope const AA* aa, scope const TypeInfo tiRaw) nothrow;
  
!     /*
!         _d_assocarrayliteralTX marked as pure, because aaLiteral can be called from pure code.
!         This is a typesystem hole, however this is existing hole.
!         Early compiler didn't check purity of toHash or postblit functions, if key is a UDT thus
!         copiler allowed to create AA literal with keys, which have impure unsafe toHash methods.
!     */
!     void* _d_assocarrayliteralTX(const TypeInfo_AssociativeArray ti, void[] keys, void[] values) pure;
! }
  
! void* aaLiteral(Key, Value)(Key[] keys, Value[] values) @trusted pure
  {
!     return _d_assocarrayliteralTX(typeid(Value[Key]), *cast(void[]*)&keys, *cast(void[]*)&values);
  }
  
  // Lower an Associative Array to a newaa struct for static initialization.
  auto _aaAsStruct(K, V)(V[K] aa) @safe
  {
-     import core.internal.newaa : makeAA;
      assert(__ctfe);
      return makeAA!(K, V)(aa);
  }
--- 2952,2978 ----
          auto e = new Error("msg", "hello", 42, new Exception("It's an Exception!"));
          assert(e.file == "hello");
          assert(e.line == 42);
!         assert(e._nextInChainPtr !is null);
          assert(e.msg == "msg");
          assert(e.bypassedException is null);
      }
  }
  
! public import core.internal.newaa : _d_aaIn, _d_aaDel, _d_aaNew, _d_aaEqual, _d_assocarrayliteralTX;
! public import core.internal.newaa : _d_aaLen, _d_aaGetY, _d_aaGetRvalueX, _d_aaApply, _d_aaApply2;
! // public import core.exception : onRangeError; // causes extra messages with -transition=fields
! extern (C) noreturn _d_arraybounds(string file, uint line) @trusted pure nothrow @nogc;
  
! private import core.internal.newaa;
  
! void* aaLiteral(Key, Value)(Key[] keys, Value[] values)
  {
!     return _d_assocarrayliteralTX(keys, values);
  }
  
  // Lower an Associative Array to a newaa struct for static initialization.
  auto _aaAsStruct(K, V)(V[K] aa) @safe
  {
      assert(__ctfe);
      return makeAA!(K, V)(aa);
  }
*************** alias AssociativeArray(Key, Value) = Val
*** 2939,2951 ****
   */
  void clear(Value, Key)(Value[Key] aa) @trusted
  {
!     _aaClear(*cast(AA *) &aa);
  }
  
  /** ditto */
  void clear(Value, Key)(Value[Key]* aa) @trusted
  {
!     _aaClear(*cast(AA *) aa);
  }
  
  ///
--- 2986,2998 ----
   */
  void clear(Value, Key)(Value[Key] aa) @trusted
  {
!     _aaClear(aa);
  }
  
  /** ditto */
  void clear(Value, Key)(Value[Key]* aa) @trusted
  {
!     (*aa).clear();
  }
  
  ///
*************** void clear(Value, Key)(Value[Key]* aa) @
*** 2982,3013 ****
   *      aa =     The associative array.
   * Returns:
   *      The rehashed associative array.
   */
! T rehash(T : Value[Key], Value, Key)(T aa)
  {
!     _aaRehash(cast(AA*)&aa, typeid(Value[Key]));
!     return aa;
  }
  
  /** ditto */
! T rehash(T : Value[Key], Value, Key)(T* aa)
  {
!     _aaRehash(cast(AA*)aa, typeid(Value[Key]));
!     return *aa;
  }
  
  /** ditto */
! T rehash(T : shared Value[Key], Value, Key)(T aa)
  {
!     _aaRehash(cast(AA*)&aa, typeid(Value[Key]));
!     return aa;
  }
  
  /** ditto */
! T rehash(T : shared Value[Key], Value, Key)(T* aa)
  {
!     _aaRehash(cast(AA*)aa, typeid(Value[Key]));
!     return *aa;
  }
  
  /***********************************
--- 3029,3058 ----
   *      aa =     The associative array.
   * Returns:
   *      The rehashed associative array.
+  * Note:
+  *  emulated by the compiler during CTFE
   */
! Value[Key] rehash(Value, Key)(Value[Key] aa)
  {
!     return _aaRehash(aa);
  }
  
  /** ditto */
! Value[Key] rehash(T : Value[Key], Value, Key)(T* aa)
  {
!     return (*aa).rehash(); // CTFE only intercepts the non-pointer overload
  }
  
  /** ditto */
! Value[Key] rehash(T : shared Value[Key], Value, Key)(auto ref T aa)
  {
!     return (cast(Value[Key])aa).rehash();  // CTFE only intercepts the V[K] overload
  }
  
  /** ditto */
! Value[Key] rehash(T : shared Value[Key], Value, Key)(T* aa)
  {
!     return (cast(Value[Key])*aa).rehash(); // CTFE only intercepts the non-pointer overload
  }
  
  /***********************************
*************** T rehash(T : shared Value[Key], Value, K
*** 3015,3060 ****
   * the associative array into it.
   * Params:
   *      aa =     The associative array.
   */
! V[K] dup(T : V[K], K, V)(T aa)
  {
-     //pragma(msg, "K = ", K, ", V = ", V);
- 
      // Bug10720 - check whether V is copyable
      static assert(is(typeof({ V v = aa[K.init]; })),
          "cannot call " ~ T.stringof ~ ".dup because " ~ V.stringof ~ " is not copyable");
  
!     V[K] result;
! 
!     //foreach (k, ref v; aa)
!     //    result[k] = v;  // Bug13701 - won't work if V is not mutable
! 
!     ref V duplicateElem(ref K k, ref const V v) @trusted pure nothrow
!     {
!         import core.stdc.string : memcpy;
! 
!         void* pv = _aaGetY(cast(AA*)&result, typeid(V[K]), V.sizeof, &k);
!         memcpy(pv, &v, V.sizeof);
!         return *cast(V*)pv;
!     }
! 
!     foreach (k, ref v; aa)
!     {
!         static if (!__traits(hasPostblit, V))
!             duplicateElem(k, v);
!         else static if (__traits(isStaticArray, V))
!             _doPostblit(duplicateElem(k, v)[]);
!         else static if (!is(typeof(v.__xpostblit())) && is(immutable V == immutable UV, UV))
!             (() @trusted => *cast(UV*) &duplicateElem(k, v))().__xpostblit();
!         else
!             duplicateElem(k, v).__xpostblit();
!     }
! 
!     return result;
  }
  
  /** ditto */
! V[K] dup(T : V[K], K, V)(T* aa)
  {
      return (*aa).dup;
  }
--- 3060,3079 ----
   * the associative array into it.
   * Params:
   *      aa =     The associative array.
+  * Note:
+  *  emulated by the compiler during CTFE
   */
! auto dup(T : V[K], K, V)(T aa)
  {
      // Bug10720 - check whether V is copyable
      static assert(is(typeof({ V v = aa[K.init]; })),
          "cannot call " ~ T.stringof ~ ".dup because " ~ V.stringof ~ " is not copyable");
  
!     return _aaDup(aa);
  }
  
  /** ditto */
! auto dup(T : V[K], K, V)(T* aa)
  {
      return (*aa).dup;
  }
*************** V[K] dup(T : V[K], K, V)(T* aa)
*** 3069,3082 ****
  }
  
  // this should never be made public.
! private AARange _aaToRange(T: V[K], K, V)(ref T aa) pure nothrow @nogc @safe
  {
!     // ensure we are dealing with a genuine AA.
!     static if (is(const(V[K]) == const(T)))
!         alias realAA = aa;
!     else
!         const(V[K]) realAA = aa;
!     return _aaRange(() @trusted { return *cast(AA*)&realAA; } ());
  }
  
  /***********************************
--- 3088,3101 ----
  }
  
  // this should never be made public.
! private auto _aaToRange(K, V)(auto ref inout V[K] aa) @trusted
  {
!     import core.internal.traits : substInout;
! 
!     alias K2 = substInout!K;
!     alias V2 = substInout!V;
!     auto aa2 = cast(V2[K2])aa;
!     return _aaRange(aa2);
  }
  
  /***********************************
*************** auto byKey(T : V[K], K, V)(T aa) pure no
*** 3106,3130 ****
  {
      import core.internal.traits : substInout;
  
      static struct Result
      {
!         AARange r;
  
      pure nothrow @nogc:
          @property bool empty()  @safe { return _aaRangeEmpty(r); }
          @property ref front() @trusted
          {
!             return *cast(substInout!K*) _aaRangeFrontKey(r);
          }
          void popFront() @safe { _aaRangePopFront(r); }
          @property Result save() { return this; }
      }
  
!     return Result(_aaToRange(aa));
  }
  
  /** ditto */
! auto byKey(T : V[K], K, V)(T* aa) pure nothrow @nogc
  {
      return (*aa).byKey();
  }
--- 3125,3151 ----
  {
      import core.internal.traits : substInout;
  
+     const(V[K]) aa2 = aa;
+ 
      static struct Result
      {
!         typeof(_aaToRange(aa2)) r;
  
      pure nothrow @nogc:
          @property bool empty()  @safe { return _aaRangeEmpty(r); }
          @property ref front() @trusted
          {
!             return *cast(substInout!K*)_aaRangeFrontKey(r);
          }
          void popFront() @safe { _aaRangePopFront(r); }
          @property Result save() { return this; }
      }
  
!     return Result(_aaToRange(aa2));
  }
  
  /** ditto */
! auto byKey(K, V)(V[K]* aa) pure nothrow @nogc
  {
      return (*aa).byKey();
  }
*************** auto byValue(T : V[K], K, V)(T aa) pure
*** 3167,3191 ****
  {
      import core.internal.traits : substInout;
  
      static struct Result
      {
!         AARange r;
  
      pure nothrow @nogc:
          @property bool empty() @safe { return _aaRangeEmpty(r); }
          @property ref front() @trusted
          {
!             return *cast(substInout!V*) _aaRangeFrontValue(r);
          }
          void popFront() @safe { _aaRangePopFront(r); }
          @property Result save() { return this; }
      }
  
!     return Result(_aaToRange(aa));
  }
  
  /** ditto */
! auto byValue(T : V[K], K, V)(T* aa) pure nothrow @nogc
  {
      return (*aa).byValue();
  }
--- 3188,3214 ----
  {
      import core.internal.traits : substInout;
  
+     const(V[K]) aa2 = aa;
+ 
      static struct Result
      {
!         typeof(_aaToRange(aa2)) r;
  
      pure nothrow @nogc:
          @property bool empty() @safe { return _aaRangeEmpty(r); }
          @property ref front() @trusted
          {
!             return *cast(substInout!V*)_aaRangeFrontValue(r);
          }
          void popFront() @safe { _aaRangePopFront(r); }
          @property Result save() { return this; }
      }
  
!     return Result(_aaToRange(aa2));
  }
  
  /** ditto */
! auto byValue(K, V)(V[K]* aa) pure nothrow @nogc
  {
      return (*aa).byValue();
  }
*************** auto byKeyValue(T : V[K], K, V)(T aa) pu
*** 3240,3248 ****
  {
      import core.internal.traits : substInout;
  
      static struct Result
      {
!         AARange r;
  
      pure nothrow @nogc:
          @property bool empty() @safe { return _aaRangeEmpty(r); }
--- 3263,3273 ----
  {
      import core.internal.traits : substInout;
  
+     const(V[K]) aa2 = aa;
+ 
      static struct Result
      {
!         typeof(_aaToRange(aa2)) r;
  
      pure nothrow @nogc:
          @property bool empty() @safe { return _aaRangeEmpty(r); }
*************** auto byKeyValue(T : V[K], K, V)(T aa) pu
*** 3252,3267 ****
              {
                  // We save the pointers here so that the Pair we return
                  // won't mutate when Result.popFront is called afterwards.
!                 private void* keyp;
!                 private void* valp;
  
                  @property ref key() inout @trusted
                  {
!                     return *cast(substInout!K*) keyp;
                  }
                  @property ref value() inout @trusted
                  {
!                     return *cast(substInout!V*) valp;
                  }
              }
              return Pair(_aaRangeFrontKey(r),
--- 3277,3292 ----
              {
                  // We save the pointers here so that the Pair we return
                  // won't mutate when Result.popFront is called afterwards.
!                 private const(substInout!K)* keyp;
!                 private const(substInout!V)* valp;
  
                  @property ref key() inout @trusted
                  {
!                     return *cast(K*)keyp;
                  }
                  @property ref value() inout @trusted
                  {
!                     return *cast(V*)valp;
                  }
              }
              return Pair(_aaRangeFrontKey(r),
*************** auto byKeyValue(T : V[K], K, V)(T aa) pu
*** 3271,3277 ****
          @property Result save() { return this; }
      }
  
!     return Result(_aaToRange(aa));
  }
  
  /** ditto */
--- 3296,3302 ----
          @property Result save() { return this; }
      }
  
!     return Result(_aaToRange(aa2));
  }
  
  /** ditto */
*************** auto byKeyValue(T : V[K], K, V)(T* aa) p
*** 3304,3330 ****
   *      aa =     The associative array.
   * Returns:
   *      A dynamic array containing a copy of the keys.
   */
! Key[] keys(T : Value[Key], Value, Key)(T aa) @property
  {
!     // ensure we are dealing with a genuine AA.
!     static if (is(const(Value[Key]) == const(T)))
!         alias realAA = aa;
!     else
!         const(Value[Key]) realAA = aa;
!     auto res = () @trusted {
!         auto a = cast(void[])_aaKeys(*cast(inout(AA)*)&realAA, Key.sizeof, typeid(Key[]));
!         return *cast(Key[]*)&a;
!     }();
!     static if (__traits(hasPostblit, Key))
!         _doPostblit(res);
!     return res;
  }
  
  /** ditto */
! Key[] keys(T : Value[Key], Value, Key)(T *aa) @property
  {
!     return (*aa).keys;
  }
  
  ///
--- 3329,3346 ----
   *      aa =     The associative array.
   * Returns:
   *      A dynamic array containing a copy of the keys.
+  * Note:
+  *  emulated by the compiler during CTFE
   */
! auto keys(Value, Key)(inout Value[Key] aa) @property
  {
!     return _aaKeys!(Key, Value)(aa);
  }
  
  /** ditto */
! auto keys(T : Value[Key], Value, Key)(T *aa) @property
  {
!     return (*aa).keys; // CTFE only intercepts the non-pointer overload
  }
  
  ///
*************** Key[] keys(T : Value[Key], Value, Key)(T
*** 3388,3414 ****
   *      aa =     The associative array.
   * Returns:
   *      A dynamic array containing a copy of the values.
   */
! Value[] values(T : Value[Key], Value, Key)(T aa) @property
  {
!     // ensure we are dealing with a genuine AA.
!     static if (is(const(Value[Key]) == const(T)))
!         alias realAA = aa;
!     else
!         const(Value[Key]) realAA = aa;
!     auto res = () @trusted {
!         auto a = cast(void[])_aaValues(*cast(inout(AA)*)&realAA, Key.sizeof, Value.sizeof, typeid(Value[]));
!         return *cast(Value[]*)&a;
!     }();
!     static if (__traits(hasPostblit, Value))
!         _doPostblit(res);
!     return res;
  }
  
  /** ditto */
! Value[] values(T : Value[Key], Value, Key)(T *aa) @property
  {
!     return (*aa).values;
  }
  
  ///
--- 3404,3421 ----
   *      aa =     The associative array.
   * Returns:
   *      A dynamic array containing a copy of the values.
+  * Note:
+  *  emulated by the compiler during CTFE
   */
! auto values(Value, Key)(inout Value[Key] aa) @property
  {
!     return _aaValues!(Key, Value)(aa);
  }
  
  /** ditto */
! auto values(T : Value[Key], Value, Key)(T *aa) @property
  {
!     return (*aa).values; // CTFE only intercepts the non-pointer overload
  }
  
  ///
*************** inout(V) get(K, V)(inout(V[K])* aa, K ke
*** 3508,3532 ****
  ref V require(K, V)(ref V[K] aa, K key, lazy V value = V.init)
  {
      bool found;
!     // if key is @safe-ly copyable, `require` can infer @safe
!     static if (isSafeCopyable!K)
!     {
!         auto p = () @trusted
!         {
!             return cast(V*) _aaGetX(cast(AA*) &aa, typeid(V[K]), V.sizeof, &key, found);
!         } ();
!     }
!     else
!     {
!         auto p = cast(V*) _aaGetX(cast(AA*) &aa, typeid(V[K]), V.sizeof, &key, found);
!     }
      if (found)
          return *p;
!     else
!     {
!         *p = value; // Not `return (*p = value)` since if `=` is overloaded
!         return *p;  // this might not return a ref to the left-hand side.
!     }
  }
  
  ///
--- 3515,3525 ----
  ref V require(K, V)(ref V[K] aa, K key, lazy V value = V.init)
  {
      bool found;
!     auto p = _aaGetX(aa, key, found);
      if (found)
          return *p;
!     *p = value; // Not `return (*p = value)` since if `=` is overloaded
!     return *p;  // this might not return a ref to the left-hand side.
  }
  
  ///
*************** private enum bool isSafeCopyable(T) = is
*** 3545,3551 ****
   * Calls `create` if `key` doesn't exist in the associative array,
   * otherwise calls `update`.
   * `create` returns a corresponding value for `key`.
!  * `update` accepts a key parameter. If it returns a value, the value is
   * set for `key`.
   * Params:
   *      aa =     The associative array.
--- 3538,3544 ----
   * Calls `create` if `key` doesn't exist in the associative array,
   * otherwise calls `update`.
   * `create` returns a corresponding value for `key`.
!  * `update` accepts a value parameter. If it returns a value, the value is
   * set for `key`.
   * Params:
   *      aa =     The associative array.
*************** private enum bool isSafeCopyable(T) = is
*** 3553,3576 ****
   *      create = The callable to create a value for `key`.
   *               Must return V.
   *      update = The callable to call if `key` exists.
!  *               Takes a K argument, returns a V or void.
   */
  void update(K, V, C, U)(ref V[K] aa, K key, scope C create, scope U update)
  if (is(typeof(create()) : V) && (is(typeof(update(aa[K.init])) : V) || is(typeof(update(aa[K.init])) == void)))
  {
      bool found;
!     // if key is @safe-ly copyable, `update` may infer @safe
!     static if (isSafeCopyable!K)
!     {
!         auto p = () @trusted
!         {
!             return cast(V*) _aaGetX(cast(AA*) &aa, typeid(V[K]), V.sizeof, &key, found);
!         } ();
!     }
!     else
!     {
!         auto p = cast(V*) _aaGetX(cast(AA*) &aa, typeid(V[K]), V.sizeof, &key, found);
!     }
      if (!found)
          *p = create();
      else
--- 3546,3558 ----
   *      create = The callable to create a value for `key`.
   *               Must return V.
   *      update = The callable to call if `key` exists.
!  *               Takes a V argument, returns a V or void.
   */
  void update(K, V, C, U)(ref V[K] aa, K key, scope C create, scope U update)
  if (is(typeof(create()) : V) && (is(typeof(update(aa[K.init])) : V) || is(typeof(update(aa[K.init])) == void)))
  {
      bool found;
!     auto p = _aaGetX(aa, key, found);
      if (!found)
          *p = create();
      else
*************** private size_t getArrayHash(const scope
*** 3901,3909 ****
      assert(s == "abc");
  }
  
  // HACK:  This is a lie.  `_d_arraysetcapacity` is neither `nothrow` nor `pure`, but this lie is
  // necessary for now to prevent breaking code.
! private extern (C) size_t _d_arraysetcapacity(const TypeInfo ti, size_t newcapacity, void[]* arrptr) pure nothrow;
  
  /**
  (Property) Gets the current _capacity of a slice. The _capacity is the size
--- 3883,3893 ----
      assert(s == "abc");
  }
  
+ 
  // HACK:  This is a lie.  `_d_arraysetcapacity` is neither `nothrow` nor `pure`, but this lie is
  // necessary for now to prevent breaking code.
! import core.internal.array.capacity : _d_arraysetcapacityPureNothrow;
! import core.internal.traits: Unqual;
  
  /**
  (Property) Gets the current _capacity of a slice. The _capacity is the size
*************** Note: The _capacity of a slice may be im
*** 3918,3924 ****
  */
  @property size_t capacity(T)(T[] arr) pure nothrow @trusted
  {
!     return _d_arraysetcapacity(typeid(T[]), 0, cast(void[]*)&arr);
  }
  
  ///
--- 3902,3911 ----
  */
  @property size_t capacity(T)(T[] arr) pure nothrow @trusted
  {
!     const isshared = is(T == shared);
!     alias Unqual_T = Unqual!T;
!     // The postblit of T may be impure, so we need to use the `pure nothrow` wrapper
!     return _d_arraysetcapacityPureNothrow!Unqual_T(0, cast(void[]*)&arr, isshared);
  }
  
  ///
*************** size_t reserve(T)(ref T[] arr, size_t ne
*** 3957,3963 ****
      if (__ctfe)
          return newcapacity;
      else
!         return _d_arraysetcapacity(typeid(T[]), newcapacity, cast(void[]*)&arr);
  }
  
  ///
--- 3944,3955 ----
      if (__ctfe)
          return newcapacity;
      else
!     {
!         const isshared = is(T == shared);
!         alias Unqual_T = Unqual!T;
!         // The postblit of T may be impure, so we need to use the `pure nothrow` wrapper
!         return _d_arraysetcapacityPureNothrow!Unqual_T(newcapacity, cast(void[]*)&arr, isshared);
!     }
  }
  
  ///
*************** size_t reserve(T)(ref T[] arr, size_t ne
*** 4000,4009 ****
      a.reserve(10);
  }
  
- // HACK:  This is a lie.  `_d_arrayshrinkfit` is not `nothrow`, but this lie is necessary
- // for now to prevent breaking code.
- private extern (C) void _d_arrayshrinkfit(const TypeInfo ti, void[] arr) nothrow;
- 
  /**
  Assume that it is safe to append to this array. Appends made to this array
  after calling this function may append in place, even if the array was a
--- 3992,3997 ----
*************** Returns:
*** 4021,4027 ****
  */
  auto ref inout(T[]) assumeSafeAppend(T)(auto ref inout(T[]) arr) nothrow @system
  {
!     _d_arrayshrinkfit(typeid(T[]), *(cast(void[]*)&arr));
      return arr;
  }
  
--- 4009,4021 ----
  */
  auto ref inout(T[]) assumeSafeAppend(T)(auto ref inout(T[]) arr) nothrow @system
  {
!     import core.internal.array.capacity : _d_arrayshrinkfit;
!     import core.internal.traits : Unqual;
! 
!     alias Unqual_Tarr = Unqual!T[];
!     enum isshared = is(T == shared);
!     _d_arrayshrinkfit(cast(Unqual_Tarr)arr, isshared);
! 
      return arr;
  }
  
*************** version (D_ProfileGC)
*** 4692,4697 ****
--- 4686,4693 ----
      public import core.lifetime : _d_newitemTTrace;
      public import core.internal.array.construction : _d_newarrayTTrace;
      public import core.internal.array.construction : _d_newarraymTXTrace;
+     public import core.internal.array.capacity: _d_arraysetlengthTTrace;
+     public import core.internal.array.construction : _d_arrayliteralTXTrace;
  }
  public import core.internal.array.appending : _d_arrayappendcTX;
  public import core.internal.array.comparison : __cmp;
*************** public import core.internal.array.constr
*** 4702,4711 ****
  public import core.internal.array.construction : _d_arraysetctor;
  public import core.internal.array.construction : _d_newarrayT;
  public import core.internal.array.construction : _d_newarraymTX;
  public import core.internal.array.arrayassign : _d_arrayassign_l;
  public import core.internal.array.arrayassign : _d_arrayassign_r;
  public import core.internal.array.arrayassign : _d_arraysetassign;
! public import core.internal.array.capacity: _d_arraysetlengthTImpl;
  
  public import core.internal.dassert: _d_assert_fail;
  
--- 4698,4709 ----
  public import core.internal.array.construction : _d_arraysetctor;
  public import core.internal.array.construction : _d_newarrayT;
  public import core.internal.array.construction : _d_newarraymTX;
+ public import core.internal.array.construction : _d_arrayliteralTX;
  public import core.internal.array.arrayassign : _d_arrayassign_l;
  public import core.internal.array.arrayassign : _d_arrayassign_r;
  public import core.internal.array.arrayassign : _d_arraysetassign;
! public import core.internal.array.capacity : _d_arraysetlengthT;
! public import core.internal.cast_: _d_cast;
  
  public import core.internal.dassert: _d_assert_fail;
  
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/rt/aaA.d gcc-16-20260201/libphobos/libdruntime/rt/aaA.d
*** gcc-16-20260125/libphobos/libdruntime/rt/aaA.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/rt/aaA.d	Thu Jan  1 00:00:00 1970
***************
*** 1,867 ****
- /**
-  * Implementation of associative arrays.
-  *
-  * Copyright: Copyright Digital Mars 2000 - 2015.
-  * License:   $(HTTP www.boost.org/LICENSE_1_0.txt, Boost License 1.0).
-  * Authors:   Martin Nowak
-  * Source: $(DRUNTIMESRC rt/_aaA.d)
-  */
- module rt.aaA;
- 
- /// AA version for debuggers, bump whenever changing the layout
- extern (C) immutable int _aaVersion = 1;
- 
- import core.memory : GC;
- import core.internal.util.math : min, max;
- 
- // grow threshold
- private enum GROW_NUM = 4;
- private enum GROW_DEN = 5;
- // shrink threshold
- private enum SHRINK_NUM = 1;
- private enum SHRINK_DEN = 8;
- // grow factor
- private enum GROW_FAC = 4;
- // growing the AA doubles it's size, so the shrink threshold must be
- // smaller than half the grow threshold to have a hysteresis
- static assert(GROW_FAC * SHRINK_NUM * GROW_DEN < GROW_NUM * SHRINK_DEN);
- // initial load factor (for literals), mean of both thresholds
- private enum INIT_NUM = (GROW_DEN * SHRINK_NUM + GROW_NUM * SHRINK_DEN) / 2;
- private enum INIT_DEN = SHRINK_DEN * GROW_DEN;
- 
- private enum INIT_NUM_BUCKETS = 8;
- // magic hash constants to distinguish empty, deleted, and filled buckets
- private enum HASH_EMPTY = 0;
- private enum HASH_DELETED = 0x1;
- private enum HASH_FILLED_MARK = size_t(1) << 8 * size_t.sizeof - 1;
- 
- /// Opaque AA wrapper
- struct AA
- {
-     Impl* impl;
-     alias impl this;
- 
-     private @property bool empty() const pure nothrow @nogc @safe
-     {
-         return impl is null || !impl.length;
-     }
- }
- 
- private struct Impl
- {
- private:
-     this(scope const TypeInfo_AssociativeArray ti, size_t sz = INIT_NUM_BUCKETS) nothrow
-     {
-         keysz = cast(uint) ti.key.tsize;
-         valsz = cast(uint) ti.value.tsize;
-         buckets = allocBuckets(sz);
-         firstUsed = cast(uint) buckets.length;
-         valoff = cast(uint) talign(keysz, ti.value.talign);
-         hashFn = &ti.key.getHash;
- 
-         import rt.lifetime : hasPostblit, unqualify;
- 
-         if (hasPostblit(unqualify(ti.key)))
-             flags |= Flags.keyHasPostblit;
-         if ((ti.key.flags | ti.value.flags) & 1)
-             flags |= Flags.hasPointers;
- 
-         entryTI = ti.entry;
-     }
- 
-     Bucket[] buckets;
-     uint used;
-     uint deleted;
-     const(TypeInfo) entryTI;
-     uint firstUsed;
-     immutable uint keysz;
-     immutable uint valsz;
-     immutable uint valoff;
-     Flags flags;
- 
-     // function that calculates hash of a key. Set on creation
-     // the parameter is a pointer to the key.
-     size_t delegate(scope const void*) nothrow hashFn;
- 
-     enum Flags : ubyte
-     {
-         none = 0x0,
-         keyHasPostblit = 0x1,
-         hasPointers = 0x2,
-     }
- 
-     @property size_t length() const pure nothrow @nogc @safe
-     {
-         assert(used >= deleted);
-         return used - deleted;
-     }
- 
-     @property size_t dim() const pure nothrow @nogc @safe
-     {
-         return buckets.length;
-     }
- 
-     @property size_t mask() const pure nothrow @nogc
-     {
-         return dim - 1;
-     }
- 
-     // find the first slot to insert a value with hash
-     inout(Bucket)* findSlotInsert(size_t hash) inout pure nothrow @nogc
-     {
-         for (size_t i = hash & mask, j = 1;; ++j)
-         {
-             if (!buckets[i].filled)
-                 return &buckets[i];
-             i = (i + j) & mask;
-         }
-     }
- 
-     // lookup a key
-     inout(Bucket)* findSlotLookup(size_t hash, scope const void* pkey, scope const TypeInfo keyti) inout
-     {
-         for (size_t i = hash & mask, j = 1;; ++j)
-         {
-             if (buckets[i].hash == hash && keyti.equals(pkey, buckets[i].entry))
-                 return &buckets[i];
-             else if (buckets[i].empty)
-                 return null;
-             i = (i + j) & mask;
-         }
-     }
- 
-     void grow(scope const TypeInfo keyti) pure nothrow
-     {
-         // If there are so many deleted entries, that growing would push us
-         // below the shrink threshold, we just purge deleted entries instead.
-         if (length * SHRINK_DEN < GROW_FAC * dim * SHRINK_NUM)
-             resize(dim);
-         else
-             resize(GROW_FAC * dim);
-     }
- 
-     void shrink(scope const TypeInfo keyti) pure nothrow
-     {
-         if (dim > INIT_NUM_BUCKETS)
-             resize(dim / GROW_FAC);
-     }
- 
-     void resize(size_t ndim) pure nothrow
-     {
-         auto obuckets = buckets;
-         buckets = allocBuckets(ndim);
- 
-         foreach (ref b; obuckets[firstUsed .. $])
-             if (b.filled)
-                 *findSlotInsert(b.hash) = b;
- 
-         firstUsed = 0;
-         used -= deleted;
-         deleted = 0;
-         GC.free(obuckets.ptr); // safe to free b/c impossible to reference
-     }
- 
-     void clear() pure nothrow @trusted
-     {
-         import core.stdc.string : memset;
-         // clear all data, but don't change bucket array length
-         memset(&buckets[firstUsed], 0, (buckets.length - firstUsed) * Bucket.sizeof);
-         deleted = used = 0;
-         firstUsed = cast(uint) dim;
-     }
- }
- 
- //==============================================================================
- // Bucket
- //------------------------------------------------------------------------------
- 
- private struct Bucket
- {
- private pure nothrow @nogc:
-     size_t hash;
-     void* entry;
- 
-     @property bool empty() const
-     {
-         return hash == HASH_EMPTY;
-     }
- 
-     @property bool deleted() const
-     {
-         return hash == HASH_DELETED;
-     }
- 
-     @property bool filled() const @safe
-     {
-         return cast(ptrdiff_t) hash < 0;
-     }
- }
- 
- Bucket[] allocBuckets(size_t dim) @trusted pure nothrow
- {
-     enum attr = GC.BlkAttr.NO_INTERIOR;
-     immutable sz = dim * Bucket.sizeof;
-     return (cast(Bucket*) GC.calloc(sz, attr))[0 .. dim];
- }
- 
- //==============================================================================
- // Entry
- //------------------------------------------------------------------------------
- 
- private void* allocEntry(scope const Impl* aa, scope const void* pkey)
- {
-     import rt.lifetime : _d_newitemU;
-     import core.stdc.string : memcpy, memset;
- 
-     immutable akeysz = aa.valoff;
-     void* res = void;
-     if (aa.entryTI)
-         res = _d_newitemU(aa.entryTI);
-     else
-     {
-         auto flags = (aa.flags & Impl.Flags.hasPointers) ? 0 : GC.BlkAttr.NO_SCAN;
-         res = GC.malloc(akeysz + aa.valsz, flags);
-     }
- 
-     memcpy(res, pkey, aa.keysz); // copy key
-     memset(res + akeysz, 0, aa.valsz); // zero value
- 
-     return res;
- }
- 
- private bool hasDtor(const TypeInfo ti) pure nothrow
- {
-     import rt.lifetime : unqualify;
- 
-     if (typeid(ti) is typeid(TypeInfo_Struct))
-         if ((cast(TypeInfo_Struct) cast(void*) ti).xdtor)
-             return true;
-     if (typeid(ti) is typeid(TypeInfo_StaticArray))
-         return hasDtor(unqualify(ti.next));
- 
-     return false;
- }
- 
- private immutable(void)* getRTInfo(const TypeInfo ti) pure nothrow
- {
-     // classes are references
-     const isNoClass = ti && typeid(ti) !is typeid(TypeInfo_Class);
-     return isNoClass ? ti.rtInfo() : rtinfoHasPointers;
- }
- 
- unittest
- {
-     void test(K, V)()
-     {
-         static struct Entry
-         {
-             K key;
-             V val;
-         }
-         auto keyti = typeid(K);
-         auto valti = typeid(V);
-         auto valrti = getRTInfo(valti);
-         auto keyrti = getRTInfo(keyti);
- 
-         auto impl = new Impl(typeid(V[K]));
-         if (valrti is rtinfoNoPointers && keyrti is rtinfoNoPointers)
-         {
-             assert(!(impl.flags & Impl.Flags.hasPointers));
-         }
-         else if (valrti is rtinfoHasPointers && keyrti is rtinfoHasPointers)
-         {
-             assert(impl.flags & Impl.Flags.hasPointers);
-         }
-         else
-         {
-             auto rtInfo  = cast(size_t*) impl.entryTI.rtInfo();
-             auto refInfo = cast(size_t*) typeid(Entry).rtInfo();
-             assert(rtInfo[0] == refInfo[0]); // size
-             enum bytesPerWord = 8 * size_t.sizeof * (void*).sizeof;
-             size_t words = (rtInfo[0] + bytesPerWord - 1) / bytesPerWord;
-             foreach (i; 0 .. words)
-                 assert(rtInfo[1 + i] == refInfo[i + 1]);
-         }
-     }
-     test!(long, int)();
-     test!(string, string);
-     test!(ubyte[16], Object);
- 
-     static struct Small
-     {
-         ubyte[16] guid;
-         string name;
-     }
-     test!(string, Small);
- 
-     static struct Large
-     {
-         ubyte[1024] data;
-         string[412] names;
-         ubyte[1024] moredata;
-     }
-     version (OnlyLowMemUnittests) {} else
-     test!(Large, Large);
- }
- 
- //==============================================================================
- // Helper functions
- //------------------------------------------------------------------------------
- 
- private size_t talign(size_t tsize, size_t algn) @safe pure nothrow @nogc
- {
-     immutable mask = algn - 1;
-     assert(!(mask & algn));
-     return (tsize + mask) & ~mask;
- }
- 
- // mix hash to "fix" bad hash functions
- private size_t mix(size_t h) @safe pure nothrow @nogc
- {
-     // final mix function of MurmurHash2
-     enum m = 0x5bd1e995;
-     h ^= h >> 13;
-     h *= m;
-     h ^= h >> 15;
-     return h;
- }
- 
- private size_t calcHash(scope const void *pkey, scope const Impl* impl) nothrow
- {
-     immutable hash = impl.hashFn(pkey);
-     // highest bit is set to distinguish empty/deleted from filled buckets
-     return mix(hash) | HASH_FILLED_MARK;
- }
- 
- private size_t nextpow2(const size_t n) pure nothrow @nogc
- {
-     import core.bitop : bsr;
- 
-     if (!n)
-         return 1;
- 
-     const isPowerOf2 = !((n - 1) & n);
-     return 1 << (bsr(n) + !isPowerOf2);
- }
- 
- pure nothrow @nogc unittest
- {
-     //                            0, 1, 2, 3, 4, 5, 6, 7, 8,  9
-     foreach (const n, const pow2; [1, 1, 2, 4, 4, 8, 8, 8, 8, 16])
-         assert(nextpow2(n) == pow2);
- }
- 
- //==============================================================================
- // API Implementation
- //------------------------------------------------------------------------------
- 
- /** Allocate associative array data.
-  * Called for `new SomeAA` expression.
-  * Params:
-  *      ti = TypeInfo for the associative array
-  * Returns:
-  *      A new associative array.
-  */
- extern (C) Impl* _aaNew(const TypeInfo_AssociativeArray ti)
- {
-     return new Impl(ti);
- }
- 
- /// Determine number of entries in associative array.
- extern (C) size_t _aaLen(scope const AA aa) pure nothrow @nogc
- {
-     return aa ? aa.length : 0;
- }
- 
- /******************************
-  * Lookup *pkey in aa.
-  * Called only from implementation of (aa[key]) expressions when value is mutable.
-  * Params:
-  *      paa = associative array opaque pointer
-  *      ti = TypeInfo for the associative array
-  *      valsz = ignored
-  *      pkey = pointer to the key value
-  * Returns:
-  *      if key was in the aa, a mutable pointer to the existing value.
-  *      If key was not in the aa, a mutable pointer to newly inserted value which
-  *      is set to all zeros
-  */
- extern (C) void* _aaGetY(scope AA* paa, const TypeInfo_AssociativeArray ti,
-     const size_t valsz, scope const void* pkey)
- {
-     bool found;
-     return _aaGetX(paa, ti, valsz, pkey, found);
- }
- 
- /******************************
-  * Lookup *pkey in aa.
-  * Called only from implementation of require
-  * Params:
-  *      paa = associative array opaque pointer
-  *      ti = TypeInfo for the associative array
-  *      valsz = ignored
-  *      pkey = pointer to the key value
-  *      found = true if the value was found
-  * Returns:
-  *      if key was in the aa, a mutable pointer to the existing value.
-  *      If key was not in the aa, a mutable pointer to newly inserted value which
-  *      is set to all zeros
-  */
- extern (C) void* _aaGetX(scope AA* paa, const TypeInfo_AssociativeArray ti,
-     const size_t valsz, scope const void* pkey, out bool found)
- {
-     // lazily alloc implementation
-     AA aa = *paa;
-     if (aa is null)
-     {
-         aa = new Impl(ti);
-         *paa = aa;
-     }
- 
-     // get hash and bucket for key
-     immutable hash = calcHash(pkey, aa);
- 
-     // found a value => return it
-     if (auto p = aa.findSlotLookup(hash, pkey, ti.key))
-     {
-         found = true;
-         return p.entry + aa.valoff;
-     }
- 
-     auto p = aa.findSlotInsert(hash);
-     if (p.deleted)
-         --aa.deleted;
-     // check load factor and possibly grow
-     else if (++aa.used * GROW_DEN > aa.dim * GROW_NUM)
-     {
-         aa.grow(ti.key);
-         p = aa.findSlotInsert(hash);
-         assert(p.empty);
-     }
- 
-     // update search cache and allocate entry
-     aa.firstUsed = min(aa.firstUsed, cast(uint)(p - aa.buckets.ptr));
-     p.hash = hash;
-     p.entry = allocEntry(aa, pkey);
-     // postblit for key
-     if (aa.flags & Impl.Flags.keyHasPostblit)
-     {
-         import rt.lifetime : __doPostblit, unqualify;
- 
-         __doPostblit(p.entry, aa.keysz, unqualify(ti.key));
-     }
-     // return pointer to value
-     return p.entry + aa.valoff;
- }
- 
- /******************************
-  * Lookup *pkey in aa.
-  * Called only from implementation of (aa[key]) expressions when value is not mutable.
-  * Params:
-  *      aa = associative array opaque pointer
-  *      keyti = TypeInfo for the key
-  *      valsz = ignored
-  *      pkey = pointer to the key value
-  * Returns:
-  *      pointer to value if present, null otherwise
-  */
- extern (C) inout(void)* _aaGetRvalueX(inout AA aa, scope const TypeInfo keyti, const size_t valsz,
-     scope const void* pkey)
- {
-     return _aaInX(aa, keyti, pkey);
- }
- 
- /******************************
-  * Lookup *pkey in aa.
-  * Called only from implementation of (key in aa) expressions.
-  * Params:
-  *      aa = associative array opaque pointer
-  *      keyti = TypeInfo for the key
-  *      pkey = pointer to the key value
-  * Returns:
-  *      pointer to value if present, null otherwise
-  */
- extern (C) inout(void)* _aaInX(inout AA aa, scope const TypeInfo keyti, scope const void* pkey)
- {
-     if (aa.empty)
-         return null;
- 
-     immutable hash = calcHash(pkey, aa);
-     if (auto p = aa.findSlotLookup(hash, pkey, keyti))
-         return p.entry + aa.valoff;
-     return null;
- }
- 
- /// Delete entry scope const AA, return true if it was present
- extern (C) bool _aaDelX(AA aa, scope const TypeInfo keyti, scope const void* pkey)
- {
-     if (aa.empty)
-         return false;
- 
-     immutable hash = calcHash(pkey, aa);
-     if (auto p = aa.findSlotLookup(hash, pkey, keyti))
-     {
-         // clear entry
-         p.hash = HASH_DELETED;
-         p.entry = null;
- 
-         ++aa.deleted;
-         // `shrink` reallocates, and allocating from a finalizer leads to
-         // InvalidMemoryError: https://issues.dlang.org/show_bug.cgi?id=21442
-         if (aa.length * SHRINK_DEN < aa.dim * SHRINK_NUM && !GC.inFinalizer())
-             aa.shrink(keyti);
- 
-         return true;
-     }
-     return false;
- }
- 
- /// Remove all elements from AA.
- extern (C) void _aaClear(AA aa) pure nothrow @safe
- {
-     if (!aa.empty)
-     {
-         aa.clear();
-     }
- }
- 
- /// Rehash AA
- extern (C) void* _aaRehash(AA* paa, scope const TypeInfo keyti) pure nothrow
- {
-     AA aa = *paa;
-     if (!aa.empty)
-         aa.resize(nextpow2(INIT_DEN * aa.length / INIT_NUM));
-     return aa;
- }
- 
- /// Return a GC allocated array of all values
- extern (C) inout(void[]) _aaValues(inout AA aa, const size_t keysz, const size_t valsz,
-     const TypeInfo tiValueArray) pure nothrow
- {
-     if (aa.empty)
-         return null;
- 
-     import rt.lifetime : _d_newarrayU;
- 
-     auto res = _d_newarrayU(tiValueArray, aa.length).ptr;
-     auto pval = res;
- 
-     immutable off = aa.valoff;
-     foreach (b; aa.buckets[aa.firstUsed .. $])
-     {
-         if (!b.filled)
-             continue;
-         pval[0 .. valsz] = cast(void[]) b.entry[off .. valsz + off];
-         pval += valsz;
-     }
-     // postblit is done in object.values
-     return (cast(inout(void)*) res)[0 .. aa.length]; // fake length, return number of elements
- }
- 
- /// Return a GC allocated array of all keys
- extern (C) inout(void[]) _aaKeys(inout AA aa, const size_t keysz, const TypeInfo tiKeyArray) pure nothrow
- {
-     if (aa.empty)
-         return null;
- 
-     import rt.lifetime : _d_newarrayU;
- 
-     auto res = _d_newarrayU(tiKeyArray, aa.length).ptr;
-     auto pkey = res;
- 
-     foreach (b; aa.buckets[aa.firstUsed .. $])
-     {
-         if (!b.filled)
-             continue;
-         pkey[0 .. keysz] = cast(void[]) b.entry[0 .. keysz];
-         pkey += keysz;
-     }
-     // postblit is done in object.keys
-     return (cast(inout(void)*) res)[0 .. aa.length]; // fake length, return number of elements
- }
- 
- // opApply callbacks are extern(D)
- extern (D) alias dg_t = int delegate(void*);
- extern (D) alias dg2_t = int delegate(void*, void*);
- 
- /// foreach opApply over all values
- extern (C) int _aaApply(AA aa, const size_t keysz, dg_t dg)
- {
-     if (aa.empty)
-         return 0;
- 
-     immutable off = aa.valoff;
-     foreach (b; aa.buckets)
-     {
-         if (!b.filled)
-             continue;
-         if (auto res = dg(b.entry + off))
-             return res;
-     }
-     return 0;
- }
- 
- /// foreach opApply over all key/value pairs
- extern (C) int _aaApply2(AA aa, const size_t keysz, dg2_t dg)
- {
-     if (aa.empty)
-         return 0;
- 
-     immutable off = aa.valoff;
-     foreach (b; aa.buckets)
-     {
-         if (!b.filled)
-             continue;
-         if (auto res = dg(b.entry, b.entry + off))
-             return res;
-     }
-     return 0;
- }
- 
- /** Construct an associative array of type ti from corresponding keys and values.
-  * Called for an AA literal `[k1:v1, k2:v2]`.
-  * Params:
-  *      ti = TypeInfo for the associative array
-  *      keys = array of keys
-  *      vals = array of values
-  * Returns:
-  *      A new associative array opaque pointer, or null if `keys` is empty.
-  */
- extern (C) Impl* _d_assocarrayliteralTX(const TypeInfo_AssociativeArray ti, void[] keys,
-     void[] vals)
- {
-     assert(keys.length == vals.length);
- 
-     immutable keysz = ti.key.tsize;
-     immutable valsz = ti.value.tsize;
-     immutable length = keys.length;
- 
-     if (!length)
-         return null;
- 
-     auto aa = new Impl(ti, nextpow2(INIT_DEN * length / INIT_NUM));
- 
-     void* pkey = keys.ptr;
-     void* pval = vals.ptr;
-     immutable off = aa.valoff;
-     uint actualLength = 0;
-     foreach (_; 0 .. length)
-     {
-         immutable hash = calcHash(pkey, aa);
- 
-         auto p = aa.findSlotLookup(hash, pkey, ti.key);
-         if (p is null)
-         {
-             p = aa.findSlotInsert(hash);
-             p.hash = hash;
-             p.entry = allocEntry(aa, pkey); // move key, no postblit
-             aa.firstUsed = min(aa.firstUsed, cast(uint)(p - aa.buckets.ptr));
-             actualLength++;
-         }
-         else if (aa.entryTI && hasDtor(ti.value))
-         {
-             // destroy existing value before overwriting it
-             ti.value.destroy(p.entry + off);
-         }
-         // set hash and blit value
-         auto pdst = p.entry + off;
-         pdst[0 .. valsz] = pval[0 .. valsz]; // move value, no postblit
- 
-         pkey += keysz;
-         pval += valsz;
-     }
-     aa.used = actualLength;
-     return aa;
- }
- 
- /// compares 2 AAs for equality
- extern (C) int _aaEqual(scope const TypeInfo tiRaw, scope const AA aa1, scope const AA aa2)
- {
-     if (aa1 is aa2)
-         return true;
- 
-     immutable len = _aaLen(aa1);
-     if (len != _aaLen(aa2))
-         return false;
- 
-     if (!len) // both empty
-         return true;
- 
-     import rt.lifetime : unqualify;
- 
-     auto uti = unqualify(tiRaw);
-     auto ti = *cast(TypeInfo_AssociativeArray*)&uti;
-     // compare the entries
-     immutable off = aa1.valoff;
-     foreach (b1; aa1.buckets)
-     {
-         if (!b1.filled)
-             continue;
-         auto pb2 = aa2.findSlotLookup(b1.hash, b1.entry, ti.key);
-         if (pb2 is null || !ti.value.equals(b1.entry + off, pb2.entry + off))
-             return false;
-     }
-     return true;
- }
- 
- /// compute a hash
- extern (C) hash_t _aaGetHash(scope const AA* paa, scope const TypeInfo tiRaw) nothrow
- {
-     const AA aa = *paa;
- 
-     if (aa.empty)
-         return 0;
- 
-     import rt.lifetime : unqualify;
- 
-     auto uti = unqualify(tiRaw);
-     auto ti = *cast(TypeInfo_AssociativeArray*)&uti;
-     immutable off = aa.valoff;
-     auto keyHash = &ti.key.getHash;
-     auto valHash = &ti.value.getHash;
- 
-     size_t h;
-     foreach (b; aa.buckets)
-     {
-         // use addition here, so that hash is independent of element order
-         if (b.filled)
-             h += hashOf(valHash(b.entry + off), keyHash(b.entry));
-     }
- 
-     return h;
- }
- 
- /**
-  * _aaRange implements a ForwardRange
-  */
- struct Range
- {
-     Impl* impl;
-     size_t idx;
-     alias impl this;
- }
- 
- extern (C) pure nothrow @nogc @safe
- {
-     Range _aaRange(return scope AA aa)
-     {
-         if (!aa)
-             return Range();
- 
-         foreach (i; aa.firstUsed .. aa.dim)
-         {
-             if (aa.buckets[i].filled)
-                 return Range(aa, i);
-         }
-         return Range(aa, aa.dim);
-     }
- 
-     bool _aaRangeEmpty(Range r)
-     {
-         return r.impl is null || r.idx >= r.dim;
-     }
- 
-     void* _aaRangeFrontKey(Range r)
-     {
-         assert(!_aaRangeEmpty(r));
-         if (r.idx >= r.dim)
-             return null;
-         return r.buckets[r.idx].entry;
-     }
- 
-     void* _aaRangeFrontValue(Range r)
-     {
-         assert(!_aaRangeEmpty(r));
-         if (r.idx >= r.dim)
-             return null;
- 
-         auto entry = r.buckets[r.idx].entry;
-         return entry is null ?
-             null :
-             (() @trusted { return entry + r.valoff; } ());
-     }
- 
-     void _aaRangePopFront(ref Range r)
-     {
-         if (r.idx >= r.dim) return;
-         for (++r.idx; r.idx < r.dim; ++r.idx)
-         {
-             if (r.buckets[r.idx].filled)
-                 break;
-         }
-     }
- }
- 
- // Most tests are now in test_aa.d
- 
- // test postblit for AA literals
- unittest
- {
-     static struct T
-     {
-         ubyte field;
-         static size_t postblit, dtor;
-         this(this)
-         {
-             ++postblit;
-         }
- 
-         ~this()
-         {
-             ++dtor;
-         }
-     }
- 
-     T t;
-     auto aa1 = [0 : t, 1 : t];
-     assert(T.dtor == 0 && T.postblit == 2);
-     aa1[0] = t;
-     assert(T.dtor == 1 && T.postblit == 3);
- 
-     T.dtor = 0;
-     T.postblit = 0;
- 
-     auto aa2 = [0 : t, 1 : t, 0 : t]; // literal with duplicate key => value overwritten
-     assert(T.dtor == 1 && T.postblit == 3);
- 
-     T.dtor = 0;
-     T.postblit = 0;
- 
-     auto aa3 = [t : 0];
-     assert(T.dtor == 0 && T.postblit == 1);
-     aa3[t] = 1;
-     assert(T.dtor == 0 && T.postblit == 1);
-     aa3.remove(t);
-     assert(T.dtor == 0 && T.postblit == 1);
-     aa3[t] = 2;
-     assert(T.dtor == 0 && T.postblit == 2);
- 
-     // dtor will be called by GC finalizers
-     aa1 = null;
-     aa2 = null;
-     aa3 = null;
-     auto dtor1 = typeid(TypeInfo_AssociativeArray.Entry!(int, T)).xdtor;
-     GC.runFinalizers((cast(char*)dtor1)[0 .. 1]);
-     auto dtor2 = typeid(TypeInfo_AssociativeArray.Entry!(T, int)).xdtor;
-     GC.runFinalizers((cast(char*)dtor2)[0 .. 1]);
-     assert(T.dtor == 6 && T.postblit == 2);
- }
- 
- // Ensure the newaa struct layout (used for static initialization) is in sync
- unittest
- {
-     import newaa = core.internal.newaa;
-     static assert(newaa.Impl.sizeof == Impl.sizeof);
-     // ensure compatible types and offsets
-     static foreach (i; 0 .. Impl.tupleof.length)
-     {
-         // for bucket array and Flags, we "compatible" types, not exactly the same types.
-         static if (__traits(identifier, Impl.tupleof[i]) == "buckets"
-             || __traits(identifier, Impl.tupleof[i]) == "flags")
-             static assert(Impl.tupleof[i].sizeof == newaa.Impl.tupleof[i].sizeof);
-         else
-             static assert(is(typeof(Impl.tupleof[i]) == typeof(newaa.Impl.tupleof[i])));
- 
-         static assert(Impl.tupleof[i].offsetof == newaa.Impl.tupleof[i].offsetof);
-     }
- }
--- 0 ----
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/rt/adi.d gcc-16-20260201/libphobos/libdruntime/rt/adi.d
*** gcc-16-20260125/libphobos/libdruntime/rt/adi.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/rt/adi.d	Thu Jan  1 00:00:00 1970
***************
*** 1,73 ****
- /**
-  * Implementation of dynamic array property support routines.
-  *
-  * Copyright: Copyright Digital Mars 2000 - 2015.
-  * License: Distributed under the
-  *      $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost Software License 1.0).
-  *    (See accompanying file LICENSE)
-  * Authors:   Walter Bright
-  * Source: $(DRUNTIMESRC rt/_adi.d)
-  */
- 
- module rt.adi;
- 
- // debug = adi; // uncomment to turn on debugging printf's
- 
- debug (adi) import core.stdc.stdio : printf;
- 
- /***************************************
-  * Support for array equality test.
-  * Returns:
-  *      1       equal
-  *      0       not equal
-  */
- 
- extern (C) int _adEq2(void[] a1, void[] a2, TypeInfo ti)
- {
-     debug(adi) printf("_adEq2(a1.length = %zd, a2.length = %zd)\n", a1.length, a2.length);
-     if (a1.length != a2.length)
-         return 0;               // not equal
-     if (!ti.equals(&a1, &a2))
-         return 0;
-     return 1;
- }
- 
- @safe unittest
- {
-     debug(adi) printf("array.Eq unittest\n");
- 
-     struct S(T) { T val; }
-     alias String = S!string;
-     alias Float = S!float;
- 
-     String[1] a = [String("hello"c)];
- 
-     assert(a != [String("hel")]);
-     assert(a != [String("helloo")]);
-     assert(a != [String("betty")]);
-     assert(a == [String("hello")]);
-     assert(a != [String("hxxxx")]);
- 
-     Float[1] fa = [Float(float.nan)];
-     assert(fa != fa);
- }
- 
- unittest
- {
-     debug(adi) printf("struct.Eq unittest\n");
- 
-     static struct TestStruct
-     {
-         int value;
- 
-         bool opEquals(const TestStruct rhs) const
-         {
-             return value == rhs.value;
-         }
-     }
- 
-     TestStruct[] b = [TestStruct(5)];
-     TestStruct[] c = [TestStruct(6)];
-     assert(_adEq2(*cast(void[]*)&b, *cast(void[]*)&c, typeid(TestStruct[])) == false);
-     assert(_adEq2(*cast(void[]*)&b, *cast(void[]*)&b, typeid(TestStruct[])) == true);
- }
--- 0 ----
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/rt/cast_.d gcc-16-20260201/libphobos/libdruntime/rt/cast_.d
*** gcc-16-20260125/libphobos/libdruntime/rt/cast_.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/rt/cast_.d	Thu Jan  1 00:00:00 1970
***************
*** 1,208 ****
- /**
-  * Implementation of array assignment support routines.
-  *
-  * Copyright: Copyright Digital Mars 2004 - 2010.
-  * License:   $(HTTP www.boost.org/LICENSE_1_0.txt, Boost License 1.0).
-  * Authors:   Walter Bright, Sean Kelly
-  * Source: $(DRUNTIMESRC rt/_cast_.d)
-  */
- 
- /*          Copyright Digital Mars 2004 - 2010.
-  * Distributed under the Boost Software License, Version 1.0.
-  *    (See accompanying file LICENSE or copy at
-  *          http://www.boost.org/LICENSE_1_0.txt)
-  */
- module rt.cast_;
- 
- debug(cast_) import core.stdc.stdio : printf;
- 
- extern (C):
- @nogc:
- nothrow:
- pure:
- 
- // Needed because ClassInfo.opEquals(Object) does a dynamic cast,
- // but we are trying to implement dynamic cast.
- extern (D) private bool areClassInfosEqual(scope const ClassInfo a, scope const ClassInfo b) @safe
- {
-     // same class if signatures match, works with potential duplicates across binaries
-     if (a is b)
-         return true;
- 
-     // new fast way
-     if (a.m_flags & TypeInfo_Class.ClassFlags.hasNameSig)
-         return a.nameSig[0] == b.nameSig[0]
-             && a.nameSig[1] == b.nameSig[1]
-             && a.nameSig[2] == b.nameSig[2]
-             && a.nameSig[3] == b.nameSig[3];
- 
-     // old slow way for temporary binary compatibility
-     return a.name == b.name;
- }
- 
- /******************************************
-  * Given a pointer:
-  *      If it is an Object, return that Object.
-  *      If it is an interface, return the Object implementing the interface.
-  *      If it is null, return null.
-  *      Else, undefined crash
-  */
- Object _d_toObject(return scope void* p)
- {
-     if (!p)
-         return null;
- 
-     Object o = cast(Object) p;
-     ClassInfo oc = typeid(o);
-     Interface* pi = **cast(Interface***) p;
- 
-     /* Interface.offset lines up with ClassInfo.name.ptr,
-      * so we rely on pointers never being less than 64K,
-      * and Objects never being greater.
-      */
-     if (pi.offset < 0x10000)
-     {
-         debug(cast_) printf("\tpi.offset = %zd\n", pi.offset);
-         return cast(Object)(p - pi.offset);
-     }
-     return o;
- }
- 
- /*************************************
-  * Attempts to cast interface Object o to class c.
-  * Returns o if successful, null if not.
-  */
- void* _d_interface_cast(void* p, ClassInfo c)
- {
-     debug(cast_) printf("_d_interface_cast(p = %p, c = '%.*s')\n", p, cast(int) c.name.length, c.name.ptr);
-     if (!p)
-         return null;
- 
-     Interface* pi = **cast(Interface***) p;
- 
-     debug(cast_) printf("\tpi.offset = %zd\n", pi.offset);
-     Object o2 = cast(Object)(p - pi.offset);
-     void* res = null;
-     size_t offset = 0;
-     if (o2 && _d_isbaseof2(typeid(o2), c, offset))
-     {
-         debug(cast_) printf("\toffset = %zd\n", offset);
-         res = cast(void*) o2 + offset;
-     }
-     debug(cast_) printf("\tresult = %p\n", res);
-     return res;
- }
- 
- /*****
-  * Dynamic cast from a class object `o` to class or interface `c`, where `c` is a subtype of `o`.
-  * Params:
-  *      o = instance of class
-  *      c = a subclass of o
-  * Returns:
-  *      null if o is null or c is not a subclass of o. Otherwise, return o.
-  */
- void* _d_dynamic_cast(Object o, ClassInfo c)
- {
-     debug(cast_) printf("_d_dynamic_cast(o = %p, c = '%.*s')\n", o, cast(int) c.name.length, c.name.ptr);
- 
-     void* res = null;
-     size_t offset = 0;
-     if (o && _d_isbaseof2(typeid(o), c, offset))
-     {
-         debug(cast_) printf("\toffset = %zd\n", offset);
-         res = cast(void*) o + offset;
-     }
-     debug(cast_) printf("\tresult = %p\n", res);
-     return res;
- }
- 
- /*****
-  * Dynamic cast from a class object o to class c, where c is a subclass of o.
-  * Params:
-  *      o = instance of class
-  *      c = a subclass of o
-  * Returns:
-  *      null if o is null or c is not a subclass of o. Otherwise, return o.
-  */
- void* _d_class_cast(Object o, ClassInfo c)
- {
-     debug(cast_) printf("_d_cast_cast(o = %p, c = '%.*s')\n", o, cast(int) c.name.length, c.name.ptr);
- 
-     if (!o)
-         return null;
- 
-     ClassInfo oc = typeid(o);
-     int delta = oc.depth;
- 
-     if (delta && c.depth)
-     {
-         delta -= c.depth;
-         if (delta < 0)
-             return null;
- 
-         while (delta--)
-             oc = oc.base;
-         if (areClassInfosEqual(oc, c))
-             return cast(void*)o;
-         return null;
-     }
- 
-     // no depth data - support the old way
-     do
-     {
-         if (areClassInfosEqual(oc, c))
-             return cast(void*)o;
-         oc = oc.base;
-     } while (oc);
-     return null;
- }
- 
- /**
-  * Dynamic cast `o` to final class `c` only one level down
-  * Params:
-  *      o = object that is instance of a class
-  *      c = class to cast it to
-  * Returns:
-  *      o if it succeeds, null if it fails
-  */
- void* _d_paint_cast(Object o, ClassInfo c)
- {
-     /* If o is really an instance of c, just do a paint
-      */
-     auto p = o && cast(void*)(areClassInfosEqual(typeid(o), c)) ? o : null;
-     debug assert(cast(void*)p is cast(void*)_d_dynamic_cast(o, c));
-     return cast(void*)p;
- }
- 
- int _d_isbaseof2(scope ClassInfo oc, scope const ClassInfo c, scope ref size_t offset) @safe
- {
-     if (areClassInfosEqual(oc, c))
-         return true;
- 
-     do
-     {
-         if (oc.base && areClassInfosEqual(oc.base, c))
-             return true;
- 
-         // Bugzilla 2013: Use depth-first search to calculate offset
-         // from the derived (oc) to the base (c).
-         foreach (iface; oc.interfaces)
-         {
-             if (areClassInfosEqual(iface.classinfo, c) || _d_isbaseof2(iface.classinfo, c, offset))
-             {
-                 offset += iface.offset;
-                 return true;
-             }
-         }
- 
-         oc = oc.base;
-     } while (oc);
- 
-     return false;
- }
- 
- int _d_isbaseof(scope ClassInfo oc, scope const ClassInfo c) @safe
- {
-     size_t offset = 0;
-     return _d_isbaseof2(oc, c, offset);
- }
--- 0 ----
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/rt/lifetime.d gcc-16-20260201/libphobos/libdruntime/rt/lifetime.d
*** gcc-16-20260125/libphobos/libdruntime/rt/lifetime.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/rt/lifetime.d	Sun Feb  1 22:32:17 2026
*************** private uint __typeAttrs(const scope Typ
*** 229,284 ****
      return attrs;
  }
  
- /**
- Shrink the "allocated" length of an array to be the exact size of the array.
- 
- It doesn't matter what the current allocated length of the array is, the
- user is telling the runtime that he knows what he is doing.
- 
- Params:
-     ti = `TypeInfo` of array type
-     arr = array to shrink. Its `.length` is element length, not byte length, despite `void` type
- */
- extern(C) void _d_arrayshrinkfit(const TypeInfo ti, void[] arr) nothrow
- {
-     debug(PRINTF) printf("_d_arrayshrinkfit, elemsize = %zd, arr.ptr = %p arr.length = %zd\n", ti.next.tsize, arr.ptr, arr.length);
-     auto tinext = unqualify(ti.next);
-     auto size = tinext.tsize;                  // array element size
-     auto reqsize = arr.length * size;
-     auto isshared = typeid(ti) is typeid(TypeInfo_Shared);
- 
-     auto curArr = gc_getArrayUsed(arr.ptr, isshared);
-     if (curArr.ptr is null)
-         // not a valid GC pointer
-         return;
- 
-     // align the array.
-     auto offset = arr.ptr - curArr.ptr;
-     auto cursize = curArr.length - offset;
-     if (cursize <= reqsize)
-         // invalid situation, or no change.
-         return;
- 
-     // if the type has a destructor, destroy elements we are about to remove.
-     if (typeid(tinext) is typeid(TypeInfo_Struct)) // avoid a complete dynamic type cast
-     {
-         auto sti = cast(TypeInfo_Struct)cast(void*)tinext;
-         if (sti.xdtor)
-         {
-             try
-             {
-                 finalize_array(arr.ptr + reqsize, cursize - reqsize, sti);
-             }
-             catch (Exception e)
-             {
-                 onFinalizeError(sti, e);
-             }
-         }
-     }
- 
-     gc_shrinkArrayUsed(arr.ptr[0 .. reqsize], cursize, isshared);
- }
- 
  package bool hasPostblit(in TypeInfo ti) nothrow pure
  {
      return (&ti.postblit).funcptr !is &TypeInfo.postblit;
--- 229,234 ----
*************** void __doPostblit(void *ptr, size_t len,
*** 313,431 ****
      }
  }
  
- 
- /**
- Set the array capacity.
- 
- If the array capacity isn't currently large enough
- to hold the requested capacity (in number of elements), then the array is
- resized/reallocated to the appropriate size.
- 
- Pass in a requested capacity of 0 to get the current capacity.
- 
- Params:
-     ti = type info of element type
-     newcapacity = requested new capacity
-     p = pointer to array to set. Its `length` is left unchanged.
- 
- Returns: the number of elements that can actually be stored once the resizing is done
- */
- extern(C) size_t _d_arraysetcapacity(const TypeInfo ti, size_t newcapacity, void[]* p) @weak
- in
- {
-     assert(ti);
-     assert(!(*p).length || (*p).ptr);
- }
- do
- {
-     auto isshared = typeid(ti) is typeid(TypeInfo_Shared);
-     auto tinext = unqualify(ti.next);
-     auto size = tinext.tsize;
-     version (D_InlineAsm_X86)
-     {
-         size_t reqsize = void;
- 
-         asm
-         {
-             mov EAX, newcapacity;
-             mul EAX, size;
-             mov reqsize, EAX;
-             jnc  Lcontinue;
-         }
-     }
-     else version (D_InlineAsm_X86_64)
-     {
-         size_t reqsize = void;
- 
-         asm
-         {
-             mov RAX, newcapacity;
-             mul RAX, size;
-             mov reqsize, RAX;
-             jnc  Lcontinue;
-         }
-     }
-     else
-     {
-         bool overflow = false;
-         size_t reqsize = mulu(size, newcapacity, overflow);
-         if (!overflow)
-             goto Lcontinue;
-     }
- Loverflow:
-     onOutOfMemoryError();
-     assert(0);
- Lcontinue:
- 
-     // step 1, see if we can ensure the capacity is valid in-place
-     auto datasize = (*p).length * size;
-     auto curCapacity = gc_reserveArrayCapacity((*p).ptr[0 .. datasize], reqsize, isshared);
-     if (curCapacity != 0)
-         // in-place worked!
-         return curCapacity / size;
- 
-     if (reqsize <= datasize)
-         // requested size is less than array size, the current array satisfies
-         // the request. But this is not an appendable GC array, so return 0.
-         return 0;
- 
-     // step 2, if reserving in-place doesn't work, allocate a new array with at
-     // least the requested allocated size.
-     auto attrs = __typeAttrs(tinext, (*p).ptr) | BlkAttr.APPENDABLE;
-     auto ptr = GC.malloc(reqsize, attrs, tinext);
-     if (ptr is null)
-         goto Loverflow;
- 
-     // copy the data over.
-     // note that malloc will have initialized the data we did not request to 0.
-     memcpy(ptr, (*p).ptr, datasize);
- 
-     // handle postblit
-     __doPostblit(ptr, datasize, tinext);
- 
-     if (!(attrs & BlkAttr.NO_SCAN))
-     {
-         // need to memset the newly requested data, except for the data that
-         // malloc returned that we didn't request.
-         void *endptr = ptr + reqsize;
-         void *begptr = ptr + datasize;
- 
-         // sanity check
-         assert(endptr >= begptr);
-         memset(begptr, 0, endptr - begptr);
-     }
- 
-     *p = ptr[0 .. (*p).length];
- 
-     // set up the correct length. Note that we need to do this here, because
-     // the GC malloc will automatically set the used size to what we requested.
-     gc_shrinkArrayUsed(ptr[0 .. datasize], reqsize, isshared);
- 
-     curCapacity = gc_reserveArrayCapacity(ptr[0 .. datasize], 0, isshared);
-     assert(curCapacity);
-     return curCapacity / size;
- }
- 
  /**
  Allocate an array with the garbage collector.
  
--- 263,268 ----
*************** extern (C) void[] _d_newarrayU(const sco
*** 448,490 ****
      if (length == 0 || size == 0)
          return null;
  
!     version (D_InlineAsm_X86)
!     {
!         asm pure nothrow @nogc
!         {
!             mov     EAX,size        ;
!             mul     EAX,length      ;
!             mov     size,EAX        ;
!             jnc     Lcontinue       ;
!         }
!     }
!     else version (D_InlineAsm_X86_64)
      {
!         asm pure nothrow @nogc
          {
!             mov     RAX,size        ;
!             mul     RAX,length      ;
!             mov     size,RAX        ;
!             jnc     Lcontinue       ;
          }
      }
!     else
!     {
!         bool overflow = false;
!         size = mulu(size, length, overflow);
!         if (!overflow)
!             goto Lcontinue;
!     }
! Loverflow:
      onOutOfMemoryError();
      assert(0);
- Lcontinue:
- 
-     auto ptr = GC.malloc(size, __typeAttrs(tinext) | BlkAttr.APPENDABLE, tinext);
-     if (!ptr)
-         goto Loverflow;
-     debug(PRINTF) printf(" p = %p\n", ptr);
-     return ptr[0 .. length];
  }
  
  /// ditto
--- 285,303 ----
      if (length == 0 || size == 0)
          return null;
  
!     bool overflow = false;
!     size = mulu(size, length, overflow);
!     if (!overflow)
      {
!         if (auto ptr = GC.malloc(size, __typeAttrs(tinext) | BlkAttr.APPENDABLE, tinext))
          {
!             debug(PRINTF) printf(" p = %p\n", ptr);
!             return ptr[0 .. length];
          }
      }
! 
      onOutOfMemoryError();
      assert(0);
  }
  
  /// ditto
*************** extern (C) void rt_finalizeFromGC(void*
*** 742,1137 ****
  
  
  /**
- Resize a dynamic array by setting the `.length` property
- 
- Newly created elements are initialized to their default value.
- 
- Has two variants:
- - `_d_arraysetlengthT` for arrays with elements that initialize to 0
- - `_d_arraysetlengthiT` for non-zero initializers retrieved from `TypeInfo`
- 
- ---
- void main()
- {
-     int[] a = [1, 2];
-     a.length = 3; // gets lowered to `_d_arraysetlengthT(typeid(int[]), 3, &a)`
- }
- ---
- 
- Params:
-     ti = `TypeInfo` of array
-     newlength = new value for the array's `.length`
-     p = pointer to array to update the `.length` of.
-         While it's cast to `void[]`, its `.length` is still treated as element length.
- Returns: `*p` after being updated
- */
- extern (C) void[] _d_arraysetlengthT(const TypeInfo ti, size_t newlength, void[]* p) @weak
- in
- {
-     assert(ti);
-     assert(!(*p).length || (*p).ptr);
- }
- do
- {
-     debug(PRINTF)
-     {
-         //printf("_d_arraysetlengthT(p = %p, sizeelem = %d, newlength = %d)\n", p, sizeelem, newlength);
-         if (p)
-             printf("\tp.ptr = %p, p.length = %zd\n", (*p).ptr, (*p).length);
-     }
- 
-     if (newlength <= (*p).length)
-     {
-         *p = (*p)[0 .. newlength];
-         return *p;
-     }
-     auto tinext = unqualify(ti.next);
-     size_t sizeelem = tinext.tsize;
- 
-     /* Calculate: newsize = newlength * sizeelem
-      */
-     bool overflow = false;
-     version (D_InlineAsm_X86)
-     {
-         size_t newsize = void;
- 
-         asm pure nothrow @nogc
-         {
-             mov EAX, newlength;
-             mul EAX, sizeelem;
-             mov newsize, EAX;
-             setc overflow;
-         }
-     }
-     else version (D_InlineAsm_X86_64)
-     {
-         size_t newsize = void;
- 
-         asm pure nothrow @nogc
-         {
-             mov RAX, newlength;
-             mul RAX, sizeelem;
-             mov newsize, RAX;
-             setc overflow;
-         }
-     }
-     else
-     {
-         const size_t newsize = mulu(sizeelem, newlength, overflow);
-     }
-     if (overflow)
-     {
-         onOutOfMemoryError();
-         assert(0);
-     }
- 
-     debug(PRINTF) printf("newsize = %zx, newlength = %zx\n", newsize, newlength);
- 
-     if (!(*p).ptr)
-     {
-         assert((*p).length == 0);
-         // pointer was null, need to allocate
-         auto ptr = GC.malloc(newsize, __typeAttrs(tinext) | BlkAttr.APPENDABLE, tinext);
-         if (ptr is null)
-         {
-             onOutOfMemoryError();
-             assert(0);
-         }
-         memset(ptr, 0, newsize);
-         *p = ptr[0 .. newlength];
-         return *p;
-     }
- 
-     const size_t size = (*p).length * sizeelem;
-     const isshared = typeid(ti) is typeid(TypeInfo_Shared);
- 
-     /* Attempt to extend past the end of the existing array.
-      * If not possible, allocate new space for entire array and copy.
-      */
-     void* newdata = (*p).ptr;
-     if (!gc_expandArrayUsed(newdata[0 .. size], newsize, isshared))
-     {
-         newdata = GC.malloc(newsize, __typeAttrs(tinext, (*p).ptr) | BlkAttr.APPENDABLE, tinext);
-         if (newdata is null)
-         {
-             onOutOfMemoryError();
-             assert(0);
-         }
- 
-         newdata[0 .. size] = (*p).ptr[0 .. size];
- 
-         // Do postblit processing, as we are making a copy.
-         __doPostblit(newdata, size, tinext);
-     }
- 
-     // Zero the unused portion of the newly allocated space
-     memset(newdata + size, 0, newsize - size);
- 
-     *p = newdata[0 .. newlength];
-     return *p;
- }
- 
- /// ditto
- extern (C) void[] _d_arraysetlengthiT(const TypeInfo ti, size_t newlength, void[]* p) @weak
- in
- {
-     assert(!(*p).length || (*p).ptr);
- }
- do
- {
-     debug(PRINTF)
-     {
-         //printf("_d_arraysetlengthT(p = %p, sizeelem = %d, newlength = %d)\n", p, sizeelem, newlength);
-         if (p)
-             printf("\tp.ptr = %p, p.length = %zd\n", (*p).ptr, (*p).length);
-     }
- 
-     if (newlength <= (*p).length)
-     {
-         *p = (*p)[0 .. newlength];
-         return *p;
-     }
-     auto tinext = unqualify(ti.next);
-     size_t sizeelem = tinext.tsize;
- 
-     /* Calculate: newsize = newlength * sizeelem
-      */
-     bool overflow = false;
-     version (D_InlineAsm_X86)
-     {
-         size_t newsize = void;
- 
-         asm pure nothrow @nogc
-         {
-             mov EAX, newlength;
-             mul EAX, sizeelem;
-             mov newsize, EAX;
-             setc overflow;
-         }
-     }
-     else version (D_InlineAsm_X86_64)
-     {
-         size_t newsize = void;
- 
-         asm pure nothrow @nogc
-         {
-             mov RAX, newlength;
-             mul RAX, sizeelem;
-             mov newsize, RAX;
-             setc overflow;
-         }
-     }
-     else
-     {
-         const size_t newsize = mulu(sizeelem, newlength, overflow);
-     }
-     if (overflow)
-     {
-         onOutOfMemoryError();
-         assert(0);
-     }
- 
-     debug(PRINTF) printf("newsize = %zx, newlength = %zx\n", newsize, newlength);
- 
-     static void doInitialize(void *start, void *end, const void[] initializer)
-     {
-         if (initializer.length == 1)
-         {
-             memset(start, *(cast(ubyte*)initializer.ptr), end - start);
-         }
-         else
-         {
-             auto q = initializer.ptr;
-             immutable initsize = initializer.length;
-             for (; start < end; start += initsize)
-             {
-                 memcpy(start, q, initsize);
-             }
-         }
-     }
- 
-     if (!(*p).ptr)
-     {
-         assert((*p).length == 0);
-         // pointer was null, need to allocate
-         auto ptr = GC.malloc(newsize, __typeAttrs(tinext) | BlkAttr.APPENDABLE, tinext);
-         if (ptr is null)
-         {
-             onOutOfMemoryError();
-             assert(0);
-         }
-         doInitialize(ptr, ptr + newsize, tinext.initializer);
-         *p = ptr[0 .. newlength];
-         return *p;
-     }
- 
-     const size_t size = (*p).length * sizeelem;
-     const isshared = typeid(ti) is typeid(TypeInfo_Shared);
- 
-     /* Attempt to extend past the end of the existing array.
-      * If not possible, allocate new space for entire array and copy.
-      */
-     void* newdata = (*p).ptr;
-     if (!gc_expandArrayUsed(newdata[0 .. size], newsize, isshared))
-     {
-         newdata = GC.malloc(newsize, __typeAttrs(tinext, (*p).ptr) | BlkAttr.APPENDABLE, tinext);
-         if (newdata is null)
-         {
-             onOutOfMemoryError();
-             assert(0);
-         }
- 
-         newdata[0 .. size] = (*p).ptr[0 .. size];
- 
-         // Do postblit processing, as we are making a copy.
-         __doPostblit(newdata, size, tinext);
-     }
- 
-     // Initialize the unused portion of the newly allocated space
-     doInitialize(newdata + size, newdata + newsize, tinext.initializer);
-     *p = newdata[0 .. newlength];
-     return *p;
- }
- 
- 
- /**
- Given an array of length `size` that needs to be expanded to `newlength`,
- compute a new capacity.
- 
- Better version by Dave Fladebo, enhanced by Steven Schveighoffer:
- This uses an inverse logorithmic algorithm to pre-allocate a bit more
- space for larger arrays.
- - The maximum "extra" space is about 80% of the requested space. This is for
- PAGE size and smaller.
- - As the arrays grow, the relative pre-allocated space shrinks.
- - Perhaps most importantly, overall memory usage and stress on the GC
- is decreased significantly for demanding environments.
- - The algorithm is tuned to avoid any division at runtime.
- 
- Params:
-     newlength = new `.length`
-     elemsize = size of the element in the new array
- Returns: new capacity for array
- */
- size_t newCapacity(size_t newlength, size_t elemsize)
- {
-     size_t newcap = newlength * elemsize;
- 
-     /*
-      * Max growth factor numerator is 234, so allow for multiplying by 256.
-      * But also, the resulting size cannot be more than 2x, so prevent
-      * growing if 2x would fill up the address space (for 32-bit)
-      */
-     enum largestAllowed = (ulong.max >> 8) & (size_t.max >> 1);
-     if (!newcap || (newcap & ~largestAllowed))
-         return newcap;
- 
-     /*
-      * The calculation for "extra" space depends on the requested capacity.
-      * We use an inverse logarithm of the new capacity to add an extra 15%
-      * to 83% capacity. Note that normally we humans think in terms of
-      * percent, but using 128 instead of 100 for the denominator means we
-      * can avoid all division by simply bit-shifthing. Since there are only
-      * 64 bits in a long, the bsr of a size_t is going to be 0 - 63. Using
-      * a lookup table allows us to precalculate the multiplier based on the
-      * inverse logarithm. The formula rougly is:
-      *
-      * newcap = request * (1.0 + min(0.83, 10.0 / (log(request) + 1)))
-      */
-     import core.bitop;
-     static immutable multTable = (){
-         assert(__ctfe);
-         ulong[size_t.sizeof * 8] result;
-         foreach (i; 0 .. result.length)
-         {
-             auto factor = 128 + 1280 / (i + 1);
-             result[i] = factor > 234 ? 234 : factor;
-         }
-         return result;
-     }();
- 
-     auto mult = multTable[bsr(newcap)];
- 
-     // if this were per cent, then the code would look like:
-     // ((newlength * mult + 99) / 100) * elemsize
-     newcap = cast(size_t)((newlength * mult + 127) >> 7) * elemsize;
-     debug(PRINTF) printf("mult: %2.2f, alloc: %2.2f\n",mult/128.0,newcap / cast(double)elemsize);
-     debug(PRINTF) printf("newcap = %zd, newlength = %zd, elemsize = %zd\n", newcap, newlength, elemsize);
-     return newcap;
- }
- 
- 
- /**
- Extend an array by n elements.
- 
- Caller must initialize those elements.
- 
- Params:
-     ti = type info of array type (not element type)
-     px = array to append to, cast to `byte[]` while keeping the same `.length`. Will be updated.
-     n = number of elements to append
- Returns: `px` after being appended to
- */
- extern (C)
- byte[] _d_arrayappendcTX(const TypeInfo ti, return scope ref byte[] px, size_t n) @weak
- {
-     // This is a cut&paste job from _d_arrayappendT(). Should be refactored.
- 
-     // Short circuit if no data is being appended.
-     if (n == 0)
-         return px;
- 
- 
-     // only optimize array append where ti is not a shared type
-     auto tinext = unqualify(ti.next);
-     auto sizeelem = tinext.tsize;              // array element size
-     auto isshared = typeid(ti) is typeid(TypeInfo_Shared);
-     auto length = px.length;
-     auto newlength = length + n;
-     auto newsize = newlength * sizeelem;
-     auto size = length * sizeelem;
- 
-     if (!gc_expandArrayUsed(px.ptr[0 .. size], newsize, isshared))
-     {
-         // could not set the size, we must reallocate.
-         auto newcap = newCapacity(newlength, sizeelem);
-         auto attrs = __typeAttrs(tinext, px.ptr) | BlkAttr.APPENDABLE;
-         auto ptr = cast(byte*) GC.malloc(newcap, attrs, tinext);
-         if (ptr is null)
-         {
-             onOutOfMemoryError();
-             assert(0);
-         }
- 
-         if (newsize != newcap)
-         {
-             // For small blocks that are always fully scanned, if we allocated more
-             // capacity than was requested, we are responsible for zeroing that
-             // memory.
-             // TODO: should let the GC figure this out, as this property may
-             // not always hold.
-             if (!(attrs & BlkAttr.NO_SCAN) && newcap < PAGESIZE)
-                 memset(ptr + newsize, 0, newcap - newsize);
- 
-             gc_shrinkArrayUsed(ptr[0 .. newsize], newcap, isshared);
-         }
- 
-         memcpy(ptr, px.ptr, size);
- 
-         // do potsblit processing.
-         __doPostblit(ptr, size, tinext);
- 
-         px = ptr[0 .. newlength];
-         return px;
-     }
- 
-     // we were able to expand in place, just update the length
-     px = px.ptr[0 .. newlength];
-     return px;
- }
- 
- 
- /**
  Append `dchar` to `char[]`, converting UTF-32 to UTF-8
  
  ---
--- 555,560 ----
*************** extern (C) void[] _d_arrayappendwd(ref b
*** 1272,1316 ****
      return x;
  }
  
- /**
- Allocate an array literal
- 
- Rely on the caller to do the initialization of the array.
- 
- ---
- int[] getArr()
- {
-     return [10, 20];
-     // auto res = cast(int*) _d_arrayliteralTX(typeid(int[]), 2);
-     // res[0] = 10;
-     // res[1] = 20;
-     // return res[0..2];
- }
- ---
- 
- Params:
-     ti = `TypeInfo` of resulting array type
-     length = `.length` of array literal
- 
- Returns: pointer to allocated array
- */
- extern (C)
- void* _d_arrayliteralTX(const TypeInfo ti, size_t length) @weak
- {
-     auto tinext = unqualify(ti.next);
-     auto sizeelem = tinext.tsize;              // array element size
-     void* result;
- 
-     debug(PRINTF) printf("_d_arrayliteralTX(sizeelem = %zd, length = %zd)\n", sizeelem, length);
-     if (length == 0 || sizeelem == 0)
-         return null;
-     else
-     {
-         auto allocsize = length * sizeelem;
-         return GC.malloc(allocsize, __typeAttrs(tinext) | BlkAttr.APPENDABLE, tinext);
-     }
- }
- 
  
  unittest
  {
--- 695,700 ----
diff -Nrcpad gcc-16-20260125/libphobos/libdruntime/rt/minfo.d gcc-16-20260201/libphobos/libdruntime/rt/minfo.d
*** gcc-16-20260125/libphobos/libdruntime/rt/minfo.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/libdruntime/rt/minfo.d	Sun Feb  1 22:32:17 2026
*************** struct ModuleGroup
*** 492,498 ****
--- 492,501 ----
                  if (!bt(ctordone, idx))
                  {
                      if (!processMod(idx))
+                     {
+                         .free(ctors);
                          return false;
+                     }
                  }
              }
  
diff -Nrcpad gcc-16-20260125/libphobos/src/MERGE gcc-16-20260201/libphobos/src/MERGE
*** gcc-16-20260125/libphobos/src/MERGE	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/src/MERGE	Sun Feb  1 22:32:17 2026
***************
*** 1,4 ****
! 40ffbb3641495b02815891ee004d4c6e173b1089
  
  The first line of this file holds the git revision number of the last
  merge done from the dlang/phobos repository.
--- 1,4 ----
! f87979028bd0e0f3e67dbf5b0cd1335ca3f7ed67
  
  The first line of this file holds the git revision number of the last
  merge done from the dlang/phobos repository.
diff -Nrcpad gcc-16-20260125/libphobos/src/Makefile.am gcc-16-20260201/libphobos/src/Makefile.am
*** gcc-16-20260125/libphobos/src/Makefile.am	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/src/Makefile.am	Sun Feb  1 22:32:17 2026
*************** PHOBOS_DSOURCES = etc/c/curl.d etc/c/odb
*** 137,159 ****
  	std/format/internal/write.d std/format/package.d std/format/read.d \
  	std/format/spec.d std/format/write.d std/functional.d std/getopt.d \
  	std/int128.d std/internal/attributes.d std/internal/cstring.d \
! 	std/internal/math/biguintcore.d std/internal/math/biguintnoasm.d \
! 	std/internal/math/errorfunction.d std/internal/math/gammafunction.d \
! 	std/internal/memory.d std/internal/scopebuffer.d \
! 	std/internal/test/dummyrange.d std/internal/test/range.d \
  	std/internal/test/sumtype_example_overloads.d std/internal/test/uda.d \
  	std/internal/unicode_comp.d std/internal/unicode_decomp.d \
  	std/internal/unicode_grapheme.d std/internal/unicode_norm.d \
  	std/internal/unicode_tables.d std/internal/windows/advapi32.d \
! 	std/internal/windows/bcrypt.d std/json.d std/logger/core.d \
! 	std/logger/filelogger.d std/logger/multilogger.d \
! 	std/logger/nulllogger.d std/logger/package.d std/math/algebraic.d \
! 	std/math/constants.d std/math/exponential.d std/math/hardware.d \
! 	std/math/operations.d std/math/package.d std/math/remainder.d \
! 	std/math/rounding.d std/math/traits.d std/math/trigonometry.d \
! 	std/mathspecial.d std/meta.d std/mmfile.d std/net/curl.d \
! 	std/net/isemail.d std/numeric.d std/outbuffer.d std/package.d \
! 	std/parallelism.d std/path.d std/process.d std/random.d \
  	std/range/interfaces.d std/range/package.d std/range/primitives.d \
  	std/regex/internal/backtracking.d std/regex/internal/generator.d \
  	std/regex/internal/ir.d std/regex/internal/kickstart.d \
--- 137,159 ----
  	std/format/internal/write.d std/format/package.d std/format/read.d \
  	std/format/spec.d std/format/write.d std/functional.d std/getopt.d \
  	std/int128.d std/internal/attributes.d std/internal/cstring.d \
! 	std/internal/entropy.d std/internal/math/biguintcore.d \
! 	std/internal/math/biguintnoasm.d std/internal/math/errorfunction.d \
! 	std/internal/math/gammafunction.d std/internal/memory.d \
! 	std/internal/scopebuffer.d std/internal/test/dummyrange.d \
! 	std/internal/test/range.d \
  	std/internal/test/sumtype_example_overloads.d std/internal/test/uda.d \
  	std/internal/unicode_comp.d std/internal/unicode_decomp.d \
  	std/internal/unicode_grapheme.d std/internal/unicode_norm.d \
  	std/internal/unicode_tables.d std/internal/windows/advapi32.d \
! 	std/json.d std/logger/core.d std/logger/filelogger.d \
! 	std/logger/multilogger.d std/logger/nulllogger.d std/logger/package.d \
! 	std/math/algebraic.d std/math/constants.d std/math/exponential.d \
! 	std/math/hardware.d std/math/operations.d std/math/package.d \
! 	std/math/remainder.d std/math/rounding.d std/math/traits.d \
! 	std/math/trigonometry.d std/mathspecial.d std/meta.d std/mmfile.d \
! 	std/net/curl.d std/net/isemail.d std/numeric.d std/outbuffer.d \
! 	std/package.d std/parallelism.d std/path.d std/process.d std/random.d \
  	std/range/interfaces.d std/range/package.d std/range/primitives.d \
  	std/regex/internal/backtracking.d std/regex/internal/generator.d \
  	std/regex/internal/ir.d std/regex/internal/kickstart.d \
diff -Nrcpad gcc-16-20260125/libphobos/src/Makefile.in gcc-16-20260201/libphobos/src/Makefile.in
*** gcc-16-20260125/libphobos/src/Makefile.in	Sun Jan 25 22:32:22 2026
--- gcc-16-20260201/libphobos/src/Makefile.in	Sun Feb  1 22:32:20 2026
*************** am__dirstamp = $(am__leading_dot)dirstam
*** 238,243 ****
--- 238,244 ----
  @ENABLE_LIBDRUNTIME_ONLY_FALSE@	std/int128.lo \
  @ENABLE_LIBDRUNTIME_ONLY_FALSE@	std/internal/attributes.lo \
  @ENABLE_LIBDRUNTIME_ONLY_FALSE@	std/internal/cstring.lo \
+ @ENABLE_LIBDRUNTIME_ONLY_FALSE@	std/internal/entropy.lo \
  @ENABLE_LIBDRUNTIME_ONLY_FALSE@	std/internal/math/biguintcore.lo \
  @ENABLE_LIBDRUNTIME_ONLY_FALSE@	std/internal/math/biguintnoasm.lo \
  @ENABLE_LIBDRUNTIME_ONLY_FALSE@	std/internal/math/errorfunction.lo \
*************** am__dirstamp = $(am__leading_dot)dirstam
*** 254,260 ****
  @ENABLE_LIBDRUNTIME_ONLY_FALSE@	std/internal/unicode_norm.lo \
  @ENABLE_LIBDRUNTIME_ONLY_FALSE@	std/internal/unicode_tables.lo \
  @ENABLE_LIBDRUNTIME_ONLY_FALSE@	std/internal/windows/advapi32.lo \
- @ENABLE_LIBDRUNTIME_ONLY_FALSE@	std/internal/windows/bcrypt.lo \
  @ENABLE_LIBDRUNTIME_ONLY_FALSE@	std/json.lo std/logger/core.lo \
  @ENABLE_LIBDRUNTIME_ONLY_FALSE@	std/logger/filelogger.lo \
  @ENABLE_LIBDRUNTIME_ONLY_FALSE@	std/logger/multilogger.lo \
--- 255,260 ----
*************** libgphobos_la_LINK = $(LIBTOOL) --tag=D
*** 610,632 ****
  @ENABLE_LIBDRUNTIME_ONLY_FALSE@	std/format/internal/write.d std/format/package.d std/format/read.d \
  @ENABLE_LIBDRUNTIME_ONLY_FALSE@	std/format/spec.d std/format/write.d std/functional.d std/getopt.d \
  @ENABLE_LIBDRUNTIME_ONLY_FALSE@	std/int128.d std/internal/attributes.d std/internal/cstring.d \
! @ENABLE_LIBDRUNTIME_ONLY_FALSE@	std/internal/math/biguintcore.d std/internal/math/biguintnoasm.d \
! @ENABLE_LIBDRUNTIME_ONLY_FALSE@	std/internal/math/errorfunction.d std/internal/math/gammafunction.d \
! @ENABLE_LIBDRUNTIME_ONLY_FALSE@	std/internal/memory.d std/internal/scopebuffer.d \
! @ENABLE_LIBDRUNTIME_ONLY_FALSE@	std/internal/test/dummyrange.d std/internal/test/range.d \
  @ENABLE_LIBDRUNTIME_ONLY_FALSE@	std/internal/test/sumtype_example_overloads.d std/internal/test/uda.d \
  @ENABLE_LIBDRUNTIME_ONLY_FALSE@	std/internal/unicode_comp.d std/internal/unicode_decomp.d \
  @ENABLE_LIBDRUNTIME_ONLY_FALSE@	std/internal/unicode_grapheme.d std/internal/unicode_norm.d \
  @ENABLE_LIBDRUNTIME_ONLY_FALSE@	std/internal/unicode_tables.d std/internal/windows/advapi32.d \
! @ENABLE_LIBDRUNTIME_ONLY_FALSE@	std/internal/windows/bcrypt.d std/json.d std/logger/core.d \
! @ENABLE_LIBDRUNTIME_ONLY_FALSE@	std/logger/filelogger.d std/logger/multilogger.d \
! @ENABLE_LIBDRUNTIME_ONLY_FALSE@	std/logger/nulllogger.d std/logger/package.d std/math/algebraic.d \
! @ENABLE_LIBDRUNTIME_ONLY_FALSE@	std/math/constants.d std/math/exponential.d std/math/hardware.d \
! @ENABLE_LIBDRUNTIME_ONLY_FALSE@	std/math/operations.d std/math/package.d std/math/remainder.d \
! @ENABLE_LIBDRUNTIME_ONLY_FALSE@	std/math/rounding.d std/math/traits.d std/math/trigonometry.d \
! @ENABLE_LIBDRUNTIME_ONLY_FALSE@	std/mathspecial.d std/meta.d std/mmfile.d std/net/curl.d \
! @ENABLE_LIBDRUNTIME_ONLY_FALSE@	std/net/isemail.d std/numeric.d std/outbuffer.d std/package.d \
! @ENABLE_LIBDRUNTIME_ONLY_FALSE@	std/parallelism.d std/path.d std/process.d std/random.d \
  @ENABLE_LIBDRUNTIME_ONLY_FALSE@	std/range/interfaces.d std/range/package.d std/range/primitives.d \
  @ENABLE_LIBDRUNTIME_ONLY_FALSE@	std/regex/internal/backtracking.d std/regex/internal/generator.d \
  @ENABLE_LIBDRUNTIME_ONLY_FALSE@	std/regex/internal/ir.d std/regex/internal/kickstart.d \
--- 610,632 ----
  @ENABLE_LIBDRUNTIME_ONLY_FALSE@	std/format/internal/write.d std/format/package.d std/format/read.d \
  @ENABLE_LIBDRUNTIME_ONLY_FALSE@	std/format/spec.d std/format/write.d std/functional.d std/getopt.d \
  @ENABLE_LIBDRUNTIME_ONLY_FALSE@	std/int128.d std/internal/attributes.d std/internal/cstring.d \
! @ENABLE_LIBDRUNTIME_ONLY_FALSE@	std/internal/entropy.d std/internal/math/biguintcore.d \
! @ENABLE_LIBDRUNTIME_ONLY_FALSE@	std/internal/math/biguintnoasm.d std/internal/math/errorfunction.d \
! @ENABLE_LIBDRUNTIME_ONLY_FALSE@	std/internal/math/gammafunction.d std/internal/memory.d \
! @ENABLE_LIBDRUNTIME_ONLY_FALSE@	std/internal/scopebuffer.d std/internal/test/dummyrange.d \
! @ENABLE_LIBDRUNTIME_ONLY_FALSE@	std/internal/test/range.d \
  @ENABLE_LIBDRUNTIME_ONLY_FALSE@	std/internal/test/sumtype_example_overloads.d std/internal/test/uda.d \
  @ENABLE_LIBDRUNTIME_ONLY_FALSE@	std/internal/unicode_comp.d std/internal/unicode_decomp.d \
  @ENABLE_LIBDRUNTIME_ONLY_FALSE@	std/internal/unicode_grapheme.d std/internal/unicode_norm.d \
  @ENABLE_LIBDRUNTIME_ONLY_FALSE@	std/internal/unicode_tables.d std/internal/windows/advapi32.d \
! @ENABLE_LIBDRUNTIME_ONLY_FALSE@	std/json.d std/logger/core.d std/logger/filelogger.d \
! @ENABLE_LIBDRUNTIME_ONLY_FALSE@	std/logger/multilogger.d std/logger/nulllogger.d std/logger/package.d \
! @ENABLE_LIBDRUNTIME_ONLY_FALSE@	std/math/algebraic.d std/math/constants.d std/math/exponential.d \
! @ENABLE_LIBDRUNTIME_ONLY_FALSE@	std/math/hardware.d std/math/operations.d std/math/package.d \
! @ENABLE_LIBDRUNTIME_ONLY_FALSE@	std/math/remainder.d std/math/rounding.d std/math/traits.d \
! @ENABLE_LIBDRUNTIME_ONLY_FALSE@	std/math/trigonometry.d std/mathspecial.d std/meta.d std/mmfile.d \
! @ENABLE_LIBDRUNTIME_ONLY_FALSE@	std/net/curl.d std/net/isemail.d std/numeric.d std/outbuffer.d \
! @ENABLE_LIBDRUNTIME_ONLY_FALSE@	std/package.d std/parallelism.d std/path.d std/process.d std/random.d \
  @ENABLE_LIBDRUNTIME_ONLY_FALSE@	std/range/interfaces.d std/range/package.d std/range/primitives.d \
  @ENABLE_LIBDRUNTIME_ONLY_FALSE@	std/regex/internal/backtracking.d std/regex/internal/generator.d \
  @ENABLE_LIBDRUNTIME_ONLY_FALSE@	std/regex/internal/ir.d std/regex/internal/kickstart.d \
*************** std/internal/$(am__dirstamp):
*** 881,886 ****
--- 881,887 ----
  	@: > std/internal/$(am__dirstamp)
  std/internal/attributes.lo: std/internal/$(am__dirstamp)
  std/internal/cstring.lo: std/internal/$(am__dirstamp)
+ std/internal/entropy.lo: std/internal/$(am__dirstamp)
  std/internal/math/$(am__dirstamp):
  	@$(MKDIR_P) std/internal/math
  	@: > std/internal/math/$(am__dirstamp)
*************** std/internal/windows/$(am__dirstamp):
*** 908,914 ****
  	@: > std/internal/windows/$(am__dirstamp)
  std/internal/windows/advapi32.lo:  \
  	std/internal/windows/$(am__dirstamp)
- std/internal/windows/bcrypt.lo: std/internal/windows/$(am__dirstamp)
  std/json.lo: std/$(am__dirstamp)
  std/logger/$(am__dirstamp):
  	@$(MKDIR_P) std/logger
--- 909,914 ----
diff -Nrcpad gcc-16-20260125/libphobos/src/index.dd gcc-16-20260201/libphobos/src/index.dd
*** gcc-16-20260125/libphobos/src/index.dd	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/src/index.dd	Sun Feb  1 22:32:17 2026
*************** $(BOOKTABLE ,
*** 307,312 ****
--- 307,317 ----
          $(TD An arbitrary-precision integer type.)
      )
      $(TR
+         $(TDNW $(MREF std,int128))
+         $(TDNW $(MREF core,int128))
+         $(TD 128 bit-precision integer type.)
+     )
+     $(TR
          $(TDNW $(MREF std,complex))
          $(TD A complex number type.)
      )
diff -Nrcpad gcc-16-20260125/libphobos/src/std/algorithm/iteration.d gcc-16-20260201/libphobos/src/std/algorithm/iteration.d
*** gcc-16-20260125/libphobos/src/std/algorithm/iteration.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/src/std/algorithm/iteration.d	Sun Feb  1 22:32:17 2026
*************** $(BOOKTABLE Cheat Sheet,
*** 8,13 ****
--- 8,15 ----
  $(TR $(TH Function Name) $(TH Description))
  $(T2 cache,
          Eagerly evaluates and caches another range's `front`.)
+ $(T2 lazyCache,
+         Lazily evaluates and caches another range's `front`, unlike `cache`.)
  $(T2 cacheBidirectional,
          As above, but also provides `back` and `popBack`.)
  $(T2 chunkBy,
*************** $(T2 reduce,
*** 50,56 ****
  $(T2 splitWhen,
          Lazily splits a range by comparing adjacent elements.)
  $(T2 splitter,
!         Lazily splits a range by a separator.)
  $(T2 substitute,
          `[1, 2].substitute(1, 0.1)` returns `[0.1, 2]`.)
  $(T2 sum,
--- 52,58 ----
  $(T2 splitWhen,
          Lazily splits a range by comparing adjacent elements.)
  $(T2 splitter,
!         Lazily splits a range by a separator, element predicate or whitespace.)
  $(T2 substitute,
          `[1, 2].substitute(1, 0.1)` returns `[0.1, 2]`.)
  $(T2 sum,
*************** private struct _Cache(R, bool bidir)
*** 421,426 ****
--- 423,625 ----
  }
  
  /**
+  * Similar to `cache`, but lazily evaluates the elements. Unlike `cache`,
+  * this function does not eagerly evaluate the front of the range until
+  * it's explicitly requested.
+  *
+  * This can be useful when evaluation of range elements has side effects that
+  * should be delayed until actually needed.
+  *
+  * See_Also: cache
+  *
+  * Params:
+  *    range = an $(REF_ALTTEXT input range, isInputRange, std,range,primitives)
+  *
+  * Returns:
+  *    An $(REF_ALTTEXT input range, isInputRange, std,range,primitives) with the lazily cached values of range
+  */
+ 
+ auto lazyCache(Range)(Range range)
+ if (isInputRange!Range)
+ {
+     return LazyCache!(Range, isBidirectionalRange!Range)(range);
+ }
+ 
+ ///
+ @safe unittest
+ {
+     import std.algorithm.comparison : equal;
+     import std.range, std.stdio;
+     import std.typecons : tuple;
+ 
+     ulong counter = 0;
+     double fun(int x)
+     {
+         ++counter;
+         // http://en.wikipedia.org/wiki/Quartic_function
+         return ( (x + 4.0) * (x + 1.0) * (x - 1.0) * (x - 3.0) ) / 14.0 + 0.5;
+     }
+     // With lazyCache, front won't be evaluated until requested
+     counter = 0;
+     auto result = iota(-4, 5).map!(a => tuple(a, fun(a)))()
+                             .lazyCache();
+     // At this point, no elements have been evaluated yet
+     assert(counter == 0);
+     // Now access the first element
+     auto firstElement = result.front;
+     // Only now the first element is evaluated
+     assert(counter == 1);
+     // Process the result lazily
+     auto filtered = result.filter!(a => a[1] < 0)()
+                          .map!(a => a[0])();
+     // Values are calculated as we iterate
+     assert(equal(filtered, [-3, -2, 2]));
+     // Only elements we actually accessed were evaluated
+     assert(counter == iota(-4, 5).length);
+ }
+ 
+ private struct LazyCache(R, bool bidir)
+ {
+     import core.exception : RangeError;
+ 
+     private
+     {
+         import std.algorithm.internal : algoFormat;
+         import std.meta : AliasSeq;
+ 
+         alias E  = ElementType!R;
+         alias UE = Unqual!E;
+ 
+         R source;
+ 
+         static if (bidir) alias CacheTypes = AliasSeq!(UE, UE);
+         else              alias CacheTypes = AliasSeq!UE;
+         CacheTypes caches;
+         // Flags to track if front/back have been cached
+         bool frontCached = false;
+         static if (bidir) bool backCached = false;
+ 
+         static assert(isAssignable!(UE, E) && is(UE : E),
+             algoFormat(
+                 "Cannot instantiate range with %s because %s elements are not assignable to %s.",
+                 R.stringof,
+                 E.stringof,
+                 UE.stringof
+             )
+         );
+     }
+ 
+     this(R range)
+     {
+         source = range;
+         // Don't eagerly evaluate anything in the constructor
+     }
+ 
+     static if (isInfinite!R)
+         enum empty = false;
+     else
+         bool empty() @property
+         {
+             return source.empty;
+         }
+ 
+     mixin ImplementLength!source;
+ 
+     E front() @property
+     {
+         version (assert) if (empty) throw new RangeError();
+         // Only evaluate front if it hasn't been cached yet
+         if (!frontCached && !source.empty)
+         {
+             caches[0] = source.front;
+             frontCached = true;
+         }
+         return caches[0];
+     }
+     static if (bidir) E back() @property
+     {
+         version (assert) if (empty) throw new RangeError();
+         // Only evaluate back if it hasn't been cached yet
+         if (!backCached && !source.empty)
+         {
+             caches[1] = source.back;
+             backCached = true;
+         }
+         return caches[1];
+     }
+ 
+     void popFront()
+     {
+         version (assert) if (empty) throw new RangeError();
+         source.popFront();
+         // Reset the cache state for front
+         frontCached = false;
+     }
+     static if (bidir) void popBack()
+     {
+         version (assert) if (empty) throw new RangeError();
+         source.popBack();
+         // Reset the cache state for back
+         backCached = false;
+     }
+ 
+     static if (isForwardRange!R)
+     {
+         private this(R source, ref CacheTypes caches, bool frontCached, bool backCached = false)
+         {
+             this.source = source;
+             this.caches = caches;
+             this.frontCached = frontCached;
+             static if (bidir) this.backCached = backCached;
+         }
+         typeof(this) save() @property
+         {
+             static if (bidir)
+                 return typeof(this)(source.save, caches, frontCached, backCached);
+             else
+                 return typeof(this)(source.save, caches, frontCached);
+         }
+     }
+ 
+     static if (hasSlicing!R)
+     {
+         enum hasEndSlicing = is(typeof(source[size_t.max .. $]));
+ 
+         static if (hasEndSlicing)
+         {
+             private static struct DollarToken{}
+             enum opDollar = DollarToken.init;
+ 
+             auto opSlice(size_t low, DollarToken)
+             {
+                 return typeof(this)(source[low .. $]);
+             }
+         }
+ 
+         static if (!isInfinite!R)
+         {
+             typeof(this) opSlice(size_t low, size_t high)
+             {
+                 return typeof(this)(source[low .. high]);
+             }
+         }
+         else static if (hasEndSlicing)
+         {
+             auto opSlice(size_t low, size_t high)
+             in
+             {
+                 assert(low <= high, "Bounds error when slicing lazyCache.");
+             }
+             do
+             {
+                 import std.range : takeExactly;
+                 return this[low .. $].takeExactly(high - low);
+             }
+         }
+     }
+ }
+ 
+ /**
  Implements the homonym function (also known as `transform`) present
  in many languages of functional flavor. The call `map!(fun)(range)`
  returns a range of which elements are obtained by applying `fun(a)`
*************** See_Also: $(REF tee, std,range)
*** 865,872 ****
  template each(alias fun = "a")
  {
      import std.meta : AliasSeq;
!     import std.traits : Parameters;
!     import std.typecons : Flag, Yes, No;
  
  private:
      alias BinaryArgs = AliasSeq!(fun, "i", "a");
--- 1064,1071 ----
  template each(alias fun = "a")
  {
      import std.meta : AliasSeq;
!     import std.traits : Parameters, isInstanceOf;
!     import std.typecons : Flag, Yes, No, Tuple;
  
  private:
      alias BinaryArgs = AliasSeq!(fun, "i", "a");
*************** public:
*** 912,918 ****
      Flag!"each" each(Range)(Range r)
      if (!isForeachIterable!Range && (
          isRangeIterable!Range ||
!         __traits(compiles, typeof(r.front).length)))
      {
          static if (isRangeIterable!Range)
          {
--- 1111,1118 ----
      Flag!"each" each(Range)(Range r)
      if (!isForeachIterable!Range && (
          isRangeIterable!Range ||
!         // Tuples get automatically expanded if function takes right number of args
!         (isInputRange!Range && isInstanceOf!(Tuple, typeof(r.front)))))
      {
          static if (isRangeIterable!Range)
          {
*************** public:
*** 953,959 ****
          }
          else
          {
!             // range interface with >2 parameters.
              for (auto range = r; !range.empty; range.popFront())
              {
                  static if (!is(typeof(fun(r.front.expand)) == Flag!"each"))
--- 1153,1163 ----
          }
          else
          {
!             /* Range over Tuples, fun must have correct number of args
!             * If number of args of fun is <= 2, calling fun(tuple) or fun(idx, tuple)
!             * will have precendence over fun(tuple.expand).
!             * Provide types to delegate params to control this.
!             */
              for (auto range = r; !range.empty; range.popFront())
              {
                  static if (!is(typeof(fun(r.front.expand)) == Flag!"each"))
*************** if (isInputRange!Range)
*** 2806,2815 ****
  
  /**
  Splits a forward range into subranges in places determined by a binary
! predicate.
  
  When iterating, one element of `r` is compared with `pred` to the next
! element. If `pred` return true, a new subrange is started for the next element.
  Otherwise, they are part of the same subrange.
  
  If the elements are compared with an inequality (!=) operator, consider
--- 3010,3019 ----
  
  /**
  Splits a forward range into subranges in places determined by a binary
! predicate called with adjacent elements.
  
  When iterating, one element of `r` is compared with `pred` to the next
! element. If `pred` returns true, a new subrange is started for the next element.
  Otherwise, they are part of the same subrange.
  
  If the elements are compared with an inequality (!=) operator, consider
*************** Params:
*** 2819,2825 ****
  pred = Predicate for determining where to split. The earlier element in the
  source range is always given as the first argument.
  r = A $(REF_ALTTEXT forward range, isForwardRange, std,range,primitives) to be split.
! Returns: a range of subranges of `r`, split such that within a given subrange,
  calling `pred` with any pair of adjacent elements as arguments returns `false`.
  Copying the range currently has reference semantics, but this may change in the future.
  
--- 3023,3030 ----
  pred = Predicate for determining where to split. The earlier element in the
  source range is always given as the first argument.
  r = A $(REF_ALTTEXT forward range, isForwardRange, std,range,primitives) to be split.
! 
! Returns: A range of subranges of `r`, split such that within a given subrange,
  calling `pred` with any pair of adjacent elements as arguments returns `false`.
  Copying the range currently has reference semantics, but this may change in the future.
  
*************** relations.
*** 2829,2835 ****
  */
  
  auto splitWhen(alias pred, Range)(Range r)
! if (isForwardRange!Range)
  {   import std.functional : not;
      return ChunkByImpl!(not!pred, not!pred, GroupingOpType.binaryAny, Range)(r);
  }
--- 3034,3040 ----
  */
  
  auto splitWhen(alias pred, Range)(Range r)
! if (is(typeof(binaryFun!pred(r.front, r.front)) : bool) && isForwardRange!Range)
  {   import std.functional : not;
      return ChunkByImpl!(not!pred, not!pred, GroupingOpType.binaryAny, Range)(r);
  }
*************** Implements the homonym function (also kn
*** 4309,4327 ****
  compress), `inject`, or `foldl`) present in various programming
  languages of functional flavor. There is also $(LREF fold) which does
  the same thing but with the opposite parameter order.
! The call `reduce!(fun)(seed, range)` first assigns `seed` to
! an internal variable `result`, also called the accumulator.
! Then, for each element `x` in `range`, `result = fun(result, x)`
! gets evaluated. Finally, `result` is returned.
  The one-argument version `reduce!(fun)(range)`
  works similarly, but it uses the first element of the range as the
! seed (the range must be non-empty).
  
  Returns:
!     the accumulated `result`
  
  Params:
!     fun = one or more functions
  
  See_Also:
      $(HTTP en.wikipedia.org/wiki/Fold_(higher-order_function), Fold (higher-order function))
--- 4514,4536 ----
  compress), `inject`, or `foldl`) present in various programming
  languages of functional flavor. There is also $(LREF fold) which does
  the same thing but with the opposite parameter order.
! 
! * Use `seed` to initialize an internal `accumulator`.
! * For each element `e` in $(D range), evaluate `accumulator = fun(result, e)`.
! * Return $(D accumulator).
! 
  The one-argument version `reduce!(fun)(range)`
  works similarly, but it uses the first element of the range as the
! seed (the range must be non-empty, else this throws).
! 
! If range has only one element, the functions are never invoked and
! `result` and the seed is returned unchanged.
  
  Returns:
!     the accumulated result
  
  Params:
!     fun = one or more functions of the form `Acc function(Acc, ElemT)`
  
  See_Also:
      $(HTTP en.wikipedia.org/wiki/Fold_(higher-order_function), Fold (higher-order function))
*************** languages of functional flavor, iterativ
*** 4803,4828 ****
  $(P Each predicate in `fun` must take two arguments:)
  * An accumulator value
  * An element of the range `r`
! $(P Each predicate must return a value which implicitly converts to the
  type of the accumulator.)
  
! $(P For a single predicate,
  the call `fold!(fun)(range, seed)` will:)
  
! * Use `seed` to initialize an internal variable `result` (also called
!   the accumulator).
! * For each element `e` in $(D range), evaluate `result = fun(result, e)`.
! * Return $(D result).
  
  $(P The one-argument version `fold!(fun)(range)`
  works similarly, but it uses the first element of the range as the
  seed (the range must be non-empty) and iterates over the remaining
  elements.)
  
! Multiple results are produced when using multiple predicates.
  
  Params:
!     fun = the predicate function(s) to apply to the elements
  
  See_Also:
      * $(HTTP en.wikipedia.org/wiki/Fold_(higher-order_function), Fold (higher-order function))
--- 5012,5039 ----
  $(P Each predicate in `fun` must take two arguments:)
  * An accumulator value
  * An element of the range `r`
! $(P Each function must return a value which implicitly converts to the
  type of the accumulator.)
  
! $(P For a single function,
  the call `fold!(fun)(range, seed)` will:)
  
! * Use `seed` to initialize an internal `accumulator`.
! * For each element `e` in $(D range), evaluate `accumulator = fun(result, e)`.
! * Return $(D accumulator).
  
  $(P The one-argument version `fold!(fun)(range)`
  works similarly, but it uses the first element of the range as the
  seed (the range must be non-empty) and iterates over the remaining
  elements.)
  
! Multiple results are produced when using multiple functions.
! 
! If range has only one element, the functions are never invoked and
! `result` and the seed is returned unchanged.
  
  Params:
!     fun = one or more functions of the form `Acc function(Acc, ElemT)`
  
  See_Also:
      * $(HTTP en.wikipedia.org/wiki/Fold_(higher-order_function), Fold (higher-order function))
*************** This function is also known as
*** 4913,4919 ****
      $(HTTP mathworld.wolfram.com/CumulativeSum.html, Cumulative Sum).
  
  Params:
!     fun = one or more functions to use as fold operation
  
  Returns:
      The function returns a range containing the consecutive reduced values. If
--- 5124,5130 ----
      $(HTTP mathworld.wolfram.com/CumulativeSum.html, Cumulative Sum).
  
  Params:
!     fun = one or more functions of the form `Acc function(Acc, ElemT)`
  
  Returns:
      The function returns a range containing the consecutive reduced values. If
*************** empty elements.
*** 5296,5307 ****
  The predicate is passed to $(REF binaryFun, std,functional) and accepts
  any callable function that can be executed via `pred(element, s)`.
  
! Notes:
      If splitting a string on whitespace and token compression is desired,
!     consider using `splitter` without specifying a separator.
! 
!     If no separator is passed, the $(REF_ALTTEXT, unary, unaryFun, std,functional)
!     predicate `isTerminator` decides whether to accept an element of `r`.
  
  Params:
      pred = The predicate for comparing each element with the separator,
--- 5507,5515 ----
  The predicate is passed to $(REF binaryFun, std,functional) and accepts
  any callable function that can be executed via `pred(element, s)`.
  
! Note:
      If splitting a string on whitespace and token compression is desired,
!     consider using the `splitter(r)` overload.
  
  Params:
      pred = The predicate for comparing each element with the separator,
*************** Params:
*** 5310,5316 ****
          split. Must support slicing and `.length` or be a narrow string type.
      s = The element (or range) to be treated as the separator
          between range segments to be split.
-     isTerminator = The predicate for deciding where to split the range when no separator is passed
      keepSeparators = The flag for deciding if the separators are kept
  
  Constraints:
--- 5518,5523 ----
*************** Returns:
*** 5324,5339 ****
      the returned range will be likewise.
      When a range is used a separator, bidirectionality isn't possible.
  
!     If keepSeparators is equal to Yes.keepSeparators the output will also contain the
      separators.
  
      If an empty range is given, the result is an empty range. If a range with
      one separator is given, the result is a range with two empty elements.
  
  See_Also:
!  $(REF _splitter, std,regex) for a version that splits using a regular expression defined separator,
!  $(REF _split, std,array) for a version that splits eagerly and
!  $(LREF splitWhen), which compares adjacent elements instead of element against separator.
  */
  auto splitter(alias pred = "a == b",
                Flag!"keepSeparators" keepSeparators = No.keepSeparators,
--- 5531,5546 ----
      the returned range will be likewise.
      When a range is used a separator, bidirectionality isn't possible.
  
!     If `keepSeparators` is equal to `Yes.keepSeparators` the output will also contain the
      separators.
  
      If an empty range is given, the result is an empty range. If a range with
      one separator is given, the result is a range with two empty elements.
  
  See_Also:
!  - $(REF _splitter, std,regex) for a version that splits using a regular expression defined separator.
!  - $(REF _split, std,array) for a version that splits eagerly.
!  - $(LREF splitWhen), which compares adjacent elements instead of element against separator.
  */
  auto splitter(alias pred = "a == b",
                Flag!"keepSeparators" keepSeparators = No.keepSeparators,
*************** if (is(typeof(binaryFun!pred(r.front, s)
*** 5736,5764 ****
          .equal([ [[0]], [[1]], [[2]] ]));
  }
  
- /// Use splitter without a separator
- @safe unittest
- {
-     import std.algorithm.comparison : equal;
-     import std.range.primitives : front;
- 
-     assert(equal(splitter!(a => a == '|')("a|bc|def"), [ "a", "bc", "def" ]));
-     assert(equal(splitter!(a => a == ' ')("hello  world"), [ "hello", "", "world" ]));
- 
-     int[] a = [ 1, 2, 0, 0, 3, 0, 4, 5, 0 ];
-     int[][] w = [ [1, 2], [], [3], [4, 5], [] ];
-     assert(equal(splitter!(a => a == 0)(a), w));
- 
-     a = [ 0 ];
-     assert(equal(splitter!(a => a == 0)(a), [ (int[]).init, (int[]).init ]));
- 
-     a = [ 0, 1 ];
-     assert(equal(splitter!(a => a == 0)(a), [ [], [1] ]));
- 
-     w = [ [0], [1], [2] ];
-     assert(equal(splitter!(a => a.front == 1)(w), [ [[0]], [[2]] ]));
- }
- 
  /// Leading separators, trailing separators, or no separators.
  @safe unittest
  {
--- 5943,5948 ----
*************** if (is(typeof(binaryFun!pred(r.front, s)
*** 5798,5814 ****
          .retro.equal([ "def", "|", "bc", "|", "a" ]));
  }
  
- /// Splitting by word lazily
- @safe unittest
- {
-     import std.ascii : isWhite;
-     import std.algorithm.comparison : equal;
-     import std.algorithm.iteration : splitter;
- 
-     string str = "Hello World!";
-     assert(str.splitter!(isWhite).equal(["Hello", "World!"]));
- }
- 
  @safe unittest
  {
      import std.algorithm;
--- 5982,5987 ----
*************** if (is(typeof(binaryFun!pred(r.front, s.
*** 6133,6145 ****
      assert(words.equal([ "i", "am", "pointing" ]));
  }
  
! /// ditto
  auto splitter(alias isTerminator, Range)(Range r)
  if (isForwardRange!Range && is(typeof(unaryFun!isTerminator(r.front))))
  {
      return SplitterResult!(unaryFun!isTerminator, Range)(r);
  }
  
  private struct SplitterResult(alias isTerminator, Range)
  {
      import std.algorithm.searching : find;
--- 6306,6366 ----
      assert(words.equal([ "i", "am", "pointing" ]));
  }
  
! /++
! Lazily splits a range `r` whenever a predicate `isTerminator` returns true for an element.
! 
! As above, two adjacent separators are considered to surround an empty element in
! the split range.
! 
! Params:
!     r = The $(REF_ALTTEXT forward range, isForwardRange, std,range,primitives) to be
!         split.
!     isTerminator = A $(REF_ALTTEXT unary, unaryFun, std,functional) predicate for
!         deciding where to split the range.
! 
! Returns:
!     A forward range of slices of the original range split by whitespace.
!  +/
  auto splitter(alias isTerminator, Range)(Range r)
  if (isForwardRange!Range && is(typeof(unaryFun!isTerminator(r.front))))
  {
      return SplitterResult!(unaryFun!isTerminator, Range)(r);
  }
  
+ ///
+ @safe unittest
+ {
+     import std.ascii : isWhite;
+     import std.algorithm.comparison : equal;
+     import std.algorithm.iteration : splitter;
+ 
+     string str = "Hello World\t!";
+     assert(str.splitter!(isWhite).equal(["Hello", "World", "!"]));
+ }
+ 
+ ///
+ @safe unittest
+ {
+     import std.algorithm.comparison : equal;
+     import std.range.primitives : front;
+ 
+     assert(equal(splitter!(a => a == '|')("a|bc|def"), [ "a", "bc", "def" ]));
+     assert(equal(splitter!(a => a == ' ')("hello  world"), [ "hello", "", "world" ]));
+ 
+     int[] a = [ 1, 2, 0, 0, 3, 0, 4, 5, 0 ];
+     int[][] w = [ [1, 2], [], [3], [4, 5], [] ];
+     assert(equal(splitter!(a => a == 0)(a), w));
+ 
+     a = [ 0 ];
+     assert(equal(splitter!(a => a == 0)(a), [ (int[]).init, (int[]).init ]));
+ 
+     a = [ 0, 1 ];
+     assert(equal(splitter!(a => a == 0)(a), [ [], [1] ]));
+ 
+     w = [ [0], [1], [2] ];
+     assert(equal(splitter!(a => a.front == 1)(w), [ [[0]], [[2]] ]));
+ }
+ 
  private struct SplitterResult(alias isTerminator, Range)
  {
      import std.algorithm.searching : find;
*************** Returns:
*** 7940,7945 ****
--- 8161,8173 ----
      A $(REF_ALTTEXT forward range, isForwardRange, std,range,primitives)
      of elements of which are an $(REF indexed, std,range) view into `r`.
  
+ Note:
+     The elements of the resulting range reuse the same internal buffer of
+     permutations, so each element is invalidated by `popFront`.  If copies of
+     intermediate permutations are desired, they need to be individually copied,
+     such as using `.map!(e => e.array)` to save them in individual, independent
+     arrays.
+ 
  See_Also:
  $(REF nextPermutation, std,algorithm,sorting).
  */
diff -Nrcpad gcc-16-20260125/libphobos/src/std/algorithm/mutation.d gcc-16-20260201/libphobos/src/std/algorithm/mutation.d
*** gcc-16-20260125/libphobos/src/std/algorithm/mutation.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/src/std/algorithm/mutation.d	Sun Feb  1 22:32:17 2026
*************** if (isBlitAssignable!T && !is(typeof(lhs
*** 3120,3126 ****
      static struct A
      {
          int x;
!         this(scope ref return const A other)
          {
              import std.stdio;
              x = other.x;
--- 3120,3126 ----
      static struct A
      {
          int x;
!         this(scope return ref const A other)
          {
              import std.stdio;
              x = other.x;
diff -Nrcpad gcc-16-20260125/libphobos/src/std/algorithm/searching.d gcc-16-20260201/libphobos/src/std/algorithm/searching.d
*** gcc-16-20260125/libphobos/src/std/algorithm/searching.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/src/std/algorithm/searching.d	Sun Feb  1 22:32:17 2026
*************** if (isInputRange!R && !isInfinite!R)
*** 776,801 ****
  
  /++
      Counts elements in the given
!     $(REF_ALTTEXT forward range, isForwardRange, std,range,primitives)
!     until the given predicate is true for one of the given `needles`.
  
      Params:
!         pred = The predicate for determining when to stop counting.
          haystack = The
              $(REF_ALTTEXT input range, isInputRange, std,range,primitives) to be
!             counted.
!         needles = Either a single element, or a
!             $(REF_ALTTEXT forward range, isForwardRange, std,range,primitives)
!             of elements, to be evaluated in turn against each
!             element in `haystack` under the given predicate.
  
!     Returns: The number of elements which must be popped from the front of
      `haystack` before reaching an element for which
!     `startsWith!pred(haystack, needles)` is `true`. If
      `startsWith!pred(haystack, needles)` is not `true` for any element in
!     `haystack`, then `-1` is returned. If more than one needle is provided,
!     `countUntil` will wrap the result     in a tuple similar to
!     `Tuple!(ptrdiff_t, "steps", ptrdiff_t needle)`
  
      See_Also: $(REF indexOf, std,string)
    +/
--- 776,816 ----
  
  /++
      Counts elements in the given
!     $(REF_ALTTEXT input range, isInputRange, std,range,primitives)
!     until the given predicate is true for one of the given `needles` or `needle`.
  
      Params:
!         pred = Binary predicate for determining when to stop counting,
!             which will be passed each element of `haystack` and a needle.
          haystack = The
              $(REF_ALTTEXT input range, isInputRange, std,range,primitives) to be
!             counted. Must be a
!             $(REF_ALTTEXT forward range, isForwardRange, std,range,primitives) to
!             use multiple needles.
!         needles = A sequence of values or
!             $(REF_ALTTEXT forward ranges, isForwardRange, std,range,primitives)
!             of values, to be evaluated in turn by calling `pred(element, needle)`
!             with each element of `haystack`.
!         needle = A value passed as the 2nd argument to `pred`.
  
!     Returns:
!   - The number of elements which must be popped from the front of
      `haystack` before reaching an element for which
!     $(LREF startsWith)`!pred(haystack, needles)` is `true`.
!   - If
      `startsWith!pred(haystack, needles)` is not `true` for any element in
!     `haystack`, then `-1` is returned.
!   - If more than one needle is provided,
!     `countUntil` will wrap the result in a pseudo-tuple similar to
!     `Tuple!(ptrdiff_t, "steps", ptrdiff_t, "needle")`.
!     - `steps` is the count value, which can be implicitly tested for equality.
!     - `needle` is the index into `needles` which matched.
!     - Both are `-1` if there was no match.
! 
!     Warning: Due to $(LINK2 https://tour.dlang.org/tour/en/gems/unicode,
!     auto-decoding), the return value of this function may $(I not) correspond
!     to the array index for strings.  To find the index of an element matching
!     the predicate in a string, use $(REF indexOf, std,string) instead.
  
      See_Also: $(REF indexOf, std,string)
    +/
*************** if (isInputRange!R &&
*** 923,941 ****
      assert(countUntil("日本語", '語')   == 2);
      assert(countUntil("日本語", "五") == -1);
      assert(countUntil("日本語", '五') == -1);
-     assert(countUntil([0, 7, 12, 22, 9], [12, 22]) == 2);
-     assert(countUntil([0, 7, 12, 22, 9], 9) == 4);
-     assert(countUntil!"a > b"([0, 7, 12, 22, 9], 20) == 3);
  
!     // supports multiple needles
      auto res = "...hello".countUntil("ha", "he");
      assert(res.steps == 3);
!     assert(res.needle == 1);
  
      // returns -1 if no needle was found
      res = "hello".countUntil("ha", "hu");
      assert(res.steps == -1);
      assert(res.needle == -1);
  }
  
  @safe unittest
--- 938,966 ----
      assert(countUntil("日本語", '語')   == 2);
      assert(countUntil("日本語", "五") == -1);
      assert(countUntil("日本語", '五') == -1);
  
!     const arr = [0, 7, 12, 22, 9];
!     assert(countUntil(arr, [12, 22]) == 2);
!     assert(countUntil(arr, 9) == 4);
!     assert(countUntil!"a > b"(arr, 20) == 3);
! }
! 
! /// Multiple needles
! @safe unittest
! {
      auto res = "...hello".countUntil("ha", "he");
      assert(res.steps == 3);
!     assert(res.needle == 1); // the 2nd needle matched
  
      // returns -1 if no needle was found
      res = "hello".countUntil("ha", "hu");
      assert(res.steps == -1);
      assert(res.needle == -1);
+ 
+     // `steps` can also be implicitly compared
+     const arr = [0, 7, 12, 22, 9];
+     assert(countUntil(arr, 22, 12) == 2); // `12` found after 2 elements
+     assert(countUntil(arr, 5, 6) == -1);
  }
  
  @safe unittest
*************** if (isInputRange!R &&
*** 1009,1015 ****
      assert(10.iota.repeat.joiner.countUntil!(a => a >= 9) == 9);
  }
  
! /// ditto
  ptrdiff_t countUntil(alias pred, R)(R haystack)
  if (isInputRange!R &&
      is(typeof(unaryFun!pred(haystack.front)) : bool))
--- 1034,1062 ----
      assert(10.iota.repeat.joiner.countUntil!(a => a >= 9) == 9);
  }
  
! /++
!     Counts elements in the given
!     $(REF_ALTTEXT input range, isInputRange, std,range,primitives)
!     until the given predicate is true for one of the elements of `haystack`.
! 
!     Params:
!         pred = Unary predicate for determining when to stop counting.
!         haystack = The
!             $(REF_ALTTEXT input range, isInputRange, std,range,primitives) to be
!             counted.
! 
!     Returns:
!   - The number of elements which must be popped from the front of
!     `haystack` before reaching an element for which
!     $(LREF startsWith)`!pred(haystack)` is `true`.
!   - If `startsWith!pred(haystack)` is not `true` for any element in
!     `haystack`, then `-1` is returned.
! 
!     Warning: Due to $(LINK2 https://tour.dlang.org/tour/en/gems/unicode,
!     auto-decoding), the return value of this function may $(I not) correspond
!     to the array index for strings.  To find the index of an element matching
!     the predicate in a string, use $(REF indexOf, std,string) instead.
!   +/
  ptrdiff_t countUntil(alias pred, R)(R haystack)
  if (isInputRange!R &&
      is(typeof(unaryFun!pred(haystack.front)) : bool))
diff -Nrcpad gcc-16-20260125/libphobos/src/std/ascii.d gcc-16-20260201/libphobos/src/std/ascii.d
*** gcc-16-20260125/libphobos/src/std/ascii.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/src/std/ascii.d	Sun Feb  1 22:32:17 2026
*************** $(TR $(TD Validation) $(TD
*** 23,28 ****
--- 23,29 ----
          $(LREF isDigit)
          $(LREF isGraphical)
          $(LREF isHexDigit)
+         $(LREF isLower)
          $(LREF isOctalDigit)
          $(LREF isPrintable)
          $(LREF isPunctuation)
diff -Nrcpad gcc-16-20260125/libphobos/src/std/complex.d gcc-16-20260201/libphobos/src/std/complex.d
*** gcc-16-20260125/libphobos/src/std/complex.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/src/std/complex.d	Sun Feb  1 22:32:17 2026
*************** if (is(T R == Complex!R))
*** 749,757 ****
  
  
  /**
!    Params: z = A complex number.
!    Returns: The absolute value (or modulus) of `z`.
! */
  T abs(T)(Complex!T z) @safe pure nothrow @nogc
  {
      import std.math.algebraic : hypot;
--- 749,770 ----
  
  
  /**
!  * Calculates the absolute value (or modulus) of a complex number.
!  *
!  *      $(TABLE_SV
!  *      $(TR $(TH $(I z))                          $(TH abs(z))             $(TH Notes))
!  *      $(TR $(TD (0, 0))                          $(TD 0)                  $(TD ))
!  *      $(TR $(TD (NaN, any) or (any, NaN))        $(TD NaN)                $(TD ))
!  *      $(TR $(TD (Inf, any) or (any, Inf))        $(TD Inf)                $(TD ))
!  *      $(TR $(TD (a, b)) normal case              $(TD hypot(a, b))      $(TD Uses algorithm to prevent overflow/underflow ))
!  *      )
!  *
!  * Params:
!  *      z = A complex number of type Complex!T
!  *
!  * Returns:
!  *      The absolute value (modulus) of `z`
!  */
  T abs(T)(Complex!T z) @safe pure nothrow @nogc
  {
      import std.math.algebraic : hypot;
*************** T abs(T)(Complex!T z) @safe pure nothrow
*** 767,772 ****
--- 780,805 ----
      assert(abs(complex(1.0L, -2.0L)) == core.math.sqrt(5.0L));
  }
  
+ @safe pure nothrow unittest
+ {
+     {
+         auto x = Complex!float(-5.016556e-20, 0);
+         assert(x.abs == 5.016556e-20f);
+         auto x1 = Complex!float(-5.016556e-20f, 0);
+         assert(x1.abs == 5.016556e-20f);
+         auto x2 = Complex!float(5.016556e-20f, 0);
+         assert(x2.abs == 5.016556e-20f);
+     }
+     {
+         import std.math.traits : isNaN, isInfinity;
+         assert(Complex!double(double.nan, 0).abs.isNaN);
+         assert(Complex!double(double.nan, double.nan).abs.isNaN);
+         assert(Complex!double(double.infinity, 0).abs.isInfinity);
+         assert(Complex!double(0, double.infinity).abs.isInfinity);
+         assert(Complex!double(0, 0).abs == 0);
+     }
+ }
+ 
  @safe pure nothrow @nogc unittest
  {
      static import core.math;
*************** T abs(T)(Complex!T z) @safe pure nothrow
*** 788,793 ****
--- 821,827 ----
      }}
  }
  
+ 
  /++
     Params:
      z = A complex number.
*************** T sqAbs(T)(Complex!T z) @safe pure nothr
*** 812,817 ****
--- 846,852 ----
      assert(isClose(sqAbs(complex(1.0f,-1.0f)), 2.0f));
  }
  
+ 
  /// ditto
  T sqAbs(T)(const T x) @safe pure nothrow @nogc
  if (isFloatingPoint!T)
diff -Nrcpad gcc-16-20260125/libphobos/src/std/container/rbtree.d gcc-16-20260201/libphobos/src/std/container/rbtree.d
*** gcc-16-20260125/libphobos/src/std/container/rbtree.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/src/std/container/rbtree.d	Sun Feb  1 22:32:17 2026
*************** private struct RBRange(N)
*** 679,685 ****
      /**
       * Returns the first element in the range
       */
!     @property Elem front()
      {
          return _begin.value;
      }
--- 679,685 ----
      /**
       * Returns the first element in the range
       */
!     ref @property Elem front()
      {
          return _begin.value;
      }
*************** private struct RBRange(N)
*** 687,693 ****
      /**
       * Returns the last element in the range
       */
!     @property Elem back()
      {
          return _end.prev.value;
      }
--- 687,693 ----
      /**
       * Returns the last element in the range
       */
!     ref @property Elem back()
      {
          return _end.prev.value;
      }
*************** private struct RBRange(N)
*** 737,749 ****
   * elements `a` and `b`, $(D less(a, b) == !less(b, a)). $(D less(a, a)) should
   * always equal `false`.
   *
   * If `allowDuplicates` is set to `true`, then inserting the same element more than
   * once continues to add more elements.  If it is `false`, duplicate elements are
   * ignored on insertion.  If duplicates are allowed, then new elements are
   * inserted after all existing duplicate elements.
   */
  final class RedBlackTree(T, alias less = "a < b", bool allowDuplicates = false)
! if (is(typeof(binaryFun!less(T.init, T.init))))
  {
      import std.meta : allSatisfy;
      import std.range : Take;
--- 737,753 ----
   * elements `a` and `b`, $(D less(a, b) == !less(b, a)). $(D less(a, a)) should
   * always equal `false`.
   *
+  * Care should also be taken to not modify elements in the tree (e.g. via `front` /
+  * `back`, which return by `ref`) in a way which would affect the order defined by
+  * the `less` predicate.
+  *
   * If `allowDuplicates` is set to `true`, then inserting the same element more than
   * once continues to add more elements.  If it is `false`, duplicate elements are
   * ignored on insertion.  If duplicates are allowed, then new elements are
   * inserted after all existing duplicate elements.
   */
  final class RedBlackTree(T, alias less = "a < b", bool allowDuplicates = false)
! if (is(typeof((ref const T a) => binaryFun!less(a, a))))
  {
      import std.meta : allSatisfy;
      import std.range : Take;
*************** if (is(typeof(binaryFun!less(T.init, T.i
*** 1036,1042 ****
       *
       * Complexity: $(BIGOH 1)
       */
!     inout(Elem) front() inout
      {
          return _begin.value;
      }
--- 1040,1046 ----
       *
       * Complexity: $(BIGOH 1)
       */
!     ref inout(Elem) front() inout
      {
          return _begin.value;
      }
*************** if (is(typeof(binaryFun!less(T.init, T.i
*** 1046,1052 ****
       *
       * Complexity: $(BIGOH log(n))
       */
!     inout(Elem) back() inout
      {
          return _end.prev.value;
      }
--- 1050,1056 ----
       *
       * Complexity: $(BIGOH log(n))
       */
!     ref inout(Elem) back() inout
      {
          return _end.prev.value;
      }
*************** assert(equal(rbt[], [5]));
*** 1737,1742 ****
--- 1741,1766 ----
          }
      }
  
+     /**
+      * Returns a static array of 3 ranges `r` such that `r[0]` is the
+      * same as the result of `lowerBound(value)`, `r[1]` is the same
+      * as the result of $(D equalRange(value)), and `r[2]` is the same
+      * as the result of $(D upperBound(value)).
+      *
+      * Complexity: $(BIGOH log(n))
+      */
+     auto trisect(this This)(Elem e)
+     {
+         auto equalRange = this.equalRange(e);
+         alias RangeType = typeof(equalRange);
+         RangeType[3] result = [
+             RangeType(_begin, equalRange._begin),
+             equalRange,
+             RangeType(equalRange._end, _end)
+         ];
+         return result;
+     }
+ 
      static if (doUnittest) @safe pure unittest
      {
          import std.algorithm.comparison : equal;
*************** if ( is(typeof(binaryFun!less((ElementTy
*** 2186,2191 ****
--- 2210,2220 ----
      assert(rt1.lowerBound(3).equal([1, 2]));
      assert(rt1.equalRange(3).equal([3]));
      assert(rt1[].equal([1, 2, 3, 4, 5]));
+ 
+     auto t = rt1.trisect(3);
+     assert(t[0].equal(rt1.lowerBound(3)));
+     assert(t[1].equal(rt1.equalRange(3)));
+     assert(t[2].equal(rt1.upperBound(3)));
  }
  
  //immutable checks
*************** if ( is(typeof(binaryFun!less((ElementTy
*** 2231,2233 ****
--- 2260,2273 ----
      t.insert([1, 3, 5, 4, 2]);
      assert(t[].equal([5, 4, 3, 2, 1]));
  }
+ 
+ // should support `less` predicate taking `ref const`
+ @safe pure unittest
+ {
+     struct S
+     {
+         int* value;
+     }
+ 
+     cast(void) new RedBlackTree!(S, (ref const S a, ref const S b) => a.value > b.value);
+ }
diff -Nrcpad gcc-16-20260125/libphobos/src/std/conv.d gcc-16-20260201/libphobos/src/std/conv.d
*** gcc-16-20260125/libphobos/src/std/conv.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/src/std/conv.d	Sun Feb  1 22:32:17 2026
*************** $(TR $(TD Strings) $(TD
*** 19,24 ****
--- 19,27 ----
          $(LREF text)
          $(LREF wtext)
          $(LREF dtext)
+         $(LREF writeText)
+         $(LREF writeWText)
+         $(LREF writeDText)
          $(LREF hexString)
  ))
  $(TR $(TD Numeric) $(TD
*************** template to(T)
*** 540,545 ****
--- 543,565 ----
      }
  }
  
+ private T toImpl(T, S)(S)
+ if (isInputRange!S && isInfinite!S && isExactSomeString!T)
+ {
+     static assert(0, "Cannot convert infinite range to string. " ~
+                 "Use `std.range.take` or `std.range.takeExactly` to make it finite.");
+ }
+ 
+ // Test for issue : https://github.com/dlang/phobos/issues/10559
+ @safe pure nothrow unittest
+ {
+     import std.range : repeat;
+     import std.conv : to;
+ 
+     // Test that converting an infinite range doesn't compile
+     static assert(!__traits(compiles, repeat(1).to!string));
+ }
+ 
  /**
  If the source type is implicitly convertible to the target type, $(D
  to) simply performs the implicit conversion.
*************** if (isIntegral!Target && !is(Target == e
*** 2470,2476 ****
              alias source = s;
          }
  
!         size_t count = 0;
  
          if (source.empty)
              goto Lerr;
--- 2490,2497 ----
              alias source = s;
          }
  
!         static if (doCount)
!             size_t count = 0;
  
          if (source.empty)
              goto Lerr;
*************** if (isIntegral!Target && !is(Target == e
*** 2485,2491 ****
                      sign = true;
                      goto case '+';
                  case '+':
!                     ++count;
                      source.popFront();
  
                      if (source.empty)
--- 2506,2513 ----
                      sign = true;
                      goto case '+';
                  case '+':
!                     static if (doCount)
!                         ++count;
                      source.popFront();
  
                      if (source.empty)
*************** if (isIntegral!Target && !is(Target == e
*** 2504,2510 ****
          {
              Target v = cast(Target) c;
  
!             ++count;
              source.popFront();
  
              while (!source.empty)
--- 2526,2533 ----
          {
              Target v = cast(Target) c;
  
!             static if (doCount)
!                 ++count;
              source.popFront();
  
              while (!source.empty)
*************** if (isIntegral!Target && !is(Target == e
*** 2520,2526 ****
                      // Note: `v` can become negative here in case of parsing
                      // the most negative value:
                      v = cast(Target) (v * 10 + c);
!                     ++count;
                      source.popFront();
                  }
                  else
--- 2543,2550 ----
                      // Note: `v` can become negative here in case of parsing
                      // the most negative value:
                      v = cast(Target) (v * 10 + c);
!                     static if (doCount)
!                         ++count;
                      source.popFront();
                  }
                  else
*************** do
*** 2877,2883 ****
          alias s = source;
      }
  
!     size_t count = 0;
      auto found = false;
      do
      {
--- 2901,2908 ----
          alias s = source;
      }
  
!     static if (doCount)
!         size_t count = 0;
      auto found = false;
      do
      {
*************** do
*** 2904,2910 ****
          auto nextv = v.mulu(radix, overflow).addu(c - '0', overflow);
          enforce!ConvOverflowException(!overflow && nextv <= Target.max, "Overflow in integral conversion");
          v = cast(Target) nextv;
!         ++count;
          s.popFront();
          found = true;
      } while (!s.empty);
--- 2929,2936 ----
          auto nextv = v.mulu(radix, overflow).addu(c - '0', overflow);
          enforce!ConvOverflowException(!overflow && nextv <= Target.max, "Overflow in integral conversion");
          v = cast(Target) nextv;
!         static if (doCount)
!             ++count;
          s.popFront();
          found = true;
      } while (!s.empty);
*************** if (isFloatingPoint!Target && !is(Target
*** 3163,3198 ****
  
      enforce(!p.empty, bailOut());
  
- 
      size_t count = 0;
      bool sign = false;
      switch (p.front)
      {
      case '-':
          sign = true;
!         ++count;
          p.popFront();
          enforce(!p.empty, bailOut());
          if (toLower(p.front) == 'i')
              goto case 'i';
          break;
      case '+':
!         ++count;
          p.popFront();
          enforce(!p.empty, bailOut());
          break;
      case 'i': case 'I':
          // inf
!         ++count;
          p.popFront();
          enforce(!p.empty && toUpper(p.front) == 'N',
                 bailOut("error converting input to floating point"));
!         ++count;
          p.popFront();
          enforce(!p.empty && toUpper(p.front) == 'F',
                 bailOut("error converting input to floating point"));
          // skip past the last 'f'
!         ++count;
          p.popFront();
          advanceSource();
          static if (doCount)
--- 3189,3223 ----
  
      enforce(!p.empty, bailOut());
  
      size_t count = 0;
      bool sign = false;
      switch (p.front)
      {
      case '-':
          sign = true;
!         static if (doCount) ++count;
          p.popFront();
          enforce(!p.empty, bailOut());
          if (toLower(p.front) == 'i')
              goto case 'i';
          break;
      case '+':
!         static if (doCount) ++count;
          p.popFront();
          enforce(!p.empty, bailOut());
          break;
      case 'i': case 'I':
          // inf
!         static if (doCount) ++count;
          p.popFront();
          enforce(!p.empty && toUpper(p.front) == 'N',
                 bailOut("error converting input to floating point"));
!         static if (doCount) ++count;
          p.popFront();
          enforce(!p.empty && toUpper(p.front) == 'F',
                 bailOut("error converting input to floating point"));
          // skip past the last 'f'
!         static if (doCount) ++count;
          p.popFront();
          advanceSource();
          static if (doCount)
*************** if (isFloatingPoint!Target && !is(Target
*** 3210,3216 ****
      bool startsWithZero = p.front == '0';
      if (startsWithZero)
      {
!         ++count;
          p.popFront();
          if (p.empty)
          {
--- 3235,3241 ----
      bool startsWithZero = p.front == '0';
      if (startsWithZero)
      {
!         static if (doCount) ++count;
          p.popFront();
          if (p.empty)
          {
*************** if (isFloatingPoint!Target && !is(Target
*** 3228,3250 ****
          isHex = p.front == 'x' || p.front == 'X';
          if (isHex)
          {
!             ++count;
              p.popFront();
          }
      }
      else if (toLower(p.front) == 'n')
      {
          // nan
!         ++count;
          p.popFront();
          enforce(!p.empty && toUpper(p.front) == 'A',
                 bailOut("error converting input to floating point"));
!         ++count;
          p.popFront();
          enforce(!p.empty && toUpper(p.front) == 'N',
                 bailOut("error converting input to floating point"));
          // skip past the last 'n'
!         ++count;
          p.popFront();
          advanceSource();
          static if (doCount)
--- 3253,3275 ----
          isHex = p.front == 'x' || p.front == 'X';
          if (isHex)
          {
!             static if (doCount) ++count;
              p.popFront();
          }
      }
      else if (toLower(p.front) == 'n')
      {
          // nan
!         static if (doCount) ++count;
          p.popFront();
          enforce(!p.empty && toUpper(p.front) == 'A',
                 bailOut("error converting input to floating point"));
!         static if (doCount) ++count;
          p.popFront();
          enforce(!p.empty && toUpper(p.front) == 'N',
                 bailOut("error converting input to floating point"));
          // skip past the last 'n'
!         static if (doCount) ++count;
          p.popFront();
          advanceSource();
          static if (doCount)
*************** if (isFloatingPoint!Target && !is(Target
*** 3332,3345 ****
                      exp += expIter;
                  }
                  exp -= dot;
!                 ++count;
                  p.popFront();
                  if (p.empty)
                      break;
                  i = p.front;
                  if (i == '_')
                  {
!                     ++count;
                      p.popFront();
                      if (p.empty)
                          break;
--- 3357,3370 ----
                      exp += expIter;
                  }
                  exp -= dot;
!                 static if (doCount) ++count;
                  p.popFront();
                  if (p.empty)
                      break;
                  i = p.front;
                  if (i == '_')
                  {
!                     static if (doCount) ++count;
                      p.popFront();
                      if (p.empty)
                          break;
*************** if (isFloatingPoint!Target && !is(Target
*** 3348,3354 ****
              }
              if (i == '.' && !dot)
              {
!                 ++count;
                  p.popFront();
                  dot += expIter;
              }
--- 3373,3379 ----
              }
              if (i == '.' && !dot)
              {
!                 static if (doCount) ++count;
                  p.popFront();
                  dot += expIter;
              }
*************** if (isFloatingPoint!Target && !is(Target
*** 3373,3386 ****
          char sexp = 0;
          int e = 0;
  
!         ++count;
          p.popFront();
          enforce(!p.empty, new ConvException("Unexpected end of input"));
          switch (p.front)
          {
              case '-':    sexp++;
                           goto case;
!             case '+':    ++count;
                           p.popFront();
                           break;
              default: {}
--- 3398,3411 ----
          char sexp = 0;
          int e = 0;
  
!         static if (doCount) ++count;
          p.popFront();
          enforce(!p.empty, new ConvException("Unexpected end of input"));
          switch (p.front)
          {
              case '-':    sexp++;
                           goto case;
!             case '+':    static if (doCount) ++count;
                           p.popFront();
                           break;
              default: {}
*************** if (isFloatingPoint!Target && !is(Target
*** 3392,3398 ****
              {
                  e = e * 10 + p.front - '0';
              }
!             ++count;
              p.popFront();
              sawDigits = true;
          }
--- 3417,3423 ----
              {
                  e = e * 10 + p.front - '0';
              }
!             static if (doCount) ++count;
              p.popFront();
              sawDigits = true;
          }
*************** if (isDynamicArray!Target && !is(Target
*** 4098,4104 ****
      auto result = appender!Target();
  
      parseCheck!s(lbracket);
!     size_t count = 1 + skipWS!(Source, Yes.doCount)(s);
      if (s.empty)
          throw convError!(Source, Target)(s);
      if (s.front == rbracket)
--- 4123,4134 ----
      auto result = appender!Target();
  
      parseCheck!s(lbracket);
!     static if (doCount)
!         size_t count = 1;
!     static if (doCount)
!         count += skipWS!(Source, Yes.doCount)(s);
!     else
!         skipWS!(Source, No.doCount)(s);
      if (s.empty)
          throw convError!(Source, Target)(s);
      if (s.front == rbracket)
*************** if (isDynamicArray!Target && !is(Target
*** 4106,4141 ****
          s.popFront();
          static if (doCount)
          {
!             return tuple!("data", "count")(result.data, ++count);
          }
          else
          {
              return result.data;
          }
      }
!     for (;; s.popFront(), count += 1 + skipWS!(Source, Yes.doCount)(s))
      {
          if (!s.empty && s.front == rbracket)
              break;
!         auto r = parseElement!(WideElementType!Target, Source, Yes.doCount)(s);
!         result ~= r.data;
!         count += r.count + skipWS!(Source, Yes.doCount)(s);
          if (s.empty)
              throw convError!(Source, Target)(s);
          if (s.front != comma)
              break;
      }
      parseCheck!s(rbracket);
      static if (doCount)
      {
!         return tuple!("data", "count")(result.data, ++count);
      }
      else
      {
          return result.data;
      }
  }
- 
  ///
  @safe pure unittest
  {
--- 4136,4189 ----
          s.popFront();
          static if (doCount)
          {
!             ++count;
!             return tuple!("data", "count")(result.data, count);
          }
          else
          {
              return result.data;
          }
      }
!     for (;;)
      {
          if (!s.empty && s.front == rbracket)
              break;
!         static if (doCount)
!         {
!             auto r = parseElement!(WideElementType!Target, Source, Yes.doCount)(s);
!             result ~= r.data;
!             count += r.count;
!             count += skipWS!(Source, Yes.doCount)(s);
!         }
!         else
!         {
!             auto r = parseElement!(WideElementType!Target, Source, No.doCount)(s);
!             result ~= r;
!             skipWS!(Source, No.doCount)(s);
!         }
          if (s.empty)
              throw convError!(Source, Target)(s);
          if (s.front != comma)
              break;
+         s.popFront();
+         static if (doCount)
+             ++count;
+         static if (doCount)
+             count += skipWS!(Source, Yes.doCount)(s);
+         else
+             skipWS!(Source, No.doCount)(s);
      }
      parseCheck!s(rbracket);
      static if (doCount)
      {
!         ++count;
!         return tuple!("data", "count")(result.data, count);
      }
      else
      {
          return result.data;
      }
  }
  ///
  @safe pure unittest
  {
*************** if (isStaticArray!Target && !is(Target =
*** 4286,4292 ****
          Target result = void;
  
      parseCheck!s(lbracket);
!     size_t count = 1 + skipWS!(Source, Yes.doCount)(s);
      if (s.empty)
          throw convError!(Source, Target)(s);
      if (s.front == rbracket)
--- 4334,4345 ----
          Target result = void;
  
      parseCheck!s(lbracket);
!     static if (doCount)
!         size_t count = 1;
!     static if (doCount)
!         count += skipWS!(Source, Yes.doCount)(s);
!     else
!         skipWS!(Source, No.doCount)(s);
      if (s.empty)
          throw convError!(Source, Target)(s);
      if (s.front == rbracket)
*************** if (isStaticArray!Target && !is(Target =
*** 4298,4304 ****
              s.popFront();
              static if (doCount)
              {
!                 return tuple!("data", "count")(result, ++count);
              }
              else
              {
--- 4351,4358 ----
              s.popFront();
              static if (doCount)
              {
!                 ++count;
!                 return tuple!("data", "count")(result, count);
              }
              else
              {
*************** if (isStaticArray!Target && !is(Target =
*** 4306,4318 ****
              }
          }
      }
!     for (size_t i = 0; ; s.popFront(), count += 1 + skipWS!(Source, Yes.doCount)(s))
      {
          if (i == result.length)
              goto Lmanyerr;
!         auto r = parseElement!(ElementType!Target, Source, Yes.doCount)(s);
!         result[i++] = r.data;
!         count += r.count + skipWS!(Source, Yes.doCount)(s);
          if (s.empty)
              throw convError!(Source, Target)(s);
          if (s.front != comma)
--- 4360,4382 ----
              }
          }
      }
!     for (size_t i = 0; ; )
      {
          if (i == result.length)
              goto Lmanyerr;
!         static if (doCount)
!         {
!             auto r = parseElement!(ElementType!Target, Source, Yes.doCount)(s);
!             result[i++] = r.data;
!             count += r.count;
!             count += skipWS!(Source, Yes.doCount)(s);
!         }
!         else
!         {
!             auto r = parseElement!(ElementType!Target, Source, No.doCount)(s);
!             result[i++] = r;
!             skipWS!(Source, No.doCount)(s);
!         }
          if (s.empty)
              throw convError!(Source, Target)(s);
          if (s.front != comma)
*************** if (isStaticArray!Target && !is(Target =
*** 4321,4341 ****
                  goto Lfewerr;
              break;
          }
      }
      parseCheck!s(rbracket);
      static if (doCount)
      {
!         return tuple!("data", "count")(result, ++count);
      }
      else
      {
          return result;
      }
  
- 
  Lmanyerr:
      throw parseError(text("Too many elements in input, ", result.length, " elements expected."));
- 
  Lfewerr:
      throw parseError(text("Too few elements in input, ", result.length, " elements expected."));
  }
--- 4385,4411 ----
                  goto Lfewerr;
              break;
          }
+         s.popFront();
+         static if (doCount)
+             ++count;
+         static if (doCount)
+             count += skipWS!(Source, Yes.doCount)(s);
+         else
+             skipWS!(Source, No.doCount)(s);
      }
      parseCheck!s(rbracket);
      static if (doCount)
      {
!         ++count;
!         return tuple!("data", "count")(result, count);
      }
      else
      {
          return result;
      }
  
  Lmanyerr:
      throw parseError(text("Too many elements in input, ", result.length, " elements expected."));
  Lfewerr:
      throw parseError(text("Too few elements in input, ", result.length, " elements expected."));
  }
*************** if (isAssociativeArray!Target && !is(Tar
*** 4393,4438 ****
      alias ValType = typeof(Target.init.values[0]);
  
      Target result;
  
      parseCheck!s(lbracket);
!     size_t count = 1 + skipWS!(Source, Yes.doCount)(s);
      if (s.empty)
          throw convError!(Source, Target)(s);
      if (s.front == rbracket)
      {
          s.popFront();
          static if (doCount)
          {
!             return tuple!("data", "count")(result, ++count);
          }
          else
          {
!             return result;
          }
-     }
-     for (;; s.popFront(), count += 1 + skipWS!(Source, Yes.doCount)(s))
-     {
-         auto key = parseElement!(KeyType, Source, Yes.doCount)(s);
-         count += key.count + skipWS!(Source, Yes.doCount)(s);
-         parseCheck!s(keyval);
-         count += 1 + skipWS!(Source, Yes.doCount)(s);
-         auto val = parseElement!(ValType, Source, Yes.doCount)(s);
-         count += val.count + skipWS!(Source, Yes.doCount)(s);
-         result[key.data] = val.data;
          if (s.empty)
              throw convError!(Source, Target)(s);
          if (s.front != comma)
              break;
      }
      parseCheck!s(rbracket);
      static if (doCount)
!     {
!         return tuple!("data", "count")(result, ++count);
!     }
      else
-     {
          return result;
-     }
  }
  
  ///
--- 4463,4522 ----
      alias ValType = typeof(Target.init.values[0]);
  
      Target result;
+     static if (doCount) size_t count;
  
      parseCheck!s(lbracket);
!     static if (doCount)
!         count = 1 + skipWS!(Source, Yes.doCount)(s);
!     else
!         skipWS!(Source, No.doCount)(s);
      if (s.empty)
          throw convError!(Source, Target)(s);
      if (s.front == rbracket)
      {
          s.popFront();
          static if (doCount)
+             return tuple!("data", "count")(result, count + 1);
+         else
+             return result;
+     }
+     for (;;)
+     {
+         static if (doCount)
          {
!             auto key = parseElement!(KeyType, Source, Yes.doCount)(s);
!             count += key.count + skipWS!(Source, Yes.doCount)(s);
!             parseCheck!s(keyval);
!             count += 1 + skipWS!(Source, Yes.doCount)(s);
!             auto val = parseElement!(ValType, Source, Yes.doCount)(s);
!             count += val.count + skipWS!(Source, Yes.doCount)(s);
!             result[key.data] = val.data;
          }
          else
          {
!             auto key = parseElement!(KeyType, Source, No.doCount)(s);
!             skipWS!(Source, No.doCount)(s);
!             parseCheck!s(keyval);
!             skipWS!(Source, No.doCount)(s);
!             auto val = parseElement!(ValType, Source, No.doCount)(s);
!             skipWS!(Source, No.doCount)(s);
!             result[key] = val;
          }
          if (s.empty)
              throw convError!(Source, Target)(s);
          if (s.front != comma)
              break;
+         s.popFront();
+         static if (doCount)
+             count += 1 + skipWS!(Source, Yes.doCount)(s);
+         else
+             skipWS!(Source, No.doCount)(s);
      }
      parseCheck!s(rbracket);
      static if (doCount)
!         return tuple!("data", "count")(result, count + 1);
      else
          return result;
  }
  
  ///
*************** private auto parseEscape(Source, Flag!"d
*** 4489,4495 ****
  if (isInputRange!Source && isSomeChar!(ElementType!Source))
  {
      parseCheck!s('\\');
!     size_t count = 1;
      if (s.empty)
          throw parseError("Unterminated escape sequence");
  
--- 4573,4581 ----
  if (isInputRange!Source && isSomeChar!(ElementType!Source))
  {
      parseCheck!s('\\');
!     size_t count;
!     static if (doCount)
!         count = 1;
      if (s.empty)
          throw parseError("Unterminated escape sequence");
  
*************** if (isInputRange!Source && isSomeChar!(E
*** 4507,4521 ****
              throw parseError("Hex digit is missing");
          return isAlpha(c) ? ((c & ~0x20) - ('A' - 10)) : c - '0';
      }
- 
      // We need to do octals separate, because they need a lookahead to find out,
      // where the escape sequence ends.
      auto first = s.front;
      if (first >= '0' && first <= '7')
      {
          dchar c1 = s.front;
-         ++count;
          s.popFront();
          if (s.empty)
          {
              static if (doCount)
--- 4593,4607 ----
              throw parseError("Hex digit is missing");
          return isAlpha(c) ? ((c & ~0x20) - ('A' - 10)) : c - '0';
      }
      // We need to do octals separate, because they need a lookahead to find out,
      // where the escape sequence ends.
      auto first = s.front;
      if (first >= '0' && first <= '7')
      {
          dchar c1 = s.front;
          s.popFront();
+         static if (doCount)
+             ++count;
          if (s.empty)
          {
              static if (doCount)
*************** if (isInputRange!Source && isSomeChar!(E
*** 4539,4546 ****
                  return cast (dchar)(c1 - '0');
              }
          }
-         ++count;
          s.popFront();
          dchar c3 = s.front;
          if (c3 < '0' || c3 > '7')
          {
--- 4625,4633 ----
                  return cast (dchar)(c1 - '0');
              }
          }
          s.popFront();
+         static if (doCount)
+             ++count;
          dchar c3 = s.front;
          if (c3 < '0' || c3 > '7')
          {
*************** if (isInputRange!Source && isSomeChar!(E
*** 4553,4560 ****
                  return cast (dchar) (8 * (c1 - '0') + (c2 - '0'));
              }
          }
-         ++count;
          s.popFront();
          if (c1 > '3')
              throw parseError("Octal sequence is larger than \\377");
          static if (doCount)
--- 4640,4648 ----
                  return cast (dchar) (8 * (c1 - '0') + (c2 - '0'));
              }
          }
          s.popFront();
+         static if (doCount)
+             ++count;
          if (c1 > '3')
              throw parseError("Octal sequence is larger than \\377");
          static if (doCount)
*************** if (isInputRange!Source && isSomeChar!(E
*** 4585,4598 ****
          case 'x':
              result  = getHexDigit() << 4;
              result |= getHexDigit();
!             count += 2;
              break;
          case 'u':
              result  = getHexDigit() << 12;
              result |= getHexDigit() << 8;
              result |= getHexDigit() << 4;
              result |= getHexDigit();
!             count += 4;
              break;
          case 'U':
              result  = getHexDigit() << 28;
--- 4673,4688 ----
          case 'x':
              result  = getHexDigit() << 4;
              result |= getHexDigit();
!             static if (doCount)
!                 count += 2;
              break;
          case 'u':
              result  = getHexDigit() << 12;
              result |= getHexDigit() << 8;
              result |= getHexDigit() << 4;
              result |= getHexDigit();
!             static if (doCount)
!                 count += 4;
              break;
          case 'U':
              result  = getHexDigit() << 28;
*************** if (isInputRange!Source && isSomeChar!(E
*** 4603,4609 ****
              result |= getHexDigit() << 8;
              result |= getHexDigit() << 4;
              result |= getHexDigit();
!             count += 8;
              break;
          default:
              throw parseError("Unknown escape character " ~ to!string(s.front));
--- 4693,4700 ----
              result |= getHexDigit() << 8;
              result |= getHexDigit() << 4;
              result |= getHexDigit();
!             static if (doCount)
!                 count += 8;
              break;
          default:
              throw parseError("Unknown escape character " ~ to!string(s.front));
*************** if (isInputRange!Source && isSomeChar!(E
*** 4643,4649 ****
          // https://issues.dlang.org/show_bug.cgi?id=9621 (Named Character Entities)
          //'\&amp;', '\&quot;',
      ];
- 
      foreach (i ; 0 .. s1.length)
      {
          assert(s2[i] == parseEscape(s1[i]));
--- 4734,4739 ----
*************** if (isInputRange!Source && isSomeChar!(E
*** 4696,4702 ****
      }
  
      parseCheck!s('\"');
!     size_t count = 1;
      if (s.empty)
          throw convError!(Source, Target)(s);
      if (s.front == '\"')
--- 4786,4794 ----
      }
  
      parseCheck!s('\"');
!     size_t count;
!     static if (doCount)
!         count = 1;
      if (s.empty)
          throw convError!(Source, Target)(s);
      if (s.front == '\"')
*************** if (isInputRange!Source && isSomeChar!(E
*** 4704,4716 ****
          s.popFront();
          static if (doCount)
          {
!             return tuple!("data", "count")(result.data, ++count);
          }
          else
          {
              return result.data;
          }
- 
      }
      while (true)
      {
--- 4796,4808 ----
          s.popFront();
          static if (doCount)
          {
!             count++;
!             return tuple!("data", "count")(result.data, count);
          }
          else
          {
              return result.data;
          }
      }
      while (true)
      {
*************** if (isInputRange!Source && isSomeChar!(E
*** 4722,4741 ****
                  s.popFront();
                  static if (doCount)
                  {
!                     return tuple!("data", "count")(result.data, ++count);
                  }
                  else
                  {
                      return result.data;
                  }
              case '\\':
!                 auto r = parseEscape!(typeof(s), Yes.doCount)(s);
!                 result.put(r[0]);
!                 count += r[1];
                  break;
              default:
                  result.put(s.front);
!                 ++count;
                  s.popFront();
                  break;
          }
--- 4814,4843 ----
                  s.popFront();
                  static if (doCount)
                  {
!                     count++;
!                     return tuple!("data", "count")(result.data, count);
                  }
                  else
                  {
                      return result.data;
                  }
              case '\\':
!                 static if (doCount)
!                 {
!                     auto r = parseEscape!(typeof(s), Yes.doCount)(s);
!                     result.put(r[0]);
!                     count += r[1];
!                 }
!                 else
!                 {
!                     auto r = parseEscape!(typeof(s), No.doCount)(s);
!                     result.put(r);
!                 }
                  break;
              default:
                  result.put(s.front);
!                 static if (doCount)
!                     count++;
                  s.popFront();
                  break;
          }
*************** if (isInputRange!Source && isSomeChar!(E
*** 4751,4771 ****
      Unqual!Target c;
  
      parseCheck!s('\'');
!     size_t count = 1;
      if (s.empty)
          throw convError!(Source, Target)(s);
!     ++count; // for the following if-else sequence
      if (s.front != '\\')
      {
          c = s.front;
          s.popFront();
      }
      else
!         c = parseEscape(s);
      parseCheck!s('\'');
      static if (doCount)
      {
!         return tuple!("data", "count")(c, ++count);
      }
      else
      {
--- 4853,4882 ----
      Unqual!Target c;
  
      parseCheck!s('\'');
!     size_t count;
!     static if (doCount)
!         count = 1;
      if (s.empty)
          throw convError!(Source, Target)(s);
!     static if (doCount)
!         count++;
      if (s.front != '\\')
      {
          c = s.front;
          s.popFront();
      }
      else
!     {
!         static if (doCount)
!             c = parseEscape!(typeof(s), Yes.doCount)(s).data;
!         else
!             c = parseEscape!(typeof(s), No.doCount)(s);
!     }
      parseCheck!s('\'');
      static if (doCount)
      {
!         count++;
!         return tuple!("data", "count")(c, count);
      }
      else
      {
*************** if (T.length > 0) { return textImpl!dstr
*** 4835,4840 ****
--- 4946,5170 ----
      assert(dtext(cs, ' ', ws, " ", ds) == "今日は 여보세요 Здравствуйте"d);
  }
  
+ // Ensure that ranges are being printed as expected.
+ @safe unittest
+ {
+     static struct Range
+     {
+         int counter = 0;
+ 
+     @safe pure nothrow @nogc:
+         bool empty() const => (counter <= 0);
+         int front() const => counter;
+         void popFront() { --counter; }
+     }
+ 
+     auto m = Range(2);
+     assert(text(m) == "[2, 1]");
+ 
+     const c = Range(3);
+     assert(text(c) == "const(Range)(3)");
+ }
+ 
+ // Ensure that a usage pattern seen in libraries like "unit-threaded" works.
+ @safe unittest
+ {
+     static final class Foo
+     {
+         override string toString() const @safe
+         {
+             return ":-)";
+         }
+     }
+ 
+     const c = new Foo();
+     assert(text(c) == ":-)");
+     assert(text(c, " ") == ":-) ");
+ }
+ 
+ // Ensure that classes are printed as expected.
+ @system unittest
+ {
+     import std.string : endsWith, startsWith;
+ 
+     static final class Bar {}
+ 
+     // CTFE:                                                         `Bar`
+     // Runtime:                         `std.conv.__unittest_L4875_C9.Bar`
+     static assert(text(     new       Bar ()     )  ==               "Bar"   );
+            assert(text(     new       Bar ()     ).endsWith  (      ".Bar"  ));
+     static assert(text("=", new       Bar (), ".")  ==              "=Bar."  );
+            assert(text("=", new       Bar (), ".").endsWith  (      ".Bar." ));
+     static assert(text(     new const(Bar)()     )  ==         "const(Bar)"  );
+            assert(text(     new const(Bar)()     ).startsWith( "const("     ));
+            assert(text(     new const(Bar)()     ).endsWith  (      ".Bar)" ));
+     static assert(text("=", new const(Bar)(), ".")  ==        "=const(Bar)." );
+            assert(text("=", new const(Bar)(), ".").startsWith("=const("     ));
+            assert(text("=", new const(Bar)(), ".").endsWith  (      ".Bar)."));
+ }
+ 
+ // Ensure that various types are printed as expected.
+ @safe unittest
+ {
+     import std.string : endsWith;
+ 
+     int dummy;
+ 
+     static struct Foo {}
+     struct Bar { int i() @safe => dummy; }
+ 
+     static struct Point
+     {
+         int x;
+         int y;
+     }
+ 
+     struct Range
+     {
+         bool empty()    =>              dummy > 9;
+         int  front()    =>              dummy;
+         void popFront() => cast(void) ++dummy;
+     }
+ 
+     assert(text(null         ) == "null"     );
+     assert(text(null, null   ) == "nullnull" );
+     assert(text(0, null, '\0') == "0null\x00");
+ 
+     assert(text('\r','\n','\t','\x00') == "\r\n\t\0");
+     assert(text("\r\n\t\0"           ) == "\r\n\t\0");
+ 
+     assert(text(       3141,     ) ==    "3141"  );
+     assert(text(": ",  3141, '\0') ==  ": 3141\0");
+     assert(text(      -3141,     ) ==   "-3141"  );
+     assert(text(": ", -3141, '\0') == ": -3141\0");
+ 
+     () @trusted
+     {
+         int* pointer = cast(int*) 3141;
+         assert(text(       pointer,     ) ==    "C45"  );
+         assert(text(": ",  pointer, '\0') ==  ": C45\0");
+     }();
+ 
+     assert(text(      3.1415923,      ) ==   "3.14159"  );
+     assert(text(": ", 3.1415923,  '\0') == ": 3.14159\0");
+     assert(text(      3.1415923f,     ) ==   "3.14159"  );
+     assert(text(": ", 3.1415923f, '\0') == ": 3.14159\0");
+ 
+     assert(text(       !3141,     ) ==   "false"  );
+     assert(text(": ",  !3141, '\0') == ": false\0");
+     assert(text(      !!3141,     ) ==   "true"   );
+     assert(text(": ", !!3141, '\0') == ": true\0" );
+ 
+     assert(text(             Foo(),      ) ==         "Foo()"  );
+     assert(text(": ",        Foo(),  '\0') ==       ": Foo()\0");
+     assert(text(      const(Foo)(),     ) ==   "const(Foo)()"  );
+     assert(text(": ", const(Foo)(), '\0') == ": const(Foo)()\0");
+ 
+     assert(text(             Bar(),      ) ==         "Bar()"  );
+     assert(text(": ",        Bar(),  '\0') ==       ": Bar()\0");
+     assert(text(      const(Bar)(),     ) ==   "const(Bar)()"  );
+     assert(text(": ", const(Bar)(), '\0') == ": const(Bar)()\0");
+ 
+     assert(text(                 Point(3, 141),     ) ==              "Point(3, 141)"  );
+     assert(text(": ",            Point(3, 141), '\0') ==            ": Point(3, 141)\0");
+     assert(text(          const(Point)(3, 141),     ) ==       "const(Point)(3, 141)"  );
+     assert(text(": ",     const(Point)(3, 141), '\0') ==     ": const(Point)(3, 141)\0");
+     assert(text(         shared(Point)(3, 141),     ) ==      "shared(Point)(3, 141)"  );
+     assert(text(": ",    shared(Point)(3, 141), '\0') ==    ": shared(Point)(3, 141)\0");
+     assert(text(      immutable(Point)(3, 141),     ) ==   "immutable(Point)(3, 141)"  );
+     assert(text(": ", immutable(Point)(3, 141), '\0') == ": immutable(Point)(3, 141)\0");
+ 
+     dummy = 0;
+     assert(text(            Range(),      ) ==   "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]"  );
+     dummy = 0;
+     assert(text(": ",       Range(),  '\0') == ": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\0");
+     assert(text(      const(Range)(),     ) ==   "const(Range)()"                  );
+     assert(text(": ", const(Range)(), '\0') == ": const(Range)()\0"                );
+ 
+     void function() @safe fn1;
+     void delegate() @safe dg1;
+     assert(text(fn1) == "null");
+     assert(text(dg1) == "void delegate() @safe");
+ 
+     bool function(bool, int) @safe    fn2;
+     bool delegate(bool, int) @safe    dg2;
+     bool delegate(bool, int) @system  dg3;
+     bool delegate(bool, int) @trusted dg4;
+     assert(text(fn2) == "null");
+     assert(text(dg2) == "bool delegate(bool, int) @safe");
+     assert(text(dg3) == "bool delegate(bool, int) @system");
+     assert(text(dg4) == "bool delegate(bool, int) @trusted");
+ }
+ 
+ /// Convenience functions for writing arguments to an output range as text.
+ void writeText(Sink, T...)(ref Sink sink, T args)
+ if (isOutputRange!(Sink, char) && T.length > 0)
+ {
+     sink.writeTextImpl!string(args);
+ }
+ 
+ /// ditto
+ void writeWText(Sink, T...)(ref Sink sink, T args)
+ if (isOutputRange!(Sink, wchar) && T.length > 0)
+ {
+     sink.writeTextImpl!wstring(args);
+ }
+ 
+ /// ditto
+ void writeDText(Sink, T...)(ref Sink sink, T args)
+ if (isOutputRange!(Sink, dchar) && T.length > 0)
+ {
+     sink.writeTextImpl!dstring(args);
+ }
+ 
+ ///
+ @safe unittest
+ {
+     import std.array : appender;
+ 
+     auto output = appender!string();
+     output.writeText("The answer is ", 42);
+ 
+     assert(output.data == "The answer is 42");
+ }
+ 
+ ///
+ @safe unittest
+ {
+     import std.array : appender;
+ 
+     const color = "red";
+     auto output = appender!string();
+     output.writeText(i"My favorite color is $(color)");
+ 
+     assert(output.data == "My favorite color is red");
+ }
+ 
+ @safe unittest
+ {
+     auto capp = appender!string();
+     auto wapp = appender!wstring();
+     auto dapp = appender!dstring();
+ 
+     capp.writeText(42, ' ', 1.5, ": xyz");
+     wapp.writeWText(42, ' ', 1.5, ": xyz");
+     dapp.writeDText(42, ' ', 1.5, ": xyz");
+ 
+     assert(capp.data == "42 1.5: xyz"c);
+     assert(wapp.data == "42 1.5: xyz"w);
+     assert(dapp.data == "42 1.5: xyz"d);
+ }
+ 
+ // Check range API compliance using OutputRange interface
+ @system unittest
+ {
+     import std.range.interfaces : OutputRange, outputRangeObject;
+     import std.range : nullSink;
+ 
+     OutputRange!char testOutput = outputRangeObject!char(nullSink);
+     testOutput.writeText(42, ' ', 1.5, ": xyz");
+ }
+ 
  private S textImpl(S, U...)(U args)
  {
      static if (U.length == 0)
*************** private S textImpl(S, U...)(U args)
*** 4855,4881 ****
          // assume that on average, parameters will have less
          // than 20 elements
          app.reserve(U.length * 20);
!         // Must be static foreach because of https://issues.dlang.org/show_bug.cgi?id=21209
!         static foreach (arg; args)
!         {
!             static if (
!                 isSomeChar!(typeof(arg))
!                 || isSomeString!(typeof(arg))
!                 || ( isInputRange!(typeof(arg)) && isSomeChar!(ElementType!(typeof(arg))) )
!             )
!                 app.put(arg);
!             else static if (
  
!                 is(immutable typeof(arg) == immutable uint) || is(immutable typeof(arg) == immutable ulong) ||
!                 is(immutable typeof(arg) == immutable int) || is(immutable typeof(arg) == immutable long)
!             )
!                 // https://issues.dlang.org/show_bug.cgi?id=17712#c15
!                 app.put(textImpl!(S)(arg));
!             else
!                 app.put(to!S(arg));
!         }
  
!         return app.data;
      }
  }
  
--- 5185,5216 ----
          // assume that on average, parameters will have less
          // than 20 elements
          app.reserve(U.length * 20);
!         app.writeTextImpl!S(args);
!         return app.data;
!     }
! }
  
! private void writeTextImpl(S, Sink, U...)(ref Sink sink, U args)
! if (isSomeString!S && isOutputRange!(Sink, ElementEncodingType!S))
! {
!     // Must be static foreach because of https://issues.dlang.org/show_bug.cgi?id=21209
!     static foreach (arg; args)
!     {
!         static if (
!             isSomeChar!(typeof(arg))
!             || isSomeString!(typeof(arg))
!             || ( isInputRange!(typeof(arg)) && isSomeChar!(ElementType!(typeof(arg))) )
!         )
!             put(sink, arg);
!         else static if (
  
!             is(immutable typeof(arg) == immutable uint) || is(immutable typeof(arg) == immutable ulong) ||
!             is(immutable typeof(arg) == immutable int) || is(immutable typeof(arg) == immutable long)
!         )
!             // https://issues.dlang.org/show_bug.cgi?id=17712#c15
!             put(sink, textImpl!(S)(arg));
!         else
!             put(sink, to!S(arg));
      }
  }
  
diff -Nrcpad gcc-16-20260125/libphobos/src/std/datetime/date.d gcc-16-20260201/libphobos/src/std/datetime/date.d
*** gcc-16-20260125/libphobos/src/std/datetime/date.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/src/std/datetime/date.d	Sun Feb  1 22:32:17 2026
*************** public:
*** 2131,2136 ****
--- 2131,2137 ----
          $(BOOKTABLE,
          $(TR $(TD DateTime) $(TD +) $(TD Duration) $(TD -->) $(TD DateTime))
          $(TR $(TD DateTime) $(TD -) $(TD Duration) $(TD -->) $(TD DateTime))
+         $(TR $(TD Duration) $(TD +) $(TD DateTime) $(TD -->) $(TD DateTime))
          )
  
          Params:
*************** public:
*** 2145,2150 ****
--- 2146,2159 ----
          mixin("return retval._addSeconds(" ~ op ~ "seconds);");
      }
  
+     /// ditto
+     DateTime opBinaryRight(string op)(Duration duration) const @safe pure nothrow @nogc
+     if (op == "+")
+     {
+         return this + duration;
+     }
+ 
+ 
      ///
      @safe unittest
      {
*************** public:
*** 2161,2166 ****
--- 2170,2178 ----
  
          assert(DateTime(2016, 1, 1, 0, 59, 59) - hours(1) ==
                 DateTime(2015, 12, 31, 23, 59, 59));
+ 
+         assert(DateTime(2015, 12, 31, 23, 59, 59) + hours(1) ==
+                hours(1) + DateTime(2015, 12, 31, 23, 59, 59));
      }
  
      @safe unittest
*************** public:
*** 6134,6146 ****
      import core.time : Duration;
      /++
          Gives the result of adding or subtracting a $(REF Duration, core,time)
!         from
  
          The legal types of arithmetic for $(LREF Date) using this operator are
  
          $(BOOKTABLE,
          $(TR $(TD Date) $(TD +) $(TD Duration) $(TD -->) $(TD Date))
          $(TR $(TD Date) $(TD -) $(TD Duration) $(TD -->) $(TD Date))
          )
  
          Params:
--- 6146,6159 ----
      import core.time : Duration;
      /++
          Gives the result of adding or subtracting a $(REF Duration, core,time)
!         from this $(LREF Date).
  
          The legal types of arithmetic for $(LREF Date) using this operator are
  
          $(BOOKTABLE,
          $(TR $(TD Date) $(TD +) $(TD Duration) $(TD -->) $(TD Date))
          $(TR $(TD Date) $(TD -) $(TD Duration) $(TD -->) $(TD Date))
+         $(TR $(TD Duration) $(TD +) $(TD Date) $(TD -->) $(TD Date))
          )
  
          Params:
*************** public:
*** 6155,6160 ****
--- 6168,6181 ----
          mixin("return retval._addDays(" ~ op ~ "days);");
      }
  
+ 
+     /// ditto
+     Date opBinaryRight(string op)(Duration duration) const @safe pure nothrow @nogc
+     if (op == "+")
+     {
+         return this + duration;
+     }
+ 
      ///
      @safe unittest
      {
*************** public:
*** 6165,6170 ****
--- 6186,6193 ----
  
          assert(Date(2016, 1, 1) - days(1) == Date(2015, 12, 31));
          assert(Date(2004, 3, 1) - days(4) == Date(2004, 2, 26));
+ 
+         assert(Date(2004, 2, 26) + days(4) == days(4) + Date(2004, 2, 26));
      }
  
      @safe unittest
*************** public:
*** 8844,8849 ****
--- 8867,8873 ----
          $(BOOKTABLE,
          $(TR $(TD TimeOfDay) $(TD +) $(TD Duration) $(TD -->) $(TD TimeOfDay))
          $(TR $(TD TimeOfDay) $(TD -) $(TD Duration) $(TD -->) $(TD TimeOfDay))
+         $(TR $(TD Duration) $(TD +) $(TD TimeOfDay) $(TD -->) $(TD TimeOfDay))
          )
  
          Params:
*************** public:
*** 8858,8863 ****
--- 8882,8894 ----
          mixin("return retval._addSeconds(" ~ op ~ "seconds);");
      }
  
+     /// ditto
+     TimeOfDay opBinaryRight(string op)(Duration duration) const @safe pure nothrow @nogc
+     if (op == "+")
+     {
+         return this + duration;
+     }
+ 
      ///
      @safe unittest
      {
*************** public:
*** 8872,8877 ****
--- 8903,8910 ----
          assert(TimeOfDay(12, 12, 12) - minutes(1) == TimeOfDay(12, 11, 12));
          assert(TimeOfDay(12, 12, 12) - hours(1) == TimeOfDay(11, 12, 12));
          assert(TimeOfDay(0, 0, 0) - seconds(1) == TimeOfDay(23, 59, 59));
+ 
+         assert(TimeOfDay(12, 12, 12) + seconds(1) == seconds(1) + TimeOfDay(12, 12, 12));
      }
  
      @safe unittest
diff -Nrcpad gcc-16-20260125/libphobos/src/std/datetime/systime.d gcc-16-20260201/libphobos/src/std/datetime/systime.d
*** gcc-16-20260125/libphobos/src/std/datetime/systime.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/src/std/datetime/systime.d	Sun Feb  1 22:32:17 2026
*************** public:
*** 6301,6306 ****
--- 6301,6307 ----
          $(BOOKTABLE,
          $(TR $(TD SysTime) $(TD +) $(TD Duration) $(TD -->) $(TD SysTime))
          $(TR $(TD SysTime) $(TD -) $(TD Duration) $(TD -->) $(TD SysTime))
+         $(TR $(TD Duration) $(TD +) $(TD SysTime) $(TD -->) $(TD SysTime))
          )
  
          Params:
*************** public:
*** 6316,6321 ****
--- 6317,6329 ----
          return retval;
      }
  
+     /// ditto
+     SysTime opBinaryRight(string op)(Duration duration) const @safe pure nothrow
+     if (op == "+")
+     {
+         return this + duration;
+     }
+ 
      ///
      @safe unittest
      {
*************** public:
*** 6333,6338 ****
--- 6341,6349 ----
  
          assert(SysTime(DateTime(2016, 1, 1, 0, 59, 59)) - hours(1) ==
                 SysTime(DateTime(2015, 12, 31, 23, 59, 59)));
+ 
+         assert(SysTime(DateTime(2015, 12, 31, 23, 59, 59)) + seconds(1) ==
+                seconds(1) + SysTime(DateTime(2015, 12, 31, 23, 59, 59)));
      }
  
      @safe unittest
diff -Nrcpad gcc-16-20260125/libphobos/src/std/datetime/timezone.d gcc-16-20260201/libphobos/src/std/datetime/timezone.d
*** gcc-16-20260125/libphobos/src/std/datetime/timezone.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/src/std/datetime/timezone.d	Sun Feb  1 22:32:17 2026
*************** public:
*** 291,297 ****
                  // be there, but since PosixTimeZone _does_ use leap seconds if
                  // the time zone file does, we'll test that functionality if the
                  // appropriate files exist.
!                 if (chainPath(PosixTimeZone.defaultTZDatabaseDir, "right", tzName).exists)
                  {
                      auto leapTZ = PosixTimeZone.getTimeZone("right/" ~ tzName);
  
--- 291,297 ----
                  // be there, but since PosixTimeZone _does_ use leap seconds if
                  // the time zone file does, we'll test that functionality if the
                  // appropriate files exist.
!                 if (chainPath(PosixTimeZone.getDefaultTZDatabaseDir(), "right", tzName).exists)
                  {
                      auto leapTZ = PosixTimeZone.getTimeZone("right/" ~ tzName);
  
*************** public:
*** 2014,2020 ****
              the TZDatabaseDir version to pass an arbitrary path at compile-time,
              rather than hard-coding it here. Android concatenates all time zone
              data into a single file called tzdata and stores it in the directory
!             below.
            +/
          enum defaultTZDatabaseDir = "";
      }
--- 2014,2021 ----
              the TZDatabaseDir version to pass an arbitrary path at compile-time,
              rather than hard-coding it here. Android concatenates all time zone
              data into a single file called tzdata and stores it in the directory
!             below. If the TZDIR environment variable is set, it is consulted
!             before this constant.
            +/
          enum defaultTZDatabaseDir = "";
      }
*************** public:
*** 2040,2045 ****
--- 2041,2058 ----
          enum defaultTZDatabaseDir = "";
      }
  
+     private static string getDefaultTZDatabaseDir()
+     {
+         import core.stdc.stdlib : getenv;
+         import std.string : fromStringz;
+ 
+         auto dir = getenv("TZDIR");
+         if (dir)
+             return fromStringz(dir).idup;
+ 
+         return defaultTZDatabaseDir;
+     }
+ 
  
      /++
          Returns a $(LREF TimeZone) with the give name per the TZ Database. The
*************** public:
*** 2067,2073 ****
        +/
      // TODO make it possible for tzDatabaseDir to be gzipped tar file rather than an uncompressed
      //      directory.
!     static immutable(PosixTimeZone) getTimeZone(string name, string tzDatabaseDir = defaultTZDatabaseDir) @trusted
      {
          import std.algorithm.sorting : sort;
          import std.conv : to;
--- 2080,2086 ----
        +/
      // TODO make it possible for tzDatabaseDir to be gzipped tar file rather than an uncompressed
      //      directory.
!     static immutable(PosixTimeZone) getTimeZone(string name, string tzDatabaseDir = getDefaultTZDatabaseDir()) @trusted
      {
          import std.algorithm.sorting : sort;
          import std.conv : to;
*************** public:
*** 2418,2424 ****
          Throws:
              `FileException` if it fails to read from disk.
        +/
!     static string[] getInstalledTZNames(string subName = "", string tzDatabaseDir = defaultTZDatabaseDir) @safe
      {
          import std.algorithm.sorting : sort;
          import std.array : appender;
--- 2431,2437 ----
          Throws:
              `FileException` if it fails to read from disk.
        +/
!     static string[] getInstalledTZNames(string subName = "", string tzDatabaseDir = getDefaultTZDatabaseDir()) @safe
      {
          import std.algorithm.sorting : sort;
          import std.array : appender;
*************** public:
*** 2510,2520 ****
          {}
          else
          {
!             foreach (DirEntry de; dirEntries(defaultTZDatabaseDir, SpanMode.depth))
              {
                  if (de.isFile)
                  {
!                     auto tzName = de.name[defaultTZDatabaseDir.length .. $];
  
                      if (!canFind(tzNames, tzName))
                          assertThrown!DateTimeException(testPTZFailure(tzName));
--- 2523,2534 ----
          {}
          else
          {
!             string tzDatabaseDir = getDefaultTZDatabaseDir();
!             foreach (DirEntry de; dirEntries(tzDatabaseDir, SpanMode.depth))
              {
                  if (de.isFile)
                  {
!                     auto tzName = de.name[tzDatabaseDir.length .. $];
  
                      if (!canFind(tzNames, tzName))
                          assertThrown!DateTimeException(testPTZFailure(tzName));
diff -Nrcpad gcc-16-20260125/libphobos/src/std/encoding.d gcc-16-20260201/libphobos/src/std/encoding.d
*** gcc-16-20260125/libphobos/src/std/encoding.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/src/std/encoding.d	Sun Feb  1 22:32:17 2026
*************** immutable(E)[] sanitize(E)(immutable(E)[
*** 1879,1885 ****
          offset += n;
          t = t[n..$];
      }
!     return cast(immutable(E)[])array[0 .. offset];
  }
  
  ///
--- 1879,1885 ----
          offset += n;
          t = t[n..$];
      }
!     return array[0 .. offset];
  }
  
  ///
diff -Nrcpad gcc-16-20260125/libphobos/src/std/experimental/allocator/building_blocks/kernighan_ritchie.d gcc-16-20260201/libphobos/src/std/experimental/allocator/building_blocks/kernighan_ritchie.d
*** gcc-16-20260125/libphobos/src/std/experimental/allocator/building_blocks/kernighan_ritchie.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/src/std/experimental/allocator/building_blocks/kernighan_ritchie.d	Sun Feb  1 22:32:17 2026
*************** struct KRRegion(ParentAllocator = NullAl
*** 111,121 ****
--- 111,123 ----
  
          this(this) @disable;
  
+         nothrow @nogc @trusted
          void[] payload() inout
          {
              return (cast(ubyte*) &this)[0 .. size];
          }
  
+         nothrow @nogc @trusted
          bool adjacent(in Node* right) const
          {
              assert(right);
*************** struct KRRegion(ParentAllocator = NullAl
*** 123,128 ****
--- 125,131 ----
              return p.ptr < right && right < p.ptr + p.length + Node.sizeof;
          }
  
+         nothrow @nogc @trusted
          bool coalesce(void* memoryEnd = null)
          {
              // Coalesce the last node before the memory end with any possible gap
*************** struct KRRegion(ParentAllocator = NullAl
*** 139,144 ****
--- 142,148 ----
              return true;
          }
  
+         nothrow @nogc @safe
          Tuple!(void[], Node*) allocateHere(size_t bytes)
          {
              assert(bytes >= Node.sizeof);
*************** struct KRRegion(ParentAllocator = NullAl
*** 152,158 ****
              if (leftover >= Node.sizeof)
              {
                  // There's room for another node
!                 auto newNode = cast(Node*) ((cast(ubyte*) &this) + bytes);
                  newNode.size = leftover;
                  newNode.next = next == &this ? newNode : next;
                  assert(next);
--- 156,162 ----
              if (leftover >= Node.sizeof)
              {
                  // There's room for another node
!                 auto newNode = (() @trusted => cast(Node*) ((cast(ubyte*) &this) + bytes))();
                  newNode.size = leftover;
                  newNode.next = next == &this ? newNode : next;
                  assert(next);
*************** struct KRRegion(ParentAllocator = NullAl
*** 174,181 ****
      else alias parent = ParentAllocator.instance;
      private void[] payload;
      private Node* root;
!     private bool regionMode() const { return bytesUsedRegionMode != size_t.max; }
!     private void cancelRegionMode() { bytesUsedRegionMode = size_t.max; }
      private size_t bytesUsedRegionMode = 0;
  
      auto byNodePtr()
--- 178,185 ----
      else alias parent = ParentAllocator.instance;
      private void[] payload;
      private Node* root;
!     nothrow @nogc @safe private bool regionMode() const { return bytesUsedRegionMode != size_t.max; }
!     nothrow @nogc @safe private void cancelRegionMode() { bytesUsedRegionMode = size_t.max; }
      private size_t bytesUsedRegionMode = 0;
  
      auto byNodePtr()
*************** struct KRRegion(ParentAllocator = NullAl
*** 257,262 ****
--- 261,267 ----
          }
      }
  
+     nothrow @nogc @safe
      private Node* sortFreelist(Node* root)
      {
          // Find a monotonic run
*************** struct KRRegion(ParentAllocator = NullAl
*** 274,279 ****
--- 279,285 ----
          return merge(root, tail);
      }
  
+     nothrow @nogc @safe
      private Node* merge(Node* left, Node* right)
      {
          assert(left != right);
*************** struct KRRegion(ParentAllocator = NullAl
*** 290,295 ****
--- 296,302 ----
          return result;
      }
  
+     nothrow @nogc @safe
      private void coalesceAndMakeCircular()
      {
          for (auto n = root;;)
*************** struct KRRegion(ParentAllocator = NullAl
*** 368,373 ****
--- 375,381 ----
      Otherwise, sorts the free list accumulated so far and switches strategy for
      future allocations to KR style.
      */
+     nothrow @nogc @safe
      void switchToFreeList()
      {
          if (!regionMode) return;
*************** struct KRRegion(ParentAllocator = NullAl
*** 396,401 ****
--- 404,410 ----
  
      Returns: A word-aligned buffer of `n` bytes, or `null`.
      */
+     nothrow @nogc @safe
      void[] allocate(size_t n)
      {
          if (!n || !root) return null;
*************** struct KRRegion(ParentAllocator = NullAl
*** 413,419 ****
                  immutable balance = root.size - actualBytes;
                  if (balance >= Node.sizeof)
                  {
!                     auto newRoot = cast(Node*) (result + actualBytes);
                      newRoot.next = root.next;
                      newRoot.size = balance;
                      root = newRoot;
--- 422,428 ----
                  immutable balance = root.size - actualBytes;
                  if (balance >= Node.sizeof)
                  {
!                     auto newRoot = (() @trusted => cast(Node*) ((cast(ubyte*) result) + actualBytes))();
                      newRoot.next = root.next;
                      newRoot.size = balance;
                      root = newRoot;
*************** struct KRRegion(ParentAllocator = NullAl
*** 423,429 ****
                      root = null;
                      switchToFreeList;
                  }
!                 return result[0 .. n];
              }
  
              // Not enough memory, switch to freelist mode and fall through
--- 432,438 ----
                      root = null;
                      switchToFreeList;
                  }
!                 return (() @trusted => result[0 .. n])();
              }
  
              // Not enough memory, switch to freelist mode and fall through
*************** struct KRRegion(ParentAllocator = NullAl
*** 554,559 ****
--- 563,569 ----
      at the front of the free list. These blocks get coalesced, whether
      `allocateAll` succeeds or fails due to fragmentation.
      */
+     nothrow @nogc @safe
      void[] allocateAll()
      {
          if (regionMode) switchToFreeList;
diff -Nrcpad gcc-16-20260125/libphobos/src/std/file.d gcc-16-20260201/libphobos/src/std/file.d
*** gcc-16-20260125/libphobos/src/std/file.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/src/std/file.d	Sun Feb  1 22:32:17 2026
*************** private void renameImpl(scope const(char
*** 983,992 ****
              import std.conv : to, text;
  
              if (!f)
!                 f = fromz ? to!(typeof(f))(fromz[0 .. wcslen(fromz)]) : "(null)";
  
              if (!t)
!                 t = toz ? to!(typeof(t))(toz[0 .. wcslen(toz)]) : "(null)";
  
              enforce(false,
                  new FileException(
--- 983,992 ----
              import std.conv : to, text;
  
              if (!f)
!                 f = to!(typeof(f))(fromz[0 .. wcslen(fromz)]);
  
              if (!t)
!                 t = to!(typeof(t))(toz[0 .. wcslen(toz)]);
  
              enforce(false,
                  new FileException(
*************** if (isConvertibleToString!R)
*** 2369,2375 ****
  }
  
  ///
- 
  @safe unittest
  {
      import std.exception : assertThrown;
--- 2369,2374 ----
*************** private struct DirIteratorImpl
*** 4638,4643 ****
--- 4637,4643 ----
      DirEntry _cur;
      DirHandle[] _stack;
      DirEntry[] _stashed; //used in depth first mode
+     string _pathPrefix = null;
  
      //stack helpers
      void pushExtra(DirEntry de)
*************** private struct DirIteratorImpl
*** 4793,4812 ****
          }
      }
  
!     this(R)(R pathname, SpanMode mode, bool followSymlink)
!     if (isSomeFiniteCharInputRange!R)
      {
          _mode = mode;
          _followSymlink = followSymlink;
  
!         static if (isNarrowString!R && is(immutable ElementEncodingType!R == immutable char))
!             alias pathnameStr = pathname;
!         else
!         {
!             import std.array : array;
!             string pathnameStr = pathname.array;
!         }
!         if (stepIn(pathnameStr))
          {
              if (_mode == SpanMode.depth)
                  while (mayStepIn())
--- 4793,4804 ----
          }
      }
  
!     this(string pathname, SpanMode mode, bool followSymlink)
      {
          _mode = mode;
          _followSymlink = followSymlink;
  
!         if (stepIn(pathname))
          {
              if (_mode == SpanMode.depth)
                  while (mayStepIn())
*************** auto dirEntries(bool useDIP1000 = dip100
*** 5105,5110 ****
--- 5097,5111 ----
  
      // https://issues.dlang.org/show_bug.cgi?id=15146
      dirEntries("", SpanMode.shallow).walkLength();
+ 
+     // https://github.com/dlang/phobos/issues/9584
+     string cwd = getcwd();
+     foreach (string entry; dirEntries(testdir, SpanMode.shallow))
+     {
+         if (entry.isDir)
+             chdir(entry);
+     }
+     chdir(cwd); // needed for the directories to be removed
  }
  
  /// Ditto
diff -Nrcpad gcc-16-20260125/libphobos/src/std/format/internal/write.d gcc-16-20260201/libphobos/src/std/format/internal/write.d
*** gcc-16-20260125/libphobos/src/std/format/internal/write.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/src/std/format/internal/write.d	Sun Feb  1 22:32:17 2026
*************** if (isInputRange!T)
*** 1412,1417 ****
--- 1412,1423 ----
      // if the format spec is valid
      enum formatTestMode = is(Writer == NoOpSink);
  
+     static if (!formatTestMode && isInfinite!T)
+     {
+         static assert(!isInfinite!T, "Cannot format an infinite range. " ~
+             "Convert it to a finite range first using `std.range.take` or `std.range.takeExactly`.");
+     }
+ 
      // Formatting character ranges like string
      if (f.spec == 's')
      {
*************** if (isInputRange!T)
*** 1582,1599 ****
          throw new FormatException(text("Incorrect format specifier for range: %", f.spec));
  }
  
- // https://issues.dlang.org/show_bug.cgi?id=20218
  @safe pure unittest
  {
!     void notCalled()
!     {
!         import std.range : repeat;
  
!         auto value = 1.repeat;
  
!         // test that range is not evaluated to completion at compiletime
!         format!"%s"(value);
!     }
  }
  
  // character formatting with ecaping
--- 1588,1603 ----
          throw new FormatException(text("Incorrect format specifier for range: %", f.spec));
  }
  
  @safe pure unittest
  {
!     import std.range : repeat;
!     import std.format : format;
  
!     auto value = 1.repeat;
  
!     // This should fail to compile — so we assert that it *doesn't* compile
!     static assert(!__traits(compiles, format!"%s"(value)),
!         "Test failed: formatting an infinite range should not compile.");
  }
  
  // character formatting with ecaping
diff -Nrcpad gcc-16-20260125/libphobos/src/std/format/write.d gcc-16-20260201/libphobos/src/std/format/write.d
*** gcc-16-20260125/libphobos/src/std/format/write.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/src/std/format/write.d	Sun Feb  1 22:32:17 2026
*************** uint formattedWrite(Writer, Char, Args..
*** 534,541 ****
  
      // Are we already done with formats? Then just dump each parameter in turn
      uint currentArg = 0;
-     bool lastWasConsumeAll;
- 
      while (spec.writeUpToNextSpec(w))
      {
          if (currentArg == Args.length && !spec.indexStart)
--- 534,539 ----
*************** uint formattedWrite(Writer, Char, Args..
*** 651,660 ****
              }
          default:
              if (spec.indexEnd == spec.indexEnd.max)
-             {
-                 lastWasConsumeAll = true;
                  break;
-             }
              else if (spec.indexEnd == spec.indexStart)
                  throw new FormatException(
                      text("Positional specifier %", spec.indexStart, '$', spec.spec,
--- 649,655 ----
*************** uint formattedWrite(Writer, Char, Args..
*** 665,672 ****
                      " index exceeds ", Args.length));
          }
      }
! 
!     return lastWasConsumeAll ? Args.length : currentArg;
  }
  
  ///
--- 660,666 ----
                      " index exceeds ", Args.length));
          }
      }
!     return currentArg;
  }
  
  ///
*************** if (isSomeString!(typeof(fmt)))
*** 1218,1225 ****
      import std.array : appender;
      auto w = appender!(char[])();
  
!     uint count = formattedWrite(w, "%1:$d", 1, 2, 3);
!     assert(count == 3);
      assert(w.data == "123");
  }
  
--- 1212,1218 ----
      import std.array : appender;
      auto w = appender!(char[])();
  
!     formattedWrite(w, "%1:$d", 1, 2, 3);
      assert(w.data == "123");
  }
  
diff -Nrcpad gcc-16-20260125/libphobos/src/std/functional.d gcc-16-20260201/libphobos/src/std/functional.d
*** gcc-16-20260125/libphobos/src/std/functional.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/src/std/functional.d	Sun Feb  1 22:32:17 2026
*************** private struct DelegateFaker(F)
*** 1808,1814 ****
   *
   * BUGS:
   * $(UL
-  *   $(LI Does not work with `@safe` functions.)
   *   $(LI Ignores C-style / D-style variadic arguments.)
   * )
   */
--- 1808,1813 ----
diff -Nrcpad gcc-16-20260125/libphobos/src/std/getopt.d gcc-16-20260201/libphobos/src/std/getopt.d
*** gcc-16-20260125/libphobos/src/std/getopt.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/src/std/getopt.d	Sun Feb  1 22:32:17 2026
*************** private pure Option splitAndGet(string o
*** 542,547 ****
--- 542,554 ----
      assert(olongshort.optLong == "--foo");
  }
  
+ private string optionValidatorErrorFormat(string msg, size_t idx)
+ {
+     import std.conv : to;
+     return "getopt validator: " ~ msg ~ " (at position " ~ to!(string)(idx) ~
+         ")";
+ }
+ 
  /*
  This function verifies that the variadic parameters passed in getOpt
  follow this pattern:
*************** follow this pattern:
*** 555,563 ****
  */
  private template optionValidator(A...)
  {
-     import std.format : format;
- 
-     enum fmt = "getopt validator: %s (at position %d)";
      enum isReceiver(T) = is(T == U*, U) || (is(T == function)) || (is(T == delegate));
      enum isOptionStr(T) = isSomeString!T || isSomeChar!T;
  
--- 562,567 ----
*************** private template optionValidator(A...)
*** 568,578 ****
          {
              static if (isReceiver!(A[0]))
              {
!                 msg = format(fmt, "first argument must be a string or a config", 0);
              }
              else static if (!isOptionStr!(A[0]) && !is(A[0] == config))
              {
!                 msg = format(fmt, "invalid argument type: " ~ A[0].stringof, 0);
              }
              else
              {
--- 572,582 ----
          {
              static if (isReceiver!(A[0]))
              {
!                 msg = optionValidatorErrorFormat("first argument must be a string or a config", 0);
              }
              else static if (!isOptionStr!(A[0]) && !is(A[0] == config))
              {
!                 msg = optionValidatorErrorFormat("invalid argument type: " ~ A[0].stringof, 0);
              }
              else
              {
*************** private template optionValidator(A...)
*** 581,605 ****
                      static if (!isReceiver!(A[i]) && !isOptionStr!(A[i]) &&
                          !(is(A[i] == config)))
                      {
!                         msg = format(fmt, "invalid argument type: " ~ A[i].stringof, i);
                          goto end;
                      }
                      else static if (isReceiver!(A[i]) && !isOptionStr!(A[i-1]))
                      {
!                         msg = format(fmt, "a receiver can not be preceeded by a receiver", i);
                          goto end;
                      }
                      else static if (i > 1 && isOptionStr!(A[i]) && isOptionStr!(A[i-1])
                          && isSomeString!(A[i-2]))
                      {
!                         msg = format(fmt, "a string can not be preceeded by two strings", i);
                          goto end;
                      }
                  }
              }
              static if (!isReceiver!(A[$-1]) && !is(A[$-1] == config))
              {
!                 msg = format(fmt, "last argument must be a receiver or a config",
                      A.length -1);
              }
          }
--- 585,609 ----
                      static if (!isReceiver!(A[i]) && !isOptionStr!(A[i]) &&
                          !(is(A[i] == config)))
                      {
!                         msg = optionValidatorErrorFormat("invalid argument type: " ~ A[i].stringof, i);
                          goto end;
                      }
                      else static if (isReceiver!(A[i]) && !isOptionStr!(A[i-1]))
                      {
!                         msg = optionValidatorErrorFormat("a receiver can not be preceeded by a receiver", i);
                          goto end;
                      }
                      else static if (i > 1 && isOptionStr!(A[i]) && isOptionStr!(A[i-1])
                          && isSomeString!(A[i-2]))
                      {
!                         msg = optionValidatorErrorFormat("a string can not be preceeded by two strings", i);
                          goto end;
                      }
                  }
              }
              static if (!isReceiver!(A[$-1]) && !is(A[$-1] == config))
              {
!                 msg = optionValidatorErrorFormat("last argument must be a receiver or a config",
                      A.length -1);
              }
          }
*************** private auto getoptTo(R)(string option,
*** 614,629 ****
          size_t idx, string file = __FILE__, size_t line = __LINE__)
  {
      import std.conv : to, ConvException;
-     import std.format : format;
      try
      {
          return to!R(value);
      }
      catch (ConvException e)
      {
!         throw new ConvException(format("Argument '%s' at position '%u' could "
!             ~ "not be converted to type '%s' as required by option '%s'.",
!             value, idx, R.stringof, option), e, file, line);
      }
  }
  
--- 618,633 ----
          size_t idx, string file = __FILE__, size_t line = __LINE__)
  {
      import std.conv : to, ConvException;
      try
      {
          return to!R(value);
      }
      catch (ConvException e)
      {
!         throw new ConvException("Argument '" ~ value ~ "' at position '" ~
!             to!(string)(idx) ~ "' could not be converted to type '" ~
!             R.stringof ~ "' as required by option '" ~ option ~ "'.", e, file,
!             line);
      }
  }
  
diff -Nrcpad gcc-16-20260125/libphobos/src/std/internal/entropy.d gcc-16-20260201/libphobos/src/std/internal/entropy.d
*** gcc-16-20260125/libphobos/src/std/internal/entropy.d	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/libphobos/src/std/internal/entropy.d	Sun Feb  1 22:32:17 2026
***************
*** 0 ****
--- 1,918 ----
+ // Written in the D programming language.
+ 
+ /+
+     CSPRNG library prototype.
+ 
+     This code has not been audited.
+     Do not use for cryptographic purposes.
+ 
+     The terms $(I entropy) and $(I entropy sources) here do refer to
+     cryptographically-safe random numbers and higher-level generators of such
+     — typically powered by an entropy pool provided by the operating system.
+ 
+     An example of similar usage of said terminology would be the `getentropy()`
+     function provided by
+     $(LINK2 https://man.freebsd.org/cgi/man.cgi?query=getentropy&apropos=0&sektion=3&manpath=FreeBSD+14.2-RELEASE&arch=default&format=html,
+     FreeBSD).
+ 
+     This library does not interact with any actual low-level entropy sources
+     by itself. Instead it interfaces with system-provided CSPRNGs that are
+     typically seeded through aforementioned entropy sources by the operating
+     system as needed.
+ 
+     See_also:
+         $(LINK https://blog.cr.yp.to/20140205-entropy.html),
+         $(LINK https://cr.yp.to/talks/2014.10.18/slides-djb-20141018-a4.pdf)
+ 
+     License:   $(HTTP www.boost.org/LICENSE_1_0.txt, Boost License 1.0).
+     Authors:   Elias Batek
+     Source:    $(PHOBOSSRC std/internal/entropy.d)
+  +/
+ module std.internal.entropy;
+ 
+ import std.meta;
+ 
+ version (OSX)
+     version = Darwin;
+ else version (iOS)
+     version = Darwin;
+ else version (TVOS)
+     version = Darwin;
+ else version (WatchOS)
+     version = Darwin;
+ 
+ // Self-test: Detect potentially unsuitable default entropy source.
+ @safe unittest
+ {
+     auto buffer = new ubyte[](32);
+     forceEntropySource(defaultEntropySource);
+     const result = getEntropy(buffer);
+ 
+     assert(
+         !result.isUnavailable,
+         "The default entropy source for the target platform"
+         ~ " is unavailable on this machine. Please consider"
+         ~ " patching it to accommodate to your environment."
+     );
+     assert(result.isOK);
+ }
+ 
+ // Self-test: Detect faulty implementation.
+ @system unittest
+ {
+     forceEntropySource(defaultEntropySource);
+ 
+     bool test() @system
+     {
+         static immutable pattern = 0xDEAD_BEEF_1337_0000;
+         long number = pattern;
+         const result = getEntropy(&number, number.sizeof);
+         assert(result.isOK);
+         return number != pattern;
+     }
+ 
+     size_t timesFailed = 0;
+     foreach (n; 0 .. 3)
+         if (!test())
+             ++timesFailed;
+ 
+     assert(
+         timesFailed <= 1,
+         "Suspicious random data: Potential security issue or really unlucky; please retry."
+     );
+ }
+ 
+ // Self-test: Detect faulty implementation.
+ @safe unittest
+ {
+     forceEntropySource(defaultEntropySource);
+ 
+     bool test() @safe
+     {
+         ubyte[32] data;
+         data[] = 0;
+ 
+         const result = getEntropy(data[]);
+         assert(result.isOK);
+ 
+         size_t zeros = 0;
+         foreach (b; data)
+             if (b == 0)
+                 ++zeros;
+ 
+         enum threshold = 24;
+         return zeros < threshold;
+     }
+ 
+     size_t timesFailed = 0;
+     foreach (n; 0 .. 3)
+         if (!test())
+             ++timesFailed;
+ 
+     assert(
+         timesFailed <= 1,
+         "Suspicious random data: Potential security issue or really unlucky; please retry."
+     );
+ }
+ 
+ @nogc nothrow:
+ 
+ // Flagship function
+ /++
+     Retrieves random data from an applicable system CSPRNG.
+ 
+     Params:
+         buffer = An output buffer to store the retrieved entropy in.
+                  The length of it will determine the amount of random data to
+                  be obtained.
+ 
+                  This function (and all overloads) always attempt to fill
+                  the entire buffer. Therefore, they can block, spin or report
+                  an error.
+ 
+     Returns:
+         An `EntropyResult` that either reports success
+         or the type of error that has occurred.
+ 
+         In case of an error, the data in `buffer` MUST NOT be used.
+         The recommended way to check for success is through the `isOK()`
+         helper function.
+  +/
+ EntropyResult getEntropy(scope void[] buffer) @safe
+ {
+     return getEntropyImpl(buffer);
+ }
+ 
+ ///
+ @safe unittest
+ {
+     int[4] bytes;
+     if (getEntropy(cast(void[]) bytes).isOK)
+     {
+         // Success; data in `bytes` may be used.
+     }
+ 
+     assert((cast(void[]) bytes).length == bytes.sizeof);
+ }
+ 
+ // Convenience overload
+ /// ditto
+ EntropyResult getEntropy(scope ubyte[] buffer) @safe
+ {
+     return getEntropy(cast(void[]) buffer);
+ }
+ 
+ ///
+ @safe unittest
+ {
+     ubyte[16] bytes;
+     if (getEntropy(bytes).isOK)
+     {
+         // Success; data in `bytes` may be used.
+     }
+ }
+ 
+ // Convenience wrapper
+ /// ditto
+ /++
+     Retrieves random data from an applicable system CSPRNG.
+ 
+     Params:
+         buffer = An output buffer to store the retrieved entropy in.
+         length = Length of the provided `buffer`.
+                  Specifying a wrong value here, will lead to memory corruption.
+ 
+     Returns:
+         An `EntropyResult` that either reports success
+         or the type of error that has occurred.
+ 
+         In case of an error, the data in `buffer` MUST NOT be used.
+         The recommended way to check for success is through the `isOK()`
+         helper function.
+  +/
+ EntropyResult getEntropy(scope void* buffer, size_t length) @system
+ {
+     return getEntropy(buffer[0 .. length]);
+ }
+ 
+ ///
+ @system unittest
+ {
+     ubyte[16] bytes;
+     if (getEntropy(cast(void*) bytes.ptr, bytes.length).isOK)
+     {
+         // Success; data in `bytes` may be used.
+     }
+ }
+ 
+ ///
+ @system unittest
+ {
+     int number = void;
+     if (getEntropy(&number, number.sizeof).isOK)
+     {
+         // Success; value of `number` may be used.
+     }
+ }
+ 
+ /++
+     Manually set the entropy source to use for the current thread.
+ 
+     As a rule of thumb, this SHOULD NOT be done.
+ 
+     It might be useful in cases where the default entropy source — as chosen by
+     the maintainer of the used compiler package — is unavailable on a system.
+     Usually, `EntropySource.tryAll` will be the most reasonable option
+     in such cases.
+ 
+     Params:
+         source = The requested default entropy source to use for the current thread.
+ 
+     Examples:
+ 
+     ---
+     // Using `forceEntropySource` almost always is a bad idea.
+     // As a rule of thumb, this SHOULD NOT be done.
+     forceEntropySource(EntropySource.none);
+     ---
+  +/
+ void forceEntropySource(EntropySource source) @safe
+ {
+     _entropySource = source;
+ }
+ 
+ // (In-)Convenience wrapper
+ /++
+     Retrieves random data from the requested entropy source.
+ 
+     In general, it’s a $(B bad idea) to let users pick sources themselves.
+     A sane option should be used by default instead.
+ 
+     This overload only exists because its used by Phobos.
+ 
+     See_also:
+         Use `forceEntropySource` instead.
+ 
+     Params:
+         buffer = An output buffer to store the retrieved entropy in.
+                  The length of it will determine the amount of entropy to be
+                  obtained.
+         length = Length of the provided `buffer`.
+                  Specifying a wrong value here, will lead to memory corruption.
+         source = The entropy source to use for the operation.
+ 
+     Returns:
+         An `EntropyResult` that either reports success
+         or the type of error that has occurred.
+ 
+         In case of an error, the data in `buffer` MUST NOT be used.
+         The recommended way to check for success is through the `isOK()`
+         helper function.
+  +/
+ EntropyResult getEntropy(scope void* buffer, size_t length, EntropySource source) @system
+ {
+     const sourcePrevious = _entropySource;
+     scope (exit) _entropySource = sourcePrevious;
+ 
+     _entropySource = source;
+     return getEntropy(buffer[0 .. length]);
+ }
+ 
+ ///
+ @system unittest
+ {
+     ubyte[4] bytes;
+ 
+     // `EntropySource.none` always fails.
+     assert(!getEntropy(bytes.ptr, bytes.length, EntropySource.none).isOK);
+ }
+ 
+ /++
+     A CSPRNG suitable to retrieve cryptographically-secure random data from.
+ 
+     (No actual low-level entropy sources are provided on purpose.)
+  +/
+ enum EntropySource
+ {
+     /// Implements a $(I hunting) strategy for finding an entropy source that
+     /// is available at runtime.
+     ///
+     /// Try supported sources one-by-one until one is available.
+     /// This exists to enable the use of this the entropy library
+     /// in a backwards compatibility way.
+     ///
+     /// It is recommended against using this in places that do not strictly
+     /// have to to meet compatibility requirements.
+     /// Like any kind of crypto-agility, this approach may suffer from
+     /// practical issues.
+     ///
+     /// See_also:
+     /// While the following article focuses on cipher agility in protocols,
+     /// it elaborates why agility can lead to problems:
+     /// $(LINK https://web.archive.org/web/20191102211148/https://paragonie.com/blog/2019/10/against-agility-in-cryptography-protocols)
+     tryAll = -1,
+ 
+     /// Always fail.
+     none = 0,
+ 
+     /// `/dev/urandom`
+     charDevURandom = 1,
+ 
+     /// `/dev/random`
+     charDevRandom = 2,
+ 
+     /// `getrandom` syscall or wrapper
+     getrandom = 3,
+ 
+     /// `arc4random`
+     arc4random = 4,
+ 
+     // `getentropy`
+     getentropy = 5,
+ 
+     /// Windows legacy CryptoAPI
+     cryptGenRandom = 6,
+ 
+     /// Windows Cryptography API: Next Generation (“BCrypt”)
+     bcryptGenRandom = 7,
+ }
+ 
+ ///
+ enum EntropyStatus
+ {
+     /// success
+     ok = 0,
+ 
+     /// catch-all error
+     unknownError = 1,
+ 
+     /// An entropy source was unavailable.
+     unavailable,
+ 
+     /// A dependency providing the entropy source turned out unavailable.
+     unavailableLibrary,
+ 
+     /// The requested entropy source is not supported on this platform.
+     unavailablePlatform,
+ 
+     /// Could not retrieve entropy from the selected source.
+     readError,
+ }
+ 
+ /++
+     Status report returned by `getEntropy` functions.
+ 
+     Use the `isOK` helper function to test for success.
+  +/
+ struct EntropyResult
+ {
+     ///
+     EntropyStatus status;
+ 
+     ///
+     EntropySource source;
+ 
+     /++
+         Returns:
+             A human-readable status message.
+      +/
+     string toString() const @nogc nothrow pure @safe
+     {
+         if (status == EntropyStatus.ok)
+             return "getEntropy(): OK.";
+ 
+         if (source == EntropySource.none)
+         {
+             if (status == EntropyStatus.unavailable)
+                 return "getEntropy(): Error - No suitable entropy source was available.";
+         }
+         else if (source == EntropySource.getrandom)
+         {
+             if (status == EntropyStatus.unavailableLibrary)
+                 return "getEntropy(): `dlopen(\"libc\")` failed.";
+             if (status == EntropyStatus.unavailable)
+                 return "getEntropy(): `dlsym(\"libc\", \"getrandom\")` failed.";
+             if (status == EntropyStatus.readError)
+                 return "getEntropy(): `getrandom()` failed.";
+         }
+         else if (source == EntropySource.getentropy)
+         {
+             if (status == EntropyStatus.readError)
+                 return "getEntropy(): `getentropy()` failed.";
+         }
+         else if (source == EntropySource.charDevURandom)
+         {
+             if (status == EntropyStatus.unavailable)
+                 return "getEntropy(): `/dev/urandom` is unavailable.";
+             if (status == EntropyStatus.readError)
+                 return "getEntropy(): Reading from `/dev/urandom` failed.";
+         }
+         else if (source == EntropySource.charDevURandom)
+         {
+             if (status == EntropyStatus.unavailable)
+                 return "getEntropy(): `/dev/random` is unavailable.";
+             if (status == EntropyStatus.readError)
+                 return "getEntropy(): Reading from `/dev/random` failed.";
+         }
+         else if (source == EntropySource.bcryptGenRandom)
+         {
+             if (status == EntropyStatus.unavailableLibrary)
+                 return "getEntropy(): `LoadLibraryA(\"Bcrypt.dll\")` failed.";
+             if (status == EntropyStatus.unavailable)
+                 return "getEntropy(): `GetProcAddress(hBcrypt , \"BCryptGenRandom\")` failed.";
+             if (status == EntropyStatus.readError)
+                 return "getEntropy(): `BCryptGenRandom()` failed.";
+         }
+ 
+         // generic errors
+         {
+             if (status == EntropyStatus.unavailable ||
+                 status == EntropyStatus.unavailableLibrary)
+                 return "getEntropy(): An entropy source was unavailable.";
+             if (status == EntropyStatus.unavailablePlatform)
+                 return "getEntropy(): The requested entropy source is not supported on this platform.";
+             if (status == EntropyStatus.readError)
+                 return "getEntropy(): Could not retrieve entropy from the selected source.";
+ 
+             return "getEntropy(): An unknown error occurred.";
+         }
+     }
+ }
+ 
+ ///
+ @safe unittest
+ {
+     ubyte[4] data;
+     EntropyResult result = getEntropy(data[]);
+ 
+     if (result.isOK)
+     {
+         // Success; data in `bytes` may be used.
+     }
+     else
+     {
+         // Failure
+ 
+         if (result.isUnavailable)
+         {
+             // System’s entropy source was unavailable.
+         }
+ 
+         // Call `toString` to obtain a user-readable error message.
+         assert(result.toString() !is null);
+         assert(result.toString().length > 0);
+     }
+ }
+ 
+ /++
+     Determines whether an `EntropyResult` reports the success of an operation.
+ 
+     Params:
+         value = test subject
+ 
+     Returns:
+         `true` on success
+  +/
+ pragma(inline, true) bool isOK(const EntropyResult value) pure @safe
+ {
+     return value.status == EntropyStatus.ok;
+ }
+ 
+ /++
+     Determines whether an `EntropyResult` reports the unvailability of the
+     requested entropy source.
+ 
+     Params:
+         value = test subject
+ 
+     Returns:
+         `true` if entropy source requested to use with the operation was unavailable.
+  +/
+ pragma(inline, true) bool isUnavailable(const EntropyResult value) pure @safe
+ {
+     return (
+         value.status == EntropyStatus.unavailable ||
+         value.status == EntropyStatus.unavailableLibrary ||
+         value.status == EntropyStatus.unavailablePlatform
+     );
+ }
+ 
+ package(std):
+ 
+ // If the system let us down, we'll let the system down.
+ pragma(inline, true) void crashOnError(const EntropyResult value) pure @safe
+ {
+     if (value.isOK)
+         return;
+ 
+     assert(false, value.toString());
+ }
+ 
+ /+
+     Building blocks and implementation helpers
+  +/
+ private
+ {
+     /++
+         A “Chunks” implementation that works with `void[]`.
+      +/
+     struct VoidChunks
+     {
+         void[] _data;
+         size_t _chunkSize;
+ 
+     @nogc nothrow pure @safe:
+ 
+         this(void[] data, size_t chunkSize)
+         {
+             _data = data;
+             _chunkSize = chunkSize;
+         }
+ 
+         bool empty() const
+         {
+             return _data.length == 0;
+         }
+ 
+         inout(void)[] front() inout
+         {
+             if (_data.length < _chunkSize)
+                 return _data;
+ 
+             return _data[0 .. _chunkSize];
+         }
+ 
+         void popFront()
+         {
+             if (_data.length <= _chunkSize)
+             {
+                 _data = null;
+                 return;
+             }
+ 
+             _data = _data[_chunkSize .. $];
+         }
+     }
+ 
+     struct SrcFunPair(EntropySource source, alias func)
+     {
+         enum  src = source;
+         alias fun = func;
+     }
+ 
+     template isValidSupportedSource(SupportedSource)
+     {
+         enum isValidSupportedSource = (
+             is(SupportedSource == SrcFunPair!Args, Args...) &&
+             SupportedSource.src != EntropySource.tryAll &&
+             SupportedSource.src != EntropySource.none
+         );
+     }
+ 
+     /++
+         `getEntropyImpl()` implementation helper.
+         To be instantiated and mixed in with platform-specific configuration.
+ 
+         Params:
+             defaultSource = Default entropy source of the platform
+             SupportedSources = Sequence of `SrcFunPair`
+                                representing the supported sources of the platform
+     +/
+     mixin template entropyImpl(EntropySource defaultSource, SupportedSources...)
+     if (allSatisfy!(isValidSupportedSource, SupportedSources))
+     {
+     private:
+         /// Preconfigured entropy source preset of the platform.
+         enum defaultEntropySource = defaultSource;
+ 
+         EntropyResult getEntropyImpl(scope void[] buffer) @safe
+         {
+             switch (_entropySource)
+             {
+                 static foreach (source; SupportedSources)
+                 {
+                     case source.src:
+                         return source.fun(buffer);
+                 }
+ 
+             case EntropySource.tryAll:
+                 {
+                     const result = _tryEntropySources(buffer);
+                     result.saveSourceForNextUse();
+                     return result;
+                 }
+ 
+             case EntropySource.none:
+                 return getEntropyViaNone(buffer);
+ 
+             default:
+                 return EntropyResult(EntropyStatus.unavailablePlatform, _entropySource);
+             }
+         }
+ 
+         EntropyResult _tryEntropySources(scope void[] buffer) @safe
+         {
+             EntropyResult result;
+ 
+             static foreach (source; SupportedSources)
+             {
+                 result = source.fun(buffer);
+                 if (!result.isUnavailable)
+                     return result;
+             }
+ 
+             result = EntropyResult(
+                 EntropyStatus.unavailable,
+                 EntropySource.none,
+             );
+ 
+             return result;
+         }
+     }
+ }
+ 
+ version (Darwin) mixin entropyImpl!(
+     EntropySource.arc4random,
+     SrcFunPair!(EntropySource.arc4random, getEntropyViaARC4Random),
+     SrcFunPair!(EntropySource.charDevURandom, getEntropyViaCharDevURandom),
+     SrcFunPair!(EntropySource.charDevRandom, getEntropyViaCharDevRandom),
+ );
+ else version (DragonFlyBSD) mixin entropyImpl!(
+     EntropySource.getentropy,
+     SrcFunPair!(EntropySource.getentropy, getEntropyViaGetentropy),
+     SrcFunPair!(EntropySource.charDevURandom, getEntropyViaCharDevURandom),
+     SrcFunPair!(EntropySource.charDevRandom, getEntropyViaCharDevRandom),
+ );
+ else version (FreeBSD) mixin entropyImpl!(
+     EntropySource.getentropy,
+     SrcFunPair!(EntropySource.getentropy, getEntropyViaGetentropy),
+     SrcFunPair!(EntropySource.charDevURandom, getEntropyViaCharDevURandom),
+     SrcFunPair!(EntropySource.charDevRandom, getEntropyViaCharDevRandom),
+ );
+ else version (linux) mixin entropyImpl!(
+     EntropySource.getrandom,
+     SrcFunPair!(EntropySource.getrandom, getEntropyViaGetrandom),
+     SrcFunPair!(EntropySource.charDevURandom, getEntropyViaCharDevURandom),
+     SrcFunPair!(EntropySource.charDevRandom, getEntropyViaCharDevRandom),
+ );
+ else version (NetBSD) mixin entropyImpl!(
+     EntropySource.arc4random,
+     SrcFunPair!(EntropySource.arc4random, getEntropyViaARC4Random),
+     SrcFunPair!(EntropySource.charDevURandom, getEntropyViaCharDevURandom),
+     SrcFunPair!(EntropySource.charDevRandom, getEntropyViaCharDevRandom),
+ );
+ else version (OpenBSD) mixin entropyImpl!(
+     EntropySource.arc4random,
+     SrcFunPair!(EntropySource.arc4random, getEntropyViaARC4Random),
+     SrcFunPair!(EntropySource.charDevURandom, getEntropyViaCharDevURandom),
+     SrcFunPair!(EntropySource.charDevRandom, getEntropyViaCharDevRandom),
+ );
+ else version (Posix) mixin entropyImpl!(
+     EntropySource.charDevURandom,
+     SrcFunPair!(EntropySource.charDevURandom, getEntropyViaCharDevURandom),
+     SrcFunPair!(EntropySource.charDevRandom, getEntropyViaCharDevRandom),
+ );
+ else version (Windows) mixin entropyImpl!(
+     EntropySource.bcryptGenRandom,
+     SrcFunPair!(EntropySource.bcryptGenRandom, getEntropyViaBCryptGenRandom),
+ );
+ else mixin entropyImpl!(
+     EntropySource.none,
+ );
+ 
+ private
+ {
+     static EntropySource _entropySource = defaultEntropySource;
+ 
+     void saveSourceForNextUse(const EntropyResult result) @safe
+     {
+         if (!result.isOK)
+             return;
+ 
+         _entropySource = result.source;
+     }
+ }
+ 
+ version (all)
+ {
+ private:
+ 
+     EntropyResult getEntropyViaNone(scope void[]) @safe
+     {
+         return EntropyResult(EntropyStatus.unavailable, EntropySource.none);
+     }
+ }
+ 
+ version (Posix)
+ {
+ private:
+ 
+     EntropyResult getEntropyViaCharDevURandom(scope void[] buffer) @trusted
+     {
+         const status = getEntropyViaCharDev(buffer, "/dev/urandom".ptr);
+         return EntropyResult(status, EntropySource.charDevURandom);
+     }
+ 
+     EntropyResult getEntropyViaCharDevRandom(scope void[] buffer) @trusted
+     {
+         const status = getEntropyViaCharDev(buffer, "/dev/random".ptr);
+         return EntropyResult(status, EntropySource.charDevRandom);
+     }
+ 
+     EntropyStatus getEntropyViaCharDev(scope void[] buffer, const(char)* charDevName) @system
+     {
+         import core.stdc.stdio : fclose, fopen, fread;
+ 
+         auto charDev = fopen(charDevName, "r");
+         if (charDev is null)
+             return EntropyStatus.unavailable;
+ 
+         scope (exit)
+             fclose(charDev);
+ 
+         const bytesRead = fread(buffer.ptr, 1, buffer.length, charDev);
+         if (bytesRead != buffer.length)
+             return EntropyStatus.readError;
+ 
+         return EntropyStatus.ok;
+     }
+ }
+ 
+ version (linux)
+ {
+ private:
+ 
+     EntropyResult getEntropyViaGetrandom(scope void[] buffer) @trusted
+     {
+         const status = syscallGetrandom(buffer, 0);
+         return EntropyResult(status, EntropySource.getrandom);
+     }
+ 
+     EntropyStatus syscallGetrandom(scope void[] buffer, uint flags) @system
+     {
+         import core.sys.linux.errno : EINTR, ENOSYS, errno;
+         import core.sys.linux.sys.syscall : SYS_getrandom;
+         import core.sys.linux.unistd : syscall;
+ 
+         while (buffer.length > 0)
+         {
+             const got = syscall(SYS_getrandom, buffer.ptr, buffer.length, flags);
+ 
+             if (got == -1)
+             {
+                 switch (errno)
+                 {
+                 case EINTR:
+                     break; // That’s fine.
+                 case ENOSYS:
+                     return EntropyStatus.unavailable;
+                 default:
+                     return EntropyStatus.readError;
+                 }
+             }
+ 
+             if (got > 0)
+                 buffer = buffer[got .. $];
+         }
+ 
+         return EntropyStatus.ok;
+     }
+ }
+ 
+ // BSD
+ private
+ {
+     version (Darwin)
+         version = SecureARC4Random;
+     version (DragonFlyBSD)
+         version = UseGetentropy;
+     version (FreeBSD)
+         version = UseGetentropy;
+     version (NetBSD)
+         version = SecureARC4Random;
+     version (OpenBSD)
+         version = SecureARC4Random;
+ 
+     version (SecureARC4Random)
+     {
+         EntropyResult getEntropyViaARC4Random(scope void[] buffer) @trusted
+         {
+             arc4random_buf(buffer.ptr, buffer.length);
+             return EntropyResult(EntropyStatus.ok, EntropySource.arc4random);
+         }
+ 
+         private extern(C) void arc4random_buf(scope void* buf, size_t nbytes) @system;
+     }
+ 
+     version (UseGetentropy)
+     {
+         EntropyResult getEntropyViaGetentropy(scope void[] buffer) @trusted
+         {
+             const status = callGetentropy(buffer);
+             return EntropyResult(status, EntropySource.getentropy);
+         }
+ 
+         private EntropyStatus callGetentropy(scope void[] buffer) @system
+         {
+             /+
+                 genentropy(3):
+                 The maximum buflen permitted is 256 bytes.
+             +/
+             foreach (chunk; VoidChunks(buffer, 256))
+             {
+                 const status = getentropy(buffer.ptr, buffer.length);
+                 if (status != 0)
+                     return EntropyStatus.readError;
+             }
+ 
+             return EntropyStatus.ok;
+         }
+ 
+         private extern(C) int getentropy(scope void* buf, size_t buflen) @system;
+     }
+ }
+ 
+ version (Windows)
+ {
+     import core.sys.windows.bcrypt : BCryptGenRandom, BCRYPT_USE_SYSTEM_PREFERRED_RNG;
+     import core.sys.windows.windef : HMODULE, PUCHAR, ULONG;
+     import core.sys.windows.ntdef : NT_SUCCESS;
+ 
+ private:
+ 
+     EntropyResult getEntropyViaBCryptGenRandom(scope void[] buffer) @trusted
+     {
+         const loaded = loadBcrypt();
+         if (loaded != EntropyStatus.ok)
+             return EntropyResult(loaded, EntropySource.bcryptGenRandom);
+ 
+         const status = callBcryptGenRandom(buffer);
+         return EntropyResult(status, EntropySource.bcryptGenRandom);
+     }
+ 
+     EntropyStatus callBcryptGenRandom(scope void[] buffer) @system
+     {
+         foreach (chunk; VoidChunks(buffer, ULONG.max))
+         {
+             assert(chunk.length <= ULONG.max, "Bad chunk length.");
+ 
+             const gotRandom = ptrBCryptGenRandom(
+                 null,
+                 cast(PUCHAR) buffer.ptr,
+                 cast(ULONG) buffer.length,
+                 BCRYPT_USE_SYSTEM_PREFERRED_RNG,
+             );
+ 
+             if (!NT_SUCCESS(gotRandom))
+                 return EntropyStatus.readError;
+         }
+ 
+         return EntropyStatus.ok;
+     }
+ 
+     static
+     {
+         HMODULE hBcrypt = null;
+         typeof(BCryptGenRandom)* ptrBCryptGenRandom;
+     }
+ 
+     EntropyStatus loadBcrypt() @system
+     {
+         import core.sys.windows.winbase : GetProcAddress, LoadLibraryA;
+ 
+         if (hBcrypt !is null)
+             return EntropyStatus.ok;
+ 
+         hBcrypt = LoadLibraryA("Bcrypt.dll");
+         if (!hBcrypt)
+             return EntropyStatus.unavailableLibrary;
+ 
+         ptrBCryptGenRandom = cast(typeof(ptrBCryptGenRandom)) GetProcAddress(hBcrypt, "BCryptGenRandom");
+         if (!ptrBCryptGenRandom)
+             return EntropyStatus.unavailable;
+ 
+         return EntropyStatus.ok;
+     }
+ 
+     // Will free `Bcrypt.dll`.
+     void freeBcrypt() @system
+     {
+         import core.sys.windows.winbase : FreeLibrary;
+ 
+         if (hBcrypt is null)
+             return;
+ 
+         if (!FreeLibrary(hBcrypt))
+         {
+             return; // Error
+         }
+ 
+         hBcrypt = null;
+         ptrBCryptGenRandom = null;
+     }
+ 
+     static ~this() @system
+     {
+         freeBcrypt();
+     }
+ }
diff -Nrcpad gcc-16-20260125/libphobos/src/std/internal/math/biguintcore.d gcc-16-20260201/libphobos/src/std/internal/math/biguintcore.d
*** gcc-16-20260125/libphobos/src/std/internal/math/biguintcore.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/src/std/internal/math/biguintcore.d	Sun Feb  1 22:32:17 2026
*************** public:
*** 940,946 ****
              uint [] wasteful = new BigDigit[x.data.length];
              wasteful[] = x.data[];
              immutable rem = multibyteDivAssign(wasteful, y, 0);
!             () @trusted { GC.free(wasteful.ptr); } ();
              return rem;
          }
      }
--- 940,950 ----
              uint [] wasteful = new BigDigit[x.data.length];
              wasteful[] = x.data[];
              immutable rem = multibyteDivAssign(wasteful, y, 0);
!             if (!__ctfe)
!             {
!                 //use free only at runtime
!                 () @trusted { GC.free(wasteful.ptr); } ();
!             }
              return rem;
          }
      }
*************** pure @safe unittest
*** 1279,1284 ****
--- 1283,1295 ----
     assert(s == 5);
  }
  
+ pure @safe unittest
+ { //evaluate mod at compile time
+    enum BigUint r = BigUint([5]);
+    enum BigUint t = BigUint([7]);
+    enum BigUint s = BigUint.mod(r, t);
+    static assert(s == 5);
+ }
  
  @safe pure unittest
  {
*************** void mulInternal(BigDigit[] result, cons
*** 1725,1731 ****
              mulKaratsuba(result[half .. $], y, x[half .. $], scratchbuff);
              BigDigit c = addAssignSimple(result[half .. half + y.length], partial);
              if (c) multibyteIncrementAssign!('+')(result[half + y.length..$], c);
!             () @trusted { GC.free(scratchbuff.ptr); } ();
          }
          else
          {
--- 1736,1746 ----
              mulKaratsuba(result[half .. $], y, x[half .. $], scratchbuff);
              BigDigit c = addAssignSimple(result[half .. half + y.length], partial);
              if (c) multibyteIncrementAssign!('+')(result[half + y.length..$], c);
!             if (!__ctfe)
!             {
!                 //use free only at runtime
!                 () @trusted { GC.free(scratchbuff.ptr); } ();
!             }
          }
          else
          {
*************** void mulInternal(BigDigit[] result, cons
*** 1784,1790 ****
                  addAssignSimple(result[done .. done + y.length + chunksize], partial);
                  done += chunksize;
              }
!             () @trusted { GC.free(scratchbuff.ptr); } ();
          }
      }
      else
--- 1799,1809 ----
                  addAssignSimple(result[done .. done + y.length + chunksize], partial);
                  done += chunksize;
              }
!             if (!__ctfe)
!             {
!                 //use free only at runtime
!                 () @trusted { GC.free(scratchbuff.ptr); } ();
!             }
          }
      }
      else
*************** void mulInternal(BigDigit[] result, cons
*** 1792,1798 ****
          // Balanced. Use Karatsuba directly.
          BigDigit [] scratchbuff = new BigDigit[karatsubaRequiredBuffSize(x.length)];
          mulKaratsuba(result, x, y, scratchbuff);
!         () @trusted { GC.free(scratchbuff.ptr); } ();
      }
  }
  
--- 1811,1821 ----
          // Balanced. Use Karatsuba directly.
          BigDigit [] scratchbuff = new BigDigit[karatsubaRequiredBuffSize(x.length)];
          mulKaratsuba(result, x, y, scratchbuff);
!         if (!__ctfe)
!         {
!             //use free only at runtime
!             () @trusted { GC.free(scratchbuff.ptr); } ();
!         }
      }
  }
  
*************** void mulInternal(BigDigit[] result, cons
*** 1828,1851 ****
   */
  void squareInternal(BigDigit[] result, const BigDigit[] x) pure nothrow @safe
  {
!   import core.memory : GC;
!   // Squaring is potentially half a multiply, plus add the squares of
!   // the diagonal elements.
!   assert(result.length == 2*x.length,
!      "result needs to have twice the capacity of x");
!   if (x.length <= KARATSUBASQUARELIMIT)
!   {
!       if (x.length == 1)
!       {
!          result[1] = multibyteMul(result[0 .. 1], x, x[0], 0);
!          return;
!       }
!       return squareSimple(result, x);
!   }
!   // The nice thing about squaring is that it always stays balanced
!   BigDigit [] scratchbuff = new BigDigit[karatsubaRequiredBuffSize(x.length)];
!   squareKaratsuba(result, x, scratchbuff);
!   () @trusted { GC.free(scratchbuff.ptr); } ();
  }
  
  
--- 1851,1878 ----
   */
  void squareInternal(BigDigit[] result, const BigDigit[] x) pure nothrow @safe
  {
!     import core.memory : GC;
!     // Squaring is potentially half a multiply, plus add the squares of
!     // the diagonal elements.
!     assert(result.length == 2*x.length,
!         "result needs to have twice the capacity of x");
!     if (x.length <= KARATSUBASQUARELIMIT)
!     {
!         if (x.length == 1)
!         {
!             result[1] = multibyteMul(result[0 .. 1], x, x[0], 0);
!             return;
!         }
!         return squareSimple(result, x);
!     }
!     // The nice thing about squaring is that it always stays balanced
!     BigDigit [] scratchbuff = new BigDigit[karatsubaRequiredBuffSize(x.length)];
!     squareKaratsuba(result, x, scratchbuff);
!     if (!__ctfe)
!     {
!         //use free only at runtime
!         () @trusted { GC.free(scratchbuff.ptr); } ();
!     }
  }
  
  
*************** void divModInternal(BigDigit [] quotient
*** 1897,1903 ****
          if (s == 0) remainder[] = un[0 .. vn.length];
          else multibyteShr(remainder, un[0 .. vn.length+1], s);
      }
!     () @trusted { GC.free(un.ptr); GC.free(vn.ptr); } ();
  }
  
  pure @safe unittest
--- 1924,1934 ----
          if (s == 0) remainder[] = un[0 .. vn.length];
          else multibyteShr(remainder, un[0 .. vn.length+1], s);
      }
!     if (!__ctfe)
!     {
!         //use free only at runtime
!         () @trusted { GC.free(un.ptr); GC.free(vn.ptr); } ();
!     }
  }
  
  pure @safe unittest
*************** pure nothrow @safe
*** 2842,2848 ****
          m -= v.length;
      }
      recursiveDivMod(quotient[0 .. m], u[0 .. m + v.length], v, scratch);
!     () @trusted { GC.free(scratch.ptr); } ();
  }
  
  @system unittest
--- 2873,2883 ----
          m -= v.length;
      }
      recursiveDivMod(quotient[0 .. m], u[0 .. m + v.length], v, scratch);
!     if (!__ctfe)
!     {
!         //use free only at runtime
!         () @trusted { GC.free(scratch.ptr); } ();
!     }
  }
  
  @system unittest
diff -Nrcpad gcc-16-20260125/libphobos/src/std/internal/math/gammafunction.d gcc-16-20260201/libphobos/src/std/internal/math/gammafunction.d
*** gcc-16-20260125/libphobos/src/std/internal/math/gammafunction.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/src/std/internal/math/gammafunction.d	Sun Feb  1 22:32:17 2026
*************** real digamma(real x)
*** 1643,1649 ****
      negative = 0;
      nz = 0.0;
  
!     if ( x <= 0.0 )
      {
          negative = 1;
          q = x;
--- 1643,1654 ----
      negative = 0;
      nz = 0.0;
  
!     if ( x == 0.0 )
!     {
!         return signbit(x) == 1 ? real.infinity : -real.infinity;
!     }
! 
!     if ( x < 0.0 )
      {
          negative = 1;
          q = x;
*************** done:
*** 1718,1723 ****
--- 1723,1732 ----
      assert(digamma(1.0)== -EULERGAMMA);
      assert(feqrel(digamma(0.25), -PI/2 - 3* LN2 - EULERGAMMA) >= real.mant_dig-7);
      assert(feqrel(digamma(1.0L/6), -PI/2 *sqrt(3.0L) - 2* LN2 -1.5*log(3.0L) - EULERGAMMA) >= real.mant_dig-7);
+     assert(digamma(-0.0) == real.infinity);
+     assert(!digamma(nextDown(-0.0)).isNaN());
+     assert(digamma(+0.0) == -real.infinity);
+     assert(!digamma(nextUp(+0.0)).isNaN());
      assert(digamma(-5.0).isNaN());
      assert(feqrel(digamma(2.5), -EULERGAMMA - 2*LN2 + 2.0 + 2.0L/3) >= real.mant_dig-9);
      assert(isIdentical(digamma(NaN(0xABC)), NaN(0xABC)));
diff -Nrcpad gcc-16-20260125/libphobos/src/std/internal/windows/bcrypt.d gcc-16-20260201/libphobos/src/std/internal/windows/bcrypt.d
*** gcc-16-20260125/libphobos/src/std/internal/windows/bcrypt.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/src/std/internal/windows/bcrypt.d	Thu Jan  1 00:00:00 1970
***************
*** 1,65 ****
- module std.internal.windows.bcrypt;
- 
- version (Windows):
- 
- import core.sys.windows.bcrypt : BCryptGenRandom, BCRYPT_USE_SYSTEM_PREFERRED_RNG;
- import core.sys.windows.windef : HMODULE, PUCHAR, ULONG;
- import core.sys.windows.ntdef : NT_SUCCESS;
- 
- pragma(lib, "Bcrypt.lib");
- 
- package(std) bool bcryptGenRandom(T)(out T result) @trusted
- {
-     loadBcrypt();
- 
-     const gotRandom = ptrBCryptGenRandom(
-         null,
-         cast(PUCHAR) &result,
-         ULONG(T.sizeof),
-         BCRYPT_USE_SYSTEM_PREFERRED_RNG,
-     );
- 
-     return NT_SUCCESS(gotRandom);
- }
- 
- private
- {
-     HMODULE hBcrypt = null;
-     typeof(BCryptGenRandom)* ptrBCryptGenRandom;
- }
- 
- private void loadBcrypt() @nogc nothrow
- {
-     import core.sys.windows.winbase : GetProcAddress, LoadLibraryA;
- 
-     if (!hBcrypt)
-     {
-         hBcrypt = LoadLibraryA("Bcrypt.dll");
-         if (!hBcrypt)
-             assert(false, `LoadLibraryA("Bcrypt.dll") failed.`); // `@nogc`
- 
-         ptrBCryptGenRandom = cast(typeof(ptrBCryptGenRandom)) GetProcAddress(hBcrypt , "BCryptGenRandom");
-         if (!ptrBCryptGenRandom)
-             assert(false, `GetProcAddress(hBcrypt , "BCryptGenRandom") failed.`); // `@nogc`
-     }
- }
- 
- // Will free `Bcrypt.dll`.
- private void freeBcrypt() @nogc nothrow
- {
-     import core.sys.windows.winbase : FreeLibrary;
- 
-     if (hBcrypt)
-     {
-         if (!FreeLibrary(hBcrypt))
-             assert(false, `FreeLibrary("Bcrypt.dll") failed.`); // `@nogc`
- 
-         hBcrypt = null;
-         ptrBCryptGenRandom = null;
-     }
- }
- 
- static ~this()
- {
-     freeBcrypt();
- }
--- 0 ----
diff -Nrcpad gcc-16-20260125/libphobos/src/std/json.d gcc-16-20260201/libphobos/src/std/json.d
*** gcc-16-20260125/libphobos/src/std/json.d	Sun Jan 25 22:32:18 2026
--- gcc-16-20260201/libphobos/src/std/json.d	Sun Feb  1 22:32:17 2026
*************** struct JSONValue
*** 1058,1063 ****
--- 1058,1098 ----
          }
      }
  
+     /// Calculate a numerical hash value for this value,
+     /// allowing `JSONValue` to be used in associative arrays.
+     hash_t toHash() const @nogc nothrow pure @trusted
+     {
+         final switch (type_tag)
+         {
+         case JSONType.integer:
+             return hashOf(store.integer);
+         case JSONType.uinteger:
+             return hashOf(store.uinteger);
+         case JSONType.float_:
+             return hashOf(store.floating);
+         case JSONType.string:
+             return hashOf(store.str);
+         case JSONType.object:
+             hash_t result = hashOf(type_tag);
+             if (!store.object.isOrdered)
+                 foreach (ref pair; store.object.unordered.byKeyValue)
+                     result ^= hashOf(pair.key, pair.value.toHash());
+             else
+                 foreach (ref pair; store.object.ordered)
+                     result ^= hashOf(pair.key, pair.value.toHash());
+             return result;
+         case JSONType.array:
+             hash_t result = hashOf(type_tag);
+             foreach (ref v; store.array)
+                 result = hashOf(v, result);
+             return result;
+         case JSONType.true_:
+         case JSONType.false_:
+         case JSONType.null_:
+             return hashOf(type_tag);
+         }
+     }
+ 
      ///
      @safe unittest
      {
*************** pure nothrow @safe unittest
*** 2736,2738 ****
--- 2771,2785 ----
  
      assert(app.data == s, app.data);
  }
+ 
+ @safe unittest
+ {
+     bool[JSONValue] aa;
+     aa[JSONValue("test")] = true;
+     assert(parseJSON(`"test"`) in aa);
+     assert(parseJSON(`"boo"`) !in aa);
+ 
+     aa[JSONValue(int(5))] = true;
+     assert(JSONValue(int(5)) in aa);
+     assert(JSONValue(uint(5)) in aa);
+ }
diff -Nrcpad gcc-16-20260125/libphobos/src/std/math/algebraic.d gcc-16-20260201/libphobos/src/std/math/algebraic.d
*** gcc-16-20260125/libphobos/src/std/math/algebraic.d	Sun Jan 25 22:32:19 2026
--- gcc-16-20260201/libphobos/src/std/math/algebraic.d	Sun Feb  1 22:32:17 2026
*************** real sqrt(real x) @nogc @safe pure nothr
*** 256,262 ****
   *      $(TR $(TD $(PLUSMN)$(INFIN)) $(TD $(PLUSMN)$(INFIN)) $(TD no) )
   *      )
   */
! real cbrt(real x) @trusted nothrow @nogc
  {
      version (CRuntime_Microsoft)
      {
--- 256,262 ----
   *      $(TR $(TD $(PLUSMN)$(INFIN)) $(TD $(PLUSMN)$(INFIN)) $(TD no) )
   *      )
   */
! real cbrt(real x) @trusted pure nothrow @nogc
  {
      version (CRuntime_Microsoft)
      {
*************** real cbrt(real x) @trusted nothrow @nogc
*** 273,279 ****
  }
  
  ///
! @safe unittest
  {
      import std.math.operations : feqrel;
  
--- 273,279 ----
  }
  
  ///
! @safe pure unittest
  {
      import std.math.operations : feqrel;
  
*************** real cbrt(real x) @trusted nothrow @nogc
*** 294,303 ****
   * hypot(x, -y) are equivalent.
   *
   *  $(TABLE_SV
!  *  $(TR $(TH x)            $(TH y)            $(TH hypot(x, y)) $(TH invalid?))
!  *  $(TR $(TD x)            $(TD $(PLUSMN)0.0) $(TD |x|)         $(TD no))
!  *  $(TR $(TD $(PLUSMNINF)) $(TD y)            $(TD +$(INFIN))   $(TD no))
!  *  $(TR $(TD $(PLUSMNINF)) $(TD $(NAN))       $(TD +$(INFIN))   $(TD no))
   *  )
   */
  T hypot(T)(const T x, const T y) @safe pure nothrow @nogc
--- 294,304 ----
   * hypot(x, -y) are equivalent.
   *
   *  $(TABLE_SV
!  *  $(TR $(TH x)            $(TH y)                 $(TH hypot(x, y)) $(TH invalid?))
!  *  $(TR $(TD x)            $(TD $(PLUSMN)0.0)      $(TD |x|)         $(TD no))
!  *  $(TR $(TD $(PLUSMNINF)) $(TD y)                 $(TD +$(INFIN))   $(TD no))
!  *  $(TR $(TD $(PLUSMNINF)) $(TD $(NAN))            $(TD +$(INFIN))   $(TD no))
!  *  $(TR $(TD $(NAN))       $(TD y != $(PLUSMNINF)) $(TD $(NAN))      $(TD no))
   *  )
   */
  T hypot(T)(const T x, const T y) @safe pure nothrow @nogc
*************** if (isFloatingPoint!T)
*** 308,326 ****
      // If both are huge, avoid overflow by scaling by 2^^-N.
      // If both are tiny, avoid underflow by scaling by 2^^N.
      import core.math : fabs, sqrt;
!     import std.math.traits : floatTraits, RealFormat;
  
      alias F = floatTraits!T;
  
      T u = fabs(x);
      T v = fabs(y);
!     if (!(u >= v))  // check for NaN as well.
      {
          v = u;
          u = fabs(y);
          if (u == T.infinity) return u; // hypot(inf, nan) == inf
          if (v == T.infinity) return v; // hypot(nan, inf) == inf
      }
  
      static if (F.realFormat == RealFormat.ieeeSingle)
      {
--- 309,330 ----
      // If both are huge, avoid overflow by scaling by 2^^-N.
      // If both are tiny, avoid underflow by scaling by 2^^N.
      import core.math : fabs, sqrt;
!     import std.math.traits : floatTraits, RealFormat, isNaN;
  
      alias F = floatTraits!T;
  
      T u = fabs(x);
      T v = fabs(y);
!     if (!(u >= v))
      {
          v = u;
          u = fabs(y);
          if (u == T.infinity) return u; // hypot(inf, nan) == inf
          if (v == T.infinity) return v; // hypot(nan, inf) == inf
+         if (u.isNaN || v.isNaN)
+             return T.nan;
      }
+     assert(!(u.isNaN || v.isNaN), "Comparison to NaN always fails, thus is is always handled in the branch above");
  
      static if (F.realFormat == RealFormat.ieeeSingle)
      {
*************** if (isFloatingPoint!T)
*** 349,354 ****
--- 353,365 ----
      else
          assert(0, "hypot not implemented");
  
+     if (u * T.epsilon > v)
+     {
+         // hypot (huge, tiny) = huge
+         // also: hypot(x, 0) = x
+         return u;
+     }
+ 
      // Now u >= v, or else one is NaN.
      T ratio = 1.0;
      if (v >= SQRTMAX)
*************** if (isFloatingPoint!T)
*** 368,379 ****
          v *= SCALE_UNDERFLOW;
      }
  
-     if (u * T.epsilon > v)
-     {
-         // hypot (huge, tiny) = huge
-         return u;
-     }
- 
      // both are in the normal range
      return ratio * sqrt(u*u + v*v);
  }
--- 379,384 ----
*************** if (isFloatingPoint!T)
*** 382,392 ****
--- 387,402 ----
  @safe unittest
  {
      import std.math.operations : feqrel;
+     import std.math.traits : isNaN;
  
      assert(hypot(1.0, 1.0).feqrel(1.4142) > 16);
      assert(hypot(3.0, 4.0).feqrel(5.0) > 16);
      assert(hypot(real.infinity, 1.0L) == real.infinity);
+     assert(hypot(1.0L, real.infinity) == real.infinity);
      assert(hypot(real.infinity, real.nan) == real.infinity);
+     assert(hypot(real.nan, real.infinity) == real.infinity);
+     assert(hypot(real.nan, 1.0L).isNaN);
+     assert(hypot(1.0L, real.nan).isNaN);
  }
  
  @safe unittest
*************** if (isFloatingPoint!T)
*** 404,409 ****
--- 414,429 ----
      assert(hypot(double.infinity, double.nan) == double.infinity);
  }
  
+ // https://github.com/dlang/phobos/issues/10491
+ @safe pure nothrow unittest
+ {
+     import std.math : isClose;
+ 
+     enum small = 5.016556e-20f;
+     assert(hypot(small, 0).isClose(small));
+     assert(hypot(small, float.min_normal).isClose(small));
+ }
+ 
  @safe unittest
  {
      import std.math.operations : feqrel;
diff -Nrcpad gcc-16-20260125/libphobos/src/std/math/exponential.d gcc-16-20260201/libphobos/src/std/math/exponential.d
*** gcc-16-20260125/libphobos/src/std/math/exponential.d	Sun Jan 25 22:32:19 2026
--- gcc-16-20260201/libphobos/src/std/math/exponential.d	Sun Feb  1 22:32:17 2026
*************** if (isUnsigned!F && isUnsigned!G && isUn
*** 830,857 ****
      {
          static if (T.sizeof == 8)
          {
!             static T addmod(T a, T b, T c)
              {
!                 b = c - b;
!                 if (a >= b)
!                     return a - b;
!                 else
!                     return c - b + a;
              }
  
!             T result = 0, tmp;
  
!             b %= c;
!             while (a > 0)
!             {
!                 if (a & 1)
!                     result = addmod(result, b, c);
  
!                 a >>= 1;
!                 b = addmod(b, b, c);
              }
- 
-             return result;
          }
          else
          {
--- 830,868 ----
      {
          static if (T.sizeof == 8)
          {
!             if (c <= 0x100000000)
              {
!                 T result = a * b;
!                 return result % c;
              }
+             else
+             {
+                 import core.int128 : Cent, mul, udivmod;
  
!                 auto product = mul(a, b);
  
!                 if (product.hi >= c)
!                 {
!                     product.hi %= c;
!                 }
  
!                 T remainder = void;
!                 udivmod(product, c, remainder);
!                 return remainder;
!             }
!         }
!         else static if (T.sizeof == 4)
!         {
!             if (c <= 0x10000)
!             {
!                 T result = a * b;
!                 return result % c;
!             }
!             else
!             {
!                 DoubleT result = cast(DoubleT) (cast(DoubleT) a * cast(DoubleT) b);
!                 return result % c;
              }
          }
          else
          {
diff -Nrcpad gcc-16-20260125/libphobos/src/std/mathspecial.d gcc-16-20260201/libphobos/src/std/mathspecial.d
*** gcc-16-20260125/libphobos/src/std/mathspecial.d	Sun Jan 25 22:32:19 2026
--- gcc-16-20260201/libphobos/src/std/mathspecial.d	Sun Feb  1 22:32:17 2026
***************
*** 29,34 ****
--- 29,35 ----
   *      NAN = $(RED NAN)
   *      SUP = <span style="vertical-align:super;font-size:smaller">$0</span>
   *      GAMMA = &#915;
+  *      PSI = &Psi;
   *      THETA = &theta;
   *      INTEGRAL = &#8747;
   *      INTEGRATE = $(BIG &#8747;<sub>$(SMALL $1)</sub><sup>$2</sup>)
***************
*** 37,44 ****
--- 38,47 ----
   *      BIGSUM = $(BIG &Sigma; <sup>$2</sup><sub>$(SMALL $1)</sub>)
   *      CHOOSE = $(BIG &#40;) <sup>$(SMALL $1)</sup><sub>$(SMALL $2)</sub> $(BIG &#41;)
   *      PLUSMN = &plusmn;
+  *      MNPLUS = &mnplus;
   *      INFIN = &infin;
   *      PLUSMNINF = &plusmn;&infin;
+  *      MNPLUSINF = &mnplus;&infin;
   *      PI = &pi;
   *      LT = &lt;
   *      GT = &gt;
*************** real beta(real x, real y)
*** 166,184 ****
      assert(isIdentical(beta(2, NaN(0xABC)), NaN(0xABC)));
  }
  
! /** Digamma function
   *
!  *  The digamma function is the logarithmic derivative of the gamma function.
   *
!  *  digamma(x) = d/dx logGamma(x)
   *
!  *  See_Also: $(LREF logmdigamma), $(LREF logmdigammaInverse).
   */
  real digamma(real x)
  {
      return std.internal.math.gammafunction.digamma(x);
  }
  
  /** Log Minus Digamma function
   *
   *  logmdigamma(x) = log(x) - digamma(x)
--- 169,215 ----
      assert(isIdentical(beta(2, NaN(0xABC)), NaN(0xABC)));
  }
  
! /** Digamma function, $(PSI)(x)
   *
!  * $(PSI)(x), is the logarithmic derivative of the gamma function, $(GAMMA)(x).
   *
!  * $(PSI)(x) = $(SUP d)$(SUB /, dx) ln|$(GAMMA)(x)|  (the derivative of `logGamma(x)`)
   *
!  * Params:
!  *   x = the domain value
!  *
!  * Returns:
!  *   It returns $(PSI)(x).
!  *
!  * $(TABLE_SV
!  *   $(SVH x,             digamma(x)   )
!  *   $(SV  integer < 0,   $(NAN)       )
!  *   $(SV  $(PLUSMN)0.0,  $(MNPLUSINF) )
!  *   $(SV  +$(INFIN),     +$(INFIN)    )
!  *   $(SV  -$(INFIN),     $(NAN)       )
!  *   $(SV  $(NAN),        $(NAN)       )
!  * )
!  *
!  * See_Also: $(LREF logmdigamma), $(LREF logmdigammaInverse).
   */
  real digamma(real x)
  {
      return std.internal.math.gammafunction.digamma(x);
  }
  
+ ///
+ @safe unittest
+ {
+     const euler = 0.57721_56649_01532_86060_65121L;
+ 
+     assert(isClose(digamma(1), -euler));
+     assert(digamma(+0.) == -real.infinity);
+     assert(digamma(-0.) == +real.infinity);
+     assert(digamma(+real.infinity) == +real.infinity);
+     assert(isNaN(digamma(-1)));
+     assert(isNaN(digamma(-real.infinity)));
+ }
+ 
  /** Log Minus Digamma function
   *
   *  logmdigamma(x) = log(x) - digamma(x)
diff -Nrcpad gcc-16-20260125/libphobos/src/std/net/curl.d gcc-16-20260201/libphobos/src/std/net/curl.d
*** gcc-16-20260125/libphobos/src/std/net/curl.d	Sun Jan 25 22:32:19 2026
--- gcc-16-20260201/libphobos/src/std/net/curl.d	Sun Feb  1 22:32:17 2026
*************** private auto _decodeContent(T)(ubyte[] c
*** 1226,1234 ****
      {
          import std.exception : enforce;
          import std.format : format;
  
          // Optimally just return the utf8 encoded content
!         if (encoding == "UTF-8")
              return cast(char[])(content);
  
          // The content has to be re-encoded to utf8
--- 1226,1235 ----
      {
          import std.exception : enforce;
          import std.format : format;
+         import std.uni : icmp;
  
          // Optimally just return the utf8 encoded content
!         if (icmp(encoding, "UTF-8") == 0)
              return cast(char[])(content);
  
          // The content has to be re-encoded to utf8
diff -Nrcpad gcc-16-20260125/libphobos/src/std/numeric.d gcc-16-20260201/libphobos/src/std/numeric.d
*** gcc-16-20260125/libphobos/src/std/numeric.d	Sun Jan 25 22:32:19 2026
--- gcc-16-20260201/libphobos/src/std/numeric.d	Sun Feb  1 22:32:17 2026
*************** public:
*** 3733,3739 ****
          }
          else if (range.length == 1)
          {
!             buf[0] = range[0];
              return;
          }
          else if (range.length == 2)
--- 3733,3748 ----
          }
          else if (range.length == 1)
          {
!             static if (isNumeric!(ElementType!R))
!             {
!                 buf[0].re = range[0];
!                 buf[0].im = 0;
!             }
!             else
!             {
!                 buf[0].re = range[0].re;
!                 buf[0].im = range[0].im;
!             }
              return;
          }
          else if (range.length == 2)
*************** void inverseFft(Ret, R)(R range, Ret buf
*** 3931,3936 ****
--- 3940,3965 ----
      assert(isClose(twoInv[1].im, 0, 0.0, 1e-10));
  }
  
+ // https://github.com/dlang/phobos/issues/10796
+ @system unittest
+ {
+     import std.algorithm;
+     import std.range;
+     static struct C { float re, im; } // User-defined complex
+ 
+     float[8] arr = [1,2,3,4,5,6,7,8];
+     C[8] fft1;
+     fft(arr[], fft1[]);
+     assert(isClose(fft1[].map!"a.re",
+         [36.0, -4, -4, -4, -4, -4, -4, -4], 1e-4));
+     assert(isClose(fft1[].map!"a.im",
+         [0, 9.6568, 4, 1.6568, 0, -1.6568, -4, -9.6568], 1e-4));
+ 
+     auto inv = inverseFft(fft1[]);
+     assert(isClose(inv[].map!"a.re", arr[], 1e-6));
+     assert(inv[].map!"a.im".maxElement < 1e-10);
+ }
+ 
  // Swaps the real and imaginary parts of a complex number.  This is useful
  // for inverse FFTs.
  C swapRealImag(C)(C input)
*************** struct Stride(R)
*** 4112,4122 ****
  // using a generic slow DFT.  This seems to be the best base case.  (Size 1
  // can be coded inline as buf[0] = range[0]).
  void slowFourier2(Ret, R)(R range, Ret buf)
  {
!     assert(range.length == 2);
!     assert(buf.length == 2);
!     buf[0] = range[0] + range[1];
!     buf[1] = range[0] - range[1];
  }
  
  // Hard-coded base case for FFT of size 4.  Doesn't work as well as the size
--- 4141,4164 ----
  // using a generic slow DFT.  This seems to be the best base case.  (Size 1
  // can be coded inline as buf[0] = range[0]).
  void slowFourier2(Ret, R)(R range, Ret buf)
+ if (isComplexLike!(ElementType!Ret))
+ in (range.length == 2)
+ in (buf.length == 2)
  {
!     static if (isNumeric!(ElementType!R))
!     {
!         buf[0].re = range[0] + range[1];
!         buf[0].im = 0;
!         buf[1].re = range[0] - range[1];
!         buf[1].im = 0;
!     }
!     else
!     {
!         buf[0].re = range[0].re + range[1].re;
!         buf[0].im = range[0].im + range[1].im;
!         buf[1].re = range[0].re - range[1].re;
!         buf[1].im = range[0].im - range[1].im;
!     }
  }
  
  // Hard-coded base case for FFT of size 4.  Doesn't work as well as the size
diff -Nrcpad gcc-16-20260125/libphobos/src/std/path.d gcc-16-20260201/libphobos/src/std/path.d
*** gcc-16-20260125/libphobos/src/std/path.d	Sun Jan 25 22:32:19 2026
--- gcc-16-20260201/libphobos/src/std/path.d	Sun Feb  1 22:32:17 2026
*************** private auto _stripDrive(R)(R path)
*** 992,998 ****
      Returns:
          index of extension separator (the dot), or -1 if not found
  */
! private ptrdiff_t extSeparatorPos(R)(const R path)
  if (isRandomAccessRange!R && hasLength!R && isSomeChar!(ElementType!R) ||
      isNarrowString!R)
  {
--- 992,998 ----
      Returns:
          index of extension separator (the dot), or -1 if not found
  */
! private ptrdiff_t extSeparatorPos(R)(R path)
  if (isRandomAccessRange!R && hasLength!R && isSomeChar!(ElementType!R) ||
      isNarrowString!R)
  {
*************** if (isSomeChar!C1 && isSomeChar!C2)
*** 1281,1286 ****
--- 1281,1291 ----
  }
  
  @safe unittest
+ {
+     assert(chainPath("directory", "file").withExtension(".ext").array == buildPath("directory", "file.ext"));
+ }
+ 
+ @safe unittest
  {
      import std.algorithm.comparison : equal;
  
diff -Nrcpad gcc-16-20260125/libphobos/src/std/random.d gcc-16-20260201/libphobos/src/std/random.d
*** gcc-16-20260125/libphobos/src/std/random.d	Sun Jan 25 22:32:19 2026
--- gcc-16-20260201/libphobos/src/std/random.d	Sun Feb  1 22:32:17 2026
*************** else
*** 1773,1845 ****
  }
  
  version (linux)
! {
!     version (linux_legacy_emulate_getrandom)
!     {
!         /+
!             Emulates `getrandom()` for backwards compatibility
!             with outdated kernels and legacy libc versions.
! 
!             `getrandom()` was added to the GNU C Library in v2.25.
!          +/
!         pragma(msg, "`getrandom()` emulation for legacy Linux targets is enabled.");
! 
!         /+
!             On modern kernels (5.6+), `/dev/random` would behave more similar
!             to `getrandom()`.
!             However, this emulator was specifically written for systems older
!             than that. Hence, `/dev/urandom` is the CSPRNG of choice.
! 
!             <https://web.archive.org/web/20200914181930/https://www.2uo.de/myths-about-urandom/>
!          +/
!         private static immutable _pathLinuxSystemCSPRNG = "/dev/urandom";
! 
!         import core.sys.posix.sys.types : ssize_t;
! 
!         /+
!             Linux `getrandom()` emulation built upon `/dev/urandom`.
!             The fourth parameter (`uint flags`) is happily ignored.
!          +/
!         private ssize_t getrandom(
!                 void* buf,
!                 size_t buflen,
!                 uint,
!         ) @system nothrow @nogc
!         {
!             import core.stdc.stdio : fclose, fopen, fread;
! 
!             auto blockDev = fopen(_pathLinuxSystemCSPRNG.ptr, "r");
!             if (blockDev is null)
!                 assert(false, "System CSPRNG unavailable: `fopen(\"" ~ _pathLinuxSystemCSPRNG ~ "\")` failed.");
!             scope (exit) fclose(blockDev);
! 
!             const bytesRead = fread(buf, 1, buflen, blockDev);
!             return bytesRead;
!         }
!     }
!     else
!     {
!         // `getrandom()` was introduced in Linux 3.17.
! 
!         // Shim for missing bindings in druntime
!         version (none)
!             import core.sys.linux.sys.random : getrandom;
!         else
!         {
!             import core.sys.posix.sys.types : ssize_t;
!             private extern extern(C) ssize_t getrandom(
!                 void* buf,
!                 size_t buflen,
!                 uint flags,
!             ) @system nothrow @nogc;
!         }
!     }
! }
! 
  version (Windows)
! {
!     import std.internal.windows.bcrypt : bcryptGenRandom;
! }
  
  /**
  A "good" seed for initializing random number engines. Initializing
--- 1773,1781 ----
  }
  
  version (linux)
!     version = SeedUseGetEntropy;
  version (Windows)
!     version = SeedUseGetEntropy;
  
  /**
  A "good" seed for initializing random number engines. Initializing
*************** how excellent the source of entropy is.
*** 1881,1916 ****
  */
  @property uint unpredictableSeed() @trusted nothrow @nogc
  {
!     version (linux)
      {
!         uint buffer;
! 
!         /*
!             getrandom(2):
!             If the _urandom_ source has been initialized, reads of up to
!             256 bytes will always return as many bytes as requested and
!             will not be interrupted by signals. No such guarantees apply
!             for larger buffer sizes.
!             */
!         static assert(buffer.sizeof <= 256);
! 
!         const status = (() @trusted => getrandom(&buffer, buffer.sizeof, 0))();
!         assert(status == buffer.sizeof);
  
          return buffer;
      }
-     else version (Windows)
-     {
-         uint result;
-         if (!bcryptGenRandom!uint(result))
-         {
-             version (none)
-                 return fallbackSeed();
-             else
-                 assert(false, "BCryptGenRandom() failed.");
-         }
-         return result;
-     }
      else version (AnyARC4Random)
      {
          return arc4random();
--- 1817,1831 ----
  */
  @property uint unpredictableSeed() @trusted nothrow @nogc
  {
!     version (SeedUseGetEntropy)
      {
!         import std.internal.entropy : crashOnError, EntropySource, getEntropy;
  
+         uint buffer;
+         const status = (() @trusted => getEntropy(&buffer, buffer.sizeof, EntropySource.tryAll))();
+         crashOnError(status);
          return buffer;
      }
      else version (AnyARC4Random)
      {
          return arc4random();
*************** if (isUnsigned!UIntType)
*** 1960,1995 ****
          /// ditto
          @property UIntType unpredictableSeed() @nogc nothrow @trusted
          {
!             version (linux)
              {
!                 UIntType buffer;
! 
!                 /*
!                     getrandom(2):
!                     If the _urandom_ source has been initialized, reads of up to
!                     256 bytes will always return as many bytes as requested and
!                     will not be interrupted by signals. No such guarantees apply
!                     for larger buffer sizes.
!                  */
!                 static assert(buffer.sizeof <= 256);
! 
!                 const status = (() @trusted => getrandom(&buffer, buffer.sizeof, 0))();
!                 assert(status == buffer.sizeof);
  
                  return buffer;
              }
-             else version (Windows)
-             {
-                 UIntType result;
-                 if (!bcryptGenRandom!UIntType(result))
-                 {
-                     version (none)
-                         return fallbackSeed();
-                     else
-                         assert(false, "BCryptGenRandom() failed.");
-                 }
-                 return result;
-             }
              else version (AnyARC4Random)
              {
                  static if (UIntType.sizeof <= uint.sizeof)
--- 1875,1889 ----
          /// ditto
          @property UIntType unpredictableSeed() @nogc nothrow @trusted
          {
!             version (SeedUseGetEntropy)
              {
!                 import std.internal.entropy : crashOnError, EntropySource, getEntropy;
  
+                 UIntType buffer;
+                 const status = (() @trusted => getEntropy(&buffer, buffer.sizeof, EntropySource.tryAll))();
+                 crashOnError(status);
                  return buffer;
              }
              else version (AnyARC4Random)
              {
                  static if (UIntType.sizeof <= uint.sizeof)
diff -Nrcpad gcc-16-20260125/libphobos/src/std/range/package.d gcc-16-20260201/libphobos/src/std/range/package.d
*** gcc-16-20260125/libphobos/src/std/range/package.d	Sun Jan 25 22:32:19 2026
--- gcc-16-20260201/libphobos/src/std/range/package.d	Sun Feb  1 22:32:17 2026
*************** pure @safe nothrow @nogc unittest
*** 3881,3889 ****
  }
  
  /++
!     Convenience function which calls
      $(REF popFrontN, std, range, primitives)`(range, n)` and returns `range`.
!     `drop` makes it easier to pop elements from a range
      and then pass it to another function within a single expression,
      whereas `popFrontN` would require multiple statements.
  
--- 3881,3891 ----
  }
  
  /++
!     `drop` is a convenience function which calls
      $(REF popFrontN, std, range, primitives)`(range, n)` and returns `range`.
!     Unlike `popFrontN`, the range argument is passed by copy, not by `ref`.
! 
!     `drop` makes it easier to pop elements from a range rvalue
      and then pass it to another function within a single expression,
      whereas `popFrontN` would require multiple statements.
  
*************** if (isInputRange!R)
*** 3916,3922 ****
  {
      import std.algorithm.comparison : equal;
  
!     assert([0, 2, 1, 5, 0, 3].drop(3) == [5, 0, 3]);
      assert("hello world".drop(6) == "world");
      assert("hello world".drop(50).empty);
      assert("hello world".take(6).drop(3).equal("lo "));
--- 3918,3927 ----
  {
      import std.algorithm.comparison : equal;
  
!     auto a = [0, 2, 1, 5, 0, 3];
!     assert(a.drop(3) == [5, 0, 3]);
!     assert(a.length == 6); // original unchanged
! 
      assert("hello world".drop(6) == "world");
      assert("hello world".drop(50).empty);
      assert("hello world".take(6).drop(3).equal("lo "));
*************** if (isBidirectionalRange!R)
*** 3993,4000 ****
          `range` with `n` elements dropped
  
      See_Also:
!         $(REF popFrontExcatly, std, range, primitives),
!         $(REF popBackExcatly, std, range, primitives)
  +/
  R dropExactly(R)(R range, size_t n)
  if (isInputRange!R)
--- 3998,4005 ----
          `range` with `n` elements dropped
  
      See_Also:
!         $(REF popFrontExactly, std, range, primitives),
!         $(REF popBackExactly, std, range, primitives)
  +/
  R dropExactly(R)(R range, size_t n)
  if (isInputRange!R)
*************** if (isBidirectionalRange!R)
*** 4030,4038 ****
  }
  
  /++
!     Convenience function which calls
!     `range.popFront()` and returns `range`. `dropOne`
!     makes it easier to pop an element from a range
      and then pass it to another function within a single expression,
      whereas `popFront` would require multiple statements.
  
--- 4035,4045 ----
  }
  
  /++
!     `dropOne` is a convenience function which calls
!     `range.popFront()` and returns `range`.
!     Unlike `popFront`, the range argument is passed by copy, not by `ref`.
! 
!     `dropOne` makes it easier to pop an element from a range rvalue
      and then pass it to another function within a single expression,
      whereas `popFront` would require multiple statements.
  
diff -Nrcpad gcc-16-20260125/libphobos/src/std/string.d gcc-16-20260201/libphobos/src/std/string.d
*** gcc-16-20260125/libphobos/src/std/string.d	Sun Jan 25 22:32:19 2026
--- gcc-16-20260201/libphobos/src/std/string.d	Sun Feb  1 22:32:17 2026
*************** if (isConvertibleToString!Range)
*** 6864,6869 ****
--- 6864,6874 ----
   *  tabsize = column spacing of tabs in firstindent[] and indent[]
   * Returns:
   *  resulting paragraph as an allocated string
+  * Bugs:
+  *  Columns are counted as the number of code points in the string. This may
+  *  not correspond with the actual number of columns displayed if the string
+  *  contains combining characters, modifiers, zero-width characters, or
+  *  double-width characters.
   */
  
  S wrap(S)(S s, in size_t columns = 80, S firstindent = null,
diff -Nrcpad gcc-16-20260125/libphobos/src/std/sumtype.d gcc-16-20260201/libphobos/src/std/sumtype.d
*** gcc-16-20260125/libphobos/src/std/sumtype.d	Sun Jan 25 22:32:19 2026
--- gcc-16-20260201/libphobos/src/std/sumtype.d	Sun Feb  1 22:32:17 2026
*************** version (D_BetterC) {} else
*** 32,40 ****
  {
      import std.math.operations : isClose;
  
!     struct Fahrenheit { double degrees; }
!     struct Celsius { double degrees; }
!     struct Kelvin { double degrees; }
  
      alias Temperature = SumType!(Fahrenheit, Celsius, Kelvin);
  
--- 32,40 ----
  {
      import std.math.operations : isClose;
  
!     struct Fahrenheit { double value; }
!     struct Celsius { double value; }
!     struct Kelvin { double value; }
  
      alias Temperature = SumType!(Fahrenheit, Celsius, Kelvin);
  
*************** version (D_BetterC) {} else
*** 48,76 ****
      {
          return Fahrenheit(
              t.match!(
!                 (Fahrenheit f) => f.degrees,
!                 (Celsius c) => c.degrees * 9.0/5 + 32,
!                 (Kelvin k) => k.degrees * 9.0/5 - 459.4
              )
          );
      }
  
!     assert(toFahrenheit(t1).degrees.isClose(98.6));
!     assert(toFahrenheit(t2).degrees.isClose(212));
!     assert(toFahrenheit(t3).degrees.isClose(32));
  
      // Use ref to modify the value in place.
      void freeze(ref Temperature t)
      {
          t.match!(
!             (ref Fahrenheit f) => f.degrees = 32,
!             (ref Celsius c) => c.degrees = 0,
!             (ref Kelvin k) => k.degrees = 273
          );
      }
  
      freeze(t1);
!     assert(toFahrenheit(t1).degrees.isClose(32));
  
      // Use a catch-all handler to give a default result.
      bool isFahrenheit(Temperature t)
--- 48,76 ----
      {
          return Fahrenheit(
              t.match!(
!                 (Fahrenheit f) => f.value,
!                 (Celsius c) => c.value * 9.0/5 + 32,
!                 (Kelvin k) => k.value * 9.0/5 - 459.4
              )
          );
      }
  
!     assert(toFahrenheit(t1).value.isClose(98.6));
!     assert(toFahrenheit(t2).value.isClose(212));
!     assert(toFahrenheit(t3).value.isClose(32));
  
      // Use ref to modify the value in place.
      void freeze(ref Temperature t)
      {
          t.match!(
!             (ref Fahrenheit f) => f.value = 32,
!             (ref Celsius c) => c.value = 0,
!             (ref Kelvin k) => k.value = 273
          );
      }
  
      freeze(t1);
!     assert(toFahrenheit(t1).value.isClose(32));
  
      // Use a catch-all handler to give a default result.
      bool isFahrenheit(Temperature t)
diff -Nrcpad gcc-16-20260125/libphobos/src/std/traits.d gcc-16-20260201/libphobos/src/std/traits.d
*** gcc-16-20260125/libphobos/src/std/traits.d	Sun Jan 25 22:32:19 2026
--- gcc-16-20260201/libphobos/src/std/traits.d	Sun Feb  1 22:32:17 2026
*************** It will return `void` if a symbol withou
*** 4728,4737 ****
  alias TemplateOf(alias T : Base!Args, alias Base, Args...) = Base;
  
  /// ditto
! alias TemplateOf(T : Base!Args, alias Base, Args...) = Base;
! 
! /// ditto
! alias TemplateOf(T) = void;
  
  ///
  @safe unittest
--- 4728,4734 ----
  alias TemplateOf(alias T : Base!Args, alias Base, Args...) = Base;
  
  /// ditto
! alias TemplateOf(alias T) = void;
  
  ///
  @safe unittest
*************** alias TemplateOf(T) = void;
*** 4768,4773 ****
--- 4765,4774 ----
  {
      static assert(is(TemplateOf!(int[]) == void));
      static assert(is(TemplateOf!bool == void));
+ 
+     // https://github.com/dlang/phobos/issues/10527
+     static void foo() {}
+     static assert(is(TemplateOf!foo == void));
  }
  
  /**
*************** enum bool isSomeFunction(alias T) =
*** 7610,7615 ****
--- 7611,7618 ----
  /**
  Detect whether `T` is a callable object, which can be called with the
  function call operator `$(LPAREN)...$(RPAREN)`.
+ 
+ $(NOTE Implicit Function Template Instantiation is *not* attempted - see below.)
   */
  template isCallable(alias callable)
  {
*************** template isCallable(alias callable)
*** 7633,7639 ****
      }
  }
  
! /// Functions, lambdas, and aggregate types with (static) opCall.
  @safe unittest
  {
      void f() { }
--- 7636,7642 ----
      }
  }
  
! /// Functions, function pointers, delegates, lambdas.
  @safe unittest
  {
      void f() { }
*************** template isCallable(alias callable)
*** 7642,7647 ****
--- 7645,7661 ----
      static assert( isCallable!f);
      static assert( isCallable!g);
  
+     auto fp = &f;
+     static assert( isCallable!fp);
+     static assert( isCallable!((int x) {}));
+ 
+     int x;
+     static assert(!isCallable!x);
+ }
+ 
+ /// Aggregate types with (static) opCall.
+ @safe unittest
+ {
      class C { int opCall(int) { return 0; } }
      auto c = new C;
      struct S { static int opCall(int) { return 0; } }
*************** template isCallable(alias callable)
*** 7656,7662 ****
      static assert(!isCallable!I);
  }
  
! /// Templates
  @safe unittest
  {
      void f()() { }
--- 7670,7676 ----
      static assert(!isCallable!I);
  }
  
! /// Template functions are only detected if they are instantiable with `!()`.
  @safe unittest
  {
      void f()() { }
*************** template isCallable(alias callable)
*** 7668,7676 ****
      static assert( isCallable!g);
      static assert( isCallable!S1);
      static assert( isCallable!S2);
  }
  
! /// Overloaded functions and function templates.
  @safe unittest
  {
      static struct Wrapper
--- 7682,7692 ----
      static assert( isCallable!g);
      static assert( isCallable!S1);
      static assert( isCallable!S2);
+ 
+     static assert(!isCallable!((x) {}));
  }
  
! /// Overloaded functions and function templates instantiable with `!()`.
  @safe unittest
  {
      static struct Wrapper
diff -Nrcpad gcc-16-20260125/libphobos/src/std/typecons.d gcc-16-20260201/libphobos/src/std/typecons.d
*** gcc-16-20260125/libphobos/src/std/typecons.d	Sun Jan 25 22:32:19 2026
--- gcc-16-20260201/libphobos/src/std/typecons.d	Sun Feb  1 22:32:17 2026
*************** struct Nullable(T)
*** 3836,3857 ****
       * Returns:
       *     A `string` if `writer` and `fmt` are not set; `void` otherwise.
       */
!     string toString()
      {
          import std.array : appender;
          auto app = appender!string();
          auto spec = singleSpec("%s");
!         toString(app, spec);
          return app.data;
      }
  
      /// ditto
!     string toString() const
      {
          import std.array : appender;
          auto app = appender!string();
          auto spec = singleSpec("%s");
!         toString(app, spec);
          return app.data;
      }
  
--- 3836,3857 ----
       * Returns:
       *     A `string` if `writer` and `fmt` are not set; `void` otherwise.
       */
!     string toString()()
      {
          import std.array : appender;
          auto app = appender!string();
          auto spec = singleSpec("%s");
!         this.toString(app, spec);
          return app.data;
      }
  
      /// ditto
!     string toString()() const
      {
          import std.array : appender;
          auto app = appender!string();
          auto spec = singleSpec("%s");
!         this.toString(app, spec);
          return app.data;
      }
  
*************** private static:
*** 6677,6684 ****
                  if (atts & FA.property) poatts ~= " @property";
                  if (atts & FA.safe    ) poatts ~= " @safe";
                  if (atts & FA.trusted ) poatts ~= " @trusted";
-                 if (atts & FA.scope_ )  poatts ~= " scope";
                  if (atts & FA.return_ ) poatts ~= " return";
                  return poatts;
              }
              enum postAtts = make_postAtts();
--- 6677,6684 ----
                  if (atts & FA.property) poatts ~= " @property";
                  if (atts & FA.safe    ) poatts ~= " @safe";
                  if (atts & FA.trusted ) poatts ~= " @trusted";
                  if (atts & FA.return_ ) poatts ~= " return";
+                 if (atts & FA.scope_ )  poatts ~= " scope";
                  return poatts;
              }
              enum postAtts = make_postAtts();
*************** private template replaceTypeInFunctionTy
*** 10786,10803 ****
          {
              if (i)
                  result ~= ", ";
              if (storageClasses[i] & ParameterStorageClass.scope_)
                  result ~= "scope ";
-             if (storageClasses[i] & ParameterStorageClass.in_)
-                 result ~= "in ";
              if (storageClasses[i] & ParameterStorageClass.out_)
                  result ~= "out ";
              if (storageClasses[i] & ParameterStorageClass.ref_)
                  result ~= "ref ";
              if (storageClasses[i] & ParameterStorageClass.lazy_)
                  result ~= "lazy ";
-             if (storageClasses[i] & ParameterStorageClass.return_)
-                 result ~= "return ";
  
              result ~= "PX[" ~ i.stringof ~ "]";
          }
--- 10786,10803 ----
          {
              if (i)
                  result ~= ", ";
+             if (storageClasses[i] & ParameterStorageClass.return_)
+                 result ~= "return ";
              if (storageClasses[i] & ParameterStorageClass.scope_)
                  result ~= "scope ";
              if (storageClasses[i] & ParameterStorageClass.out_)
                  result ~= "out ";
              if (storageClasses[i] & ParameterStorageClass.ref_)
                  result ~= "ref ";
+             if (storageClasses[i] & ParameterStorageClass.in_)
+                 result ~= "in ";
              if (storageClasses[i] & ParameterStorageClass.lazy_)
                  result ~= "lazy ";
  
              result ~= "PX[" ~ i.stringof ~ "]";
          }
diff -Nrcpad gcc-16-20260125/libphobos/src/std/uuid.d gcc-16-20260201/libphobos/src/std/uuid.d
*** gcc-16-20260125/libphobos/src/std/uuid.d	Sun Jan 25 22:32:19 2026
--- gcc-16-20260201/libphobos/src/std/uuid.d	Sun Feb  1 22:32:17 2026
*************** public struct UUID
*** 1204,1235 ****
   *
   * This function is not supported at compile time.
   *
   * Params:
   *      randomGen = uniform RNG
   * See_Also: $(REF isUniformRNG, std,random)
   */
  @nogc nothrow @safe UUID randomUUID()
  {
!     import std.random : rndGen;
!     // A PRNG with fewer than `n` bytes of state cannot produce
!     // every distinct `n` byte sequence.
!     static if (typeof(rndGen).sizeof >= UUID.sizeof)
!     {
!         return randomUUID(rndGen);
!     }
!     else
!     {
!         import std.random : unpredictableSeed, Xorshift192;
!         static assert(Xorshift192.sizeof >= UUID.sizeof);
!         static Xorshift192 rng;
!         static bool initialized;
!         if (!initialized)
!         {
!             rng.seed(unpredictableSeed);
!             initialized = true;
!         }
!         return randomUUID(rng);
!     }
  }
  
  /// ditto
--- 1204,1255 ----
   *
   * This function is not supported at compile time.
   *
+  * Bugs:
+  * $(LINK2 https://github.com/dlang/phobos/issues/9881, Issue #9881 - Randomness in UUID generation is insufficient)
+  *
+  * Warning:
+  * $(B This function must not be used for cryptographic purposes.)
+  * UUIDs generated by this function do not have sufficient randomness
+  * for all use cases.
+  * This especially applies to the overload that accepts a caller-provided RNG.
+  * At the moment, Phobos does not provide a $(I cryptographically-secure
+  * pseudo-random number generator (CSPRNG)) that could be supplied to this
+  * function.
+  *
+  * While the function overload with no parameters will attempt to use the
+  * system CSPRNG where available and implemented, there are no guarantees.
+  * See $(REF unpredictableSeed, std, random) for details.
+  *
   * Params:
   *      randomGen = uniform RNG
   * See_Also: $(REF isUniformRNG, std,random)
   */
  @nogc nothrow @safe UUID randomUUID()
  {
!     import std.conv : bitCast;
!     import std.random : unpredictableSeed;
! 
!     enum bufferSize = UUID.data.sizeof;
!     ubyte[bufferSize] data;
! 
!     static assert(ulong.sizeof * 2 == bufferSize);
!     const half1 = unpredictableSeed!ulong();
!     const half2 = unpredictableSeed!ulong();
! 
!     data[0 .. ulong.sizeof] = (() @trusted => half1.bitCast!(ubyte[ulong.sizeof]))();
!     data[ulong.sizeof .. $] = (() @trusted => half2.bitCast!(ubyte[ulong.sizeof]))();
! 
!     // set variant
!     // must be 0b_10xxxxxx
!     data[8] &= 0b_10_111111;
!     data[8] |= 0b_10_000000;
! 
!     // set version
!     // must be 0b_0100xxxx
!     data[6] &= 0b_0100_1111;
!     data[6] |= 0b_0100_0000;
! 
!     return UUID(data);
  }
  
  /// ditto
diff -Nrcpad gcc-16-20260125/libphobos/src/std/variant.d gcc-16-20260201/libphobos/src/std/variant.d
*** gcc-16-20260125/libphobos/src/std/variant.d	Sun Jan 25 22:32:19 2026
--- gcc-16-20260201/libphobos/src/std/variant.d	Sun Feb  1 22:32:17 2026
*************** public:
*** 850,856 ****
       */
      @property inout(T) get(T)() inout
      {
!         inout(T) result = void;
          static if (is(T == shared))
              alias R = shared Unqual!T;
          else
--- 850,863 ----
       */
      @property inout(T) get(T)() inout
      {
!         static union SupressDestructor {
!             T val;
!         }
! 
!         /* If this function fails and it throws, copy elision will not run and the destructor might be called.
!          * But since this value is void initialized, this is undesireable.
!          */
!         inout(SupressDestructor) result = void;
          static if (is(T == shared))
              alias R = shared Unqual!T;
          else
*************** public:
*** 861,867 ****
          {
              throw new VariantException(type, typeid(T));
          }
!         return result;
      }
  
      /// Ditto
--- 868,874 ----
          {
              throw new VariantException(type, typeid(T));
          }
!         return result.val;
      }
  
      /// Ditto
*************** if (isAlgebraic!VariantType && Handler.l
*** 3255,3257 ****
--- 3262,3305 ----
      immutable aa = ["0": 0];
      auto v = Variant(aa); // compile error
  }
+ 
+ // https://github.com/dlang/phobos/issues/9585
+ // Verify that alignment is respected
+ @safe unittest
+ {
+     static struct Foo { double x; }
+     alias AFoo1 = Algebraic!(Foo);
+     static assert(AFoo1.alignof >= double.alignof);
+ 
+     // Algebraic using a function pointer is an implementation detail. If test fails, this is safe to change
+     enum FP_SIZE = (int function()).sizeof;
+     static assert(AFoo1.sizeof >= double.sizeof + FP_SIZE);
+ }
+ 
+ // https://github.com/dlang/phobos/issues/10518
+ @system unittest
+ {
+     import std.exception : assertThrown;
+ 
+     struct Huge {
+         real a, b, c, d, e, f, g;
+     }
+     Huge h = {1,1,1,1,1,1,1};
+     Variant variant = Variant([
+             "one": Variant(1),
+     ]);
+     // Testing that this doesn't segfault. Future work might make enable this
+     assertThrown!VariantException(variant["three"] = 3);
+     assertThrown!VariantException(variant["four"] = Variant(4));
+     /* Storing huge works too, value will moved to the heap
+     * Testing this as a regression test here as the AA handling code is still somewhat brittle and might add changes
+     * that depend payload size in the future
+     */
+     assertThrown!VariantException(variant["huge"] = Variant(h));
+     /+
+     assert(variant["one"] == Variant(1));
+     assert(variant["three"] == Variant(3));
+     assert(variant["three"] == 3);
+     assert(variant["huge"] == Variant(h));
+     +/
+ }
diff -Nrcpad gcc-16-20260125/libphobos/testsuite/libphobos.aa/test_aa.d gcc-16-20260201/libphobos/testsuite/libphobos.aa/test_aa.d
*** gcc-16-20260125/libphobos/testsuite/libphobos.aa/test_aa.d	Sun Jan 25 22:32:19 2026
--- gcc-16-20260201/libphobos/testsuite/libphobos.aa/test_aa.d	Sun Feb  1 22:32:17 2026
*************** void main()
*** 41,46 ****
--- 41,48 ----
      testTombstonePurging();
      testClear();
      testTypeInfoCollect();
+     testNew();
+     testAliasThis();
  }
  
  void testKeysValues1()
*************** void testTypeInfoCollect()
*** 947,949 ****
--- 949,990 ----
      s = null; // clear any reference to the entry
      GC.collect(); // used to segfault.
  }
+ 
+ void testNew()
+ {
+     auto aa = new long[int]; // call _d_newAA
+     assert(aa.length == 0);
+     foreach (i; 0 .. 100)
+         aa[i] = i * 2;
+     assert(aa.length == 100);
+ 
+     // not supported in CTFE (it doesn't do much anyway):
+     // static auto aa = new long[int];
+ }
+ 
+ void testAliasThis()
+ {
+     static struct S
+     {
+         __gshared int numCopies;
+ 
+         ubyte[long] aa;
+         S* next;
+ 
+         this(this) { numCopies++; }
+ 
+         alias aa this;
+     }
+     S s;
+     long key = 1;
+     s.aa[1] = 1; // create and insert
+     assert(S.numCopies == 0);
+     if (auto p = 1 in s)
+         *p = 2;
+     if (auto p = key in s)
+         *p = 3;
+     if (auto p = () { return 1; }() in s)
+         *p = 4;
+     s.remove(1);
+     assert(S.numCopies == 0);
+ }
diff -Nrcpad gcc-16-20260125/libphobos/testsuite/libphobos.init_fini/custom_gc.d gcc-16-20260201/libphobos/testsuite/libphobos.init_fini/custom_gc.d
*** gcc-16-20260125/libphobos/testsuite/libphobos.init_fini/custom_gc.d	Sun Jan 25 22:32:19 2026
--- gcc-16-20260201/libphobos/testsuite/libphobos.init_fini/custom_gc.d	Sun Feb  1 22:32:17 2026
*************** import core.stdc.stdlib : calloc, malloc
*** 4,9 ****
--- 4,11 ----
  
  static import core.memory;
  
+ import core.thread.threadbase : ThreadBase;
+ 
  extern (C) __gshared string[] rt_options = ["gcopt=gc:malloc"];
  
  extern (C) pragma(crt_constructor) void register_mygc()
*************** nothrow @nogc:
*** 209,214 ****
--- 211,224 ----
          return false;
      }
  
+     void initThread(ThreadBase thread) nothrow @nogc
+     {
+     }
+ 
+     void cleanupThread(ThreadBase thread) nothrow @nogc
+     {
+     }
+ 
  private:
      // doesn't care for alignment
      static void* sentinelAdd(void* p, size_t value)
diff -Nrcpad gcc-16-20260125/libstdc++-v3/ChangeLog gcc-16-20260201/libstdc++-v3/ChangeLog
*** gcc-16-20260125/libstdc++-v3/ChangeLog	Sun Jan 25 22:32:19 2026
--- gcc-16-20260201/libstdc++-v3/ChangeLog	Sun Feb  1 22:32:17 2026
***************
*** 1,3 ****
--- 1,159 ----
+ 2026-01-31  Patrick Palka  <ppalka@redhat.com>
+ 
+ 	* include/bits/regex_executor.tcc (_ExecutorFrameBase): Add
+ 	#pragma GCC diagnostic to suppress -Wpedantic warning about
+ 	anonymous structs.
+ 
+ 2026-01-30  Patrick Palka  <ppalka@redhat.com>
+ 
+ 	* include/bits/regex_executor.tcc (__detail::_Executor::_M_node)
+ 	[__OPTIMIZE__]: Add [[gnu::always_inline]] attribute.  Declare
+ 	inline.
+ 
+ 2026-01-30  Patrick Palka  <ppalka@redhat.com>
+ 
+ 	PR libstdc++/86164
+ 	* include/bits/regex_executor.tcc (__detail::_ExecutorFrameOpcode):
+ 	Remove _S_fopcode_restore_current.
+ 	(__detail::_Executor::_M_handle_repeat): Pass _M_current when
+ 	pushing a fallback_next or fallback_rep_once_more frame.
+ 	(__detail::_Executor::_M_handle_match): Don't push a
+ 	restore_current frame.
+ 	(__detail::_Executor::_M_handle_backref): Likewise and simplify
+ 	accordingly.
+ 	(__detail::_Executor::_M_handle_alternative): Pass _M_current when
+ 	pushing a fallback_next or posix_alternative frame.
+ 	(__detail::_Executor::_M_dfs) <case _S_fopcode_fallback_next>:
+ 	Restore _M_current.
+ 	<case _S_fopcode_fallback_rep_once_more>: Likewise.
+ 	<case _S_fopcode_posix_alternative>: Likewise.
+ 	<case _S_fopcode_restore_current>: Remove.
+ 
+ 2026-01-30  Patrick Palka  <ppalka@redhat.com>
+ 
+ 	PR libstdc++/86164
+ 	* include/bits/regex.h (__detail::_Executor): Use inline
+ 	namespace _V2.
+ 	* include/bits/regex_executor.h (__detail::_ExecutorFrame):
+ 	Declare.
+ 	(__detail::_Executor): Use inline namespace _V2.
+ 	(__detail::_Executor::_M_node): Declare.
+ 	(__detail::_Executor::_M_frames): New data member.
+ 	* include/bits/regex_executor.tcc (__detail::_ExecutorFrameOpcode):
+ 	New.
+ 	(__detail::_ExecutorFrameBase): New.
+ 	(__detail::_ExecutorFrame): New.
+ 	(__detail::_Executor): Use inline namespace _V2.
+ 	(__detail::_Executor::_M_rep_once_more): Replace recursive
+ 	_M_dfs calls with an _S_opcode_next frame push, and any work
+ 	after such calls with an appropriate frame push.
+ 	(__detail::_M_handle_repeat): Likewise.
+ 	(__detail::_M_handle_subexpr_begin): Likewise.
+ 	(__detail::_M_handle_subexpr_end): Likewise.
+ 	(__detail::_M_handle_line_begin_assertion): Likewise.
+ 	(__detail::_M_handle_line_end_assertion): Likewise.
+ 	(__detail::_M_handle_word_boundary): Likewise.
+ 	(__detail::_M_handle_subexpr_lookahead): Likewise.
+ 	(__detail::_M_handle_match): Likewise.
+ 	(__detail::_M_handle_backref): Likewise.
+ 	(__detail::_M_handle_accept): Likewise.
+ 	(__detail::_M_handle_alternative): Likewise.
+ 	(__detail::_M_node): Factored out from _M_dfs.
+ 	(__detail::_M_dfs): Push an initial frame to _M_frames that
+ 	visits the starting node and pass this stack each subroutine.
+ 	Pop the latest _ExecutorFrame from _M_frames and handle
+ 	appropriately according to its _ExecutorFrameOpcode.  Loop until
+ 	_M_frames is empty.
+ 
+ 2026-01-29  Jonathan Wakely  <jwakely@redhat.com>
+ 
+ 	* include/std/expected (__expected::__trivially_replaceable)
+ 	(__expected::__usable_for_assign)
+ 	(__expected::__usable_for_trivial_assign)
+ 	(__expected::__can_reassign_type): New concepts.
+ 	(expected::operator=): Adjust constraints
+ 	on existing overloads and add defaulted overload.
+ 	(expected<cv void, E>::operator=): Likewise.
+ 	* testsuite/20_util/expected/requirements.cc: Check for trivial
+ 	and nothrow properties of assignments.
+ 
+ 2026-01-29  Jonathan Wakely  <jwakely@redhat.com>
+ 
+ 	* include/std/source_location: Check __glibcxx_contracts instead
+ 	of __cpp_lib_contracts.
+ 	* testsuite/18_support/contracts/includes.cc: New test.
+ 
+ 2026-01-29  vspefs  <vspefs@protonmail.com>
+ 
+ 	* src/c++23/std.cc.in (invoke_default_violation_handler): Change
+ 	to invoke_default_contract_violation_handler.
+ 
+ 2026-01-29  Jonathan Wakely  <jwakely@redhat.com>
+ 
+ 	* include/std/contracts: Replace non-ASCII characters.
+ 
+ 2026-01-28  Jonathan Wakely  <jwakely@redhat.com>
+ 
+ 	* src/experimental/Makefile.am: Change AM_CXXFLAGS to use C++20
+ 	by default.
+ 
+ 2026-01-28  Jonathan Wakely  <jwakely@redhat.com>
+ 
+ 	* src/experimental/contract26.cc: Use #error if built without
+ 	contracts support enabled.
+ 	* include/std/source_location: Remove stray whitespace.
+ 
+ 2026-01-28  Jonathan Wakely  <jwakely@redhat.com>
+ 
+ 	PR tree-optimization/122197
+ 	* include/bits/shared_ptr_base.h (~_Sp_counted_deleter): Use
+ 	diagnostic pragam to disable -Wfree-nonheap-object false
+ 	positive.
+ 	(~_Sp_counted_ptr_inplace): Likewise for -Warray-bounds false
+ 	positive.
+ 
+ 2026-01-28  Jonathan Wakely  <jwakely@redhat.com>
+ 
+ 	* config/locale/gnu/ctype_members.cc (use_table): New function.
+ 	(ctype<wchar_t>::do_narrow): Use use_table.
+ 
+ 2026-01-28  Soumya AR  <soumyaa@nvidia.com>
+ 
+ 	* include/bits/atomic_base.h:
+ 	Add fetch_min and fetch_max memberfunctions.
+ 	* include/bits/version.def:
+ 	Add __cpp_lib_atomic_min_max feature test macro.
+ 	* include/bits/version.h (defined): Regenerate.
+ 	* include/std/atomic: Extend for fetch_min/max non-member functions.
+ 	* src/c++23/std.cc.in: Export atomic_fetch_min, atomic_fetch_max,
+ 	atomic_fetch_min_explicit, atomic_fetch_max_explicit.
+ 	* testsuite/29_atomics/atomic_integral/nonmembers_fetch_minmax.cc:
+ 	New test.
+ 	* testsuite/29_atomics/atomic_ref/integral_fetch_minmax.cc: New test.
+ 
+ 2026-01-28  Nina Ranns  <dinka.ranns@gmail.com>
+ 	    Iain Sandoe  <iain@sandoe.co.uk>
+ 	    Ville Voutilainen  <ville.voutilainen@gmail.com>
+ 
+ 	* include/Makefile.am: Add contract include.
+ 	* include/Makefile.in: Regenerate.
+ 	* include/bits/version.def: Add ftm for contracts.
+ 	* include/bits/version.h: Regenerate.
+ 	* include/precompiled/stdc++.h: Add contracts header.
+ 	* include/std/source_location: Befriend the contract_violation
+ 	class so that we can initialise a source_location from an
+ 	existing __impl *.
+ 	* src/c++23/std.cc.in: Add contracts support.
+ 	* src/experimental/Makefile.am: Add new contract violation
+ 	implementation, remove the old one.
+ 	* src/experimental/Makefile.in: Regenerate.
+ 	* include/experimental/contract: Removed.
+ 	* src/experimental/contract.cc: Removed.
+ 	* include/std/contracts: New file.
+ 	* src/experimental/contract26.cc: New file.
+ 	* testsuite/18_support/contracts/invoke_default_cvh.cc: New test.
+ 	* testsuite/18_support/contracts/invoke_default_cvh2.cc: New test.
+ 
  2026-01-23  Tomasz Kamiński  <tkaminsk@redhat.com>
  
  	PR libstdc++/123758
diff -Nrcpad gcc-16-20260125/libstdc++-v3/config/locale/gnu/ctype_members.cc gcc-16-20260201/libstdc++-v3/config/locale/gnu/ctype_members.cc
*** gcc-16-20260125/libstdc++-v3/config/locale/gnu/ctype_members.cc	Sun Jan 25 22:32:19 2026
--- gcc-16-20260201/libstdc++-v3/config/locale/gnu/ctype_members.cc	Sun Feb  1 22:32:17 2026
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 217,227 ****
      return __hi;
    }
  
    char
    ctype<wchar_t>::
    do_narrow(wchar_t __wc, char __dfault) const
    {
!     if (__wc >= 0 && __wc < 128 && _M_narrow_ok)
        return _M_narrow[__wc];
  #if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2)
      __c_locale __old = __uselocale(_M_c_locale_ctype);
--- 217,236 ----
      return __hi;
    }
  
+   // True if c can be looked up in _M_narrow.
+   [[gnu::always_inline]]
+   static inline bool
+   use_table(wchar_t c)
+   {
+     using U = std::make_unsigned<wchar_t>::type;
+     return U(c) < 128;
+   }
+ 
    char
    ctype<wchar_t>::
    do_narrow(wchar_t __wc, char __dfault) const
    {
!     if (use_table(__wc) && _M_narrow_ok)
        return _M_narrow[__wc];
  #if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2)
      __c_locale __old = __uselocale(_M_c_locale_ctype);
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 244,250 ****
      if (_M_narrow_ok)
        while (__lo < __hi)
  	{
! 	  if (*__lo >= 0 && *__lo < 128)
  	    *__dest = _M_narrow[*__lo];
  	  else
  	    {
--- 253,259 ----
      if (_M_narrow_ok)
        while (__lo < __hi)
  	{
! 	  if (use_table(*__lo))
  	    *__dest = _M_narrow[*__lo];
  	  else
  	    {
diff -Nrcpad gcc-16-20260125/libstdc++-v3/include/Makefile.am gcc-16-20260201/libstdc++-v3/include/Makefile.am
*** gcc-16-20260125/libstdc++-v3/include/Makefile.am	Sun Jan 25 22:32:19 2026
--- gcc-16-20260201/libstdc++-v3/include/Makefile.am	Sun Feb  1 22:32:17 2026
*************** std_freestanding = \
*** 32,37 ****
--- 32,38 ----
  	${std_srcdir}/bit \
  	${std_srcdir}/bitset \
  	${std_srcdir}/concepts \
+ 	${std_srcdir}/contracts \
  	${std_srcdir}/coroutine \
  	${std_srcdir}/expected \
  	${std_srcdir}/functional \
*************** experimental_headers = \
*** 801,807 ****
  	${experimental_srcdir}/array \
  	${experimental_srcdir}/buffer \
  	${experimental_srcdir}/chrono \
- 	${experimental_srcdir}/contract \
  	${experimental_srcdir}/deque \
  	${experimental_srcdir}/executor \
  	${experimental_srcdir}/forward_list \
--- 802,807 ----
diff -Nrcpad gcc-16-20260125/libstdc++-v3/include/Makefile.in gcc-16-20260201/libstdc++-v3/include/Makefile.in
*** gcc-16-20260125/libstdc++-v3/include/Makefile.in	Sun Jan 25 22:32:19 2026
--- gcc-16-20260201/libstdc++-v3/include/Makefile.in	Sun Feb  1 22:32:17 2026
*************** std_freestanding = \
*** 393,398 ****
--- 393,399 ----
  	${std_srcdir}/bit \
  	${std_srcdir}/bitset \
  	${std_srcdir}/concepts \
+ 	${std_srcdir}/contracts \
  	${std_srcdir}/coroutine \
  	${std_srcdir}/expected \
  	${std_srcdir}/functional \
*************** experimental_headers = \
*** 1150,1156 ****
  	${experimental_srcdir}/array \
  	${experimental_srcdir}/buffer \
  	${experimental_srcdir}/chrono \
- 	${experimental_srcdir}/contract \
  	${experimental_srcdir}/deque \
  	${experimental_srcdir}/executor \
  	${experimental_srcdir}/forward_list \
--- 1151,1156 ----
diff -Nrcpad gcc-16-20260125/libstdc++-v3/include/bits/atomic_base.h gcc-16-20260201/libstdc++-v3/include/bits/atomic_base.h
*** gcc-16-20260125/libstdc++-v3/include/bits/atomic_base.h	Sun Jan 25 22:32:19 2026
--- gcc-16-20260201/libstdc++-v3/include/bits/atomic_base.h	Sun Feb  1 22:32:17 2026
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 334,339 ****
--- 334,356 ----
    // NB: Assuming _ITp is an integral scalar type that is 1, 2, 4, or
    // 8 bytes, since that is what GCC built-in functions for atomic
    // memory access expect.
+ 
+   namespace __atomic_impl
+   {
+     template<typename _Tp>
+       using _Val = typename remove_volatile<_Tp>::type;
+ 
+ #if __glibcxx_atomic_min_max
+     template<typename _Tp>
+       _Tp
+       __fetch_min(_Tp* __ptr, _Val<_Tp> __i, memory_order __m) noexcept;
+ 
+     template<typename _Tp>
+       _Tp
+       __fetch_max(_Tp* __ptr, _Val<_Tp> __i, memory_order __m) noexcept;
+ #endif
+   }
+ 
    template<typename _ITp>
      struct __atomic_base
      {
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 674,679 ****
--- 691,718 ----
        fetch_xor(__int_type __i,
  		memory_order __m = memory_order_seq_cst) volatile noexcept
        { return __atomic_fetch_xor(&_M_i, __i, int(__m)); }
+ 
+ #if __glibcxx_atomic_min_max
+       _GLIBCXX_ALWAYS_INLINE __int_type
+       fetch_min(__int_type __i,
+ 		memory_order __m = memory_order_seq_cst) noexcept
+       { return __atomic_impl::__fetch_min(&_M_i, __i, __m); }
+ 
+       _GLIBCXX_ALWAYS_INLINE __int_type
+       fetch_min(__int_type __i,
+ 		memory_order __m = memory_order_seq_cst) volatile noexcept
+       { return __atomic_impl::__fetch_min(&_M_i, __i, __m); }
+ 
+       _GLIBCXX_ALWAYS_INLINE __int_type
+       fetch_max(__int_type __i,
+ 		memory_order __m = memory_order_seq_cst) noexcept
+       { return __atomic_impl::__fetch_max(&_M_i, __i, __m); }
+ 
+       _GLIBCXX_ALWAYS_INLINE __int_type
+       fetch_max(__int_type __i,
+ 		memory_order __m = memory_order_seq_cst) volatile noexcept
+       { return __atomic_impl::__fetch_max(&_M_i, __i, __m); }
+ #endif
      };
  
  
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 976,985 ****
  	return __ptr;
        }
  
-     // Remove volatile and create a non-deduced context for value arguments.
-     template<typename _Tp>
-       using _Val = typename remove_volatile<_Tp>::type;
- 
  #pragma GCC diagnostic push
  #pragma GCC diagnostic ignored "-Wc++17-extensions"
  
--- 1015,1020 ----
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 1293,1298 ****
--- 1328,1376 ----
  	    return __newval;
  	  }
        }
+ 
+ #if __glibcxx_atomic_min_max
+     template<typename _Tp>
+       concept __atomic_fetch_minmaxable
+ 	= requires (_Tp __t) {
+ 	    __atomic_fetch_min(&__t, __t, 0);
+ 	    __atomic_fetch_max(&__t, __t, 0);
+ 	  };
+ 
+     template<typename _Tp>
+       _Tp
+       __fetch_min(_Tp* __ptr, _Val<_Tp> __i, memory_order __m) noexcept
+       {
+ 	if constexpr (__atomic_fetch_minmaxable<_Tp>)
+ 	  return __atomic_fetch_min(__ptr, __i, int(__m));
+ 	else
+ 	  {
+ 	    _Val<_Tp> __oldval = load (__ptr, memory_order_relaxed);
+ 	    _Val<_Tp> __newval = __oldval < __i ? __oldval : __i;
+ 	    while (!compare_exchange_weak (__ptr, __oldval, __newval, __m,
+ 					   memory_order_relaxed))
+ 	      __newval = __oldval < __i ? __oldval : __i;
+ 	    return __oldval;
+ 	  }
+       }
+ 
+     template<typename _Tp>
+       _Tp
+       __fetch_max(_Tp* __ptr, _Val<_Tp> __i, memory_order __m) noexcept
+       {
+ 	if constexpr (__atomic_fetch_minmaxable<_Tp>)
+ 	  return __atomic_fetch_max(__ptr, __i, int(__m));
+ 	else
+ 	  {
+ 	    _Val<_Tp> __oldval = load (__ptr, memory_order_relaxed);
+ 	    _Val<_Tp> __newval = __oldval > __i ? __oldval : __i;
+ 	    while (!compare_exchange_weak (__ptr, __oldval, __newval, __m,
+ 					   memory_order_relaxed))
+ 	      __newval = __oldval > __i ? __oldval : __i;
+ 	    return __oldval;
+ 	  }
+       }
+ #endif
    } // namespace __atomic_impl
  
    // base class for atomic<floating-point-type>
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 1487,1492 ****
--- 1565,1592 ----
  		memory_order __m = memory_order_seq_cst) volatile noexcept
        { return __atomic_impl::__fetch_sub_flt(&_M_fp, __i, __m); }
  
+ #if __glibcxx_atomic_min_max
+       value_type
+       fetch_min(value_type __i,
+ 		memory_order __m = memory_order_seq_cst) noexcept
+       { return __atomic_impl::__fetch_min(&_M_fp, __i, __m); }
+ 
+       value_type
+       fetch_min(value_type __i,
+ 		memory_order __m = memory_order_seq_cst) volatile noexcept
+       { return __atomic_impl::__fetch_min(&_M_fp, __i, __m); }
+ 
+       value_type
+       fetch_max(value_type __i,
+ 		memory_order __m = memory_order_seq_cst) noexcept
+       { return __atomic_impl::__fetch_max(&_M_fp, __i, __m); }
+ 
+       value_type
+       fetch_max(value_type __i,
+ 		memory_order __m = memory_order_seq_cst) volatile noexcept
+       { return __atomic_impl::__fetch_max(&_M_fp, __i, __m); }
+ #endif
+ 
        value_type
        operator+=(value_type __i) noexcept
        { return __atomic_impl::__add_fetch_flt(&_M_fp, __i); }
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 1746,1751 ****
--- 1846,1863 ----
  		memory_order __m = memory_order_seq_cst) const noexcept
        { return __atomic_impl::fetch_xor(this->_M_ptr, __i, __m); }
  
+ #if __glibcxx_atomic_min_max
+       value_type
+       fetch_min(value_type __i,
+ 		memory_order __m = memory_order_seq_cst) const noexcept
+       { return __atomic_impl::__fetch_min(this->_M_ptr, __i, __m); }
+ 
+       value_type
+       fetch_max(value_type __i,
+ 		memory_order __m = memory_order_seq_cst) const noexcept
+       { return __atomic_impl::__fetch_max(this->_M_ptr, __i, __m); }
+ #endif
+ 
        _GLIBCXX_ALWAYS_INLINE value_type
        operator++(int) const noexcept
        { return fetch_add(1); }
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 1812,1817 ****
--- 1924,1941 ----
  		memory_order __m = memory_order_seq_cst) const noexcept
        { return __atomic_impl::__fetch_sub_flt(this->_M_ptr, __i, __m); }
  
+ #if __glibcxx_atomic_min_max
+       value_type
+       fetch_min(value_type __i,
+ 		memory_order __m = memory_order_seq_cst) const noexcept
+       { return __atomic_impl::__fetch_min(this->_M_ptr, __i, __m); }
+ 
+       value_type
+       fetch_max(value_type __i,
+ 		memory_order __m = memory_order_seq_cst) const noexcept
+       { return __atomic_impl::__fetch_max(this->_M_ptr, __i, __m); }
+ #endif
+ 
        value_type
        operator+=(value_type __i) const noexcept
        { return __atomic_impl::__add_fetch_flt(this->_M_ptr, __i); }
diff -Nrcpad gcc-16-20260125/libstdc++-v3/include/bits/regex.h gcc-16-20260201/libstdc++-v3/include/bits/regex.h
*** gcc-16-20260125/libstdc++-v3/include/bits/regex.h	Sun Jan 25 22:32:19 2026
--- gcc-16-20260201/libstdc++-v3/include/bits/regex.h	Sun Feb  1 22:32:17 2026
*************** namespace __detail
*** 61,68 ****
--- 61,70 ----
  		      _RegexExecutorPolicy		   __policy,
  		      bool				   __match_mode);
  
+ _GLIBCXX_BEGIN_INLINE_ABI_NAMESPACE(_V2)
    template<typename, typename, typename, bool>
      class _Executor;
+ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)
  
    template<typename _Tp>
      struct __is_contiguous_iter : false_type { };
diff -Nrcpad gcc-16-20260125/libstdc++-v3/include/bits/regex_executor.h gcc-16-20260201/libstdc++-v3/include/bits/regex_executor.h
*** gcc-16-20260125/libstdc++-v3/include/bits/regex_executor.h	Sun Jan 25 22:32:19 2026
--- gcc-16-20260201/libstdc++-v3/include/bits/regex_executor.h	Sun Feb  1 22:32:17 2026
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 36,46 ****
--- 36,50 ----
  
  namespace __detail
  {
+ _GLIBCXX_BEGIN_INLINE_ABI_NAMESPACE(_V2)
    /**
     * @addtogroup regex-detail
     * @{
     */
  
+   template<typename _BiIter, bool _Trivial = is_trivially_copyable<_BiIter>::value>
+     struct _ExecutorFrame;
+ 
    /**
     * @brief Takes a regex and an input string and does the matching.
     *
*************** namespace __detail
*** 143,148 ****
--- 147,155 ----
        _M_handle_alternative(_Match_mode, _StateIdT);
  
        void
+       _M_node(_Match_mode, _StateIdT);
+ 
+       void
        _M_dfs(_Match_mode __match_mode, _StateIdT __start);
  
        bool
*************** namespace __detail
*** 290,295 ****
--- 297,303 ----
  	};
  
      public:
+       _GLIBCXX_STD_C::vector<_ExecutorFrame<_BiIter>>       _M_frames;
        _ResultsVec                                           _M_cur_results;
        _BiIter                                               _M_current;
        _BiIter                                               _M_begin;
*************** namespace __detail
*** 305,310 ****
--- 313,319 ----
      };
  
   ///@} regex-detail
+ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)
  } // namespace __detail
  _GLIBCXX_END_NAMESPACE_VERSION
  } // namespace std
diff -Nrcpad gcc-16-20260125/libstdc++-v3/include/bits/regex_executor.tcc gcc-16-20260201/libstdc++-v3/include/bits/regex_executor.tcc
*** gcc-16-20260125/libstdc++-v3/include/bits/regex_executor.tcc	Sun Jan 25 22:32:19 2026
--- gcc-16-20260201/libstdc++-v3/include/bits/regex_executor.tcc	Sun Feb  1 22:32:17 2026
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 36,41 ****
--- 36,42 ----
  #pragma GCC diagnostic ignored "-Wc++17-extensions" // if constexpr
  namespace __detail
  {
+ _GLIBCXX_BEGIN_INLINE_ABI_NAMESPACE(_V2)
    template<typename _BiIter, typename _Alloc, typename _TraitsT,
  	   bool __dfs_mode>
      bool _Executor<_BiIter, _Alloc, _TraitsT, __dfs_mode>::
*************** namespace __detail
*** 55,60 ****
--- 56,142 ----
        return false;
      }
  
+   enum _ExecutorFrameOpcode : unsigned char
+   {
+     _S_fopcode_next,
+     _S_fopcode_fallback_next,
+     _S_fopcode_rep_once_more,
+     _S_fopcode_fallback_rep_once_more,
+     _S_fopcode_posix_alternative,
+     _S_fopcode_merge_sol,
+     _S_fopcode_restore_cur_results,
+     _S_fopcode_restore_rep_count,
+     _S_fopcode_decrement_rep_count,
+   };
+ 
+ #pragma GCC diagnostic push
+ #pragma GCC diagnostic ignored "-Wpedantic" // anon struct
+   struct _ExecutorFrameBase
+   {
+     _ExecutorFrameBase(_ExecutorFrameOpcode __op, _StateIdT __i)
+     : _M_op(__op), _M_state_id(__i)
+     { }
+ 
+     _ExecutorFrameOpcode _M_op;
+     union {
+       unsigned char _M_byte0;
+       struct { // Used by restore_rep_count frame
+ 	unsigned char _M_count : 2;
+       };
+       struct { // Used by restore_cur_results frame
+ 	unsigned char _M_end : 1;
+ 	unsigned char _M_matched : 1;
+       };
+     };
+     unsigned char _M_bytes[6];
+     _StateIdT _M_state_id;
+   };
+ #pragma GCC diagnostic pop
+ 
+   template<typename _BiIter, bool _Trivial /* = is_trivially_copyable<_BiIter>::value */>
+     struct _ExecutorFrame : _ExecutorFrameBase
+     {
+       _ExecutorFrame(_ExecutorFrameOpcode __op, _StateIdT __i)
+       : _ExecutorFrameBase(__op, __i)
+       { }
+ 
+       _ExecutorFrame(_ExecutorFrameOpcode __op, _StateIdT __i, _BiIter __p)
+       : _ExecutorFrameBase(__op, __i), _M_pos(__p)
+       { }
+ 
+       _ExecutorFrame(_ExecutorFrameOpcode __op, _StateIdT __i, long __v)
+       : _ExecutorFrameBase(__op, __i), _M_val(__v)
+       { }
+ 
+       // _M_pos and _M_val are mutually exclusive, which the optimized
+       // partial specialization below depends on.
+       _BiIter _M_pos = _BiIter();
+       long _M_val = 0;
+     };
+ 
+   // Space-optimized partial specialization for when the input iterator is
+   // trivially copyable.
+   template<typename _BiIter>
+     struct _ExecutorFrame<_BiIter, true> : _ExecutorFrameBase
+     {
+       _ExecutorFrame(_ExecutorFrameOpcode __op, _StateIdT __i)
+       : _ExecutorFrameBase(__op, __i)
+       { }
+ 
+       _ExecutorFrame(_ExecutorFrameOpcode __op, _StateIdT __i, _BiIter __p)
+       : _ExecutorFrameBase(__op, __i), _M_pos(__p)
+       { }
+ 
+       _ExecutorFrame(_ExecutorFrameOpcode __op, _StateIdT __i, long __v)
+       : _ExecutorFrameBase(__op, __i), _M_val(__v)
+       { }
+ 
+       union {
+ 	_BiIter _M_pos;
+ 	long _M_val;
+       };
+     };
+ 
    // The _M_main function operates in different modes, DFS mode or BFS mode,
    // indicated by template parameter __dfs_mode, and dispatches to one of the
    // _M_main_dispatch overloads.
*************** namespace __detail
*** 181,199 ****
        auto& __rep_count = _M_rep_count[__i];
        if (__rep_count.second == 0 || __rep_count.first != _M_current)
  	{
! 	  auto __back = __rep_count;
  	  __rep_count.first = _M_current;
  	  __rep_count.second = 1;
! 	  _M_dfs(__match_mode, __state._M_alt);
! 	  __rep_count = __back;
  	}
        else
  	{
  	  if (__rep_count.second < 2)
  	    {
  	      __rep_count.second++;
! 	      _M_dfs(__match_mode, __state._M_alt);
! 	      __rep_count.second--;
  	    }
  	}
      }
--- 263,282 ----
        auto& __rep_count = _M_rep_count[__i];
        if (__rep_count.second == 0 || __rep_count.first != _M_current)
  	{
! 	  _M_frames.emplace_back(_S_fopcode_restore_rep_count,
! 				 __i, __rep_count.first);
! 	  _M_frames.back()._M_count = __rep_count.second;
  	  __rep_count.first = _M_current;
  	  __rep_count.second = 1;
! 	  _M_frames.emplace_back(_S_fopcode_next, __state._M_alt);
  	}
        else
  	{
  	  if (__rep_count.second < 2)
  	    {
  	      __rep_count.second++;
! 	      _M_frames.emplace_back(_S_fopcode_decrement_rep_count, __i);
! 	      _M_frames.emplace_back(_S_fopcode_next, __state._M_alt);
  	    }
  	}
      }
*************** namespace __detail
*** 208,230 ****
      _M_handle_repeat(_Match_mode __match_mode, _StateIdT __i)
      {
        const auto& __state = _M_nfa[__i];
- 
        // Greedy.
        if (!__state._M_neg)
  	{
! 	  _M_rep_once_more(__match_mode, __i);
! 	  // If it's DFS executor and already accepted, we're done.
! 	  if (!__dfs_mode || !_M_has_sol)
! 	    _M_dfs(__match_mode, __state._M_next);
  	}
        else // Non-greedy mode
  	{
  	  if constexpr (__dfs_mode)
  	    {
  	      // vice-versa.
! 	      _M_dfs(__match_mode, __state._M_next);
! 	      if (!_M_has_sol)
! 		_M_rep_once_more(__match_mode, __i);
  	    }
  	  else
  	    {
--- 291,315 ----
      _M_handle_repeat(_Match_mode __match_mode, _StateIdT __i)
      {
        const auto& __state = _M_nfa[__i];
        // Greedy.
        if (!__state._M_neg)
  	{
! 	  if constexpr (__dfs_mode)
! 	    // If it's DFS executor and already accepted, we're done.
! 	    _M_frames.emplace_back(_S_fopcode_fallback_next, __state._M_next,
! 				   _M_current);
! 	  else
! 	    _M_frames.emplace_back(_S_fopcode_next, __state._M_next);
! 	  _M_frames.emplace_back(_S_fopcode_rep_once_more, __i);
  	}
        else // Non-greedy mode
  	{
  	  if constexpr (__dfs_mode)
  	    {
  	      // vice-versa.
! 	      _M_frames.emplace_back(_S_fopcode_fallback_rep_once_more, __i,
! 				     _M_current);
! 	      _M_frames.emplace_back(_S_fopcode_next, __state._M_next);
  	    }
  	  else
  	    {
*************** namespace __detail
*** 233,244 ****
  	      // be better by attempting its next node.
  	      if (!_M_has_sol)
  		{
- 		  _M_dfs(__match_mode, __state._M_next);
  		  // DON'T attempt anything if it's already accepted. An
  		  // accepted state *must* be better than a solution that
  		  // matches a non-greedy quantifier one more time.
! 		  if (!_M_has_sol)
! 		    _M_rep_once_more(__match_mode, __i);
  		}
  	    }
  	}
--- 318,328 ----
  	      // be better by attempting its next node.
  	      if (!_M_has_sol)
  		{
  		  // DON'T attempt anything if it's already accepted. An
  		  // accepted state *must* be better than a solution that
  		  // matches a non-greedy quantifier one more time.
! 		  _M_frames.emplace_back(_S_fopcode_fallback_rep_once_more, __i);
! 		  _M_frames.emplace_back(_S_fopcode_next, __state._M_next);
  		}
  	    }
  	}
*************** namespace __detail
*** 250,261 ****
      _M_handle_subexpr_begin(_Match_mode __match_mode, _StateIdT __i)
      {
        const auto& __state = _M_nfa[__i];
- 
        auto& __res = _M_cur_results[__state._M_subexpr];
!       auto __back = __res.first;
        __res.first = _M_current;
!       _M_dfs(__match_mode, __state._M_next);
!       __res.first = __back;
      }
  
    template<typename _BiIter, typename _Alloc, typename _TraitsT,
--- 334,346 ----
      _M_handle_subexpr_begin(_Match_mode __match_mode, _StateIdT __i)
      {
        const auto& __state = _M_nfa[__i];
        auto& __res = _M_cur_results[__state._M_subexpr];
!       _M_frames.emplace_back(_S_fopcode_restore_cur_results,
! 			     static_cast<_StateIdT>(__state._M_subexpr),
! 			     __res.first);
!       _M_frames.back()._M_end = false;
        __res.first = _M_current;
!       _M_frames.emplace_back(_S_fopcode_next, __state._M_next);
      }
  
    template<typename _BiIter, typename _Alloc, typename _TraitsT,
*************** namespace __detail
*** 264,276 ****
      _M_handle_subexpr_end(_Match_mode __match_mode, _StateIdT __i)
      {
        const auto& __state = _M_nfa[__i];
- 
        auto& __res = _M_cur_results[__state._M_subexpr];
!       auto __back = __res;
        __res.second = _M_current;
        __res.matched = true;
!       _M_dfs(__match_mode, __state._M_next);
!       __res = __back;
      }
  
    template<typename _BiIter, typename _Alloc, typename _TraitsT,
--- 349,363 ----
      _M_handle_subexpr_end(_Match_mode __match_mode, _StateIdT __i)
      {
        const auto& __state = _M_nfa[__i];
        auto& __res = _M_cur_results[__state._M_subexpr];
!       _M_frames.emplace_back(_S_fopcode_restore_cur_results,
! 			     static_cast<_StateIdT>(__state._M_subexpr),
! 			     __res.second);
!       _M_frames.back()._M_end = true;
!       _M_frames.back()._M_matched = __res.matched;
        __res.second = _M_current;
        __res.matched = true;
!       _M_frames.emplace_back(_S_fopcode_next, __state._M_next);
      }
  
    template<typename _BiIter, typename _Alloc, typename _TraitsT,
*************** namespace __detail
*** 280,286 ****
      {
        const auto& __state = _M_nfa[__i];
        if (_M_at_begin())
! 	_M_dfs(__match_mode, __state._M_next);
      }
  
    template<typename _BiIter, typename _Alloc, typename _TraitsT,
--- 367,373 ----
      {
        const auto& __state = _M_nfa[__i];
        if (_M_at_begin())
! 	_M_frames.emplace_back(_S_fopcode_next, __state._M_next);
      }
  
    template<typename _BiIter, typename _Alloc, typename _TraitsT,
*************** namespace __detail
*** 290,296 ****
      {
        const auto& __state = _M_nfa[__i];
        if (_M_at_end())
! 	_M_dfs(__match_mode, __state._M_next);
      }
  
    template<typename _BiIter, typename _Alloc, typename _TraitsT,
--- 377,383 ----
      {
        const auto& __state = _M_nfa[__i];
        if (_M_at_end())
! 	_M_frames.emplace_back(_S_fopcode_next, __state._M_next);
      }
  
    template<typename _BiIter, typename _Alloc, typename _TraitsT,
*************** namespace __detail
*** 300,306 ****
      {
        const auto& __state = _M_nfa[__i];
        if (_M_word_boundary() == !__state._M_neg)
! 	_M_dfs(__match_mode, __state._M_next);
      }
  
    // Here __state._M_alt offers a single start node for a sub-NFA.
--- 387,393 ----
      {
        const auto& __state = _M_nfa[__i];
        if (_M_word_boundary() == !__state._M_neg)
! 	_M_frames.emplace_back(_S_fopcode_next, __state._M_next);
      }
  
    // Here __state._M_alt offers a single start node for a sub-NFA.
*************** namespace __detail
*** 312,318 ****
      {
        const auto& __state = _M_nfa[__i];
        if (_M_lookahead(__state._M_alt) == !__state._M_neg)
! 	_M_dfs(__match_mode, __state._M_next);
      }
  
    template<typename _BiIter, typename _Alloc, typename _TraitsT,
--- 399,405 ----
      {
        const auto& __state = _M_nfa[__i];
        if (_M_lookahead(__state._M_alt) == !__state._M_neg)
! 	_M_frames.emplace_back(_S_fopcode_next, __state._M_next);
      }
  
    template<typename _BiIter, typename _Alloc, typename _TraitsT,
*************** namespace __detail
*** 321,327 ****
      _M_handle_match(_Match_mode __match_mode, _StateIdT __i)
      {
        const auto& __state = _M_nfa[__i];
- 
        if (_M_current == _M_end)
  	return;
        if constexpr (__dfs_mode)
--- 408,413 ----
*************** namespace __detail
*** 329,336 ****
  	  if (__state._M_matches(*_M_current))
  	    {
  	      ++_M_current;
! 	      _M_dfs(__match_mode, __state._M_next);
! 	      --_M_current;
  	    }
  	}
        else
--- 415,421 ----
  	  if (__state._M_matches(*_M_current))
  	    {
  	      ++_M_current;
! 	      _M_frames.emplace_back(_S_fopcode_next, __state._M_next);
  	    }
  	}
        else
*************** namespace __detail
*** 411,425 ****
  	      _M_re._M_automaton->_M_traits)._M_apply(
  		  __submatch.first, __submatch.second, _M_current, __last))
  	{
! 	  if (__last != _M_current)
! 	    {
! 	      auto __backup = _M_current;
! 	      _M_current = __last;
! 	      _M_dfs(__match_mode, __state._M_next);
! 	      _M_current = __backup;
! 	    }
! 	  else
! 	    _M_dfs(__match_mode, __state._M_next);
  	}
      }
  
--- 496,503 ----
  	      _M_re._M_automaton->_M_traits)._M_apply(
  		  __submatch.first, __submatch.second, _M_current, __last))
  	{
! 	  _M_current = __last;
! 	  _M_frames.emplace_back(_S_fopcode_next, __state._M_next);
  	}
      }
  
*************** namespace __detail
*** 483,513 ****
      _M_handle_alternative(_Match_mode __match_mode, _StateIdT __i)
      {
        const auto& __state = _M_nfa[__i];
- 
        if (_M_nfa._M_flags & regex_constants::ECMAScript)
  	{
  	  // TODO: Fix BFS support. It is wrong.
- 	  _M_dfs(__match_mode, __state._M_alt);
  	  // Pick lhs if it matches. Only try rhs if it doesn't.
! 	  if (!_M_has_sol)
! 	    _M_dfs(__match_mode, __state._M_next);
  	}
        else
  	{
  	  // Try both and compare the result.
  	  // See "case _S_opcode_accept:" handling above.
! 	  _M_dfs(__match_mode, __state._M_alt);
! 	  auto __has_sol = _M_has_sol;
! 	  _M_has_sol = false;
! 	  _M_dfs(__match_mode, __state._M_next);
! 	  _M_has_sol |= __has_sol;
  	}
      }
  
    template<typename _BiIter, typename _Alloc, typename _TraitsT,
  	   bool __dfs_mode>
!     void _Executor<_BiIter, _Alloc, _TraitsT, __dfs_mode>::
!     _M_dfs(_Match_mode __match_mode, _StateIdT __i)
      {
        if (_M_states._M_visited(__i))
  	return;
--- 561,591 ----
      _M_handle_alternative(_Match_mode __match_mode, _StateIdT __i)
      {
        const auto& __state = _M_nfa[__i];
        if (_M_nfa._M_flags & regex_constants::ECMAScript)
  	{
  	  // TODO: Fix BFS support. It is wrong.
  	  // Pick lhs if it matches. Only try rhs if it doesn't.
! 	  _M_frames.emplace_back(_S_fopcode_fallback_next, __state._M_next,
! 				 _M_current);
! 	  _M_frames.emplace_back(_S_fopcode_next, __state._M_alt);
  	}
        else
  	{
  	  // Try both and compare the result.
  	  // See "case _S_opcode_accept:" handling above.
! 	  _M_frames.emplace_back(_S_fopcode_posix_alternative, __state._M_next,
! 				 _M_current);
! 	  _M_frames.emplace_back(_S_fopcode_next, __state._M_alt);
  	}
      }
  
    template<typename _BiIter, typename _Alloc, typename _TraitsT,
  	   bool __dfs_mode>
! #ifdef __OPTIMIZE__
!     [[__gnu__::__always_inline__]]
! #endif
!     inline void _Executor<_BiIter, _Alloc, _TraitsT, __dfs_mode>::
!     _M_node(_Match_mode __match_mode, _StateIdT __i)
      {
        if (_M_states._M_visited(__i))
  	return;
*************** namespace __detail
*** 545,550 ****
--- 623,696 ----
  	}
      }
  
+   template<typename _BiIter, typename _Alloc, typename _TraitsT,
+ 	   bool __dfs_mode>
+     void _Executor<_BiIter, _Alloc, _TraitsT, __dfs_mode>::
+     _M_dfs(_Match_mode __match_mode, _StateIdT __start)
+     {
+       _M_frames.emplace_back(_S_fopcode_next, __start);
+ 
+       while (!_M_frames.empty())
+ 	{
+ 	  _ExecutorFrame<_BiIter> __frame = std::move(_M_frames.back());
+ 	  _M_frames.pop_back();
+ 
+ 	  switch (__frame._M_op)
+ 	    {
+ 	    case _S_fopcode_fallback_next:
+ 	      if (_M_has_sol)
+ 		break;
+ 	      if constexpr (__dfs_mode)
+ 		_M_current = __frame._M_pos;
+ 	      [[__fallthrough__]];
+ 	    case _S_fopcode_next:
+ 	      _M_node(__match_mode, __frame._M_state_id);
+ 	      break;
+ 
+ 	    case _S_fopcode_fallback_rep_once_more:
+ 	      if (_M_has_sol)
+ 		break;
+ 	      if constexpr (__dfs_mode)
+ 		_M_current = __frame._M_pos;
+ 	      [[__fallthrough__]];
+ 	    case _S_fopcode_rep_once_more:
+ 	      _M_rep_once_more(__match_mode, __frame._M_state_id);
+ 	      break;
+ 
+ 	    case _S_fopcode_posix_alternative:
+ 	      _M_frames.emplace_back(_S_fopcode_merge_sol, 0, _M_has_sol);
+ 	      _M_frames.emplace_back(_S_fopcode_next, __frame._M_state_id);
+ 	      if constexpr (__dfs_mode)
+ 		_M_current = __frame._M_pos;
+ 	      _M_has_sol = false;
+ 	      break;
+ 
+ 	    case _S_fopcode_merge_sol:
+ 	      _M_has_sol |= __frame._M_val;
+ 	      break;
+ 
+ 	    case _S_fopcode_restore_cur_results:
+ 	      if (!__frame._M_end)
+ 		_M_cur_results[__frame._M_state_id].first = __frame._M_pos;
+ 	      else
+ 		{
+ 		  _M_cur_results[__frame._M_state_id].second = __frame._M_pos;
+ 		  _M_cur_results[__frame._M_state_id].matched = __frame._M_matched;
+ 		}
+ 	      break;
+ 
+ 	    case _S_fopcode_restore_rep_count:
+ 	      _M_rep_count[__frame._M_state_id].first = __frame._M_pos;
+ 	      _M_rep_count[__frame._M_state_id].second = __frame._M_count;
+ 	      break;
+ 
+ 	    case _S_fopcode_decrement_rep_count:
+ 	      _M_rep_count[__frame._M_state_id].second--;
+ 	      break;
+ 	    }
+ 	}
+     }
+ 
    // Return whether now is at some word boundary.
    template<typename _BiIter, typename _Alloc, typename _TraitsT,
  	   bool __dfs_mode>
*************** namespace __detail
*** 569,574 ****
--- 715,721 ----
  
        return __left_is_word != __right_is_word;
      }
+ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)
  } // namespace __detail
  #pragma GCC diagnostic pop
  
diff -Nrcpad gcc-16-20260125/libstdc++-v3/include/bits/shared_ptr_base.h gcc-16-20260201/libstdc++-v3/include/bits/shared_ptr_base.h
*** gcc-16-20260125/libstdc++-v3/include/bits/shared_ptr_base.h	Sun Jan 25 22:32:19 2026
--- gcc-16-20260201/libstdc++-v3/include/bits/shared_ptr_base.h	Sun Feb  1 22:32:17 2026
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 579,585 ****
--- 579,589 ----
        _Sp_counted_deleter(_Ptr __p, _Deleter __d, const _Alloc& __a) noexcept
        : _M_impl(__p, std::move(__d), __a) { }
  
+ #pragma GCC diagnostic push // PR tree-optimization/122197
+ #pragma GCC diagnostic ignored "-Wfree-nonheap-object"
+   template<typename> class auto_ptr;
        ~_Sp_counted_deleter() noexcept { }
+ #pragma GCC diagnostic pop
  
        virtual void
        _M_dispose() noexcept
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 667,673 ****
--- 671,680 ----
  	      std::forward<_Args>(__args)...); // might throw
  	}
  
+ #pragma GCC diagnostic push // PR tree-optimization/122197
+ #pragma GCC diagnostic ignored "-Warray-bounds"
        ~_Sp_counted_ptr_inplace() noexcept { }
+ #pragma GCC diagnostic pop
  
        virtual void
        _M_dispose() noexcept
diff -Nrcpad gcc-16-20260125/libstdc++-v3/include/bits/version.def gcc-16-20260201/libstdc++-v3/include/bits/version.def
*** gcc-16-20260125/libstdc++-v3/include/bits/version.def	Sun Jan 25 22:32:19 2026
--- gcc-16-20260201/libstdc++-v3/include/bits/version.def	Sun Feb  1 22:32:17 2026
*************** ftms = {
*** 790,795 ****
--- 790,803 ----
  };
  
  ftms = {
+   name = atomic_min_max;
+   values = {
+     v = 202403;
+     cxxmin = 26;
+   };
+ };
+ 
+ ftms = {
    name = atomic_lock_free_type_aliases;
    values = {
      v = 201907;
*************** ftms = {
*** 2272,2277 ****
--- 2280,2294 ----
    };
  };
  
+ ftms = {
+   name = contracts;
+   values = {
+     v = 202502;
+     cxxmin = 26;
+     extra_cond = "__cpp_contracts >= 202502L";
+   };
+ };
+ 
  // Standard test specifications.
  stds[97] = ">= 199711L";
  stds[03] = ">= 199711L";
diff -Nrcpad gcc-16-20260125/libstdc++-v3/include/bits/version.h gcc-16-20260201/libstdc++-v3/include/bits/version.h
*** gcc-16-20260125/libstdc++-v3/include/bits/version.h	Sun Jan 25 22:32:19 2026
--- gcc-16-20260201/libstdc++-v3/include/bits/version.h	Sun Feb  1 22:32:17 2026
***************
*** 878,883 ****
--- 878,893 ----
  #endif /* !defined(__cpp_lib_atomic_float) */
  #undef __glibcxx_want_atomic_float
  
+ #if !defined(__cpp_lib_atomic_min_max)
+ # if (__cplusplus >  202302L)
+ #  define __glibcxx_atomic_min_max 202403L
+ #  if defined(__glibcxx_want_all) || defined(__glibcxx_want_atomic_min_max)
+ #   define __cpp_lib_atomic_min_max 202403L
+ #  endif
+ # endif
+ #endif /* !defined(__cpp_lib_atomic_min_max) */
+ #undef __glibcxx_want_atomic_min_max
+ 
  #if !defined(__cpp_lib_atomic_lock_free_type_aliases)
  # if (__cplusplus >= 202002L) && ((__GCC_ATOMIC_INT_LOCK_FREE | __GCC_ATOMIC_LONG_LOCK_FREE | __GCC_ATOMIC_CHAR_LOCK_FREE) & 2)
  #  define __glibcxx_atomic_lock_free_type_aliases 201907L
***************
*** 2546,2549 ****
--- 2556,2569 ----
  #endif /* !defined(__cpp_lib_is_implicit_lifetime) */
  #undef __glibcxx_want_is_implicit_lifetime
  
+ #if !defined(__cpp_lib_contracts)
+ # if (__cplusplus >  202302L) && (__cpp_contracts >= 202502L)
+ #  define __glibcxx_contracts 202502L
+ #  if defined(__glibcxx_want_all) || defined(__glibcxx_want_contracts)
+ #   define __cpp_lib_contracts 202502L
+ #  endif
+ # endif
+ #endif /* !defined(__cpp_lib_contracts) */
+ #undef __glibcxx_want_contracts
+ 
  #undef __glibcxx_want_all
diff -Nrcpad gcc-16-20260125/libstdc++-v3/include/experimental/contract gcc-16-20260201/libstdc++-v3/include/experimental/contract
*** gcc-16-20260125/libstdc++-v3/include/experimental/contract	Sun Jan 25 22:32:19 2026
--- gcc-16-20260201/libstdc++-v3/include/experimental/contract	Thu Jan  1 00:00:00 1970
***************
*** 1,83 ****
- // Contracts support header for -*- C++ -*-
- 
- // Copyright (C) 2019-2026 Free Software Foundation, Inc.
- //
- // This file is part of GCC.
- //
- // GCC is free software; you can redistribute it and/or modify
- // it under the terms of the GNU General Public License as published by
- // the Free Software Foundation; either version 3, or (at your option)
- // any later version.
- //
- // GCC is distributed in the hope that it will be useful,
- // but WITHOUT ANY WARRANTY; without even the implied warranty of
- // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- // GNU General Public License for more details.
- //
- // Under Section 7 of GPL version 3, you are granted additional
- // permissions described in the GCC Runtime Library Exception, version
- // 3.1, as published by the Free Software Foundation.
- 
- // You should have received a copy of the GNU General Public License and
- // a copy of the GCC Runtime Library Exception along with this program;
- // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
- // <http://www.gnu.org/licenses/>.
- 
- /** @file contract
-  *  This is a Standard C++ Library header.
-  */
- 
- #ifndef _GLIBCXX_CONTRACT
- #define _GLIBCXX_CONTRACT 1
- 
- #ifdef _GLIBCXX_SYSHDR
- #pragma GCC system_header
- #endif
- 
- #if __cplusplus >= 201703L
- 
- #include <string_view>
- #include <cstdint>
- 
- namespace std _GLIBCXX_VISIBILITY(default)
- {
- _GLIBCXX_BEGIN_NAMESPACE_VERSION
- 
- namespace experimental
- {
-   // From P1332
-   enum class contract_violation_continuation_mode {
-     never_continue, maybe_continue
-   };
- 
-   class contract_violation {
-     const char* _M_file;
-     const char* _M_function;
-     const char* _M_comment;
-     const char* _M_level;
-     const char* _M_role;
-     uint_least32_t _M_line;
-     signed char _M_continue;
-   public:
-     // From N4820
-     uint_least32_t line_number() const noexcept { return _M_line; }
-     string_view file_name() const noexcept { return _M_file; }
-     string_view function_name() const noexcept { return _M_function; }
-     string_view comment() const noexcept { return _M_comment; }
-     string_view assertion_level() const noexcept { return _M_level; }
-     // From P1332
-     string_view assertion_role() const noexcept { return _M_role; }
-     contract_violation_continuation_mode continuation_mode() const noexcept
-     { return static_cast<contract_violation_continuation_mode>(_M_continue); }
-   };
- 
- } // namespace experimental
- 
- _GLIBCXX_END_NAMESPACE_VERSION
- } // namespace std
- 
- // To override the contract violation handler, define
- //void ::handle_contract_violation (const std::experimental::contract_violation &);
- 
- #endif // C++17
- #endif // _GLIBCXX_CONTRACT
--- 0 ----
diff -Nrcpad gcc-16-20260125/libstdc++-v3/include/precompiled/stdc++.h gcc-16-20260201/libstdc++-v3/include/precompiled/stdc++.h
*** gcc-16-20260125/libstdc++-v3/include/precompiled/stdc++.h	Sun Jan 25 22:32:19 2026
--- gcc-16-20260201/libstdc++-v3/include/precompiled/stdc++.h	Sun Feb  1 22:32:17 2026
***************
*** 232,237 ****
--- 232,238 ----
  #endif
  
  #if __cplusplus > 202302L
+ #include <contracts>
  #include <debugging>
  #include <inplace_vector>
  #include <meta>
diff -Nrcpad gcc-16-20260125/libstdc++-v3/include/std/atomic gcc-16-20260201/libstdc++-v3/include/std/atomic
*** gcc-16-20260125/libstdc++-v3/include/std/atomic	Sun Jan 25 22:32:19 2026
--- gcc-16-20260201/libstdc++-v3/include/std/atomic	Sun Feb  1 22:32:17 2026
***************
*** 43,48 ****
--- 43,49 ----
  #define __glibcxx_want_atomic_is_always_lock_free
  #define __glibcxx_want_atomic_flag_test
  #define __glibcxx_want_atomic_float
+ #define __glibcxx_want_atomic_min_max
  #define __glibcxx_want_atomic_ref
  #define __glibcxx_want_atomic_lock_free_type_aliases
  #define __glibcxx_want_atomic_value_initialization
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 1568,1573 ****
--- 1569,1604 ----
  			      memory_order __m) noexcept
      { return __a->fetch_xor(__i, __m); }
  
+ #ifdef __cpp_lib_atomic_min_max
+   template<typename _ITp>
+     inline _ITp
+     atomic_fetch_min_explicit(__atomic_base<_ITp>* __a,
+ 			      __atomic_val_t<_ITp> __i,
+ 			      memory_order __m) noexcept
+     { return __a->fetch_min(__i, __m); }
+ 
+   template<typename _ITp>
+     inline _ITp
+     atomic_fetch_min_explicit(volatile __atomic_base<_ITp>* __a,
+ 			      __atomic_val_t<_ITp> __i,
+ 			      memory_order __m) noexcept
+     { return __a->fetch_min(__i, __m); }
+ 
+   template<typename _ITp>
+     inline _ITp
+     atomic_fetch_max_explicit(__atomic_base<_ITp>* __a,
+ 			      __atomic_val_t<_ITp> __i,
+ 			      memory_order __m) noexcept
+     { return __a->fetch_max(__i, __m); }
+ 
+   template<typename _ITp>
+     inline _ITp
+     atomic_fetch_max_explicit(volatile __atomic_base<_ITp>* __a,
+ 			      __atomic_val_t<_ITp> __i,
+ 			      memory_order __m) noexcept
+     { return __a->fetch_max(__i, __m); }
+ #endif
+ 
    template<typename _ITp>
      inline _ITp
      atomic_fetch_add(atomic<_ITp>* __a,
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 1628,1633 ****
--- 1659,1690 ----
  		     __atomic_val_t<_ITp> __i) noexcept
      { return atomic_fetch_xor_explicit(__a, __i, memory_order_seq_cst); }
  
+ #ifdef __cpp_lib_atomic_min_max
+   template<typename _ITp>
+     inline _ITp
+     atomic_fetch_min(__atomic_base<_ITp>* __a,
+ 		     __atomic_val_t<_ITp> __i) noexcept
+     { return atomic_fetch_min_explicit(__a, __i, memory_order_seq_cst); }
+ 
+   template<typename _ITp>
+     inline _ITp
+     atomic_fetch_min(volatile __atomic_base<_ITp>* __a,
+ 		     __atomic_val_t<_ITp> __i) noexcept
+     { return atomic_fetch_min_explicit(__a, __i, memory_order_seq_cst); }
+ 
+   template<typename _ITp>
+     inline _ITp
+     atomic_fetch_max(__atomic_base<_ITp>* __a,
+ 		     __atomic_val_t<_ITp> __i) noexcept
+     { return atomic_fetch_max_explicit(__a, __i, memory_order_seq_cst); }
+ 
+   template<typename _ITp>
+     inline _ITp
+     atomic_fetch_max(volatile __atomic_base<_ITp>* __a,
+ 		     __atomic_val_t<_ITp> __i) noexcept
+     { return atomic_fetch_max_explicit(__a, __i, memory_order_seq_cst); }
+ #endif
+ 
  #ifdef __cpp_lib_atomic_float
    template<>
      struct atomic<float> : __atomic_float<float>
diff -Nrcpad gcc-16-20260125/libstdc++-v3/include/std/contracts gcc-16-20260201/libstdc++-v3/include/std/contracts
*** gcc-16-20260125/libstdc++-v3/include/std/contracts	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/libstdc++-v3/include/std/contracts	Sun Feb  1 22:32:17 2026
***************
*** 0 ****
--- 1,111 ----
+ // Contracts support header for -*- C++ -*-
+ 
+ // Copyright The GNU Toolchain Authors.
+ //
+ // This file is part of GCC.
+ //
+ // GCC is free software; you can redistribute it and/or modify
+ // it under the terms of the GNU General Public License as published by
+ // the Free Software Foundation; either version 3, or (at your option)
+ // any later version.
+ //
+ // GCC is distributed in the hope that it will be useful,
+ // but WITHOUT ANY WARRANTY; without even the implied warranty of
+ // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ // GNU General Public License for more details.
+ //
+ // Under Section 7 of GPL version 3, you are granted additional
+ // permissions described in the GCC Runtime Library Exception, version
+ // 3.1, as published by the Free Software Foundation.
+ 
+ // You should have received a copy of the GNU General Public License and
+ // a copy of the GCC Runtime Library Exception along with this program;
+ // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
+ // <http://www.gnu.org/licenses/>.
+ 
+ /** @file contracts
+  *  This is a Standard C++ Library header.
+  */
+ 
+ #ifndef _GLIBCXX_CONTRACTS
+ #define _GLIBCXX_CONTRACTS 1
+ 
+ #pragma GCC system_header
+ 
+ #define __glibcxx_want_contracts
+ #include <bits/version.h>
+ 
+ #ifdef __cpp_lib_contracts
+ #include <source_location>
+ #include <bits/exception_ptr.h>
+ 
+ namespace std _GLIBCXX_VISIBILITY(default)
+ {
+ _GLIBCXX_BEGIN_NAMESPACE_VERSION
+ 
+ namespace contracts
+ {
+   // From P2900R14
+ 
+   enum class assertion_kind : __UINT16_TYPE__ {
+     pre = 1,
+     post = 2,
+     assert = 3,
+ 
+     /* Implementation-defined values should have a minimum value of 1000. */
+   };
+ 
+   enum class evaluation_semantic : __UINT16_TYPE__ {
+     ignore = 1,
+     observe = 2,
+     enforce = 3,
+     quick_enforce = 4,
+ 
+     /* Implementation-defined values should have a minimum value of 1000.  */
+   };
+ 
+   enum class detection_mode : __UINT16_TYPE__ {
+     predicate_false = 1,
+     evaluation_exception = 2,
+ 
+     /* Implementation-defined values should have a minimum value of 1000. */
+   };
+ 
+   using __vendor_ext = void;
+ 
+   class contract_violation {
+     __UINT16_TYPE__ _M_version;
+     assertion_kind _M_assertion_kind;
+     evaluation_semantic _M_evaluation_semantic;
+     detection_mode _M_detection_mode;
+     const char* _M_comment;
+     const void* _M_src_loc_ptr;
+     __vendor_ext* _M_ext;
+ 
+   public:
+     // cannot be copied or moved or assigned to
+     contract_violation(const contract_violation&) = delete;
+     contract_violation& operator=(const contract_violation&) = delete;
+ 
+     assertion_kind kind() const noexcept { return _M_assertion_kind; }
+     evaluation_semantic semantic() const noexcept { return _M_evaluation_semantic; }
+     detection_mode mode() const noexcept { return _M_detection_mode; }
+     const char* comment() const noexcept { return _M_comment; }
+     std::source_location location() const noexcept {
+       return std::source_location (_M_src_loc_ptr);
+     }
+     bool is_terminating () const noexcept {
+       return _M_evaluation_semantic == std::contracts::evaluation_semantic::enforce
+ 	    || _M_evaluation_semantic == std::contracts::evaluation_semantic::quick_enforce;
+     }
+   };
+ 
+   void invoke_default_contract_violation_handler(const contract_violation&) noexcept;
+ 
+ } // namespace contracts
+ 
+ _GLIBCXX_END_NAMESPACE_VERSION
+ } // namespace std
+ 
+ #endif // __cpp_lib_contracts
+ #endif // _GLIBCXX_CONTRACTS
diff -Nrcpad gcc-16-20260125/libstdc++-v3/include/std/expected gcc-16-20260201/libstdc++-v3/include/std/expected
*** gcc-16-20260125/libstdc++-v3/include/std/expected	Sun Jan 25 22:32:19 2026
--- gcc-16-20260201/libstdc++-v3/include/std/expected	Sun Feb  1 22:32:17 2026
*************** namespace __expected
*** 340,345 ****
--- 340,368 ----
      concept __not_constructing_bool_from_expected
        = ! is_same_v<remove_cv_t<_Tp>, bool>
  	  || ! __is_expected<remove_cvref_t<_Up>>;
+ 
+   template<typename _Tp, typename _Up = remove_cvref_t<_Tp>>
+     concept __trivially_replaceable
+       = is_trivially_constructible_v<_Up, _Tp>
+ 	  && is_trivially_assignable_v<_Up&, _Tp>
+ 	  && is_trivially_destructible_v<_Up>;
+ 
+   template<typename _Tp, typename _Up = remove_cvref_t<_Tp>>
+     concept __usable_for_assign
+       = is_constructible_v<_Up, _Tp> && is_assignable_v<_Up&, _Tp>;
+ 
+   // _GLIBCXX_RESOLVE_LIB_DEFECTS
+   // 4026. Assignment operators of std::expected should propagate triviality
+   template<typename _Tp>
+     concept __usable_for_trivial_assign
+       = __trivially_replaceable<_Tp> && __usable_for_assign<_Tp>;
+ 
+   // For copy/move assignment to replace T with E (or vice versa)
+   // we require at least one of them to be nothrow move constructible.
+   template<typename _Tp, typename _Er>
+     concept __can_reassign_type
+       = is_nothrow_move_constructible_v<_Tp>
+ 	  || is_nothrow_move_constructible_v<_Er>;
  }
  /// @endcond
  
*************** namespace __expected
*** 560,577 ****
  
        // assignment
  
        expected& operator=(const expected&) = delete;
  
        constexpr expected&
        operator=(const expected& __x)
        noexcept(__and_v<is_nothrow_copy_constructible<_Tp>,
  		       is_nothrow_copy_constructible<_Er>,
  		       is_nothrow_copy_assignable<_Tp>,
  		       is_nothrow_copy_assignable<_Er>>)
!       requires is_copy_assignable_v<_Tp> && is_copy_constructible_v<_Tp>
! 	    && is_copy_assignable_v<_Er> && is_copy_constructible_v<_Er>
! 	    && (is_nothrow_move_constructible_v<_Tp>
! 		|| is_nothrow_move_constructible_v<_Er>)
        {
  	if (__x._M_has_value)
  	  this->_M_assign_val(__x._M_val);
--- 583,613 ----
  
        // assignment
  
+       // Deleted copy assignment, when constraints not met for other overloads
        expected& operator=(const expected&) = delete;
  
+       // Trivial copy assignment
+       expected&
+       operator=(const expected&)
+       noexcept(__and_v<is_nothrow_copy_constructible<_Tp>,
+ 		       is_nothrow_copy_constructible<_Er>,
+ 		       is_nothrow_copy_assignable<_Tp>,
+ 		       is_nothrow_copy_assignable<_Er>>)
+       requires __expected::__usable_for_trivial_assign<const _Tp&>
+ 	    && __expected::__usable_for_trivial_assign<const _Er&>
+ 	    && __expected::__can_reassign_type<_Tp, _Er>
+ 	= default;
+ 
+       // Non-trivial copy assignment
        constexpr expected&
        operator=(const expected& __x)
        noexcept(__and_v<is_nothrow_copy_constructible<_Tp>,
  		       is_nothrow_copy_constructible<_Er>,
  		       is_nothrow_copy_assignable<_Tp>,
  		       is_nothrow_copy_assignable<_Er>>)
!       requires __expected::__usable_for_assign<const _Tp&>
! 	    && __expected::__usable_for_assign<const _Er&>
! 	    && __expected::__can_reassign_type<_Tp, _Er>
        {
  	if (__x._M_has_value)
  	  this->_M_assign_val(__x._M_val);
*************** namespace __expected
*** 580,595 ****
  	return *this;
        }
  
        constexpr expected&
        operator=(expected&& __x)
        noexcept(__and_v<is_nothrow_move_constructible<_Tp>,
  		       is_nothrow_move_constructible<_Er>,
  		       is_nothrow_move_assignable<_Tp>,
  		       is_nothrow_move_assignable<_Er>>)
!       requires is_move_assignable_v<_Tp> && is_move_constructible_v<_Tp>
! 	    && is_move_assignable_v<_Er> && is_move_constructible_v<_Er>
! 	    && (is_nothrow_move_constructible_v<_Tp>
! 		|| is_nothrow_move_constructible_v<_Er>)
        {
  	if (__x._M_has_value)
  	  _M_assign_val(std::move(__x._M_val));
--- 616,643 ----
  	return *this;
        }
  
+       // Trivial move assignment
+       expected&
+       operator=(expected&&)
+       noexcept(__and_v<is_nothrow_move_constructible<_Tp>,
+ 		       is_nothrow_move_constructible<_Er>,
+ 		       is_nothrow_move_assignable<_Tp>,
+ 		       is_nothrow_move_assignable<_Er>>)
+       requires __expected::__usable_for_trivial_assign<_Tp&&>
+ 	    && __expected::__usable_for_trivial_assign<_Er&&>
+ 	    && __expected::__can_reassign_type<_Tp, _Er>
+ 	= default;
+ 
+       // Non-trivial move assignment
        constexpr expected&
        operator=(expected&& __x)
        noexcept(__and_v<is_nothrow_move_constructible<_Tp>,
  		       is_nothrow_move_constructible<_Er>,
  		       is_nothrow_move_assignable<_Tp>,
  		       is_nothrow_move_assignable<_Er>>)
!       requires __expected::__usable_for_assign<_Tp&&>
! 	    && __expected::__usable_for_assign<_Er&&>
! 	    && __expected::__can_reassign_type<_Tp, _Er>
        {
  	if (__x._M_has_value)
  	  _M_assign_val(std::move(__x._M_val));
*************** namespace __expected
*** 1447,1460 ****
  
        // assignment
  
        expected& operator=(const expected&) = delete;
  
        constexpr expected&
        operator=(const expected& __x)
        noexcept(__and_v<is_nothrow_copy_constructible<_Er>,
  		       is_nothrow_copy_assignable<_Er>>)
!       requires is_copy_constructible_v<_Er>
! 	    && is_copy_assignable_v<_Er>
        {
  	if (__x._M_has_value)
  	  emplace();
--- 1495,1517 ----
  
        // assignment
  
+       // Deleted copy assignment, when constraints not met for other overloads
        expected& operator=(const expected&) = delete;
  
+       // Trivial copy assignment
+       expected&
+       operator=(const expected&)
+       noexcept(__and_v<is_nothrow_copy_constructible<_Er>,
+ 		       is_nothrow_copy_assignable<_Er>>)
+       requires __expected::__usable_for_trivial_assign<const _Er&>
+ 	= default;
+ 
+       // Non-trivial copy assignment
        constexpr expected&
        operator=(const expected& __x)
        noexcept(__and_v<is_nothrow_copy_constructible<_Er>,
  		       is_nothrow_copy_assignable<_Er>>)
!       requires __expected::__usable_for_assign<const _Er&>
        {
  	if (__x._M_has_value)
  	  emplace();
*************** namespace __expected
*** 1463,1474 ****
  	return *this;
        }
  
        constexpr expected&
        operator=(expected&& __x)
        noexcept(__and_v<is_nothrow_move_constructible<_Er>,
  		       is_nothrow_move_assignable<_Er>>)
!       requires is_move_constructible_v<_Er>
! 	    && is_move_assignable_v<_Er>
        {
  	if (__x._M_has_value)
  	  emplace();
--- 1520,1539 ----
  	return *this;
        }
  
+       // Trivial move assignment
+       expected&
+       operator=(expected&&)
+       noexcept(__and_v<is_nothrow_move_constructible<_Er>,
+ 		       is_nothrow_move_assignable<_Er>>)
+       requires __expected::__usable_for_trivial_assign<_Er&&>
+ 	= default;
+ 
+       // Non-trivial move assignment
        constexpr expected&
        operator=(expected&& __x)
        noexcept(__and_v<is_nothrow_move_constructible<_Er>,
  		       is_nothrow_move_assignable<_Er>>)
!       requires __expected::__usable_for_assign<_Er&&>
        {
  	if (__x._M_has_value)
  	  emplace();
diff -Nrcpad gcc-16-20260125/libstdc++-v3/include/std/source_location gcc-16-20260201/libstdc++-v3/include/std/source_location
*** gcc-16-20260125/libstdc++-v3/include/std/source_location	Sun Jan 25 22:32:19 2026
--- gcc-16-20260201/libstdc++-v3/include/std/source_location	Sun Feb  1 22:32:17 2026
***************
*** 38,43 ****
--- 38,46 ----
  namespace std
  {
  _GLIBCXX_BEGIN_NAMESPACE_VERSION
+ #ifdef __glibcxx_contracts
+   namespace contracts { class contract_violation; }
+ #endif
  
    /// A class that describes a location in source code.
    struct source_location
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 85,90 ****
--- 88,101 ----
  
    private:
      const __impl* _M_impl = nullptr;
+ 
+     constexpr source_location (const void *__t)
+       : _M_impl (static_cast <const __impl*>(__t)) {}
+ 
+ #ifdef __glibcxx_contracts
+     /* To enable use of the source __impl*.  */
+     friend class std::contracts::contract_violation;
+ #endif
    };
  
  _GLIBCXX_END_NAMESPACE_VERSION
diff -Nrcpad gcc-16-20260125/libstdc++-v3/src/c++23/std.cc.in gcc-16-20260201/libstdc++-v3/src/c++23/std.cc.in
*** gcc-16-20260125/libstdc++-v3/src/c++23/std.cc.in	Sun Jan 25 22:32:19 2026
--- gcc-16-20260201/libstdc++-v3/src/c++23/std.cc.in	Sun Feb  1 22:32:17 2026
*************** export namespace std
*** 570,575 ****
--- 570,581 ----
    using std::atomic_fetch_sub_explicit;
    using std::atomic_fetch_xor;
    using std::atomic_fetch_xor_explicit;
+ #ifdef __cpp_lib_atomic_min_max
+   using std::atomic_fetch_min;
+   using std::atomic_fetch_min_explicit;
+   using std::atomic_fetch_max;
+   using std::atomic_fetch_max_explicit;
+ #endif
    using std::atomic_flag;
    using std::atomic_flag_clear;
    using std::atomic_flag_clear_explicit;
*************** export namespace std
*** 1017,1022 ****
--- 1023,1040 ----
  }
  #endif
  
+ // 17.10.1 <contracts>
+ #if __cpp_lib_contracts
+ export namespace std::contracts
+ {
+   using std::contracts::assertion_kind;
+   using std::contracts::evaluation_semantic;
+   using std::contracts::detection_mode;
+   using std::contracts::contract_violation;
+   using std::contracts::invoke_default_contract_violation_handler;
+ }
+ #endif // __cpp_lib_contracts
+ 
  // 17.12.2 <coroutine>
  #if __cpp_lib_coroutine
  export namespace std
diff -Nrcpad gcc-16-20260125/libstdc++-v3/src/experimental/Makefile.am gcc-16-20260201/libstdc++-v3/src/experimental/Makefile.am
*** gcc-16-20260125/libstdc++-v3/src/experimental/Makefile.am	Sun Jan 25 22:32:19 2026
--- gcc-16-20260201/libstdc++-v3/src/experimental/Makefile.am	Sun Feb  1 22:32:17 2026
*************** endif
*** 39,48 ****
  headers =
  
  sources = \
! 	contract.cc
  
  # vpath % $(top_srcdir)/src/experimental
  
  libstdc__exp_la_SOURCES = $(sources)
  
  libstdc__exp_la_LIBADD = \
--- 39,54 ----
  headers =
  
  sources = \
! 	contract26.cc
  
  # vpath % $(top_srcdir)/src/experimental
  
+ 
+ contract26.lo: contract26.cc
+ 	$(LTCXXCOMPILE) -std=gnu++26 -fcontracts -c $<
+ contract26.o: contract26.cc
+ 	$(CXXCOMPILE) -std=gnu++26 -fcontracts -c $<
+ 
  libstdc__exp_la_SOURCES = $(sources)
  
  libstdc__exp_la_LIBADD = \
*************** libstdc__exp_la_DEPENDENCIES = \
*** 61,67 ****
  # OPTIMIZE_CXXFLAGS on the compile line so that -O2 can be overridden
  # as the occasion calls for it.
  AM_CXXFLAGS = \
! 	-std=gnu++17 -nostdinc++ \
  	$(glibcxx_lt_pic_flag) $(glibcxx_compiler_shared_flag) \
  	$(XTEMPLATE_FLAGS) $(VTV_CXXFLAGS) \
  	$(WARN_CXXFLAGS) $(OPTIMIZE_CXXFLAGS) $(CONFIG_CXXFLAGS) \
--- 67,73 ----
  # OPTIMIZE_CXXFLAGS on the compile line so that -O2 can be overridden
  # as the occasion calls for it.
  AM_CXXFLAGS = \
! 	-std=gnu++20 -nostdinc++ \
  	$(glibcxx_lt_pic_flag) $(glibcxx_compiler_shared_flag) \
  	$(XTEMPLATE_FLAGS) $(VTV_CXXFLAGS) \
  	$(WARN_CXXFLAGS) $(OPTIMIZE_CXXFLAGS) $(CONFIG_CXXFLAGS) \
diff -Nrcpad gcc-16-20260125/libstdc++-v3/src/experimental/Makefile.in gcc-16-20260201/libstdc++-v3/src/experimental/Makefile.in
*** gcc-16-20260125/libstdc++-v3/src/experimental/Makefile.in	Sun Jan 25 22:32:19 2026
--- gcc-16-20260201/libstdc++-v3/src/experimental/Makefile.in	Sun Feb  1 22:32:17 2026
*************** am__installdirs = "$(DESTDIR)$(toolexecl
*** 152,158 ****
  LTLIBRARIES = $(toolexeclib_LTLIBRARIES)
  @ENABLE_FILESYSTEM_TS_TRUE@am__DEPENDENCIES_1 = $(top_builddir)/src/filesystem/libstdc++fsconvenience.la
  @ENABLE_BACKTRACE_TRUE@am__DEPENDENCIES_2 = $(top_builddir)/src/libbacktrace/libstdc++_libbacktrace.la
! am__objects_1 = contract.lo
  am_libstdc__exp_la_OBJECTS = $(am__objects_1)
  libstdc__exp_la_OBJECTS = $(am_libstdc__exp_la_OBJECTS)
  AM_V_lt = $(am__v_lt_@AM_V@)
--- 152,158 ----
  LTLIBRARIES = $(toolexeclib_LTLIBRARIES)
  @ENABLE_FILESYSTEM_TS_TRUE@am__DEPENDENCIES_1 = $(top_builddir)/src/filesystem/libstdc++fsconvenience.la
  @ENABLE_BACKTRACE_TRUE@am__DEPENDENCIES_2 = $(top_builddir)/src/libbacktrace/libstdc++_libbacktrace.la
! am__objects_1 = contract26.lo
  am_libstdc__exp_la_OBJECTS = $(am__objects_1)
  libstdc__exp_la_OBJECTS = $(am_libstdc__exp_la_OBJECTS)
  AM_V_lt = $(am__v_lt_@AM_V@)
*************** toolexeclib_LTLIBRARIES = libstdc++exp.l
*** 458,467 ****
  @ENABLE_BACKTRACE_TRUE@backtrace_lib = $(top_builddir)/src/libbacktrace/libstdc++_libbacktrace.la
  headers = 
  sources = \
! 	contract.cc
! 
  
- # vpath % $(top_srcdir)/src/experimental
  libstdc__exp_la_SOURCES = $(sources)
  libstdc__exp_la_LIBADD = \
  	$(top_builddir)/src/c++23/libc++23convenience.la \
--- 458,465 ----
  @ENABLE_BACKTRACE_TRUE@backtrace_lib = $(top_builddir)/src/libbacktrace/libstdc++_libbacktrace.la
  headers = 
  sources = \
! 	contract26.cc
  
  libstdc__exp_la_SOURCES = $(sources)
  libstdc__exp_la_LIBADD = \
  	$(top_builddir)/src/c++23/libc++23convenience.la \
*************** libstdc__exp_la_DEPENDENCIES = \
*** 480,486 ****
  # OPTIMIZE_CXXFLAGS on the compile line so that -O2 can be overridden
  # as the occasion calls for it.
  AM_CXXFLAGS = \
! 	-std=gnu++17 -nostdinc++ \
  	$(glibcxx_lt_pic_flag) $(glibcxx_compiler_shared_flag) \
  	$(XTEMPLATE_FLAGS) $(VTV_CXXFLAGS) \
  	$(WARN_CXXFLAGS) $(OPTIMIZE_CXXFLAGS) $(CONFIG_CXXFLAGS) \
--- 478,484 ----
  # OPTIMIZE_CXXFLAGS on the compile line so that -O2 can be overridden
  # as the occasion calls for it.
  AM_CXXFLAGS = \
! 	-std=gnu++20 -nostdinc++ \
  	$(glibcxx_lt_pic_flag) $(glibcxx_compiler_shared_flag) \
  	$(XTEMPLATE_FLAGS) $(VTV_CXXFLAGS) \
  	$(WARN_CXXFLAGS) $(OPTIMIZE_CXXFLAGS) $(CONFIG_CXXFLAGS) \
*************** uninstall-am: uninstall-toolexeclibLTLIB
*** 808,813 ****
--- 806,818 ----
  .PRECIOUS: Makefile
  
  
+ # vpath % $(top_srcdir)/src/experimental
+ 
+ contract26.lo: contract26.cc
+ 	$(LTCXXCOMPILE) -std=gnu++26 -fcontracts -c $<
+ contract26.o: contract26.cc
+ 	$(CXXCOMPILE) -std=gnu++26 -fcontracts -c $<
+ 
  # Tell versions [3.59,3.63) of GNU make to not export all variables.
  # Otherwise a system limit (for SysV at least) may be exceeded.
  .NOEXPORT:
diff -Nrcpad gcc-16-20260125/libstdc++-v3/src/experimental/contract.cc gcc-16-20260201/libstdc++-v3/src/experimental/contract.cc
*** gcc-16-20260125/libstdc++-v3/src/experimental/contract.cc	Sun Jan 25 22:32:19 2026
--- gcc-16-20260201/libstdc++-v3/src/experimental/contract.cc	Thu Jan  1 00:00:00 1970
***************
*** 1,78 ****
- // -*- C++ -*- std::experimental::contract_violation and friends
- 
- // Copyright (C) 2019-2026 Free Software Foundation, Inc.
- //
- // This file is part of GCC.
- //
- // GCC is free software; you can redistribute it and/or modify
- // it under the terms of the GNU General Public License as published by
- // the Free Software Foundation; either version 3, or (at your option)
- // any later version.
- //
- // GCC is distributed in the hope that it will be useful,
- // but WITHOUT ANY WARRANTY; without even the implied warranty of
- // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- // GNU General Public License for more details.
- //
- // Under Section 7 of GPL version 3, you are granted additional
- // permissions described in the GCC Runtime Library Exception, version
- // 3.1, as published by the Free Software Foundation.
- 
- // You should have received a copy of the GNU General Public License and
- // a copy of the GCC Runtime Library Exception along with this program;
- // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
- // <http://www.gnu.org/licenses/>.
- 
- #include <experimental/contract>
- #if _GLIBCXX_HOSTED && _GLIBCXX_VERBOSE
- # include <iostream>
- #endif
- 
- __attribute__ ((weak)) void
- handle_contract_violation (const std::experimental::contract_violation &violation)
- {
- #if _GLIBCXX_HOSTED && _GLIBCXX_VERBOSE
-   bool level_default_p = violation.assertion_level() == "default";
-   bool role_default_p = violation.assertion_role() == "default";
-   bool cont_mode_default_p = violation.continuation_mode()
-     == std::experimental::contract_violation_continuation_mode::never_continue;
- 
-   const char* modes[]{ "off", "on" }; // Must match enumerators in header.
-   std::cerr << "contract violation in function " << violation.function_name()
-     << " at " << violation.file_name() << ':' << violation.line_number()
-     << ": " << violation.comment();
- 
-   const char* delimiter = "\n[";
- 
-   if (!level_default_p)
-     {
-       std::cerr << delimiter << "level:" << violation.assertion_level();
-       delimiter = ", ";
-     }
-   if (!role_default_p)
-     {
-       std::cerr << delimiter << "role:" << violation.assertion_role();
-       delimiter = ", ";
-     }
-   if (!cont_mode_default_p)
-     {
-       std::cerr << delimiter << "continue:"
- 		<< modes[(int)violation.continuation_mode() & 1];
-       delimiter = ", ";
-     }
- 
-   if (delimiter[0] == ',')
-     std::cerr << ']';
- 
-   std::cerr << std::endl;
- #endif
- }
- 
- #if _GLIBCXX_INLINE_VERSION
- // The compiler expects the contract_violation class to be in an unversioned
- // namespace, so provide a forwarding function with the expected symbol name.
- extern "C" void
- _Z25handle_contract_violationRKNSt12experimental18contract_violationE
- (const std::experimental::contract_violation &violation)
- { handle_contract_violation(violation); }
- #endif
--- 0 ----
diff -Nrcpad gcc-16-20260125/libstdc++-v3/src/experimental/contract26.cc gcc-16-20260201/libstdc++-v3/src/experimental/contract26.cc
*** gcc-16-20260125/libstdc++-v3/src/experimental/contract26.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/libstdc++-v3/src/experimental/contract26.cc	Sun Feb  1 22:32:17 2026
***************
*** 0 ****
--- 1,159 ----
+ // -*- C++ -*- std::contracts::contract_violation and friends
+ 
+ // Copyright The GNU Toolchain Authors.
+ //
+ // This file is part of GCC.
+ //
+ // GCC is free software; you can redistribute it and/or modify
+ // it under the terms of the GNU General Public License as published by
+ // the Free Software Foundation; either version 3, or (at your option)
+ // any later version.
+ //
+ // GCC is distributed in the hope that it will be useful,
+ // but WITHOUT ANY WARRANTY; without even the implied warranty of
+ // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ // GNU General Public License for more details.
+ //
+ // Under Section 7 of GPL version 3, you are granted additional
+ // permissions described in the GCC Runtime Library Exception, version
+ // 3.1, as published by the Free Software Foundation.
+ 
+ // You should have received a copy of the GNU General Public License and
+ // a copy of the GCC Runtime Library Exception along with this program;
+ // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
+ // <http://www.gnu.org/licenses/>.
+ 
+ #include <contracts>
+ 
+ #ifndef __cpp_lib_contracts
+ # error "This file requires C++26 contracts support to be enabled"
+ #endif
+ 
+ #if _GLIBCXX_HOSTED && _GLIBCXX_VERBOSE
+ # include <iostream>
+ # include <cxxabi.h>
+ #endif
+ 
+ void __handle_contract_violation(const std::contracts::contract_violation &violation) noexcept
+ {
+ #if _GLIBCXX_HOSTED && _GLIBCXX_VERBOSE
+ 
+   std::cerr << "contract violation in function " << violation.location().function_name()
+     << " at " << violation.location().file_name() << ':' << violation.location().line()
+     << ": " << violation.comment();
+ 
+   const char* delimiter = "\n[";
+ 
+   std::cerr << delimiter << "assertion_kind:";
+    switch (violation.kind())
+    {
+      case std::contracts::assertion_kind::pre:
+        std::cerr << " pre";
+        break;
+      case std::contracts::assertion_kind::post:
+        std::cerr << " post";
+        break;
+      case std::contracts::assertion_kind::assert:
+        std::cerr << " assert";
+        break;
+      default:
+        std::cerr << " unknown" << (int) violation.semantic();
+    }
+    delimiter = ", ";
+ 
+   std::cerr << delimiter << "semantic:";
+   switch (violation.semantic())
+   {
+     case std::contracts::evaluation_semantic::enforce:
+       std::cerr << " enforce";
+       break;
+     case std::contracts::evaluation_semantic::observe:
+       std::cerr << " observe";
+       break;
+     default:
+       std::cerr << " unknown" << (int) violation.semantic();
+   }
+   delimiter = ", ";
+ 
+   std::cerr << delimiter << "mode:";
+   switch (violation.mode())
+   {
+     case std::contracts::detection_mode::predicate_false:
+       std::cerr << " predicate_false";
+       break;
+     case std::contracts::detection_mode::evaluation_exception:
+       std::cerr << " evaluation_exception";
+       break;
+     default:
+       std::cerr << "unknown";
+   }
+   delimiter = ", ";
+ 
+   if (violation.mode() == std::contracts::detection_mode::evaluation_exception)
+     {
+       /* Based on the impl. in vterminate.cc.  */
+       std::type_info *t = __cxxabiv1::__cxa_current_exception_type();
+       if (t)
+ 	{
+ 	  int status = -1;
+ 	  char *dem = 0;
+ 	  // Note that "name" is the mangled name.
+ 	  char const *name = t->name();
+ 	  dem = __cxxabiv1::__cxa_demangle(name, 0, 0, &status);
+ 	  std::cerr << ": threw an instance of '";
+ 	  std::cerr << ( status == 0 ? dem : name) << "'";
+ 	}
+       else
+ 	std::cerr << ": threw an unknown type";
+     }
+ 
+   std::cerr << delimiter << "terminating:"
+ 	    << (violation.is_terminating () ? " yes" : " no");
+ 
+   if (delimiter[0] == ',')
+     std::cerr << ']';
+ 
+   std::cerr << std::endl;
+ #endif
+ }
+ 
+ namespace std _GLIBCXX_VISIBILITY(default)
+ {
+ _GLIBCXX_BEGIN_NAMESPACE_VERSION
+ 
+ namespace contracts
+ {
+ 
+ void invoke_default_contract_violation_handler(const std::contracts::contract_violation& violation) noexcept
+ {
+   return __handle_contract_violation(violation);
+ }
+ 
+ }
+ }
+ 
+ __attribute__ ((weak)) void
+ handle_contract_violation (const std::contracts::contract_violation &violation)
+ {
+   return __handle_contract_violation(violation);
+ }
+ 
+ #if _GLIBCXX_INLINE_VERSION
+ // The compiler expects the contract_violation class to be in an unversioned
+ // namespace, so provide a forwarding function with the expected symbol name.
+ extern "C" void
+ _Z25handle_contract_violationRKNSt9contracts18contract_violationE
+ (const std::contracts::contract_violation &violation)
+ { handle_contract_violation(violation); }
+ 
+ extern "C" void
+ _Z27__handle_contract_violationRKNSt9contracts18contract_violationE
+ (const std::contracts::contract_violation &violation)
+ { __handle_contract_violation(violation); }
+ 
+ extern "C" void
+ _Z41invoke_default_contract_violation_handlerRKNSt9contracts18contract_violationE
+ (const std::contracts::contract_violation &violation)
+ { invoke_default_contract_violation_handler(violation); }
+ 
+ #endif
diff -Nrcpad gcc-16-20260125/libstdc++-v3/testsuite/18_support/contracts/includes.cc gcc-16-20260201/libstdc++-v3/testsuite/18_support/contracts/includes.cc
*** gcc-16-20260125/libstdc++-v3/testsuite/18_support/contracts/includes.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/libstdc++-v3/testsuite/18_support/contracts/includes.cc	Sun Feb  1 22:32:17 2026
***************
*** 0 ****
--- 1,6 ----
+ // { dg-options "-fcontracts" }
+ // { dg-do compile { target c++26 } }
+ 
+ // We should not get errors from including this before <contracts>:
+ #include <source_location>
+ #include <contracts>
diff -Nrcpad gcc-16-20260125/libstdc++-v3/testsuite/18_support/contracts/invoke_default_cvh.cc gcc-16-20260201/libstdc++-v3/testsuite/18_support/contracts/invoke_default_cvh.cc
*** gcc-16-20260125/libstdc++-v3/testsuite/18_support/contracts/invoke_default_cvh.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/libstdc++-v3/testsuite/18_support/contracts/invoke_default_cvh.cc	Sun Feb  1 22:32:17 2026
***************
*** 0 ****
--- 1,23 ----
+ // { dg-options "-fcontracts -fcontract-evaluation-semantic=observe" }
+ // { dg-do run { target c++26 } }
+ 
+ #include <contracts>
+ #include <testsuite_hooks.h>
+ 
+ bool custom_called = false;
+ 
+ 
+ void handle_contract_violation(const std::contracts::contract_violation& v)
+ {
+   invoke_default_contract_violation_handler(v);
+   custom_called = true;
+ }
+ 
+ void f(int i) pre (i>10) {};
+ 
+ int main()
+ {
+   f(0);
+   VERIFY(custom_called);
+ }
+ // { dg-output "contract violation in function void f.int. at .*(\n|\r\n|\r)" }
diff -Nrcpad gcc-16-20260125/libstdc++-v3/testsuite/18_support/contracts/invoke_default_cvh2.cc gcc-16-20260201/libstdc++-v3/testsuite/18_support/contracts/invoke_default_cvh2.cc
*** gcc-16-20260125/libstdc++-v3/testsuite/18_support/contracts/invoke_default_cvh2.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/libstdc++-v3/testsuite/18_support/contracts/invoke_default_cvh2.cc	Sun Feb  1 22:32:17 2026
***************
*** 0 ****
--- 1,55 ----
+ // check that default contract violation is not invoked if not explicitly invoked
+ // { dg-options "-fcontracts -fcontract-evaluation-semantic=observe" }
+ // { dg-do run { target c++26 } }
+ 
+ #include <contracts>
+ #include <testsuite_hooks.h>
+ #include <iostream>
+ #include <sstream>
+ 
+ 
+ struct checking_buf
+   : public std::streambuf
+ {
+   bool written = false;
+ 
+   checking_buf() = default;
+ 
+   virtual int_type
+   overflow(int_type)
+   {
+     written = true;
+     return int_type();
+   }
+ 
+   std::streamsize xsputn(const char* s, std::streamsize count)
+   {
+     written = true;
+     return count;
+   }
+ 
+ };
+ 
+ 
+ bool custom_called = false;
+ 
+ 
+ void handle_contract_violation(const std::contracts::contract_violation& v)
+ {
+   custom_called = true;
+ }
+ 
+ void f(int i) pre (i>10) {};
+ 
+ int main()
+ {
+   auto save_buf = std::cerr.rdbuf();
+   checking_buf buf;
+   std::cerr.rdbuf(&buf);
+ 
+   f(0);
+   std::cerr.rdbuf(save_buf);
+   VERIFY(!buf.written);
+   return 0;
+ }
+ 
diff -Nrcpad gcc-16-20260125/libstdc++-v3/testsuite/20_util/expected/requirements.cc gcc-16-20260201/libstdc++-v3/testsuite/20_util/expected/requirements.cc
*** gcc-16-20260125/libstdc++-v3/testsuite/20_util/expected/requirements.cc	Sun Jan 25 22:32:19 2026
--- gcc-16-20260201/libstdc++-v3/testsuite/20_util/expected/requirements.cc	Sun Feb  1 22:32:17 2026
*************** static_assert( move_constructible< void,
*** 86,124 ****
  // Copy assignment
  
  template<typename T, typename E>
!   constexpr bool copy_assignable
!     = std::is_copy_assignable_v<std::expected<T, E>>;
  
  struct F { F(F&&); F& operator=(const F&); }; // not copy-constructible
- struct G { G(const G&); G(G&&); G& operator=(const G&); }; // throwing move
  
! static_assert( copy_assignable< int,  int > );
! static_assert( copy_assignable< F,    int > == false );
! static_assert( copy_assignable< int,  F   > == false );
! static_assert( copy_assignable< F,    F   > == false );
! static_assert( copy_assignable< G,    int > );
! static_assert( copy_assignable< int,  G   > );
! static_assert( copy_assignable< G,    G   > == false );
! static_assert( copy_assignable< void, int > );
! static_assert( copy_assignable< void, F > == false );
! static_assert( copy_assignable< void, G > );
  
  // Move assignment
  
  template<typename T, typename E>
!   constexpr bool move_assignable
!     = std::is_move_assignable_v<std::expected<T, E>>;
  
! static_assert( move_assignable< int,  int > );
! static_assert( move_assignable< F,    int > );
! static_assert( move_assignable< int,  F   > );
! static_assert( move_assignable< F,    F   > == false );
! static_assert( move_assignable< G,    int > );
! static_assert( move_assignable< int,  G   > );
! static_assert( move_assignable< G,    G   > == false );
! static_assert( move_assignable< void, int > );
! static_assert( move_assignable< void, F > );
! static_assert( move_assignable< void, G > );
  
  // QoI properties
  static_assert( sizeof(std::expected<char, unsigned char>) == 2 );
--- 86,151 ----
  // Copy assignment
  
  template<typename T, typename E>
!   constexpr Result copy_assignable
!     = std::is_trivially_copy_assignable_v<std::expected<T, E>> ? Trivial
!       : std::is_nothrow_copy_assignable_v<std::expected<T, E>> ? NoThrow
!       : std::is_copy_assignable_v<std::expected<T, E>> ? Yes
!       : No;
  
  struct F { F(F&&); F& operator=(const F&); }; // not copy-constructible
  
! template<bool CopyCtor, bool MoveCtor, bool CopyAssign, bool MoveAssign>
! struct X {
!     X(const X&) noexcept(CopyCtor);
!     X(X&&) noexcept(MoveCtor);
!     X& operator=(const X&) noexcept(CopyAssign);
!     X& operator=(X&&) noexcept(MoveAssign);
! };
! using G = X<false, false, false, false>;
! using H = X<false, true, true, true>;
! using I = X<true, true, true, false>;
! 
! static_assert( copy_assignable< int,  int > == Trivial );
! static_assert( copy_assignable< F,    int > == No );
! static_assert( copy_assignable< int,  F   > == No );
! static_assert( copy_assignable< F,    F   > == No );
! static_assert( copy_assignable< G,    int > == Yes );
! static_assert( copy_assignable< int,  G   > == Yes );
! static_assert( copy_assignable< G,    G   > == No );
! static_assert( copy_assignable< int,  H   > == Yes );
! static_assert( copy_assignable< H,    H   > == Yes );
! static_assert( copy_assignable< int,  I   > == NoThrow );
! static_assert( copy_assignable< I,    I   > == NoThrow );
! static_assert( copy_assignable< void, int > == Trivial );
! static_assert( copy_assignable< void, F > == No );
! static_assert( copy_assignable< void, G > == Yes );
! static_assert( copy_assignable< void, H > == Yes );
! static_assert( copy_assignable< void, I > == NoThrow );
  
  // Move assignment
  
  template<typename T, typename E>
!   constexpr Result move_assignable
!     = std::is_trivially_move_assignable_v<std::expected<T, E>> ? Trivial
!       : std::is_nothrow_move_assignable_v<std::expected<T, E>> ? NoThrow
!       : std::is_move_assignable_v<std::expected<T, E>> ? Yes
!       : No;
  
! static_assert( move_assignable< int,  int > == Trivial );
! static_assert( move_assignable< F,    int > == Yes );
! static_assert( move_assignable< int,  F   > == Yes );
! static_assert( move_assignable< F,    F   > == No );
! static_assert( move_assignable< G,    int > == Yes );
! static_assert( move_assignable< int,  G   > == Yes );
! static_assert( move_assignable< G,    G   > == No );
! static_assert( move_assignable< int,  H   > == NoThrow );
! static_assert( move_assignable< H,    H   > == NoThrow );
! static_assert( move_assignable< I,    I   > == Yes );
! static_assert( move_assignable< void, int > == Trivial );
! static_assert( move_assignable< void, F > == Yes );
! static_assert( move_assignable< void, G > == Yes );
! static_assert( move_assignable< void, H > == NoThrow );
! static_assert( move_assignable< void, I > == Yes );
  
  // QoI properties
  static_assert( sizeof(std::expected<char, unsigned char>) == 2 );
*************** static_assert( sizeof(std::expected<void
*** 126,128 ****
--- 153,216 ----
  static_assert( sizeof(std::expected<void*, char>) == sizeof(void*) + __alignof(void*) );
  static_assert( alignof(std::expected<void, char>) == 1 );
  static_assert( alignof(std::expected<void*, char>) == alignof(void*) );
+ 
+ // For QoI we propagate noexcept(false) from trivial special members.
+ template<bool CopyCtor, bool MoveCtor, bool CopyAssign, bool MoveAssign>
+ struct Y {
+     Y(const Y&) noexcept(CopyCtor) = default;
+     Y(Y&&) noexcept(MoveCtor) = default;
+     Y& operator=(const Y&) noexcept(CopyAssign) = default;
+     Y& operator=(Y&&) noexcept(MoveAssign) = default;
+ };
+ 
+ template<int I> using Yi = Y<bool(I&8), bool(I&4), bool(I&2), bool(I&1)>;
+ 
+ template<typename> constexpr bool nothrow_copy = false;
+ template<typename> constexpr bool nothrow_move = false;
+ 
+ template<bool CC, bool MC, bool CA, bool MA>
+ constexpr bool nothrow_copy<Y<CC, MC, CA, MA>> = CC && CA;
+ 
+ template<bool CC, bool MC, bool CA, bool MA>
+ constexpr bool nothrow_move<Y<CC, MC, CA, MA>> = MC && MA;
+ 
+ template<> constexpr bool nothrow_copy<void> = true;
+ template<> constexpr bool nothrow_move<void> = true;
+ 
+ template<typename A, typename B>
+ consteval bool do_checks()
+ {
+   if constexpr (std::is_void_v<A> || std::is_nothrow_move_constructible_v<A>
+ 		|| std::is_nothrow_move_constructible_v<B>)
+     {
+       // All assignments should be trivial
+       static_assert( copy_assignable<A, B> == Trivial );
+       static_assert( move_assignable<A, B> == Trivial );
+       // But whether they are nothrow depends on the noexcept-specifiers
+       static_assert( std::is_nothrow_copy_assignable_v<std::expected<A, B>>
+ 		    == (nothrow_copy<A> && nothrow_copy<B>) );
+       static_assert( std::is_nothrow_move_assignable_v<std::expected<A, B>>
+ 		    == (nothrow_move<A> && nothrow_move<B>) );
+     }
+   else
+     {
+       static_assert( copy_assignable<A, B> == No );
+       static_assert( move_assignable<A, B> == No );
+     }
+   return true;
+ }
+ 
+ template<typename A, int... I>
+ consteval bool check(std::integer_sequence<int, I...>)
+ {
+   return (do_checks<A, Yi<I>>() && ...);
+ }
+ 
+ template<int... I>
+ consteval bool
+ check_all(std::integer_sequence<int, I...> i)
+ {
+   return (check<Yi<I>>(i) && ...) && check<void>(i);
+ }
+ 
+ static_assert(check_all(std::make_integer_sequence<int, 16>{}));
diff -Nrcpad gcc-16-20260125/libstdc++-v3/testsuite/29_atomics/atomic_integral/nonmembers_fetch_minmax.cc gcc-16-20260201/libstdc++-v3/testsuite/29_atomics/atomic_integral/nonmembers_fetch_minmax.cc
*** gcc-16-20260125/libstdc++-v3/testsuite/29_atomics/atomic_integral/nonmembers_fetch_minmax.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/libstdc++-v3/testsuite/29_atomics/atomic_integral/nonmembers_fetch_minmax.cc	Sun Feb  1 22:32:18 2026
***************
*** 0 ****
--- 1,50 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-require-atomic-builtins "" }
+ 
+ #include <atomic>
+ 
+ void
+ test01()
+ {
+   volatile std::atomic<int> v;
+   std::atomic<long> a;
+   const std::memory_order mo = std::memory_order_seq_cst;
+   int i = 0;
+   long l = 0;
+ 
+   auto r1 = atomic_fetch_min(&v, i);
+   static_assert( std::is_same<decltype(r1), int>::value, "" );
+   auto r2 = atomic_fetch_min(&a, l);
+   static_assert( std::is_same<decltype(r2), long>::value, "" );
+   auto r3 = atomic_fetch_min_explicit(&v, i, mo);
+   static_assert( std::is_same<decltype(r3), int>::value, "" );
+   auto r4 = atomic_fetch_min_explicit(&a, l, mo);
+   static_assert( std::is_same<decltype(r4), long>::value, "" );
+ 
+   auto r5 = atomic_fetch_max(&v, i);
+   static_assert( std::is_same<decltype(r5), int>::value, "" );
+   auto r6 = atomic_fetch_max(&a, l);
+   static_assert( std::is_same<decltype(r6), long>::value, "" );
+   auto r7 = atomic_fetch_max_explicit(&v, i, mo);
+   static_assert( std::is_same<decltype(r7), int>::value, "" );
+   auto r8 = atomic_fetch_max_explicit(&a, l, mo);
+   static_assert( std::is_same<decltype(r8), long>::value, "" );
+ }
+ 
+ void
+ test02()
+ {
+   volatile std::atomic<long> v;
+   std::atomic<long> a;
+   std::memory_order mo = std::memory_order_seq_cst;
+   const int i = 0;
+ 
+   atomic_fetch_min(&v, i);
+   atomic_fetch_min(&a, i);
+   atomic_fetch_min_explicit(&v, i, mo);
+   atomic_fetch_min_explicit(&a, i, mo);
+   atomic_fetch_max(&v, i);
+   atomic_fetch_max(&a, i);
+   atomic_fetch_max_explicit(&v, i, mo);
+   atomic_fetch_max_explicit(&a, i, mo);
+ }
diff -Nrcpad gcc-16-20260125/libstdc++-v3/testsuite/29_atomics/atomic_ref/integral_fetch_minmax.cc gcc-16-20260201/libstdc++-v3/testsuite/29_atomics/atomic_ref/integral_fetch_minmax.cc
*** gcc-16-20260125/libstdc++-v3/testsuite/29_atomics/atomic_ref/integral_fetch_minmax.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20260201/libstdc++-v3/testsuite/29_atomics/atomic_ref/integral_fetch_minmax.cc	Sun Feb  1 22:32:18 2026
***************
*** 0 ****
--- 1,118 ----
+ // { dg-do run { target c++26 } }
+ // { dg-require-atomic-cmpxchg-word "" }
+ // { dg-add-options libatomic }
+ 
+ #include <atomic>
+ #include <limits.h>
+ #include <testsuite_hooks.h>
+ 
+ void
+ test01()
+ {
+   int value;
+   const auto mo = std::memory_order_relaxed;
+ 
+   {
+     std::atomic_ref<int> a(value);
+ 
+     a = 100;
+     auto v = a.fetch_min(50);
+     VERIFY( v == 100 );
+     VERIFY( a == 50 );
+ 
+     v = a.fetch_min(75, mo);
+     VERIFY( v == 50 );
+     VERIFY( a == 50 );
+ 
+     v = a.fetch_min(25);
+     VERIFY( v == 50 );
+     VERIFY( a == 25 );
+ 
+     a = -10;
+     v = a.fetch_min(-20);
+     VERIFY( v == -10 );
+     VERIFY( a == -20 );
+ 
+     v = a.fetch_min(-5, mo);
+     VERIFY( v == -20 );
+     VERIFY( a == -20 );
+ 
+     a = 20;
+     v = a.fetch_max(50);
+     VERIFY( v == 20 );
+     VERIFY( a == 50 );
+ 
+     v = a.fetch_max(30, mo);
+     VERIFY( v == 50 );
+     VERIFY( a == 50 );
+ 
+     v = a.fetch_max(100);
+     VERIFY( v == 50 );
+     VERIFY( a == 100 );
+ 
+     a = -50;
+     v = a.fetch_max(-20);
+     VERIFY( v == -50 );
+     VERIFY( a == -20 );
+ 
+     v = a.fetch_max(-30, mo);
+     VERIFY( v == -20 );
+     VERIFY( a == -20 );
+   }
+ 
+   VERIFY( value == -20 );
+ }
+ 
+ void
+ test02()
+ {
+   unsigned short value;
+   const auto mo = std::memory_order_relaxed;
+ 
+   {
+     std::atomic_ref<unsigned short> a(value);
+ 
+     a = 100;
+     auto v = a.fetch_min(50);
+     VERIFY( v == 100 );
+     VERIFY( a == 50 );
+ 
+     v = a.fetch_min(75, mo);
+     VERIFY( v == 50 );
+     VERIFY( a == 50 );
+ 
+     a = 20;
+     v = a.fetch_max(50);
+     VERIFY( v == 20 );
+     VERIFY( a == 50 );
+ 
+     v = a.fetch_max(30, mo);
+     VERIFY( v == 50 );
+     VERIFY( a == 50 );
+ 
+     v = a.fetch_max(200);
+     VERIFY( v == 50 );
+     VERIFY( a == 200 );
+   }
+ 
+   VERIFY( value == 200 );
+ }
+ 
+ void
+ test03()
+ {
+   int i = INT_MIN;
+   std::atomic_ref<int> a(i);
+   a.fetch_min(INT_MAX);
+   VERIFY( a == INT_MIN );
+   a.fetch_max(INT_MAX);
+   VERIFY( a == INT_MAX );
+ }
+ 
+ int
+ main()
+ {
+   test01();
+   test02();
+   test03();
+ }
diff -Nrcpad gcc-16-20260125/maintainer-scripts/ChangeLog gcc-16-20260201/maintainer-scripts/ChangeLog
*** gcc-16-20260125/maintainer-scripts/ChangeLog	Sun Jan 25 22:32:20 2026
--- gcc-16-20260201/maintainer-scripts/ChangeLog	Sun Feb  1 22:32:18 2026
***************
*** 1,3 ****
--- 1,7 ----
+ 2026-01-26  Pietro Monteiro  <pietro@sociotechnical.xyz>
+ 
+ 	* update_web_docs_git (MANUALS): Add ga68-coding-guidelines.
+ 
  2025-12-21  Gerald Pfeifer  <gerald@pfeifer.com>
  
  	* update_web_docs_git: Avoid redirects from Sphinx stylesheets.
diff -Nrcpad gcc-16-20260125/maintainer-scripts/update_web_docs_git gcc-16-20260201/maintainer-scripts/update_web_docs_git
*** gcc-16-20260125/maintainer-scripts/update_web_docs_git	Sun Jan 25 22:32:20 2026
--- gcc-16-20260201/maintainer-scripts/update_web_docs_git	Sun Feb  1 22:32:18 2026
*************** MANUALS="cpp
*** 33,38 ****
--- 33,39 ----
    cppinternals
    fastjar
    ga68
+   ga68-coding-guidelines
    ga68-internals
    gcc
    gccgo
